yodogawa 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.windsurf/templates/documentation-rules.md +143 -0
- package/.windsurf/templates/project/01-requirements/01-system-overview.md +49 -0
- package/.windsurf/templates/project/01-requirements/02-features-implemented.md +73 -0
- package/.windsurf/templates/project/01-requirements/03-features-planned.md +75 -0
- package/.windsurf/templates/project/01-requirements/04-non-functional-requirements.md +115 -0
- package/.windsurf/templates/project/01-requirements/05-user-stories.md +124 -0
- package/.windsurf/templates/project/02-behavior/01-scenarios.md +406 -0
- package/.windsurf/templates/project/03-domain/01-domain-model.md +338 -0
- package/.windsurf/templates/project/03-domain/02-ubiquitous-language.md +153 -0
- package/.windsurf/templates/project/04-design/01-tech-stack.md +360 -0
- package/.windsurf/templates/project/04-design/02-repository-structure.md +390 -0
- package/.windsurf/templates/project/04-design/03-screen-design.md +586 -0
- package/.windsurf/templates/project/04-design/04-data-model.md +211 -0
- package/.windsurf/templates/project/04-design/05-api-spec.md +221 -0
- package/.windsurf/templates/project/04-design/06-architecture.md +183 -0
- package/.windsurf/templates/project/04-design/07-infrastructure.md +180 -0
- package/.windsurf/templates/tasks/task-template/a-definition.md +143 -0
- package/.windsurf/templates/tasks/task-template/b-research.md +185 -0
- package/.windsurf/templates/tasks/task-template/c-implementation.md +197 -0
- package/.windsurf/workflows/a-001-SetupDocStructure.md +165 -0
- package/.windsurf/workflows/a-002-InitializeProject.md +229 -0
- package/.windsurf/workflows/a-003-CreateScenarios.md +130 -0
- package/.windsurf/workflows/a-004-DefineDomainModel.md +133 -0
- package/.windsurf/workflows/a-005-CreateDomainDiagram.md +114 -0
- package/.windsurf/workflows/a-006-ReviewRequirementsDomain.md +132 -0
- package/.windsurf/workflows/a-007-DefineTechStack.md +121 -0
- package/.windsurf/workflows/a-008-DefineRepositoryStructure.md +118 -0
- package/.windsurf/workflows/a-009-DefineScreenDesign.md +121 -0
- package/.windsurf/workflows/a-010-DefineDataModel.md +125 -0
- package/.windsurf/workflows/a-011-DefineAPISpec.md +123 -0
- package/.windsurf/workflows/a-012-DefineArchitecture.md +119 -0
- package/.windsurf/workflows/a-013-DefineInfrastructure.md +120 -0
- package/.windsurf/workflows/a-014-ReviewDesign.md +122 -0
- package/.windsurf/workflows/b-001-CreateTaskDirectory.md +71 -0
- package/.windsurf/workflows/b-002-CreateTaskDefinition.md +165 -0
- package/.windsurf/workflows/b-003-CreateTaskResearch.md +412 -0
- package/.windsurf/workflows/b-004-CreateTaskImplementation.md +97 -0
- package/.windsurf/workflows/b-005-ReviewTask.md +312 -0
- package/.windsurf/workflows/c-001-ImplementTask.md +493 -0
- package/.windsurf/workflows/c-002-UpdateDocumentation.md +797 -0
- package/.windsurf/workflows/x-Accessibility-Check.md +469 -0
- package/.windsurf/workflows/x-Bundle-Optimize.md +386 -0
- package/.windsurf/workflows/x-CI-FixFailure.md +636 -0
- package/.windsurf/workflows/x-CI-Setup.md +641 -0
- package/.windsurf/workflows/x-Code-Refactor.md +71 -0
- package/.windsurf/workflows/x-Code-ResearchAndReview.md +78 -0
- package/.windsurf/workflows/x-Component-Create.md +359 -0
- package/.windsurf/workflows/x-Context-CatchUp.md +63 -0
- package/.windsurf/workflows/x-Database-Seed.md +300 -0
- package/.windsurf/workflows/x-Dependencies-Update.md +315 -0
- package/.windsurf/workflows/x-DevEnvironment-Setup.md +437 -0
- package/.windsurf/workflows/x-Logging-Add.md +682 -0
- package/.windsurf/workflows/x-Migration-Create.md +354 -0
- package/.windsurf/workflows/x-Problem-RootCauseAnalysis.md +65 -0
- package/.windsurf/workflows/x-Repository-Push.md +375 -0
- package/.windsurf/workflows/x-Repository-PushToGithub.md +72 -0
- package/.windsurf/workflows/x-Requirements-Clarify.md +61 -0
- package/.windsurf/workflows/z-CreateWorkflow.md +77 -0
- package/README.md +280 -0
- package/bin/cli.js +74 -0
- package/package.json +28 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# データモデル(ERD)
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
何を書くか: データベース構造、エンティティ、属性、リレーションシップ、制約
|
|
5
|
+
|
|
6
|
+
目的:
|
|
7
|
+
- データ構造の全体像を可視化
|
|
8
|
+
- テーブル設計の一貫性を保つ
|
|
9
|
+
- 開発者間の認識統一
|
|
10
|
+
- データの整合性ルールを明確化
|
|
11
|
+
- マイグレーション計画の基盤
|
|
12
|
+
|
|
13
|
+
重要性:
|
|
14
|
+
- データベース設計の記録(ADR: Architecture Decision Record の一部)
|
|
15
|
+
- 正規化・非正規化の判断根拠を記録
|
|
16
|
+
- パフォーマンス最適化の指針
|
|
17
|
+
- データ整合性の担保
|
|
18
|
+
- 将来の拡張性を考慮した設計
|
|
19
|
+
|
|
20
|
+
記載のポイント:
|
|
21
|
+
- Mermaid ERD で視覚的に表現
|
|
22
|
+
- エンティティごとに責務を明確化
|
|
23
|
+
- リレーションシップと多重度を正確に記載
|
|
24
|
+
- 制約(NOT NULL, UNIQUE, CHECK)を明記
|
|
25
|
+
- インデックス戦略を記録
|
|
26
|
+
- データ型の選択理由を記載
|
|
27
|
+
|
|
28
|
+
更新頻度:
|
|
29
|
+
- プロジェクト初期にドメインモデルから作成
|
|
30
|
+
- テーブル追加・変更時に更新
|
|
31
|
+
- マイグレーション実行時に更新
|
|
32
|
+
- パフォーマンスチューニング時に見直し
|
|
33
|
+
-->
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## エンティティ一覧
|
|
38
|
+
|
|
39
|
+
<!--
|
|
40
|
+
各エンティティの責務と主要属性を明記
|
|
41
|
+
|
|
42
|
+
まずエンティティの一覧を把握してから、ERDで視覚化する流れが自然です。
|
|
43
|
+
|
|
44
|
+
テーブル構成:
|
|
45
|
+
【エンティティ名】
|
|
46
|
+
- テーブル名(物理名)
|
|
47
|
+
- 複数形推奨(例: users, orders, products)
|
|
48
|
+
- スネークケース推奨(例: order_items, user_roles)
|
|
49
|
+
|
|
50
|
+
【説明】
|
|
51
|
+
- そのエンティティが表現するビジネス概念
|
|
52
|
+
- 責務と役割
|
|
53
|
+
- ドメインモデルとの対応
|
|
54
|
+
|
|
55
|
+
【主要属性】
|
|
56
|
+
- 重要なカラムをリスト化
|
|
57
|
+
- すべてを列挙する必要はない(詳細は ERD 参照)
|
|
58
|
+
- ビジネスキーとなる属性を優先的に記載
|
|
59
|
+
|
|
60
|
+
【備考】
|
|
61
|
+
- 正規化・非正規化の判断理由
|
|
62
|
+
- パーティショニング戦略
|
|
63
|
+
- 削除方法(論理削除 or 物理削除)
|
|
64
|
+
- 監査要件(作成日時、更新日時、削除日時)
|
|
65
|
+
|
|
66
|
+
記載のベストプラクティス:
|
|
67
|
+
- エンティティの分類を明記(コア、参照、関連、履歴)
|
|
68
|
+
- ソフトデリート(論理削除)の有無を記載
|
|
69
|
+
- タイムスタンプ(created_at, updated_at)の有無
|
|
70
|
+
- ドメインモデルの Aggregate との対応を記載
|
|
71
|
+
|
|
72
|
+
よくあるエンティティの分類:
|
|
73
|
+
- コアエンティティ: ビジネスの中心(User, Order, Product)
|
|
74
|
+
- 参照エンティティ: マスタデータ(Category, Status, Country)
|
|
75
|
+
- 関連エンティティ: 多対多の中間テーブル(UserRole, OrderItem)
|
|
76
|
+
- 履歴エンティティ: 監査ログ、変更履歴(AuditLog, OrderHistory)
|
|
77
|
+
-->
|
|
78
|
+
|
|
79
|
+
| エンティティ名 | 説明 | 主要属性 | 備考 |
|
|
80
|
+
|---------------|------|----------|------|
|
|
81
|
+
| <!-- 例: users --> | <!-- 例: ユーザー情報を管理。システムにアクセスする全てのユーザーを表す --> | <!-- 例: id, email, name, password_hash --> | <!-- 例: 論理削除(deleted_at)、email は一意制約 --> |
|
|
82
|
+
| <!-- 例: orders --> | <!-- 例: 注文情報を管理。ユーザーが商品を購入する取引単位 --> | <!-- 例: id, user_id, status, total_amount --> | <!-- 例: status は enum 型または CHECK 制約、物理削除不可(履歴保持) --> |
|
|
83
|
+
| <!-- 例: products --> | <!-- 例: 商品マスタ。販売可能な商品の情報を管理 --> | <!-- 例: id, name, price, stock --> | <!-- 例: 論理削除(is_active)、在庫数は別テーブルでも可 --> |
|
|
84
|
+
| <!-- 例: order_items --> | <!-- 例: 注文明細。注文に含まれる商品と数量を管理 --> | <!-- 例: id, order_id, product_id, quantity, unit_price --> | <!-- 例: 価格変更の影響を避けるため unit_price を保持 --> |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## リレーションシップ
|
|
89
|
+
|
|
90
|
+
<!--
|
|
91
|
+
エンティティ間の関係性を明記
|
|
92
|
+
|
|
93
|
+
エンティティ一覧で各テーブルの責務を把握した後、このセクションでテーブル間の関係性を理解します。
|
|
94
|
+
その後、ERDで視覚的に確認する流れが自然です。
|
|
95
|
+
|
|
96
|
+
テーブル構成:
|
|
97
|
+
【エンティティA / エンティティB】
|
|
98
|
+
- リレーションシップの両端のエンティティ名
|
|
99
|
+
|
|
100
|
+
【関係性】
|
|
101
|
+
- 多重度を記載
|
|
102
|
+
- 1:1(一対一)
|
|
103
|
+
- 1:N(一対多)
|
|
104
|
+
- N:M(多対多) → 通常は中間テーブルで 1:N + N:1 に分解
|
|
105
|
+
|
|
106
|
+
【外部キー】
|
|
107
|
+
- FK として使用されるカラム名
|
|
108
|
+
- 命名規則: {参照先テーブル名}_id(例: user_id, product_id)
|
|
109
|
+
|
|
110
|
+
【制約】
|
|
111
|
+
- ON DELETE の動作(CASCADE, SET NULL, RESTRICT)
|
|
112
|
+
- ON UPDATE の動作
|
|
113
|
+
- NOT NULL 制約の有無
|
|
114
|
+
|
|
115
|
+
【備考】
|
|
116
|
+
- ビジネスルールの説明
|
|
117
|
+
- リレーションシップの意味
|
|
118
|
+
- インデックスの有無
|
|
119
|
+
|
|
120
|
+
記載のベストプラクティス:
|
|
121
|
+
- 親子関係を明確に
|
|
122
|
+
- CASCADE 削除は慎重に(意図しないデータ削除を防ぐ)
|
|
123
|
+
- 循環参照に注意
|
|
124
|
+
- パフォーマンスを考慮した FK インデックス
|
|
125
|
+
-->
|
|
126
|
+
|
|
127
|
+
| エンティティA | エンティティB | 関係性 | 外部キー | 制約 | 備考 |
|
|
128
|
+
|--------------|--------------|--------|----------|------|------|
|
|
129
|
+
| <!-- 例: users --> | <!-- 例: orders --> | <!-- 例: 1:N --> | <!-- 例: user_id --> | <!-- 例: ON DELETE RESTRICT --> | <!-- 例: 1人のユーザーが複数の注文を持つ。ユーザー削除時は注文が残るため RESTRICT --> |
|
|
130
|
+
| <!-- 例: orders --> | <!-- 例: order_items --> | <!-- 例: 1:N --> | <!-- 例: order_id --> | <!-- 例: ON DELETE CASCADE --> | <!-- 例: 1つの注文が複数の明細を持つ。注文削除時は明細も削除 --> |
|
|
131
|
+
| <!-- 例: products --> | <!-- 例: order_items --> | <!-- 例: 1:N --> | <!-- 例: product_id --> | <!-- 例: ON DELETE RESTRICT --> | <!-- 例: 商品削除時は注文明細が残るため削除不可 --> |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## ERD(Entity Relationship Diagram)
|
|
136
|
+
|
|
137
|
+
<!--
|
|
138
|
+
Mermaid を使用してデータベース構造を可視化
|
|
139
|
+
|
|
140
|
+
エンティティ一覧とリレーションシップで理解した内容を、このERDで視覚的に確認します。
|
|
141
|
+
|
|
142
|
+
記載のベストプラクティス:
|
|
143
|
+
1. すべてのエンティティとリレーションシップを記載
|
|
144
|
+
2. 主キー(PK)、外部キー(FK)を明記
|
|
145
|
+
3. データ型を記載(int, string, datetime, boolean など)
|
|
146
|
+
4. リレーションシップの多重度を正確に表現(1:1, 1:N, N:M)
|
|
147
|
+
5. 複雑な場合は複数の図に分割(コアドメイン、サブドメインごと)
|
|
148
|
+
|
|
149
|
+
Mermaid ERD の記法:
|
|
150
|
+
- エンティティ名 { 属性名 データ型 制約 }
|
|
151
|
+
- リレーションシップ記法:
|
|
152
|
+
- ||--|| : 1対1(必須-必須)
|
|
153
|
+
- ||--o| : 1対0..1(必須-オプション)
|
|
154
|
+
- ||--o{ : 1対多(必須-0以上)
|
|
155
|
+
- }o--o{ : 多対多
|
|
156
|
+
- PK: Primary Key(主キー)
|
|
157
|
+
- FK: Foreign Key(外部キー)
|
|
158
|
+
- UK: Unique Key(一意制約)
|
|
159
|
+
-->
|
|
160
|
+
|
|
161
|
+
```mermaid
|
|
162
|
+
erDiagram
|
|
163
|
+
USER ||--o{ ORDER : "places"
|
|
164
|
+
USER {
|
|
165
|
+
bigint id PK "ユーザーID"
|
|
166
|
+
string email UK "メールアドレス(一意)"
|
|
167
|
+
string name "氏名"
|
|
168
|
+
string password_hash "パスワードハッシュ"
|
|
169
|
+
datetime created_at "作成日時"
|
|
170
|
+
datetime updated_at "更新日時"
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
ORDER ||--|{ ORDER_ITEM : "contains"
|
|
174
|
+
ORDER {
|
|
175
|
+
bigint id PK "注文ID"
|
|
176
|
+
bigint user_id FK "ユーザーID"
|
|
177
|
+
string status "ステータス: pending, confirmed, shipped, delivered, cancelled"
|
|
178
|
+
decimal total_amount "合計金額"
|
|
179
|
+
datetime created_at "作成日時"
|
|
180
|
+
datetime updated_at "更新日時"
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
PRODUCT ||--o{ ORDER_ITEM : "is ordered in"
|
|
184
|
+
PRODUCT {
|
|
185
|
+
bigint id PK "商品ID"
|
|
186
|
+
string name "商品名"
|
|
187
|
+
text description "商品説明"
|
|
188
|
+
decimal price "価格"
|
|
189
|
+
int stock "在庫数"
|
|
190
|
+
boolean is_active "有効フラグ"
|
|
191
|
+
datetime created_at "作成日時"
|
|
192
|
+
datetime updated_at "更新日時"
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
ORDER_ITEM {
|
|
196
|
+
bigint id PK "注文明細ID"
|
|
197
|
+
bigint order_id FK "注文ID"
|
|
198
|
+
bigint product_id FK "商品ID"
|
|
199
|
+
int quantity "数量"
|
|
200
|
+
decimal unit_price "単価(注文時の価格)"
|
|
201
|
+
datetime created_at "作成日時"
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**補足**:
|
|
206
|
+
<!-- 例:
|
|
207
|
+
- USER と ORDER は 1:N の関係(1人のユーザーが複数の注文を持つ)
|
|
208
|
+
- ORDER と ORDER_ITEM は 1:N の関係(1つの注文が複数の明細を持つ)
|
|
209
|
+
- PRODUCT と ORDER_ITEM は 1:N の関係(1つの商品が複数の注文明細に含まれる)
|
|
210
|
+
- unit_price を ORDER_ITEM に持たせることで、価格変更の影響を回避
|
|
211
|
+
-->
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# API仕様
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
何を書くか: 認証方式、エンドポイント一覧、共通レスポンス形式
|
|
5
|
+
|
|
6
|
+
目的:
|
|
7
|
+
- フロントエンド・バックエンド間の基本契約を明確化
|
|
8
|
+
- API設計の全体像を把握
|
|
9
|
+
- 開発者間の認識統一
|
|
10
|
+
|
|
11
|
+
重要性:
|
|
12
|
+
- 高レベルなAPI設計の記録
|
|
13
|
+
- 詳細な仕様(リクエスト/レスポンスのスキーマ)はOpenAPI/Swaggerやコードで管理
|
|
14
|
+
|
|
15
|
+
記載のポイント:
|
|
16
|
+
- 認証方式の基本情報
|
|
17
|
+
- エンドポイント一覧(メソッド、パス、説明、認証要否)
|
|
18
|
+
- 共通のレスポンス形式(成功/エラー)
|
|
19
|
+
|
|
20
|
+
更新頻度:
|
|
21
|
+
- プロジェクト初期に基本設計を作成
|
|
22
|
+
- エンドポイント追加・削除時に更新
|
|
23
|
+
|
|
24
|
+
**詳細な実装仕様の管理**:
|
|
25
|
+
- リクエスト/レスポンスの詳細なJSONスキーマ → OpenAPI/Swagger
|
|
26
|
+
- バリデーションルール → コード(バリデーター)
|
|
27
|
+
- エラーコード詳細 → コード(エラーハンドラー)
|
|
28
|
+
- ページネーション、レート制限 → コードと運用ドキュメント
|
|
29
|
+
-->
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 認証・認可
|
|
34
|
+
|
|
35
|
+
<!--
|
|
36
|
+
API のセキュリティ方式の基本情報
|
|
37
|
+
|
|
38
|
+
よくある認証方式:
|
|
39
|
+
- JWT (JSON Web Token): ステートレス、マイクロサービス向き
|
|
40
|
+
- OAuth 2.0: サードパーティ認証、権限委譲
|
|
41
|
+
- API Key: シンプル、内部API向き
|
|
42
|
+
- Session Cookie: ステートフル、Webアプリ向き
|
|
43
|
+
|
|
44
|
+
記載すべき内容:
|
|
45
|
+
- 認証方法(JWT, OAuth 2.0, API Key など)
|
|
46
|
+
- トークンの基本的な有効期限
|
|
47
|
+
- 認証フローの概要
|
|
48
|
+
- 権限スコープの種類
|
|
49
|
+
-->
|
|
50
|
+
|
|
51
|
+
| 項目 | 内容 |
|
|
52
|
+
|------|------|
|
|
53
|
+
| **認証方法** | <!-- 例: JWT Bearer Token --> |
|
|
54
|
+
| **トークン有効期限** | <!-- 例: アクセストークン: 1時間、リフレッシュトークン: 30日 --> |
|
|
55
|
+
| **トークン形式** | <!-- 例: Authorization: Bearer {token} --> |
|
|
56
|
+
| **権限スコープ** | <!-- 例: read, write, admin --> |
|
|
57
|
+
|
|
58
|
+
**認証フロー概要**:
|
|
59
|
+
<!-- 例:
|
|
60
|
+
1. POST /auth/login でログイン
|
|
61
|
+
2. アクセストークンとリフレッシュトークンを取得
|
|
62
|
+
3. 以降のリクエストで Authorization: Bearer {token} ヘッダーに含める
|
|
63
|
+
4. トークン期限切れ時は POST /auth/refresh でリフレッシュ
|
|
64
|
+
-->
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## エンドポイント一覧
|
|
69
|
+
|
|
70
|
+
<!--
|
|
71
|
+
すべてのAPIエンドポイントを一覧化
|
|
72
|
+
|
|
73
|
+
テーブル構成:
|
|
74
|
+
【メソッド】
|
|
75
|
+
- HTTP メソッド(GET, POST, PUT, PATCH, DELETE)
|
|
76
|
+
- RESTful な使い分けを意識
|
|
77
|
+
|
|
78
|
+
【パス】
|
|
79
|
+
- エンドポイントの URL パス
|
|
80
|
+
- パスパラメータは {id}, {userId} のように記載
|
|
81
|
+
- 例: /api/users/{id}, /api/orders/{orderId}/items
|
|
82
|
+
|
|
83
|
+
【説明】
|
|
84
|
+
- エンドポイントの目的を1行で記載
|
|
85
|
+
- 例: 「ユーザー一覧を取得」「注文を作成」
|
|
86
|
+
|
|
87
|
+
【認証】
|
|
88
|
+
- 必要/不要/オプション
|
|
89
|
+
- 必要な権限スコープがあれば記載(例: admin, write)
|
|
90
|
+
|
|
91
|
+
【ステータス】
|
|
92
|
+
- 実装済み/未実装/非推奨(Deprecated)
|
|
93
|
+
- バージョニングで廃止予定のエンドポイントを記録
|
|
94
|
+
|
|
95
|
+
記載のベストプラクティス:
|
|
96
|
+
- リソースごとにグループ化(ユーザー関連、注文関連など)
|
|
97
|
+
- CRUD 操作を揃える(GET一覧, GET詳細, POST作成, PUT更新, DELETE削除)
|
|
98
|
+
- ページネーションやフィルタリングのパラメータを記載
|
|
99
|
+
- 非推奨(Deprecated)エンドポイントも記録し、移行先を明記
|
|
100
|
+
-->
|
|
101
|
+
|
|
102
|
+
### ユーザー管理
|
|
103
|
+
|
|
104
|
+
| メソッド | パス | 説明 | 認証 | ステータス |
|
|
105
|
+
|---------|------|------|------|-----------|
|
|
106
|
+
| <!-- GET --> | <!-- /api/users --> | <!-- ユーザー一覧取得 --> | <!-- 必要(read) --> | <!-- 実装済み --> |
|
|
107
|
+
| <!-- GET --> | <!-- /api/users/{id} --> | <!-- ユーザー詳細取得 --> | <!-- 必要(read) --> | <!-- 実装済み --> |
|
|
108
|
+
| <!-- POST --> | <!-- /api/users --> | <!-- ユーザー作成 --> | <!-- 必要(write) --> | <!-- 実装済み --> |
|
|
109
|
+
| <!-- PUT --> | <!-- /api/users/{id} --> | <!-- ユーザー更新(完全置換) --> | <!-- 必要(write) --> | <!-- 実装済み --> |
|
|
110
|
+
| <!-- PATCH --> | <!-- /api/users/{id} --> | <!-- ユーザー更新(部分更新) --> | <!-- 必要(write) --> | <!-- 実装済み --> |
|
|
111
|
+
| <!-- DELETE --> | <!-- /api/users/{id} --> | <!-- ユーザー削除 --> | <!-- 必要(admin) --> | <!-- 実装済み --> |
|
|
112
|
+
|
|
113
|
+
### 注文管理
|
|
114
|
+
|
|
115
|
+
| メソッド | パス | 説明 | 認証 | ステータス |
|
|
116
|
+
|---------|------|------|------|-----------|
|
|
117
|
+
| <!-- GET --> | <!-- /api/orders --> | <!-- 注文一覧取得 --> | <!-- 必要(read) --> | <!-- 実装済み --> |
|
|
118
|
+
| <!-- GET --> | <!-- /api/orders/{id} --> | <!-- 注文詳細取得 --> | <!-- 必要(read) --> | <!-- 実装済み --> |
|
|
119
|
+
| <!-- POST --> | <!-- /api/orders --> | <!-- 注文作成 --> | <!-- 必要(write) --> | <!-- 実装済み --> |
|
|
120
|
+
| <!-- POST --> | <!-- /api/orders/{id}/cancel --> | <!-- 注文キャンセル --> | <!-- 必要(write) --> | <!-- 実装済み --> |
|
|
121
|
+
|
|
122
|
+
### 認証
|
|
123
|
+
|
|
124
|
+
| メソッド | パス | 説明 | 認証 | ステータス |
|
|
125
|
+
|---------|------|------|------|-----------|
|
|
126
|
+
| <!-- POST --> | <!-- /api/auth/login --> | <!-- ログイン --> | <!-- 不要 --> | <!-- 実装済み --> |
|
|
127
|
+
| <!-- POST --> | <!-- /api/auth/logout --> | <!-- ログアウト --> | <!-- 必要 --> | <!-- 実装済み --> |
|
|
128
|
+
| <!-- POST --> | <!-- /api/auth/refresh --> | <!-- トークンリフレッシュ --> | <!-- 不要(リフレッシュトークン必要) --> | <!-- 実装済み --> |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 共通レスポンス形式
|
|
133
|
+
|
|
134
|
+
<!--
|
|
135
|
+
全エンドポイントで統一するレスポンス形式
|
|
136
|
+
|
|
137
|
+
記載すべき内容:
|
|
138
|
+
- 成功時のレスポンス構造
|
|
139
|
+
- エラー時のレスポンス構造
|
|
140
|
+
- 主要なHTTPステータスコード
|
|
141
|
+
|
|
142
|
+
詳細な仕様(リクエスト/レスポンスの詳細なJSONスキーマ、
|
|
143
|
+
バリデーションルール、エラーコード定義)は OpenAPI/Swagger で管理します。
|
|
144
|
+
-->
|
|
145
|
+
|
|
146
|
+
### 成功レスポンス
|
|
147
|
+
|
|
148
|
+
**基本構造**:
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"data": { /* リソースデータ */ },
|
|
152
|
+
"meta": { /* メタデータ(ページネーション情報など) */ }
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**単一リソース取得の例**:
|
|
157
|
+
```json
|
|
158
|
+
{
|
|
159
|
+
"data": {
|
|
160
|
+
"id": 1,
|
|
161
|
+
"email": "user@example.com",
|
|
162
|
+
"name": "User Name",
|
|
163
|
+
"created_at": "2024-01-01T00:00:00Z"
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**リスト取得の例**:
|
|
169
|
+
```json
|
|
170
|
+
{
|
|
171
|
+
"data": [
|
|
172
|
+
{ "id": 1, "name": "User 1" },
|
|
173
|
+
{ "id": 2, "name": "User 2" }
|
|
174
|
+
],
|
|
175
|
+
"meta": {
|
|
176
|
+
"total": 100,
|
|
177
|
+
"limit": 20,
|
|
178
|
+
"offset": 0
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### エラーレスポンス
|
|
184
|
+
|
|
185
|
+
**基本構造**:
|
|
186
|
+
```json
|
|
187
|
+
{
|
|
188
|
+
"error": {
|
|
189
|
+
"code": "ERROR_CODE",
|
|
190
|
+
"message": "Human-readable error message"
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**バリデーションエラーの例**:
|
|
196
|
+
```json
|
|
197
|
+
{
|
|
198
|
+
"error": {
|
|
199
|
+
"code": "VALIDATION_ERROR",
|
|
200
|
+
"message": "Validation failed",
|
|
201
|
+
"details": [
|
|
202
|
+
{ "field": "email", "message": "Invalid email format" }
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### 主要なHTTPステータスコード
|
|
209
|
+
|
|
210
|
+
| ステータスコード | 説明 | 使用場面 |
|
|
211
|
+
|----------------|------|---------|
|
|
212
|
+
| **200 OK** | 成功 | GET, PUT, PATCH, DELETE の成功 |
|
|
213
|
+
| **201 Created** | リソース作成成功 | POST でのリソース作成成功 |
|
|
214
|
+
| **204 No Content** | 成功(レスポンスボディなし) | DELETE 成功時など |
|
|
215
|
+
| **400 Bad Request** | 不正なリクエスト | バリデーションエラー |
|
|
216
|
+
| **401 Unauthorized** | 認証エラー | トークン不正・期限切れ |
|
|
217
|
+
| **403 Forbidden** | 権限不足 | 認証済みだが権限不足 |
|
|
218
|
+
| **404 Not Found** | リソースが存在しない | 指定したIDのリソースが見つからない |
|
|
219
|
+
| **409 Conflict** | リソースの競合 | 既に存在するメールアドレスなど |
|
|
220
|
+
| **429 Too Many Requests** | レート制限超過 | リクエスト数が上限を超えた |
|
|
221
|
+
| **500 Internal Server Error** | サーバーエラー | サーバー内部エラー |
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# アーキテクチャ設計
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
何を書くか: システム全体の構造、採用アーキテクチャパターン、重要な設計決定(ADR)
|
|
5
|
+
|
|
6
|
+
目的:
|
|
7
|
+
- システム全体の見通しを向上
|
|
8
|
+
- コンポーネント間の関係を明確化
|
|
9
|
+
- アーキテクチャ決定の記録と共有
|
|
10
|
+
|
|
11
|
+
重要性:
|
|
12
|
+
- 高レベルなアーキテクチャの全体像を把握
|
|
13
|
+
- 詳細な実装仕様(スペック、パフォーマンス数値)はコードとインフラコードで管理
|
|
14
|
+
|
|
15
|
+
記載のポイント:
|
|
16
|
+
- システムアーキテクチャ図で視覚的に表現
|
|
17
|
+
- 採用したアーキテクチャパターンとその理由
|
|
18
|
+
- 重要な技術的決定事項(ADR)
|
|
19
|
+
|
|
20
|
+
更新頻度:
|
|
21
|
+
- プロジェクト初期にアーキテクチャ設計を作成
|
|
22
|
+
- アーキテクチャ変更時に更新
|
|
23
|
+
- 重要な技術的決定時に ADR を追加
|
|
24
|
+
-->
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## システムアーキテクチャ図
|
|
29
|
+
|
|
30
|
+
<!--
|
|
31
|
+
Mermaid を使用してシステム全体の構造を可視化
|
|
32
|
+
|
|
33
|
+
記載のベストプラクティス:
|
|
34
|
+
1. 主要なコンポーネントとその関係を記載
|
|
35
|
+
2. データフローを矢印で表現
|
|
36
|
+
3. 外部システムとの連携も記載
|
|
37
|
+
4. レイヤーごとに色分けまたはグループ化
|
|
38
|
+
5. 複雑な場合は複数の図に分割(全体図、詳細図)
|
|
39
|
+
|
|
40
|
+
よくあるコンポーネント:
|
|
41
|
+
- クライアント層: Webブラウザ、モバイルアプリ
|
|
42
|
+
- プレゼンテーション層: フロントエンド(React, Vue)
|
|
43
|
+
- API層: REST API, GraphQL
|
|
44
|
+
- ビジネスロジック層: サービス、ドメインモデル
|
|
45
|
+
- データアクセス層: ORM、リポジトリ
|
|
46
|
+
- データストア層: RDBMS, NoSQL, キャッシュ
|
|
47
|
+
- 外部サービス: 決済API、メール送信、認証サービス
|
|
48
|
+
- インフラ: ロードバランサー、CDN、キューシステム
|
|
49
|
+
|
|
50
|
+
Mermaid の記法:
|
|
51
|
+
- graph TD: 上から下へのフロー
|
|
52
|
+
- graph LR: 左から右へのフロー
|
|
53
|
+
- subgraph でグループ化
|
|
54
|
+
- []: 四角、(): 丸角四角、{}: ひし形、[()]: スタジアム型、[[]]: サブルーチン、[()]: 円柱
|
|
55
|
+
-->
|
|
56
|
+
|
|
57
|
+
```mermaid
|
|
58
|
+
graph TB
|
|
59
|
+
subgraph "クライアント層"
|
|
60
|
+
Web[Webブラウザ]
|
|
61
|
+
Mobile[モバイルアプリ]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
subgraph "CDN層"
|
|
65
|
+
CDN[CloudFront CDN]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
subgraph "ロードバランシング層"
|
|
69
|
+
LB[Application Load Balancer]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
subgraph "アプリケーション層"
|
|
73
|
+
API1[APIサーバー 1<br/>Node.js + Express]
|
|
74
|
+
API2[APIサーバー 2<br/>Node.js + Express]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
subgraph "キャッシュ層"
|
|
78
|
+
Cache[(Redis)]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
subgraph "データ層"
|
|
82
|
+
DB[(PostgreSQL<br/>Primary)]
|
|
83
|
+
DBRead[(PostgreSQL<br/>Read Replica)]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
subgraph "外部サービス"
|
|
87
|
+
Auth[認証サービス<br/>Auth0]
|
|
88
|
+
Payment[決済サービス<br/>Stripe]
|
|
89
|
+
Email[メール送信<br/>SendGrid]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
subgraph "ストレージ"
|
|
93
|
+
S3[Object Storage<br/>Amazon S3]
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
Web --> CDN
|
|
97
|
+
Mobile --> CDN
|
|
98
|
+
CDN --> LB
|
|
99
|
+
LB --> API1
|
|
100
|
+
LB --> API2
|
|
101
|
+
|
|
102
|
+
API1 --> Cache
|
|
103
|
+
API2 --> Cache
|
|
104
|
+
API1 --> DB
|
|
105
|
+
API2 --> DB
|
|
106
|
+
API1 --> DBRead
|
|
107
|
+
API2 --> DBRead
|
|
108
|
+
|
|
109
|
+
API1 --> Auth
|
|
110
|
+
API2 --> Auth
|
|
111
|
+
API1 --> Payment
|
|
112
|
+
API2 --> Payment
|
|
113
|
+
API1 --> Email
|
|
114
|
+
API2 --> Email
|
|
115
|
+
|
|
116
|
+
API1 --> S3
|
|
117
|
+
API2 --> S3
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**補足**:
|
|
121
|
+
<!-- 例:
|
|
122
|
+
- クライアントからのリクエストは CDN を経由してキャッシュ可能な静的コンテンツを配信
|
|
123
|
+
- API層は水平スケール可能(オートスケーリング)
|
|
124
|
+
- データベースは Primary/Replica 構成で読み取り負荷を分散
|
|
125
|
+
- Redis でセッション管理とキャッシュを実現
|
|
126
|
+
- 外部サービスとの連携は API Gateway 経由で統一
|
|
127
|
+
-->
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 採用アーキテクチャパターン
|
|
132
|
+
|
|
133
|
+
<!--
|
|
134
|
+
採用したアーキテクチャパターンとその理由を簡潔に記載
|
|
135
|
+
|
|
136
|
+
よくあるアーキテクチャパターン:
|
|
137
|
+
- Layered Architecture: プレゼンテーション層 → ビジネスロジック層 → データアクセス層
|
|
138
|
+
- Clean Architecture: ドメイン中心、依存性逆転
|
|
139
|
+
- Microservices: サービスごとに独立したデプロイ
|
|
140
|
+
- Event-Driven: 非同期処理、疎結合
|
|
141
|
+
|
|
142
|
+
記載すべき内容:
|
|
143
|
+
- 採用パターン名
|
|
144
|
+
- 選定理由(なぜこのパターンが適しているか)
|
|
145
|
+
- 適用範囲
|
|
146
|
+
-->
|
|
147
|
+
|
|
148
|
+
| 項目 | 内容 |
|
|
149
|
+
|------|------|
|
|
150
|
+
| **採用パターン** | <!-- 例: Layered Architecture(レイヤードアーキテクチャ) --> |
|
|
151
|
+
| **選定理由** | <!-- 例: チームサイズが小規模なため、シンプルで運用コストの低いアーキテクチャを選択 --> |
|
|
152
|
+
| **適用範囲** | <!-- 例: バックエンド全体 --> |
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## ADR(Architecture Decision Record)
|
|
157
|
+
|
|
158
|
+
<!--
|
|
159
|
+
重要なアーキテクチャ決定を記録
|
|
160
|
+
|
|
161
|
+
ADR とは:
|
|
162
|
+
- アーキテクチャに関する重要な決定を記録
|
|
163
|
+
- 「なぜその決定をしたか」の背景を残す
|
|
164
|
+
- 将来的な見直しや移行の判断材料
|
|
165
|
+
|
|
166
|
+
記載すべき内容:
|
|
167
|
+
- 決定事項: 何を決めたか
|
|
168
|
+
- 背景: なぜその決定が必要だったか
|
|
169
|
+
- 代替案: 他の選択肢
|
|
170
|
+
- 影響: その決定による影響
|
|
171
|
+
- 決定日: いつ決定したか
|
|
172
|
+
|
|
173
|
+
よくある決定事項:
|
|
174
|
+
- データベースの選択
|
|
175
|
+
- キャッシュ戦略
|
|
176
|
+
- 認証方式
|
|
177
|
+
- デプロイ戦略
|
|
178
|
+
-->
|
|
179
|
+
|
|
180
|
+
| 決定事項 | 背景 | 代替案 | 影響 | 決定日 |
|
|
181
|
+
|---------|------|--------|------|--------|
|
|
182
|
+
| <!-- 例: PostgreSQL を採用 --> | <!-- 例: ACID準拠のトランザクションが必要 --> | <!-- 例: MySQL, MongoDB --> | <!-- 例: データ整合性が高い --> | <!-- 例: 2024-01-05 --> |
|
|
183
|
+
| <!-- 例: Redis をセッション管理に使用 --> | <!-- 例: ステートレスな API サーバーを実現 --> | <!-- 例: DB保存, JWT のみ --> | <!-- 例: セッション管理が高速 --> | <!-- 例: 2024-01-10 --> |
|