Visão Geral da Arquitetura do Sistema
Pilar: 01 — Arquitetura, Stack e Segurança
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
Módulos Conectados:gatein-server,gatein-app,gatein-web
1. Diagrama de Componentes do Ecossistema
O ecossistema Gatein é composto por uma arquitetura distribuída e desacoplada baseada em serviços RESTful, comunicação bidirecional em tempo real (Socket.IO) e infraestrutura de nuvem Serverless/Firebase:
graph TB
subgraph "Campos e Clientes Front-end"
MOB["Gatein Mobile App<br/>(React Native / iOS & Android)"]
WEB["Gatein Web App<br/>(React 18 + Vite / SPA)"]
ERP["ERP / TMS Terceiros<br/>(SAP, TOTVS, WMS)"]
end
subgraph "Serviços de Infraestrutura Cloud"
FBA["Firebase Auth<br/>(Provedor de Identidade Web)"]
FCM["Firebase Cloud Messaging<br/>(Push Notifications Mobile)"]
FBS["Firebase Storage<br/>(Uploads de Mídia e Fotos)"]
end
subgraph "Core Backend Services (gatein-server)"
API["FastAPI App Server<br/>(Uvicorn / ASGI Async Engine)"]
SIO["Socket.IO Server<br/>(Namespace /checkin)"]
SCH["APScheduler Engine<br/>(Lembretes & Expurgos Background)"]
end
subgraph "Persistência e Cache"
PG[(PostgreSQL 15+<br/>Banco Relacional Multi-Tenant)]
RDS[(Redis 7+<br/>OTP Cache, Active Sockets & Jobs)]
end
subgraph "Automação de Pátio (Physical Gate)"
HW["Hardware / Totem de Entrada<br/>(Leitores Ópticos & Cancelas)"]
end
MOB -->|REST HTTPs / JWT Mobile| API
WEB -->|REST HTTPs / Bearer Firebase| API
ERP -->|REST HTTPs / Header X-API-Key| API
WEB -->|Auth Login| FBA
API -->|Verify ID Token| FBA
API -->|Dispatch Push Notifications| FCM
FCM -->|Push Message| MOB
API -->|Read/Write Records| PG
API -->|Setex OTP / Cache Sqids| RDS
SIO -->|Active Terminals Mapping| RDS
SIO <-->|WebSocket Bidirecional / Handshake 15s| HW
SCH -->|Verify Windows & Triggers| PG
2. Diagrama de Atores e Fluxos Operacionais
sequenceDiagram
autonumber
actor M as Motorista (Mobile)
actor T as Operador de Terminal (Web)
actor TR as Transportador (Web)
actor PA as Platform Admin (System)
participant S as Gatein Server (FastAPI)
rect rgb(240, 248, 255)
note over TR, S: 1. Gestão de Viagens
TR->>S: POST /web/trips (Aloca motorista e caminhão)
end
rect rgb(255, 250, 240)
note over T, M: 2. Agendamento e Recepção
T->>S: POST /web/appointments (Define janela operacional)
S-->>M: FCM Push: "Novo Agendamento Disponível"
end
rect rgb(240, 255, 240)
note over M, T: 3. Check-in e Liberação
M->>S: POST /mobile/checkin/{terminal_id} (Entrada Geofence)
S-->>T: Socket.IO: Notifica painel de pátio em tempo real
T->>S: POST /web/checkin/approve (Aprova entrada)
S-->>M: Emite Ticket Digital com QR Code no celular
end
rect rgb(255, 240, 255)
note over PA, S: 4. Governança e Homologação
PA->>S: POST /admin/system/staging-passwords (Configura senhas de teste)
end
3. Padrão Multi-Tenant e Isolamento de Dados
Toda a arquitetura de banco de dados do Gatein é estruturada em torno do conceito de Multi-Tenancy por Isolamento Lógico (company_id):
- Garantia por Injeção de Dependências:
No backend FastAPI, a dependência
get_current_admin_company_userourequire_permissionextrai a identidade do usuário a partir do token verificado e descobre o seucompany_id. - Filtro Obrigatório em Queries:
Nenhuma instrução SQL de consulta, atualização ou deleção no PostgreSQL pode ser executada sem a cláusula explícita:
WHERE company_id = current_user.company_id - Proteção Contra Escalada Horizontal de Privilégios:
Mesmo que um atacante altere os identificadores na URL da requisição Web (ex:
/web/appointments/123), a query intercepta e valida se a entidade pertence à empresa do token autenticado. Se não pertencer, retorna HTTP 404/403.
4. Fronteiras de Responsabilidade e Contratos de Serviço
| Componente | Responsabilidade Exclusiva | O que NÃO é de sua alçada |
|---|---|---|
gatein-server | Máquina de estados operacionais, validações de janela, geração de tokens JWT, emissão de tickets, cálculo geográfico de geofences e despacho FCM. | Interface do usuário e captura de sinal de sensores GPS brutos. |
gatein-app | Captura de coordenadas GPS, armazenamento de tokens em local seguro, notificação via Notifee, elevação de brilho para QR Code e renderização via Dynamic Layout Engine. | Decisão sobre autorização de entrada ou alteração de status de banco de dados. |
gatein-web | Interface gráfica de gestão, editor visual de layouts, mapa de geofence, gerenciamento de API Keys e botões de aprovação/rejeição de pátio. | Armazenamento primário de credenciais de motorista. |
APScheduler | Monitoramento assíncrono de janelas temporais de agendamentos, disparos de lembretes e tarefas de expurgo de logs antigos. | Processamento de requisições REST síncronas de usuários. |
5. Decisões Arquiteturais Registradas (ADRs)
ADR-001: Escolha do Framework FastAPI (Python) para o Backend
- Contexto: Necessidade de alta capacidade de concorrência I/O (WebSocket Socket.IO, integrações REST, banco relacional) e suporte a digitação estrita com Pydantic.
- Decisão: Utilizar FastAPI com Uvicorn (ASGI engine).
- Consequência: Excelente throughput assíncrono, documentação automática OpenAPI/Swagger e serialização rápida.
ADR-002: Utilização de Sqids para Ofuscação de IDs
- Contexto: Impedir que concorrentes ou usuários mal-intencionados enumerem a quantidade de agendamentos, motoristas ou tickets do sistema alterando IDs numéricos sequenciais em URLs (
/activities/1,/activities/2). - Decisão: Adotar a biblioteca Sqids para codificar IDs numéricos e UUIDs em strings alfanuméricas ofuscadas.
- Consequência: IDs públicos legíveis e seguros; o banco armazena chaves nativas e a API serializa/deserializa via
encode_id()edecode_id().
ADR-003: Snapshot Imutável de Tickets Digitais (JSONB)
- Contexto: Garantir que comprovantes de entrada no pátio não sofram alteração retroativa se o ERP do terminal modificar dados do agendamento após a liberação.
- Decisão: No ato da aprovação do check-in, o servidor gera uma foto congelada (snapshot) de todas as variáveis do ticket e persiste no campo
content(JSONB) da tabelatickets. - Consequência: Garantia de auditoria e valor jurídico à liberação emitida ao motorista.
ADR-004: Handshake Socket.IO de 15 Segundos com Fallback FCM
- Contexto: A comunicação com totens físicos e leitores de pátio pode falhar devido a instabilidades de rede local no terminal.
- Decisão: Definir timeout de 15,0s na chamada RPC
sio.call('request_checkin'). Se o totem não responder, dispara evento assíncrono FCM com notificação de falha para o dispositivo do motorista. - Consequência: Evita travamentos de conexões HTTP no celular do motorista e provê feedback claro em caso de indisponibilidade de pátio.