スターターアプリ

予約機能

同時実行に安全な hold、Stripe checkout、email、calendar を持つ opt-in 予約を有効化します。

スターターのコミット 7d452a6 と同期済みです。

予約は既定で無効です。src/config/reservations.ts に service catalog、IANA timezone、営業時間、価格/deposit、Stripe webhook、email policy を定義してから NEXT_PUBLIC_FEATURE_RESERVATIONS_ENABLED=true にします。demo auto-seed も無効で本番依存は禁止です。

API は GET /api/reservations/servicesPOST /api/reservations/availability、冪等 POST /api/reservationsGET /api/reservations/mine。UI は /:locale/reserve/:locale/account/reservations です。

checkout は DB lock 内で 35 分 hold と Stripe Session を一度作り、同じ Idempotency-Key を安全に replay します。advisory lock と exclusion constraint が同時 hold/confirmed の重複を防ぎます。支払い確定は検証済み webhook だけで、return page では行いません。期限切れは該当 session の hold だけ解放します。

確定時は ICS email を enqueue し Google Calendar link を提供します。同時予約、重複、放棄、遅延支払い、timezone/DST、deposit/full、email retry、組織 scope をテストします。

予約機能 · Sushi SaaS