mcpField
D
ddd-api-designer

ddd-api-designer

github.com/full-stack-skills開発17125 回インストール4 週間前に更新
リポジトリ

ddd-api-designer について

DDDプロジェクト向けのAPI設計スキルで、ドメインモデルからREST APIを設計する手順を示します。CQRS、データオブジェクトの階層化、複数クライアントへの適応に加え、BFF、バージョン管理、安全対策を扱います。

主な機能

  1. 01CommandとQueryの分離設計
  2. 02PO→DO→DTO→VOの変換チェーン
  3. 03RESTエンドポイントと命名規則
  4. 04統一レスポンス形式とエラーコード
  5. 05BFFによるデータ集約と適応
  6. 06APIバージョン管理とセキュリティ設計

活用シーン

  1. 01DDD集約をREST APIとして設計
  2. 02読み取りと書き込みで別々のDTOを定義
  3. 03Web、iOS、MiniApp向けのBFFを設計
  4. 04APIのバージョン移行と安全対策を計画

インストール

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

$npx skills add https://github.com/full-stack-skills/ddd-skills --skill ddd-api-designer

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
examples/
01-BFF-aggregation-example.md
02-api-version-migration.md
03-inventory-api-design.md
04-notification-api-design.md
05-openapi-codegen-example.md
06-order-api-design.md
07-payment-api-design.md
08-product-api-design.md
09-search-api-design.md
10-user-api-design.md
references/architecture/
clean-ddd-hexagonal-hexagonal.md
partme-16-service-data-view.md
references/examples-ref/
api-error-handling.md
data-object-transformation.md
event-driven-api.md
unified-response-format.md
references/migration/
api-versioning-strategies.md
references/patterns/
BFF-design-pattern.md
cqrs-api-design.md
data-access-api.md
idempotency-design.md
pagination-filtering-design.md
references/security/
api-naming-conventions.md
api-rate-limiting.md
api-security-design.md
openapi-specification.md

詳細

DDD API Designer

从领域模型到 REST API 的完整设计指南:CQRS 读写分离、四层数据对象转换链(PO→DO→DTO→VO)、统一响应格式、BFF 多端适配、版本管理与安全设计。

Workflow

  1. 识别 Command vs Query — 将领域行为分为命令(写)和查询(读),决定 Method 和端点
  2. 设计数据对象转换链 — 建立 PO→DO→DTO→VO 四层转换,各层独立职责
  3. 设计 REST 端点 — Command 动词后缀, Query 资源命名
  4. 定义统一响应格式 — Result<T> 包装 + 业务错误码体系
  5. 应用 BFF — 每前端一个 BFF, 数据聚合 + 格式适配 + 协议转换
  6. 选择版本策略 — 推荐 URL Path: /api/v1/orders, CDN 友好
  7. 施加安全控制 — AuthN + AuthZ + 三层校验 + 差异化限流

When to Use

✅ ALWAYS use when❌ Skip when
API 设计、REST API、接口设计内部工具无外部消费者
DTO/VO 设计、数据对象转换GraphQL/gRPC 项目
BFF / Backend for Frontend无领域模型时 → domain-designer
OpenAPI / Swagger / API 文档简单 CRUD 无 DDD
API 版本管理 / 安全设计纯 gRPC 微服务(用 protobuf IDL)
需要将 DDD 聚合暴露为 REST API快速原型不关心 API 规范

Boundary

✅ 明确适用
  • 需要将 DDD 领域模型暴露为 REST API — CQRS 读写分离、数据对象转换链完整落地
  • CQRS 命令/查询分离设计 — 独立 Command DTO 和 Query DTO,各自演化
  • 多端(Web/iOS/MiniApp)API 统一设计 — BFF 模式按平台适配
  • 统一响应格式与错误码体系设计 — Result<T> + 业务错误码标准化
  • OpenAPI/Swagger 规范输出 — 代码生成策略保持接口与实现同步
⚠ 需谨慎评估
  • 团队对 DDD/CQRS 不熟悉 → 先学习基础概念
  • 单体应用无扩展需求 → 评估 ROI,可能过度设计
  • 现有 API 无消费者兼容需求 → 版本管理可简化
❌ 不适用
  • GraphQL/gRPC 项目 → 使用对应 IDL 和工具链
  • 简单 CRUD 无 DDD → 先用通用 REST 框架或 domain-designer
  • 快速原型/演示阶段 → 先用简化 API,后续再引入规范
  • 纯 gRPC 微服务 → 使用 protobuf IDL + gRPC 拦截器
  • 内部工具无外部消费者 → 简化 API 设计

CQRS API Design

Command(写)动词驱动,Query(读)资源驱动:

维度CommandQuery
HTTP MethodPOST/PUT/DELETEGET
URL 动词需要(confirm, cancel)不需要
请求体Command 对象仅查询参数
DTO 分离独立 Command DTO独立 Query DTO
幂等性必须实现天然幂等
缓存从不缓存ETag, max-age
响应创建的资源摘要数据 DTO / 列表

原则:Command DTO 和 Query DTO 始终分开定义。子资源嵌套最多 2 层。详见 references/patterns/cqrs-api-design.md

数据对象转换链(PO → DO → DTO → VO)

对象层职责可见性
POInfrastructureORM 映射,数据库结构对应内部
DODomain充血模型,含业务行为内部
DTOInterface/App跨层跨服务数据传输半内部
VOInterface页面专用展示数据外部

读方向:PO→DO→DTO→VO;写方向:VO→DTO→Command→DO→PO。 一个 DO 可按场景转换为多个 DTO(详情 DTO、摘要 DTO 等),Controller 不直接返回领域对象。详见 references/examples-ref/data-object-transformation.md

API 设计规范

规则示例
名词复数/orders ✓
Kebab-case/order-history ✓
最大 2 层嵌套/orders/{id}/items
写动词后缀/orders/{id}/confirm
查询参数?status=PAID&page=1
无 URL 动词❌ GET /getOrders → GET /orders

HTTP Status:201 Created(创建)、200 OK(查询/更新)、204 No Content(删除)、400(校验/业务)、404(未找到)、409(并发冲突)、429(限流)、500(内部错误)。详见 references/security/api-naming-conventions.md

统一响应格式

成功:{ "code": 0, "message": "success", "data": T } — 201/200/204 错误:{ "code": 40001, "message": "...", "detail": "...", "requestId": "req-xxx" } — 400/404/409/429/500

Response wrapper Result<T> 包含 code + message + data + requestId。错误响应绝不返回堆栈信息。详见 references/examples-ref/unified-response-format.md

BFF(Backend for Frontend)

每前端一个 BFF(Web/iOS/MiniApp),职责:

  • 数据聚合:组合多服务数据为页面 VO(1 次前端调用替代 N 次)
  • 格式适配:Web 全量字段 / 移动端精简字段
  • 协议转换:内部 gRPC → 外部 REST/JSON
  • 响应塑形:移除内部字段,添加 UI 元数据

与 API Gateway 区别:BFF 做视图聚合(页面级),Gateway 做路由+限流(服务级)。 BFF 不直接访问数据库,不包含业务逻辑。详见 references/patterns/BFF-design-pattern.md

API 版本管理

策略示例推荐度
URL Path ★/api/v1/orders → /api/v2/orders★★★★★
Request HeaderAccept: vnd.company.v2+json★★★☆☆
Query Param/api/orders?version=2★★☆☆☆

推荐 URL Path:直观、CDN 友好、Swagger 兼容。迁移流程:v1 → v1+v2 → v2 only → v1 sunset(410 Gone)。详见 references/migration/api-versioning-strategies.md

API セキュリティ設計

4 層のセキュリティモデル:

  1. 認証:JWT Bearer Token/OAuth2/API Key(サービス間)
  2. 認可:境界づけられたコンテキスト+リソースの所有権+ロールに基づく
  3. 入力検証:Controller の形式 → Application のビジネスロジック → Domain の不変条件
  4. レート制限:Command 50/s、Query 200/s、Auth 10/s。詳しくは references/security/api-security-design.md を参照してください。

よくある落とし穴

DTO で列挙型を公開する→string code | Command/Query DTO を混用する→分離する | null 安全性→Optional を処理する | VO で DB フィールドをそのまま公開する→ビューをカスタマイズする | 冪等性の欠如→Idempotency-Key | エラーでスタックトレースをそのまま返す→requestId | 深いネスト→2 層以下 | ドメインオブジェクトのシリアライズ→DTO/VO を介する

ルール

  • Command/Query DTO の分離 — 書き込み操作と読み取り操作には個別の DTO を使用し、同じ構造の再利用は禁止です
  • Controller でのプロトコル変換 — Controller 層では HTTP プロトコルの適合のみを行い、ビジネスロジックやドメイン呼び出しは含めません
  • エラーコードのプレフィックスを統一 — ビジネスエラーは 5 桁のコードです。先頭 1 桁はカテゴリ(4=クライアント/5=サーバー)、次の 2 桁は HTTP、末尾 3 桁は具体的なエラーを表します
  • BFF の責務範囲 — BFF はデータ集約と形式の適合のみを行い、データベースへの直接アクセスやビジネスルールの実装は行いません
  • レスポンスのラッパー — すべての API レスポンスを Result<T> でラップします。例外は 204 No Content とファイルダウンロードのみです

FAQ

質問回答
DO と DTO のフィールドが同じなら再利用できますか?できません。DO は振る舞いを含みますが、DTO は純粋なデータであり、進化の方向が異なります。
すべての API でレスポンス形式を統一する必要がありますか?はい。例外はファイルダウンロードと 204 のみです。
エラーコードはどのように設計しますか?5 桁の数字です。先頭 1 桁はカテゴリ、次の 2 桁は HTTP、末尾 3 桁は具体的なエラーを表します。
BFF が必要なのはどのような場合ですか?複数のフロントエンドプラットフォームがある場合、またはフロントエンドで複数のサービスのデータを組み合わせる必要がある場合です。
子リソースのネストは最大何層ですか?最大 2 層です。2 層を超える場合は、集約の境界に問題があることを示しています。
Controller にビジネスロジックを記述できますか?できません。プロトコル変換のみを行います。

キーワード

CQRS API REST endpoint design PO DO DTO VO data object transformation unified response format BFF Backend for Frontend OpenAPI Swagger API versioning API security command query separation Result<T> response wrapper input validation rate limiting idempotency pagination design

参考資料

Examples


🧭 DDD Skills Journey

📍 当前:ddd-api-designer — Step 4: API 设计与数据转换

Step 1 (awesome) → Step 2 (selector) → Step 3 (架构落地) → Step 4 (领域+CQRS+API) → Step 5 (审查) → Step 6 (辅助) → Step 7 (文档)
                                                                    ↑
                                         ⭐ ddd-api-designer: 领域模型 → REST API

← 上一站: hand off to ddd-domain-designer skill — 先有领域模型再设计 API(Install: npx skills add full-stack-skills/ddd-skills --skill ddd-domain-designer). → 下一站: hand off to ddd-code-reviewer skill — 审查 API 设计合规性(Install: npx skills add full-stack-skills/ddd-skills --skill ddd-code-reviewer). 🔗 相关: hand off to ddd-cqrs-architecture skill — CQRS 深入(Install: npx skills add full-stack-skills/ddd-skills --skill ddd-cqrs-architecture) | ddd-architecture-doc skill — OpenAPI 文档输出(Install: npx skills add full-stack-skills/ddd-skills --skill ddd-architecture-doc).

核心原则:Command 和 Query 分开设计。牢记 PO→DO→DTO→VO 四层转换链,DTO 与领域对象解耦,VO 与数据库结构解耦。

コメント