Pular para conteúdo

Aplicações

App unificado

apps/aivaleu_app atende cliente e parceiro. O bootstrap resolve o ambiente nesta ordem:

  1. --dart-define=FLAVOR=dev|prod;
  2. flavor informado pelo Android no channel aivaleu/app_config;
  3. sufixo .dev no application ID;
  4. fallback: prod em release e dev fora 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_it registra SDKs, repositories, casos de uso e Cubits/BLoCs.
  • MultiRepositoryProvider e MultiBlocProvider expõem dependências no app principal.
  • aivaleu_ui centraliza 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.