feat(healthcheck-survey-bot): HC-WAワークフローを60ノードから14ノードへ全面リビルド

分岐ロジック・Pleasanter/LINEWORKS API呼び出しをCodeノードへ集約する新ルールに
合わせて再構築。IF/JWT/Execute Workflow/Data Tableは専用ノードのまま維持しつつ、
業務ロジックは4つのCodeノードに集約した。デプロイ・n8n API呼び出しは未実施。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Kenichiro NOGI 2026-09-05 18:29:30 +09:00
parent c8ce15385a
commit 83d568a493
2 changed files with 193 additions and 1948 deletions

View File

@ -58,8 +58,29 @@ Task 5processFlow.jsの`getValidationColumnNames`はこの構造(`proces
- デプロイ・活性化はサブエージェントのBashサンドボックスが実APIキー使用を一律ブロックしたためコントローラーが直接実行した詳細: `task-10-report.md`
- ワークフロー `HC-WA: LINEWORKS応答受信`: **ローカルJSON作成のみ、n8n未デプロイ**id未採番
- ファイル: `workflows/hc-wa-lineworks-response.json`45ード、Webhook `healthcheck-lineworks-response` 唯一の受信口、`awaitInput`(none/date/file)3分岐のSwitch構成
- ファイル: `workflows/hc-wa-lineworks-response.json`
- **プロジェクト全体のn8nワークフロー構築ルール2026-09-05改訂に合わせて14ード構成で全面リビルド。旧60ード版個別キーごとのData Table/HTTP Requestードを積み上げ、awaitInput分岐をSwitch+各分岐に案内送信一式を重複配置した構成)はこのタスクでの再構築に伴い置き換えた。**IF・JWT・Execute Workflow・Data Tableは各ルールに従い専用ードのままだが、それらは機械的に必要な最小限IF×2, JWT×1, Execute Workflow×1, Data Table×3であり、本来Codeードに集約可能な分岐ロジック・Pleasanter/LINEWORKS API呼び出しはすべて4つのCodeードに集約したブリーフの目安「11ード」に対し実際は14ードだが、これはIF/JWT/Execute Workflowを専用ードに保つというルール自体が要求する固定オーバーヘッドであり、60ードからの削減という趣旨は達成している
- 本タスクの担当範囲はワークフローJSONのローカル作成・検証までで、n8n Public APIの呼び出しデプロイ・activateは一切実施していない。コントローラー側での`node scripts/deploy-workflow.js workflows/hc-wa-lineworks-response.json`実行後、実際のワークフローIDをこの行に追記すること
- 秘密情報・SiteId等はすべて`workflow_config_values``bNkadTyDgDepYx2p`)から`Data Table`ードで取得し式参照。ワークフローJSONに秘密値のハードコードなし
- 未検証の暫定実装あり(詳細は`task-11-report.md`: ①Data Table `update`操作のパラメータ形状get/insertは実機確認済みだが、updateは本タスクで初採用のため未検証、②Switchード(typeVersion 3)の`rules.values[].outputKey`スキーマ、③`/api/users/get`をWhere無しで呼んだ場合のレスポンス形状配列/`.Value`/単一オブジェクトいずれにも対応する防御的実装)、④`api/items/{SiteId}/get`ColumnFilterHash検索のレスポンス形状、⑤LINEWORKSファイル添付のダウンロード/Pleasanterアップロードのエンドポイントブリーフ記載どおり実装時にPleasanter公式マニュアルapi-attachment系で要確認のプレースホルダー
- ード構成14ード:
1. `Webhook``healthcheck-lineworks-response`, `rawBody:true`
2. `Data Table`「設定値一括取得」: `workflow_config_values`を`filters`無し・`returnAll:true`で一括取得
3. `Code`「署名検証・対象レコード特定」: HMAC-SHA256署名検証、対象者メール→PleasanterUserId解決、508971の対象レコード検索`ColumnFilterHash`までを1ードに集約。0件/複数件はthrow自動判定しない
4. `Data Table`「待機状態取得」: `healthcheck_bot_state`から該当resultIdの行を取得
5. `Code`「分岐処理・アクション決定」: `awaitInput`none/date/file、または待機状態自体が無い場合に応じた分岐ロジック全体を1ードに集約。`action`execute/send/errorと次の待機状態`nextAwaitInput`/`nextAwaitProcessId`/`nextAwaitColumn`を1つのJSONオブジェクトとして出力する
6. `Data Table`「状態更新」: 5の出力を使い`healthcheck_bot_state`を無条件で`update`
7. `IF`「action==execute」: true→8、false→9
8. `Execute Workflow`「HC-SUB実行」Task 9, `XRqcykbG2LuAjGG2`→13
9. `IF`「action==send」: true→10、false→14
10. `Code`「JWTクレーム組み立て」: 484184からのBotId解決とJWTクレーム・LINEWORKSメッセージ内容の組み立てを1ードに集約
11. `JWT`「Sign JWT」`operation:sign`, `RS256`, Credential: 「LINEWORKS Bot Private Key (v4)」`Hw0qlEaGfLPnQWp1`
12. `Code`「アクセストークン取得・LINEWORKS送信」: LINEWORKSアクセストークン取得とメッセージ送信を1ードに集約→13
13. `Respond to Webhook(成功)`: 8と12の両方から接続される共有の成功応答ード
14. `Respond to Webhook(異常系)`: 9のfalse分岐action=="error")専用
- **分岐ノードの出力の流れ方(設計上の重要ポイント)**: ード5は「今回どうするかaction/processId/messageText」と「次に書き込む待機状態next*」を1つの出力オブジェクトにまとめて返す。ード6状態更新ード5の直接の後続ードなのでそのまま`$json.next*`を参照して無条件更新するが、ード6通過後の`$json`はData Table Updateの返り値更新後の行データに置き換わり、ード5の`action`/`processId`/`messageText`等は失われる。そのため、ード7以降IF・Execute Workflow・JWTクレーム組み立て・Respond to Webhook(異常系))はすべて裸の`$json`ではなく`$('分岐処理・アクション決定').item.json...`とード名を明示して参照しているHC-SUBの`$('Execute Workflow Trigger').item.json`と同じ規約)
- 秘密情報・SiteId等はすべて`workflow_config_values``bNkadTyDgDepYx2p`から「設定値一括取得」1ードで取得し、直後のCodeードで`configKey`→`configValue`のMapに変換して参照。ワークフローJSONに秘密値のハードコードなし
- 未検証・要判断の暫定実装・既知の未実装あり(詳細は`task-11-rebuild-report.md`:
①Data Table `update`操作のパラメータ形状get/insertは実機確認済みだが、updateは本タスクで初採用のため未検証、ブリーフ記載のサンプル形状をそのまま採用
②`/api/users/get`・`api/items/{SiteId}/get`ColumnFilterHash検索のレスポンス形状はHC-SUB・旧WA版と同じ想定を踏襲
③484184(`LINEWORKS_BOT_MASTER_SITE_ID`)からのBotId解決ロジックはHC-SUBと同じ暫定実装`SiteSettings.BotIds`または`Processes[].BotId`を仮定)
④**LINEWORKSファイル添付`awaitInput:"file"`分岐)の実処理は未実装。** ファイルダウンロード(`GET /v1.0/bots/{botId}/attachments/{fileId}`にはLINEWORKS Bot APIのアクセストークンが必要だが、JWT署名は専用のJWTードード11、action=="send"経路にのみ存在しード5より後段でしか行えないため、ード5内ではトークンを取得する手段がない。現状はこのケースを検出すると`action:"send"`でユーザーに「準備中」メッセージを返し、待機状態は`file`のまま維持するユーザーが詰まらないための安全側実装。実装するにはグラフ構成の見直しファイル受信専用のJWT/Tokenペアを追加する等が必要で、フォローアップタスクで対応すること
- 設計上の注記: HC-SUBTask 9が`healthcheck_bot_state`に保存する`pendingProcesses`は`{processId, label, tooltip}`のみで`ValidateInputs`を持たないため、none分岐での`classifyAwaitInput`実行時はHC-WA内で`サイト設定取得`(getsite)を再実行し、ProcessId一致でフルのProcess定義を引き直す設計にしたTask 9側のファイルは変更していない

File diff suppressed because one or more lines are too long