mcpField
B
backend-api-design

backend-api-design

github.com/c0x12c開発109123 回インストール19 週間前に更新
リポジトリ

backend-api-design について

backend-api-designは、記載された規約に沿ってバックエンドAPIを実装する開発者向けのリファレンススキルです。URL設計、レイヤー分担、レスポンス処理、ページネーション、エラー処理、実装上の注意点を扱います。

主な機能

  1. 01URLとHTTPメソッドの規約
  2. 02Controller・Manager・Repositoryの役割
  3. 03Eitherによるエラーとトランザクション
  4. 04レスポンスモデルとページネーション
  5. 05Micronaut実装上の注意点

活用シーン

  1. 01リソース操作用エンドポイントの設計
  2. 02APIとデータアクセスの責務分離
  3. 03ページ付き一覧レスポンスの実装
  4. 04記載された注意点に沿ったコード確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/c0x12c/ai-toolkit --skill backend-api-design

インストール後、Claude Code で/backend-api-designを入力して読み込まれたか確認します。

同梱ファイルcode-patterns.md

詳細

バックエンド API 設計 — クイックリファレンス

URL パターン

GET  /api/v1/employees              # List (plural)
GET  /api/v1/employee               # Get one (?id=xxx)
POST /api/v1/employee               # Create
POST /api/v1/employee/update        # Update (?id=xxx)
POST /api/v1/employee/delete        # Soft delete (?id=xxx)
POST /api/v1/employee/restore       # Restore (?id=xxx)
POST /api/v1/sync/employees         # Action

厳守ルール

  • パスパラメーターは使用しません — 常に @QueryValue を使い、@PathVariable は使用しません
  • 単一リソースには単数形を使用します — /employees/{id} ではなく /employee
  • コレクションには複数形を使用します — /employees
  • アクションには動詞のサブパスを使用します — /delete、/restore、/sync

レイヤードアーキテクチャ

Controller  →  thin, just delegates
    ↓
Manager     →  business logic, transactions, Either returns
    ↓
Repository  →  data access only, no business logic
コントローラー:薄いラッパー
  • デフォルト値を指定してクエリパラメーターを解析します
  • マネージャーに処理を委譲します
  • .throwOrValue() で Either をアンラップします
  • ビジネスロジックは禁止、リポジトリーへのアクセスは禁止です
マネージャー:ビジネスロジック
  • Either<ClientException, T> を返します
  • DB 操作を transaction(db.primary) { } でラップします
  • 複数のリポジトリーをオーケストレーションします
  • ビジネスルールを検証します
リポジトリー:データアクセス
  • エンティティまたは null を返します
  • 読み取りには db.replica、書き込みには db.primary を使用します
  • 常に deletedAt.isNull() を確認します

クイックコードリファレンス

コントローラーでの基本的な委譲パターン:

@Get("/employee")
suspend fun getEmployee(@QueryValue id: UUID): EmployeeResponse {
  return employeeManager.findById(id).throwOrValue()
}
  • レスポンスモデル — module-client/response/{domain}/ 内に companion object { fun from(entity) } を定義します
  • ページネーション — オフセットベースです。マネージャーは items、total、page、limit、hasMore を持つ EmployeeListResponse を返します
  • エラー — マネージャーから ClientError.NOT_FOUND.asException().left() を返し、例外をスローしないでください
  • ファクトリービーン — @Factory クラスに @Singleton メソッドを定義し、リポジトリーと db をマネージャーに接続します

コントローラー、レスポンスモデル、ページネーション、エラー処理、ファクトリービーンのテンプレートについては、code-patterns.md を参照してください。

注意点

  • 複数単語からなる @QueryValue パラメーターには、明示的な snake_case 名が必須です。 フロントエンドの axios インターセプターは project_id を送信しますが、Micronaut はパラメーター名を文字どおりに照合します。@QueryValue projectId: UUID のように省略せず、@QueryValue("project_id") projectId: UUID と記述してください。
  • @Put、@Delete、@Patch は使用しないでください。 これは RPC スタイルです。すべての変更操作には @Post を使用します。読み取りに使用する @Get は 1 つだけです。
  • リポジトリーを注入するコントローラーは、コードの問題を示す兆候です。 コントローラー内に private val fooRepository: FooRepository がある場合は、マネージャーに移動してください。
  • 2 つ目の .where {} ではなく andWhere {} を使用します。 .where {} を 2 回呼び出すと、最初の条件が置き換えられます。条件をつなげるには .andWhere {} を使用してください。
  • @ExecuteOn(TaskExecutors.IO) を忘れないでください。 これがないと、suspend 関数が停止したり、誤ったスレッドプールで実行されたりする場合があります。すべてのコントローラーに必要です。

コメント