Pular para conteúdo

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

cd functions
npm ci
npm test
firebase deploy --only 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:

npm run backfill:coupon-usage:dry-run
npm run backfill:coupon-usage:apply

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.