v1.0.0 の歴史資料当時の説明です。現在の仕様とは異なる箇所があります。現行版の対応記事 →資料一覧へ

DEEP GUIDE 05

口座凍結と監査記録

管理者が口座を止めたとき、利用者の操作と記録がどう変わるかを見る。

このガイドで追う一件

管理者が利用者の口座を凍結します。対象の取り違え、同時に進む送金、応答を失った後の再実行を考えます。

コードを読む順番

以下は MiniBank v1.0.0 の確認先です。マイグレーションは順に適用されるため、関数の最終形を調べるときは後続の変更も確認してください。

  1. 1

    凍結の依頼を受ける

    管理者 API は対象の口座 ID と冪等性キーを検証し、管理者セッションを確認してから操作を渡します。

    確認するファイルsrc/app/api/v1/admin/accounts/[id]/freeze/route.ts

  2. 2

    操作する管理者を固定する

    freeze_account は管理者自身の行を先にロックして有効な権限を確かめます。次に対象口座の状態を扱います。

    確認するファイルsupabase/migrations/20260823100001_fix_admin_toctou_lock_own_operator_row.sql

  3. 3

    再送と監査を読む

    同じ依頼を識別するキーを使い、凍結の操作記録を残します。応答が届かなかった場合にも、別の操作として重複させない設計です。

    確認するファイルsrc/services/AdminMutationService.ts

  4. 4

    凍結後の送金を確かめる

    送金処理は確定時点で口座状態を確認します。画面が古い状態を示していても、凍結中の口座から取引を成立させないことを確かめます。

    確認するファイルsupabase/migrations/20260819163038_create_execute_transfer_function.sql

失敗時・範囲外の確認

管理者が対象を誤ると利用者の操作を止めてしまいます。誰が、いつ、どの口座に何をしたかを追える監査記録と、解除操作を別の状態変更として扱うことが重要です。

ここまでで説明できること

管理者操作は画面上のボタンではなく、権限・状態・再送・監査を含む一件の取引だと説明できます。