Aplicações¶
App unificado¶
apps/aivaleu_app atende cliente e parceiro. O bootstrap resolve o ambiente nesta ordem:
--dart-define=FLAVOR=dev|prod;- flavor informado pelo Android no channel
aivaleu/app_config; - sufixo
.devno application ID; - fallback:
prodem release edevfora de release.
Depois carrega .env.dev ou .env.prod, inicializa a opção Firebase correspondente, ativa App Check e registra dependências. Falha de inicialização do Firebase produz uma tela mínima de erro, em vez de continuar com dependências parciais.
Áreas funcionais¶
| Área | Implementação principal | Dependências relevantes |
|---|---|---|
| Autenticação e conta | features/auth, features/account |
Firebase Auth, AuthRepository, deleteUserAccount |
| Descoberta | features/discovery |
OfferRepository, StoreRepository, getOfferFeed |
| Cupons e economia | features/wallet |
CouponRepository, streams Firestore e callables de cupom |
| Campanhas | features/campaigns |
CampaignRepository, PartnerCampaignRepository |
| Perfil, indicação e Premium | features/profile |
Remote Config, referrals, Stripe Checkout/Portal |
| Parceiro | features/partner |
lojas, catálogo/ofertas, garçons, campanhas, integrações |
As rotas nomeadas são montadas em main.dart. Entre as rotas públicas do app estão /offer_details, /campaigns, /coupons, /wallet, /profile, /premium e os fluxos /partner_*.
Monitor do garçom¶
apps/waiter_desktop é um app Flutter para desktop/web com um fluxo deliberadamente estreito:
sequenceDiagram
participant UI as Monitor
participant Auth as Firebase Auth
participant Login as loginWaiter
participant DB as Firestore
participant Confirm as confirmCheckin
UI->>Auth: signInAnonymously()
UI->>Login: email + PIN
Login->>DB: valida waiters e cria waiter_sessions
Login-->>UI: unidades autorizadas
UI->>DB: stream waiting_checkin da unidade
UI->>Confirm: couponId + waiterId
Confirm->>DB: valida sessão, unidade e cupom em transação
Se o e-mail/PIN corresponder a mais de uma unidade, AuthDesktopCubit pede seleção. CheckinCubit observa a fila em tempo real, filtra por nome e espera o snapshot do Firestore depois da confirmação; ele não remove o item de forma otimista.
O provedor anônimo do Firebase Auth deve estar habilitado. A sessão do garçom é um documento backend-only; as Rules negam leitura e escrita direta em waiter_sessions.
Super Admin Web¶
apps/super_admin_web usa MaterialApp.router, GoRouter, BLoC e tema claro/escuro. super_admin_role_guard.dart e o backend exigem o custom claim booleano super_admin == true.
As áreas implementadas incluem dashboard, curadoria de lojas e ofertas, criação administrativa de oferta, parceiros, campanhas e configurações dos schedulers. A proteção visual de rota não substitui as Rules nem a validação server-side.
No modo remoto, o entrypoint ativa reCAPTCHA Enterprise App Check. No modo local, conecta Auth, Firestore, Functions regional/default e Storage aos emuladores.
Estado e injeção¶
get_itregistra SDKs, repositories, casos de uso e Cubits/BLoCs.MultiRepositoryProvidereMultiBlocProviderexpõem dependências no app principal.aivaleu_uicentraliza temas e widgets de campanha/oferta; não contém acesso a dados.- Streams Firestore alimentam telas que precisam de atualização em tempo real; callables concentram mutações privilegiadas.
Ao adicionar uma feature, mantenha a direção presentation → use case → repository interface → repository implementation. Não importe SDK Firebase no package de domínio.