概要
ランキング作成・再投票・閲覧解放などに「ポイント」を消費。日次ログインボーナス・広告報酬で獲得。
二重付与防止のためクライアントとDB両方で確認する二層チェック構造。
関連画面
獲得手段
| イベント | 付与量 | 制約 |
| ログインボーナス | 連続日数に応じて変動 | 1日1回(二重付与防止) |
| 広告報酬 | 動画視聴で N pt | 1日Mまで(実装確認) |
| キャンセル返金 | cancelRefund で消費分の一部 | 下書き削除時等 |
消費手段
| アクション | 消費ポイント | PointAction |
| ランキング作成(基本) | 20pt | createRanking |
| クイズ付与 | +15pt | createRanking(合算) |
| TOP3ランキング | 20pt | createRanking |
| 選択肢拡張 +10 | 10pt | extendChoices10 |
| 選択肢拡張 +15 | 20pt | extendChoices15 |
| 期間延長 +7日 | 10pt | extendPeriod7 |
| 期間延長 +14日 | 20pt | extendPeriod14 |
| 1回目の再投票 | 3pt | revote1 |
| 2回目の再投票 | 7pt | revote2 |
| 結果閲覧(基本) | 1pt | viewResult |
| 詳細閲覧 | 2pt | viewDetail |
| 条件付き閲覧 | 3pt | viewConditional |
無料作成枠
新規ユーザーには freeCreationRemaining として無料でランキング作成できる枠が用意される。
消費前にこのカウンタを優先利用する。
ビジネスルール
- 消費操作は必ず
PointService.consumePoints() 経由(直接 users.points を更新しない)
- すべての取引は
PointTransaction に履歴として記録
- ログインボーナスは
lastLoginDate(クライアント) + point_transactions(DB)の二層で重複防止
- 残高不足時は
RankingServiceError.insufficientPoints(required:current:) で必要量を返す
- 下書き削除時、24時間以内かつ未公開なら cancelRefund でポイント返却
外部連携
| 連携先 | 用途 |
| Supabase point_transactions表 | 取引履歴 |
| Supabase users.points | 残高管理 |
| AdMob Rewarded広告 | 動画報酬の付与 |
エラー処理
| 発生条件 | 対応 |
| 残高不足 | 「Npt不足です(必要M, 現在L)」のアラート |
| ボーナス二重付与検出 | サイレントで既受領扱い |
| 消費後のINSERT失敗 | cancelRefundで補償 |
実装メモ
- PointService.consumePoints() でポイント減少 + point_transactions INSERT を実行
- PointAction enum で15種のアクションを定義
- claimLoginBonus() で日次付与(連続ログイン日数カウント)
- Supabase Edge Function 化(v1.1検討)でアトミック保証
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成 |