4. API 境界設計(インフラ層)
4.1 BookStack API の使用エンドポイント整理
本ツール(Book/Chapter/Page の骨格生成)で利用するエンドポイントは最小限に絞る。
一覧取得系(同一性判定・SKIP判定のための現状取得)
-
GET /api/books/{book_id}- Book直下の Page と Chapter の“並び”を
contentから取得する前提 - 原則これ1本で足りる設計とし、追加の list 取得は増やさない
- Book直下の Page と Chapter の“並び”を
作成系(骨格生成の本体)
POST /api/chapters(Chapter作成)POST /api/pages(Page作成:Book直下 / Chapter配下)
非対象(このプロジェクトでは使わない)
- 更新(PUT/PATCH)、削除(DELETE)
- 破壊操作をしない・再実行安全を優先するため
4.2 認証・ベースURLの扱い
本ツールでは、秘匿情報および環境依存の設定値をすべて環境変数から取得する。 CLI 引数や設定ファイルでの指定は行わない。
認証情報(必須)
- BookStack API の認証情報は 環境変数から取得する。
- CLI 引数では受け取らない。
| 環境変数 | 必須 | 説明 |
|---|---|---|
BOOKSTACK_TOKEN_ID |
必須 | API Token ID |
BOOKSTACK_TOKEN_SECRET |
必須 | API Token Secret |
認証情報は絶対にログや標準出力へ出力してはならない。 例外メッセージに含まれる可能性もあるため、出力時は必ずマスクまたは抑制する。
API ベースURL
- BookStack API のベースURLは 環境変数から取得する。
- CLI 引数による指定は行わない。
| 環境変数 | 必須 | 説明 |
|---|---|---|
BOOKSTACK_BASE_URL |
必須 | BookStack API のベースURL |
正規化ルール
-
末尾の
/は トリムして保持するhttps://example.com/https://example.comは同一として扱う。
ベースURLを環境変数に統一することで、 実行コマンドを固定したまま、環境(本番・検証・ローカル)を切り替えられる。
CLI 引数を持たないことで、 実行方法が常に一意になり、運用・再実行時の混乱を防げる。
4.3 クライアントクラスの責務定義
インフラ層に BookStackClient(仮称)を置き、ユースケース層から HTTP 詳細を隠蔽する。
共通責務
一覧取得系
-
get_book_content(book_id)の提供GET /api/books/{book_id}を呼び、Book直下の Page/Chapter と、Chapter配下の Page を再帰的に辿れる情報として返す- ユースケース層が「存在確認・同一性判定・SKIP判定」を行える材料のみ返す(下記の最小フィールド)
作成系
-
create_chapter(book_id, name, ...) -> (id, name) -
create_page(parent, name, markdown, ...) -> (id, name)- 親指定は
parent_type/parent_idを入力とする(後述) - API送信直前に
book_idorchapter_idに詰め替える責務はクライアント側に置く(ユースケースに漏らさない)
- 親指定は
4.4 API レスポンスの最小利用フィールド定義(id / name)
手順書のとおり、ユースケース側が保持する参照(戻り値)は原則 id / name とする。
ChapterRef:id,namePageRef:id,name
ただし、同一性判定・構造把握のため、一覧取得時のみクライアント内部DTOとして追加フィールドを扱う(ユースケース側に “判定材料” として渡す用途)。
一覧取得時の内部DTO(例)
type:page/chapteridnameparent_type:book/chapterparent_id: 親オブジェクトID(Book ID または Chapter ID)priority: 並び順を必要とする場合のみ(任意)
4.5 親参照の表現(parent_type / parent_id)
book_id / chapter_id のような “API都合の二重表現” をユースケース側に漏らさないため、親参照を以下で統一する。
parent_type:bookまたはchapter(Enum相当で固定)parent_id: 親オブジェクトのid
マッピング規則(クライアント責務):
parent_type == 'book'→POST /api/pagesにbook_id = parent_idparent_type == 'chapter'→POST /api/pagesにchapter_id = parent_id
4.6 リトライロジックの配置(クライアント側)
リトライは クライアント側(インフラ層) に実装し、ユースケース層は “成功/失敗” の結果のみ扱う。
リトライ対象
- ネットワーク例外(タイムアウト、接続失敗等)
- HTTP
429(レート制限) - HTTP
5xx(サーバ側エラー)
リトライしない
-
HTTP
4xx(429を除く)- 入力不正・権限・存在しない等の可能性が高く、再試行しても改善しない前提
バックオフ方針(固定値)
- 最大試行回数:5回(初回 + リトライ4回)
- 指数バックオフ(例):0.5s → 1s → 2s → 4s → 8s(上限は適度にクリップ)
Retry-Afterが取れる場合はそれを優先(任意対応)