# n8n 問い合わせ振り分けポートフォリオ

この成果物は、n8nのWebhook、Code、IF、HTTP Request、Respond to Webhookを使った合成データラボ。顧客案件の実績ではない。実在する個人情報、資格情報、外部SaaSを使わない。

## 処理

1. Webhookで問い合わせを受ける。
2. Code nodeで`case_id`、件名、本文を検証・正規化する。
3. IF nodeで正常系と入力不正を分ける。
4. HTTP Request nodeから内部モックAPIへ振り分け結果を送る。
5. 一時的な503は最大3回まで再試行する。
6. `case_id`を冪等キーとして重複作成を防ぐ。
7. 入力不正は400、上流障害は502、受付完了は202で返す。

## 公開成果物

- `workflow.json`: n8n 2.33.7からexportしたinactiveなworkflow。資格情報なし。
- `summary.json`: 実測HTTPステータス、正常、再試行、重複、上流障害、入力不正の検証結果、全監査イベント。
- `SHA256SUMS`: workflow.jsonとsummary.jsonのSHA-256。

## 再現

Docker、Docker Compose、Node.js 22以上、jq、pnpmを用意する。リポジトリのルートで次を実行する。

```sh
AUTOMATION_NOTE_RUN_ID=portfolio-local pnpm lab:n8n-portfolio
```

専用Composeは外部ネットワークへ接続しない。n8nと内部モックAPIだけを同じinternal networkへ置き、各HTTP通信を5秒で打ち切る。成功・失敗を問わず終了時にコンテナ、network、volumeを削除する。公開出力とraw応答・n8n export原本は別ディレクトリへ分離する。

## 実サービスへ置き換えるとき

- `PORTFOLIO_MOCK_API_URL`を実APIのURLへ置き換える。
- APIキーをworkflowへ直書きせず、n8n Credentialへ登録する。
- WebhookへHeader AuthまたはJWT Authを設定する。
- 個人情報の保存場所、保存期間、削除、権限、監査を合意する。
- 相手APIが状態変更を伴う場合、再試行前に冪等キー対応を確認する。
- 同時実行時の一意性はDB制約で担保する。

## 限界

- 合成データだけを使う。
- 顧客案件の実績ではない。
- 外部ネットワークへ接続しない。
- AI分類、外部SaaS認証、本番負荷、長期運用、並列実行、SLAは未検証。
- 共通ベンチの問い合わせ100件を測定した結果ではない。
