Skip to content

/mypage 失敗通知 Slack 連携 E2E手順 ​

目的 ​

求職者向け /mypage/:token のスケジュール操作で以下を確認する。

  • 画面上でエラーメッセージ(トースト/表示)が出る
  • フロントから /api/v1/public/candidates/:token/schedule-errors が呼ばれる
  • バックエンドから Slack Webhook へ通知される

前提 ​

  • SLACK_WEBHOOK_URL が有効値で設定されている
  • Backend が起動している(http://127.0.0.1:8787)
  • Frontend が起動している
  • テスト用の有効な public_token を1つ用意している
  • Slack 側で通知先チャンネルを確認できる

起動 ​

bash
# backend
npm run dev --workspace=backend

# frontend(別ターミナル)
npm run dev --workspace=frontend

http://localhost:3000/mypage/<public_token> を開き、スケジュール タブへ移動する。


1. GET失敗の通知確認(Queryエラー) ​

手順 ​

  1. ブラウザDevToolsを開く
  2. Network request blocking に次を追加して有効化する
    */api/v1/public/candidates/*/schedules*
  3. /mypage の スケジュール タブを再読み込みする

期待結果 ​

  • 画面にエラー表示
    エラーが発生しました。時間をおいて再試行してください。
  • schedule-errors への POST が発生し、202 が返る
  • schedule-errors リクエストBodyに以下が含まれる
    • source: "query"
    • message: "エラーが発生しました。時間をおいて再試行してください。"
  • Slack に /mypage スケジュールエラー通知 が届く

確認後、request blocking は無効化する。


2. 更新失敗の通知確認(Mutationエラー) ​

手順(簡易: ネットワーク失敗を意図的に作る) ​

  1. DevTools の request blocking に次を追加して有効化
    */api/v1/public/candidates/*/schedules/*
  2. 既存の「空き」スケジュールを1件開き、削除を実行する
    空き枠がない場合は先に1件作成してから削除操作する

期待結果 ​

  • トーストが表示される
    • 例: エラーが発生しました。時間をおいて再試行してください。
  • schedule-errors への POST が発生し、202 が返る
  • schedule-errors リクエストBodyに以下が含まれる
    • source: "mutation"
  • Slack に通知が届く

確認後、request blocking は無効化する。


3. 429(レート制限)の通知確認 ​

分単位制限(20回/分)を先に消費し、次のUI操作で 429 を発生させる。

手順 ​

  1. 以下で同一トークンに対して POST /schedules を20回実行する
bash
TOKEN="<public_token>"
for i in $(seq 1 20); do
  curl -s -o /dev/null -w "%{http_code}\n" \
    -X POST "http://127.0.0.1:8787/api/v1/public/candidates/${TOKEN}/schedules" \
    -H "Content-Type: application/json" \
    -d '{"start_time":"2026-02-09T10:00:00+09:00","end_time":"2026-02-09T11:00:00+09:00","adaptability":"どちらも可"}'
done
  1. 1分以内に /mypage 画面から空き時間の作成または削除を1回実行する

期待結果 ​

  • UIにレート制限メッセージ
    • アクセスが集中しています。しばらく待ってから再試行してください。
  • schedule-errors への POST が発生し、202 が返る
  • schedule-errors リクエストBodyに以下が含まれる
    • source: "mutation"
    • code: "RATE_LIMITED"
  • Slack に通知が届く

4. Slack送信成功の確認ポイント ​

DevTools で schedule-errors リクエストを開き、Response が次であること:

json
{ "data": { "success": true, "skipped": false } }
  • success: true = Webhook送信成功
  • skipped: true = SLACK_WEBHOOK_URL 未設定などで送信未実行

5. 空き時間登録の通知確認(正常系) ​

エラーではなく「求職者が空き時間を入れた」ことを業務側へ知らせる通知。 エラー通知と違いバックエンドが直接送るので、フロントの schedule-errors は関与しない。

前提 ​

  • SLACK_SCHEDULE_WEBHOOK_URL(未設定なら SLACK_WEBHOOK_URL)が有効値
  • 対象求職者に、直近30分以内に作成された「空き」が残っていないこと
    (残っていると連投抑制が働き、通知されないのが正しい挙動)

手順 ​

  1. /mypage/<public_token> の スケジュール タブでカレンダーをドラッグし、空き時間を1件登録する
  2. 続けてもう1件登録する

期待結果 ​

  • 1件目の登録直後に Slack へ1通届く

見出し行の下に、青いアクセントバー(#2f6fed)付きのカードが1枚ぶら下がる。

:calendar: [BUSON] /mypage 空き時間が登録されました — 山田 太郎
┃ 山田 太郎  ID: 123          ← 氏名は求職者詳細へのリンク
┃
┃ 登録枠                        面談形式
┃ 2026/08/27(木) 10:00〜11:00   どちらも可
┃
┃ 現在の空き時間
┃ 1件
┃
┃ [ 求職者詳細を開く ]
┃
┃ 企業との日程調整をお願いします(直近30分の追加登録はこの1通にまとめています)
  • 2件目では通知が飛ばない(30分の時間窓で先頭1件だけが通知役になるため)
  • APP_BASE_URL 未設定なら氏名のリンクと「求職者詳細を開く」ボタンが出ない
  • adaptability 未設定なら「面談形式」の列が出ない
  • 見出し行(プッシュ通知にもそのまま出る)に求職者名が付く
  • 「現在の空き時間」は今後の枠だけを数える(過去の空き行は含めない)
  • Block Kit を解釈しないクライアント(古いモバイル・メール通知)では attachment の fallback に入れた素のテキストが出る
  • 通知に失敗してもスケジュール登録自体は 201 で成功する。失敗はサーバログに残る
NOTIFICATION_EVENT {"event":"PUBLIC_SCHEDULE_SUBMISSION_SLACK_NOTIFY_FAILED", ...}

補足(直接送信確認) ​

UIを使わず通知経路だけ確認する場合:

bash
curl -i -X POST \
  "http://127.0.0.1:8787/api/v1/public/candidates/<public_token>/schedule-errors" \
  -H "Content-Type: application/json" \
  -d '{"source":"mutation","code":"RATE_LIMITED","message":"実送信テスト"}'

202 と {"data":{"success":true,"skipped":false}} が返れば送信成功。