フィードバック記録
メソッド
RESTメソッドを採用しています。
HTTPメソッド
POST: 完了した wf2des 生成に対するデザイナーのフィードバックを記録する。
フィードバックは記録のみです。wf2des 行に feedbackStatus を刻印し、生成されたデザインがどのように受け入れられたか(利用前に手動で修正されたか、そのまま採用されたか)を利用者が確認できるようにします。SQSメッセージは送信されず、webhook も発火せず、後続の生成実行もトリガーされません。生成そのものは変更されません。
命名規則
一貫性と可読性を確保するため、リクエストとレスポンスのJSONノードにはcamelCaseを使用します。SQSペイロードのノードにはsnake_caseを使用します。
リクエストとレスポンス
ヘッダー
メタ情報はレスポンスボディではなく、HTTPヘッダーに設定されます。
リクエストヘッダー
AuthorizationContent-TypeAcceptAccept-language
レスポンスヘッダー
Content-Type
フィードバック記録
URI
パスパラメータ
| Name | Type | Required | Description |
|---|---|---|---|
| organization_id | integer | Required | 組織ID |
| project_id | integer | Required | プロジェクトID |
| wf2des_id | string | Required | wf2des ID |
リクエストボディ
リクエストボディはJSONです。
リクエストパラメータ
| Name | Type | Required | Description |
|---|---|---|---|
| feedbackStatus | string (enum) | Required | 生成されたデザインがどのように受け入れられたか。"0" fixed(手動修正後に採用)/ "1" adopted(そのまま利用)。それ以外の値は400。 |
このエンドポイントが運ぶのはフラグのみです。フィードバックの詳細(
{status, changed_nodes[], diff_url, at, by})は、このエンドポイントが呼び出される前に、プラグインによってwf2des-apiへ直接(POST /internal/wf2des/{wf2des_id}/feedback)書き込まれます — 詳細を先に・フラグを後に(detail first, flag last)。詳細がこのエンドポイントを通ることは決してありません(バックエンドのサービストークンはデータプレーンに対して read-only です)。処理フローを参照してください。
レスポンス
レスポンスはJSONです(HTTPステータス: 200 OK)。
{
"wf2desId": "8f14e45f-ceea-467d-9a3e-1b2c3d4e5f60",
"status": "1",
"phase": null,
"feedbackStatus": "0",
"attempt": 1,
"recordedAt": "2026-07-10T09:30:00Z"
}
レスポンスフィールド
| Name | Type | Description |
|---|---|---|
| wf2desId | string | wf2des ID |
| status | string (enum) | 生成ステータス — フィードバックでは変更されません。フィードバックは完了した実行("1")に対してのみ記録されます。 |
| phase | string | null | 生成フェーズ — 完了した実行では null(フィードバックはこれに触れません)。 |
| feedbackStatus | string (enum) | 刻印された値 — "0" fixed / "1" adopted。 |
| attempt | integer | 実行のフェンシングカウンタ(フィードバックでは変更されません)。 |
| recordedAt | string | feedback_status が刻印されたときの ISO 8601 タイムスタンプ(updatedAt のミラー)。 |
ステータス / フェーズの enum(wf2des 行):
status:"0"processing ·"1"completed ·"2"failed ·"3"rejected ·"4"cancelledphase(status "0"内、終了状態になるとnull):"0"parse ·"1"awaiting_confirm ·"2"assemblefeedbackStatus:"0"fixed ·"1"adopted
フィードバックは最終書き込みによる冪等(idempotent by last-write)です。フィードバックを再記録すると、以前の feedbackStatus が上書きされ(プラグインは同じ方法で wf2des-api を介して詳細を再書き込みします)、現在の値とともに 200 OK を返します。
認証
認証は Amazon Cognito が発行する JSON Web Token(JWT)を使用して実行されます。
プロジェクトへの Write アクセス権を持つ認証済みセッションであれば、フィードバックを記録できます — 生成をトリガーしたセッションに限定されません。フィードバックの詳細は、このエンドポイントが行を刻印する前に、プラグインによって wf2des-api データプレーンを介して design_generation_result ドキュメントに書き込まれます。
例外処理
例外処理のステータスコードは以下の通りです。
| Description | Status Code | Status Name |
|---|---|---|
feedbackStatus の欠落または無効(不在、または "0" / "1" 以外) |
400 | Bad Request |
| 認証情報の欠落 | 401 | Unauthorized |
| 権限不足 | 403 | Forbidden |
| wf2des、プロジェクト、または組織が見つかりません | 404 | Not Found |
| 内部サーバーエラー | 500 | Internal Server Error |
フィードバックは完了した実行(status "1")に対してのみ受け付けられます。完了していない行はフィードバックの観点では見つからないものとして扱われ、404 を返します — processing、failed、rejected、または cancelled の生成に対してフィードバックは意味を持ちません。
処理フロー
バックエンドが wf2des PostgreSQL 行を所有し、唯一の書き込み者です。フィードバックの記録は、バックエンド側で適用される単一のdetail-first-flag-lastシーケンスです — worker は PostgreSQL の認証情報を保持せず、一切関与しません。SQSメッセージは送信されず、webhook も発火せず、後続の実行もトリガーされません。エンドポイントは完了した行とその結果ドキュメントに注釈を付けるだけです。
- パスパラメータから組織ID、プロジェクトID、
wf2des_idを抽出し、リクエストボディからfeedbackStatusを抽出する。 - ユーザーがプロジェクトへの Write アクセス権を持つことを確認する。
feedbackStatus("0"fixed /"1"adopted)を検証し、不在または不明な値の場合は 400 を返す。wf2des行をロードする。存在しない、ソフト削除されている、またはorganization_id/project_idがパスと一致しない場合は 404 を返す。- 行が
status "1"completed であることを確認する。それ以外の状態の場合は 404 を返す(フィードバックは完了した実行にのみ適用される)。 - Detail first(前提条件)。 フィードバックの詳細 —
feedbackブロック({status, changed_nodes[], diff_url, at, by}、artifact_urls.feedback_diffから参照)— は、この呼び出しの前にプラグインによってwf2des-apiへ直接書き込み済みである。詳細をフラグより先に書くことで、フラグが立った行には常にフィードバック詳細が存在することが保証される。このエンドポイントは詳細を受け付けることも永続化することもない。 - Flag last。 1つの PostgreSQL トランザクションで
wf2des行にfeedback_statusを刻印する(updated_at/updated_byも刻印)。status、phase、attemptは変更されない。 - 刻印された
feedbackStatusとともに行を返す。
再記録すると、以前の詳細ドキュメントが上書きされ、feedback_status が再刻印される(last-write-wins)。フィードバックは記録のみであるため、attempt に対する compare-and-set はありません — フラグは、完了した実行に対して記録された最新のフィードバックを単に反映するだけです。
詳細フローチャート
flowchart TD
Start([POST /feedback]) --> Auth[Auth & Parameter Extraction]
Auth --> Service[Service Layer]
Service --> AccessCheck[Access Check]
AccessCheck --> HasAccess{Write Access?}
HasAccess -->|No| Err403[403 Forbidden]
HasAccess -->|Yes| Validate[Validate Body<br/>feedbackStatus '0' fixed / '1' adopted]
Validate --> BodyValid{Valid?}
BodyValid -->|No| Err400[400 Bad Request]
BodyValid -->|Yes| LoadRow[Load wf2des Row<br/>WHERE id = :wf2des_id]
LoadRow --> RowExists{Exists &<br/>org/project match?}
RowExists -->|No| Err404[404 Not Found]
RowExists -->|Yes| Completed{status '1'<br/>completed?}
Completed -->|No| Err404
Completed -->|Yes| DetailNote[Detail precondition<br/>the plugin has already written the<br/>feedback detail via wf2des-api]
DetailNote --> FlagLast[Flag last<br/>stamp feedback_status in one PG txn<br/>status / phase / attempt untouched]
FlagLast --> FlagResult{Success?}
FlagResult -->|No| Err500[500 Internal Server Error]
FlagResult -->|Yes| Success[200 OK<br/>row with feedbackStatus stamped]