概要
新規ランキングを作成・公開する一連のフロー。基本情報→選択肢→(クイズ)→期間→プレビューの5ステップ。
下書き保存・編集モード・選択肢拡張・期間延長などの拡張機能を含む。
関連画面
処理フロー(公開)
sequenceDiagram
participant U as User
participant V as Step4PreviewView
participant VM as CreateRankingViewModel
participant RS as RankingService
participant PS as PointService
participant DB as Supabase
U->>V: 「公開する」タップ
V->>VM: publish()
VM->>PS: consumePoints(createRanking, ...)
PS->>DB: users.points 減少
PS->>DB: point_transactions INSERT
alt 残高不足
PS-->>VM: insufficientPoints
VM-->>U: 「Npt不足」
end
VM->>RS: createRanking(...)
RS->>DB: rankings INSERT (status: active)
RS->>DB: choices INSERT (×N)
alt hasQuiz
RS->>DB: quizzes INSERT (×3)
end
RS-->>VM: 作成完了
VM->>V: 完了画面 → ホーム
ビジネスルール
- 必須項目: タイトル、主タグ、選択肢3つ以上
- 選択肢上限は基本N、拡張で+10または+15
- 期間は7日 or 14日、拡張可
- クイズ付与で +15pt の追加コスト、3問必須
- 下書きは最大M件まで保存可(superuser除く)
- 24時間以内の下書き削除なら cancelRefund でポイント返却
- 予約投稿は startsAt を未来日時に設定
外部連携
| 連携先 | 用途 |
| Supabase rankings表 | ランキング本体 |
| Supabase choices表 | 選択肢 |
| Supabase quizzes表 | クイズ(hasQuiz=trueのみ) |
| PointService | 消費・無料枠の判定 |
| Supabase Storage | 選択肢画像(imageUrl) |
エラー処理
| 発生条件 | 対応 |
| 必須項目未入力 | 該当ステップへ戻して赤枠表示 |
| ポイント不足 | 「Npt必要(現在M)」 |
| 非アトミック途中失敗 | 「下書きから再開できます」 |
| 画像アップロード失敗 | 該当選択肢のみエラー表示、再試行 |
実装メモ
- CreateRankingView は自前 NavigationStack を持たない
- 下書き復元は status==.draft の rankings から取得
- 非アトミック処理(4ステップ)
- Edge Function 化(v1.1)
- 画像のSupabase Storage連携の安定化
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成 |