Arquitetura do Portal MBL
Visao Geral
Plataforma completa de gestao para nucleos do MBL. Suporta multi-tenant (cada nucleo e um tenant isolado) e multi-membership (um usuario pode ser membro de multiplos nucleos com cargo, saldo e plano independentes). Economia gamificada com moeda virtual (nome e sigla configuraveis por nucleo), integracao de pagamentos via Asaas, comunicacao interna, porta-vozes com sync automatico de redes sociais, e IA generativa.
Stack Tecnologica
| Camada | Tecnologia | Deploy |
|---|---|---|
| Frontend | Next.js 15 (App Router, Server Components) + TypeScript + Tailwind CSS | Google Cloud Run |
| Backend | NestJS 10 (REST, Guards, Interceptors, Cron) + TypeScript | Google Cloud Run |
| Banco de Dados | Supabase (PostgreSQL 17) — 41 migrations, 40+ tabelas, 18+ enums | Supabase Cloud (remoto) |
| Autenticacao | Supabase Auth (JWT, password recovery via admin.generateLink) | Supabase Cloud |
| Storage | Supabase Storage (avatars, comunicados, comentarios) | Supabase Cloud |
| Pagamentos | Asaas (PIX, Cartao, Boleto) — config por nucleo + sync automatico via cron | Asaas Cloud |
| Resend (templates brandados por nucleo, tipos obrigatorios bypass preferencias) | Resend Cloud | |
| IA | Google Gemini (chat, consulta membros, function calling) | Google AI |
| RSS | RSSHub auto-hospedado (YouTube + Twitter/X automatico, Instagram manual) | Google Cloud Run |
| Docs | Next.js (este portal) | Google Cloud Run |
Estrutura do Monorepo
mbles/
├── apps/
│ ├── web/ # Frontend Next.js 15 (45+ rotas)
│ │ ├── src/app/ # App Router (auth/, dashboard/)
│ │ ├── src/components/ # Componentes reutilizaveis
│ │ ├── src/hooks/ # Hooks (use-user com multi-membership)
│ │ └── src/lib/ # Utilitarios (supabase, nucleo, phone, api-fetch)
│ │
│ ├── api/ # Backend NestJS 10 (32 modulos)
│ │ ├── src/modules/ # 32 modulos (auth, membros, membership, economia, ...)
│ │ ├── src/common/ # Guards, Interceptors, Decorators
│ │ └── src/supabase/ # Supabase service (clients: service role, anon, per-user)
│ │
│ └── docs/ # Documentacao tecnica (este portal)
│
├── packages/
│ └── shared/ # Tipos e enums compartilhados entre web e api
│
├── supabase/
│ ├── migrations/ # 41 migrations PostgreSQL
│ └── email-templates/ # Templates HTML de email (recovery, signup, etc)
│
├── CLAUDE.md # Instrucoes para copilots de IA (32 modulos documentados)
├── README.md # Visao geral + setup local
└── CONTRIBUTING.md # Git flow, commits, deploy
Multi-Tenant + Multi-Membership
O sistema e multi-tenant: cada nucleo (MBL-ES, MBL-SP, etc) e um tenant isolado com dados separados. Alem disso, suporta multi-membership: um mesmo usuario (mesmo email/CPF/senha) pode ser membro de multiplos nucleos simultaneamente, com cargo, status, saldo de moedas e plano independentes por nucleo.
| Conceito | Tabela | Descricao |
|---|---|---|
| Identidade global | usuarios | 1 linha por pessoa (email, CPF, auth_id). RLS desabilitado. |
| Membership por nucleo | membros_nucleos | M:N (usuario_id, nucleo_id). Cargo, status, saldo, plano isolados por nucleo. |
| Nucleo de origem | membros_nucleos.is_nucleo_origem | TRUE para o nucleo onde o usuario se cadastrou. |
| Convidado | membros_nucleos.is_nucleo_origem = FALSE | Membro vindo de outro nucleo. Nao pode usar a loja. |
| Tenant ativo | Header X-Tenant-ID | Frontend envia para o backend qual nucleo o usuario esta navegando. |
Fluxo de Autenticacao
1. Browser faz signInWithPassword (Supabase Auth) → cookies SSR setados
2. Frontend chama POST /api/auth/login → retorna nucleos[] (memberships ativas)
3. Se 1 nucleo → entra direto
Se N nucleos → /auth/selecionar-nucleo
Se dominio nao-membro → botao "Solicitar acesso"
4. SUPER_ADMIN → entra direto, dropdown global de nucleos
5. Toda request API inclui header X-Tenant-ID com nucleo ativo
6. AuthGuard valida membership em membros_nucleos e injeta:
- request.user.nucleoId
- request.user.cargo (do nucleo ativo)
- request.user.isConvidado
- request.user.isNucleoOrigem
RBAC (Role-Based Access Control)
| Cargo | Nivel | Pode fazer |
|---|---|---|
| MEMBRO | 1 | Ver feed, tarefas, eventos, loja, perfil, ranking |
| LIDER_PROJETO | 2 | + Gerenciar tarefas dentro dos projetos que lidera |
| PORTA_VOZ | 2 | + Acessar IA, gerenciar redes sociais |
| COORDENADOR | 3 | + Aprovar membros, criar projetos/eventos/tarefas, ver relatorios |
| ADMINISTRADOR | 4 | + Gerenciar economia, loja, planos, conquistas, configuracoes do nucleo |
| SUPER_ADMIN | 5 | + Navegar entre todos os nucleos, relatorios globais, bug reports, config nacional |
Cargo e por nucleo (via membros_nucleos.cargo). Um usuario pode ser COORDENADOR no ES e MEMBRO no SP.
Economia (Moeda Virtual)
Cada nucleo define nome_moeda e sigla_moeda (ex: "Capixacoins"/"CC"). O saldo e calculado via ledger (transacoes_moeda) e cacheado em membros_nucleos.saldo_capixacoins(atualizado por trigger PostgreSQL). Multiplicador global e teto mensal configuraveis por nucleo.
Integracao Asaas
- Config por nucleo: cada nucleo tem sua propria API key e ambiente (sandbox/production)
- Webhook: recebe eventos de pagamento (CONFIRMED, OVERDUE, REFUNDED) e atualiza pedidos/assinaturas
- Sync automatico: cron diario (3h) busca cobrancas confirmadas no Asaas e atribui planos + cria lancamentos financeiros
- Rebuild financeiro: trigger manual busca TUDO no Asaas, agrupa parcelas, filtra testes e futuros, cria lancamentos retroativos
- Split payment: compras podem ser pagas parte em moeda virtual + parte em R$ (PIX/cartao/boleto)
Porta-Vozes e RSS
- YouTube: sync automatico via RSSHub auto-hospedado (cron a cada 5h)
- Twitter/X: sync automatico via RSSHub + auth_token cookie
- Instagram: adicao manual (admin cola URL do post/reel, sistema gera embed). API oficial planejada para futuro.
- TikTok: suportado via RSSHub (quando disponivel)
- Postagens automaticamente aparecem no feed do nucleo e geram notificacoes
Deploy
Todo o deploy e feito via Google Cloud Run:
| Servico | Imagem | Descricao |
|---|---|---|
mbles-api | Buildpack (source deploy) | Backend NestJS |
mbles-web | Buildpack (source deploy) | Frontend Next.js |
rsshub | diygod/rsshub:latest | RSS feeds de porta-vozes |
Banco, auth e storage ficam no Supabase Cloud (remoto). Nao ha Supabase local.