Operação¶
Build do app principal¶
Produção Android usa o flavor prod. Exemplo versionado no guia de deploy:
cd apps/aivaleu_app
flutter build appbundle --flavor prod --dart-define=FLAVOR=prod \
--obfuscate --split-debug-info=build/app/outputs/symbols
Valide Firebase config, signing e flavor antes de publicar.
Cloud Functions¶
Deploy altera produção
O comando acima deve ser executado somente em uma janela de deploy intencional, após confirmar o projeto ativo da Firebase CLI. Esta documentação não assume que a presença do código significa que a versão correspondente já esteja implantada.
Super Admin Hosting¶
O target super-admin aponta para apps/super_admin_web/build/web.
cd apps/super_admin_web
flutter build web --release
cd ../..
firebase deploy --only hosting:super-admin
Stripe¶
O backend atual usa secrets e região southamerica-east1. O webhook processa:
checkout.session.completed;invoice.paid;invoice.payment_failed;customer.subscription.created;customer.subscription.updated;customer.subscription.deleted.
Ao testar com Stripe CLI e Functions Emulator, aponte para a URL efetivamente exibida pelo Emulator para stripeWebhook; não reutilize URLs históricas com região diferente.
Schedulers¶
expireCoupons, campaignAutoTransitions e closeExpiredCampaigns são throttled por settings/schedulers. resetTrendingProducts possui cron próprio.
A configuração de scheduler é operacional. Desabilitar um job pode atrasar manutenção automática, mas não deve conceder permissão, Premium ou alterar a regra transacional de cupom.
Backfill de quota¶
functions/package.json oferece:
Execute primeiro o dry-run. O apply deve ocorrer em janela controlada, sem mutações concorrentes de cupons, seguido por novo dry-run esperando zero writes planejados.
Diagnóstico rápido¶
| Sintoma | Verifique |
|---|---|
| Feed vazio com localização | Auth, coordenadas, raio, stores com location, status/source da oferta e quota. |
| Feed funciona sem ranking | Logs de getOfferFeed; repository pode ter caído no fallback Firestore. |
resource-exhausted ao gerar cupom |
couponUsageLimit, reservados e usados. |
| Garçom vê fila mas não confirma | waiter_sessions, expiração, waiter/store e status waiting_checkin. |
Partner recebe permission-denied ao editar oferta |
Payload não pode carregar campos de autoria, curadoria ou contadores bloqueados. |
| Super Admin Web redireciona para denied | custom claim super_admin; UI guard não substitui token válido. |
| Premium não atualiza | webhook Stripe, stripeEvents, subscriptions e mirror no users. |
| Contador de aguardando no dashboard parece incorreto | Compatibilidade waitingCheckin vs waiting_checkin em getDashboardStats. |
Observabilidade atual¶
O código usa logs do Firebase Functions e debugPrint/logger no Flutter. Não há, na baseline, pipeline de CI nem stack de observabilidade dedicada versionada. Ao adicionar alertas/telemetria, não registre PINs, tokens, secrets ou payloads pessoais desnecessários.