- Notifications
You must be signed in to change notification settings - Fork 1
Open
Labels
Description
イベント申し込みキャンセル機能実装
概要
- 認証済みユーザーが申し込み済みのイベントをキャンセルできる機能を実装する。
- ユーザーの利便性向上と、予定変更・急用等への柔軟な対応を可能にする。
目的
- ユーザーが申し込み後に予定変更した場合の対応
- 誤申し込みやダブルブッキングの解決
- 定員管理の柔軟性向上
- ユーザー体験の大幅改善
背景
現在のシステムでは、一度イベントに申し込むとキャンセルができず、以下の問題が発生している:
- 急用や予定変更への対応不可
- 誤申し込み時の修正手段なし
- 定員に達したイベントでのキャンセル待ち機能なし
- ユーザーの利便性が低い
実際のイベント管理サービス(connpass等)では申し込みキャンセル機能は標準機能として提供されており、本アプリでも必須の機能と判断。
実装内容
1. バックエンドAPI
- キャンセルAPI実装(
DELETE /api/events/[id]/cancel) - ユーザー申し込み履歴取得API(
GET /api/user/registrations) - 権限チェック(申し込み者本人のみキャンセル可能)
- 定員数の自動更新
- データ整合性の確保
2. メール通知機能
- キャンセル完了メール(申し込み者へ)
- キャンセル通知メール(イベント作成者へ)
- メールテンプレートの作成
3. フロントエンドUI
- ユーザーの申し込み履歴ページ
- キャンセルボタンとモーダル
- キャンセル確認ダイアログ
- イベント詳細ページでのキャンセル機能
- 申し込み状況の動的更新
4. UX改善
- キャンセル理由の選択(オプション)
- キャンセル期限の設定(イベント開始前のみ等)
- 申し込み・キャンセル履歴の表示
- Toast通知による操作フィードバック
技術的詳細
API設計例
キャンセルAPI
// DELETE /api/events/[id]/cancel export async function onRequest(context: RequestContext) { // 1. 認証チェック // 2. 申し込み状況確認 // 3. キャンセル処理実行 // 4. 定員数更新 // 5. メール通知送信 }申し込み履歴API
// GET /api/user/registrations export async function onRequest(context: RequestContext) { // 1. 認証チェック // 2. ユーザーの申し込み履歴取得 // 3. イベント情報と結合 // 4. キャンセル可能フラグ付与 }データベース更新
-- attendees テーブルに status カラム追加検討 ALTER TABLE attendees ADD COLUMN status TEXT DEFAULT 'registered'; -- 'registered', 'cancelled' 等の状態管理 -- または論理削除での実装 ALTER TABLE attendees ADD COLUMN cancelled_at INTEGER;フロントエンド実装例
// ユーザー申し込み履歴表示 function MyRegistrations() { const { data: registrations } = useQuery({ queryKey: ['user-registrations'], queryFn: getUserRegistrations, }); const cancelMutation = useMutation({ mutationFn: cancelEventRegistration, onSuccess: () => { toast.success('申し込みをキャンセルしました'); queryClient.invalidateQueries(['user-registrations']); }, }); return ( <div> {registrations?.map(reg => ( <EventRegistrationCard key={reg.id} registration={reg} onCancel={() => cancelMutation.mutate(reg.event_id)} /> ))} </div> ); }ユーザーストーリー
基本フロー
1. ユーザーがマイページで申し込み済みイベント一覧を確認 2. キャンセルしたいイベントの「キャンセル」ボタンをクリック 3. 確認ダイアログで理由を選択(オプション) 4. 「キャンセル確定」で処理実行 5. キャンセル完了の通知とメール送信 6. イベント詳細ページで定員数が更新される エラーケース
- イベント開始後のキャンセル不可 - 既にキャンセル済みの場合 - 申し込んでいないイベントのキャンセル試行 - 権限のないユーザーによる操作 受け入れ基準
- 認証済みユーザーが申し込み済みイベントをキャンセルできる
- キャンセル後、定員に空きが生まれる
- キャンセル完了時にメール通知が送信される
- 申し込み履歴でキャンセル状況が確認できる
- 不正なキャンセル操作は適切にエラーハンドリングされる
- イベント詳細ページの参加者数が正確に更新される
- UXに配慮した確認フローが実装されている
依存関係
前提条件
- Issue イベント申し込み・キャンセル機能の実装 #5 ✅ (イベント申し込み機能)
関連Issue
- Issue ユーザープロフィールページ・ユーザー情報の編集機能実装 #18 (ユーザープロフィールページ) - 申し込み履歴表示で連携
制約事項
- イベント開始後のキャンセルは不可
- キャンセル期限はイベント開始24時間前まで(設定可能)
- 1つのイベントに対して何度も申し込み・キャンセルを繰り返すことの制限検討
テスト計画
- 正常系:申し込み→キャンセルの一連フロー
- 異常系:権限なし、期限切れ、重複操作等
- 定員管理:キャンセル後の定員数更新確認
- メール送信:各種通知メールの送信確認
- UI/UX:操作フローの直感性確認
見積もり
実装時間: 1-2日
テスト時間: 半日
ブランチ
feature/event-registration-cancel