概要

ランキングへの投票機能。シングル投票(1選択肢)と TOP3投票(3選択肢の順位付き)の2モード。 クイズゲート機能で「分かってる人だけ投票できる」品質保証。再投票は最大3回までポイント消費で許可。

関連画面

処理フロー(シングル投票・quiz無)

sequenceDiagram participant U as User participant V as VoteView participant VM as RankingDetailViewModel participant VS as VoteService participant PS as PointService participant DB as Supabase U->>V: 選択肢タップ + 投票 V->>VM: castVote() VM->>PS: consumePoints (revote時のみ) PS-->>VM: ok VM->>VS: castVote() VS->>DB: votes INSERT alt Unique制約違反 DB-->>VS: 23505エラー VS-->>VM: VoteError.alreadyVoted else 成功 DB-->>VS: ok VS->>DB: choices.voteCount RPC VS->>DB: rankings.voteCount RPC DB-->>VS: ok end VS-->>VM: 完了 VM->>V: hasVotedOptimistically=true V->>U: ResultView へ遷移

投票モード

モード動作消費
RankingMode.single1選択肢を選ぶ初回0pt / revote1: 3pt / revote2: 7pt
RankingMode.threePoint3枠を順位付きで選ぶ同上(3件のVote INSERT)

ビジネスルール

クイズゲート機能

外部連携

連携先用途
Supabase votes表投票記録
Supabase RPCchoices.voteCount / rankings.voteCount の更新
PointService再投票時のポイント消費

エラー処理

発生条件対応
ポイント不足「ポイントが足りません」アラート
既に投票済み(Unique違反)「すでに投票済みです」 + ResultView へ
期間外「投票期間外です」
非アトミック途中失敗cancelRefund で補償処理

実装メモ

変更履歴

バージョン日付変更内容
1.02026-05-09初版作成