DEEP GUIDE 01
本人確認の申請から審査まで
顧客の申請と管理者の審査を、状態の変化として追う。
このガイドで追う一件
未確認の顧客が本人確認を申請し、管理者が承認する一件を考えます。申請をもう一度押した場合と、承認済みの顧客が再申請した場合も比べます。
コードを読む順番
以下は MiniBank v1.0.0 の確認先です。マイグレーションは順に適用されるため、関数の最終形を調べるときは後続の変更も確認してください。
- 1
顧客が申請する
顧客向け API はログイン中の利用者を確認し、CustomerService の submitKycApplication を呼びます。画面のボタンだけで状態を決めず、サーバー側へ渡します。
確認するファイル
src/app/api/v1/customers/me/kyc-submit/route.ts - 2
状態を pending に移す
submit_kyc_application は顧客行をロックし、not_started または rejected から pending へ移します。既に pending なら同じ行を返すため、応答が失われた後の再送でも申請を増やしません。
確認するファイル
supabase/migrations/20260822090001_create_submit_kyc_application_function.sql - 3
管理者が審査する
承認 API は Origin、管理者セッション、対象 ID、冪等性キーを確かめてから approveKyc を呼びます。申請者自身が承認できる経路にはしません。
確認するファイル
src/app/api/v1/admin/kyc/[customerId]/approve/route.ts - 4
遷移の前提を確かめる
管理者の審査は pending を起点とするよう制限されています。画面に見えた状態が古くても、確定時の状態を基準に判断します。
確認するファイル
supabase/migrations/20260822090002_restrict_kyc_review_to_pending.sql
失敗時・範囲外の確認
既に verified の顧客による再申請は拒否されます。審査の途中で状態が変わった場合も、古い画面表示だけで承認できないことが重要です。外部の本人確認事業者との照合は、この題材の範囲外です。
ここまでで説明できること
本人確認を「画面上のチェック」ではなく、権限を持つ人だけが動かせる状態遷移として説明できます。