Appearance
/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=frontendhttp://localhost:3000/mypage/<public_token> を開き、スケジュール タブへ移動する。
1. GET失敗の通知確認(Queryエラー)
手順
- ブラウザDevToolsを開く
- Network request blocking に次を追加して有効化する
*/api/v1/public/candidates/*/schedules* /mypageのスケジュールタブを再読み込みする
期待結果
- 画面にエラー表示
エラーが発生しました。時間をおいて再試行してください。 schedule-errorsへのPOSTが発生し、202が返るschedule-errorsリクエストBodyに以下が含まれるsource: "query"message: "エラーが発生しました。時間をおいて再試行してください。"
- Slack に
/mypage スケジュールエラー通知が届く
確認後、request blocking は無効化する。
2. 更新失敗の通知確認(Mutationエラー)
手順(簡易: ネットワーク失敗を意図的に作る)
- DevTools の request blocking に次を追加して有効化
*/api/v1/public/candidates/*/schedules/* - 既存の「空き」スケジュールを1件開き、削除を実行する
空き枠がない場合は先に1件作成してから削除操作する
期待結果
- トーストが表示される
- 例:
エラーが発生しました。時間をおいて再試行してください。
- 例:
schedule-errorsへのPOSTが発生し、202が返るschedule-errorsリクエストBodyに以下が含まれるsource: "mutation"
- Slack に通知が届く
確認後、request blocking は無効化する。
3. 429(レート制限)の通知確認
分単位制限(20回/分)を先に消費し、次のUI操作で 429 を発生させる。
手順
- 以下で同一トークンに対して
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分以内に
/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分以内に作成された「空き」が残っていないこと
(残っていると連投抑制が働き、通知されないのが正しい挙動)
手順
/mypage/<public_token>のスケジュールタブでカレンダーをドラッグし、空き時間を1件登録する- 続けてもう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}} が返れば送信成功。