Especificação consolidada para implementação do backend de produção, coerente com o escopo já definido do projeto: Puzzle + RPG leve, economia autoritativa, ranking sazonal, hatchery, evolução e LiveOps.
Princípios: servidor autoritativo para recursos críticos, idempotência por txnId, timers UTC, telemetria orientada a decisão, e baixo custo operacional para estúdio indie.
| Módulo | Responsabilidade | Autoritativo? |
|---|---|---|
| Auth | Identidade de player, sessão, refresh token, device binding | Sim |
| Profile | Nome, nível, XP, configurações, consentimento | Parcial |
| Economy | Carteira, gastos, créditos, ledger, antifraude | Sim |
| Progression | Mundos, fases, estrelas, unlocks, medalhas | Sim |
| Battle | Start/end de fase, validações de score, revive, boosters | Sim |
| Hatchery | Incubação, speed-up, claim, pity timer, duplicata→essência | Sim |
| Dragons | Coleção, níveis/tier, dragão ativo, skill unlock | Sim |
| Missions | Diárias/semanais, progress tracking, claim all | Sim |
| Leaderboard | Ranking, brackets, tiebreak, payout | Sim |
| Offers/IAP | Ofertas contextuais, validação de recibo Apple/Google | Sim |
| LiveOps | Config dinâmica por data/segmento | Sim |
| Analytics | Ingestão de eventos e agregações | N/A |
Decisão v1: modular monolith (1 deploy) + filas internas. Evita complexidade prematura de microserviços.
| Tabela | Campos-chave | Notas |
|---|---|---|
| players | player_id, created_at, status | Identidade base |
| player_profile | player_id, level, xp, language, settings_json | Dados de perfil |
| wallets | player_id, gold, gems, essence, energy_current, energy_last_tick_utc | Saldo autoritativo |
| economy_ledger | ledger_id, player_id, currency, amount, reason, txn_id, created_at | Auditoria financeira |
| player_progress | player_id, world, stage, stars_json, medals_json | Progresso e platina |
| battle_runs | run_id, player_id, stage_id, seed, started_at, ended_at, result, score | Rastro de fase |
| player_boosters | player_id, hint, undo, shuffle, turbo | Inventário de utilitários |
| hatch_slots | slot_id, player_id, egg_type, start_utc, end_utc, state | Incubação UTC |
| player_dragons | player_id, dragon_id, tier, level, active | Coleção/evolução |
| mission_state | player_id, mission_id, progress, target, claimed, reset_at | Missões |
| leaderboard_scores | season_id, player_id, score, updated_at | Ranking sazonal |
| season_rewards | season_id, player_id, bracket, reward_json, claimed | Payout final |
| iap_receipts | receipt_id, player_id, store, product_id, status, verified_at | Validação IAP |
| liveops_configs | config_key, version, payload_json, starts_at, ends_at | Config dinâmica |
UNIQUE(player_id, txn_id) em transações críticas (economy/claim/revive/iap).UNIQUE(season_id, player_id) em payout de temporada.CHECK(amount != 0) e validação de saldo mínimo no nível de serviço.player_id, season_id, updated_at.POST /v1/auth/guest → cria/retorna player + tokensPOST /v1/session/start → payload inicial da homeGET /v1/bootstrap → configs, versões, feature flagsPOST /v1/battle/start (stageId, dragonId) → runId, seed, movesBasePOST /v1/battle/revive (runId, txnId, method) → movesGrantedPOST /v1/battle/use-booster (runId, boosterType, txnId)POST /v1/battle/end (runId, result, score, objectives, replayHash)GET /v1/progress/mapPOST /v1/hatch/start, /speedup, /claimPOST /v1/dragon/evolve, /set-activeGET /v1/wallet, GET /v1/ledger?cursor=GET /v1/missions, POST /v1/missions/claimGET /v1/offers/contextualPOST /v1/iap/verifyGET /v1/leaderboard/current, /season/reward| Fluxo | Regra | Proteção |
|---|---|---|
| Claim recompensa | 1x por condição | txnId + unique index |
| Reviver | max 3 por run | contador server-side + lock por run |
| Hatch timer | base UTC | ignorar relógio local |
| IAP | somente após verify | store API + dedupe receipt |
| Season reward | claim único | flag claimed + transação atômica |
/battle/end para detecção de score improvável.session_start, level_start, level_end, magic_used, booster_used, revive_offer_shown, revive_accept, hatch_complete, purchase_success, mission_claim.
| Métrica | Meta v1 |
|---|---|
| Disponibilidade API | 99.5% |
| P95 latência (GET) | < 180ms |
| P95 latência (POST crítico) | < 280ms |
| Erro 5xx | < 0.5% |
| Perda de evento analytics | < 1% |
| Risco | Impacto | Mitigação |
|---|---|---|
| Duplicação de recompensa | Alto | txnId + transação serializável + testes de concorrência |
| Exploit de relógio | Alto | UTC servidor em energia/hatch/evento |
| Fraude de score | Médio/Alto | replayHash + regras de plausibilidade |
| Quebra por config liveops | Médio | schema validation + dry-run + rollback |
| Custo infra acima do esperado | Médio | cache agressivo + batching + compressão |