Skip to main content

Módulo 02: Multi-Tenant

Status: Rascunho Inicial


1. Contratos de API (RESTful)

1.1 Tenant (Acesso exclusivo Super Admin)

POST /api/admin/tenants
Body: { nome, cnpj, subdominio, email_admin, nome_admin }
Return: { tenant_id, status: "PROVISIONANDO" }

GET /api/admin/tenants
Return: [{ id, nome, subdominio, status, criado_em }]

PATCH /api/admin/tenants/{id}/status
Body: { status: "ATIVO | SUSPENSO | CANCELADO", motivo? }

1.2 Configurações da Empresa (Acesso Admin do Tenant)

GET /api/tenant/configuracoes
Return: { dados_empresa, regras, integracoes_ativas, visual }

PUT /api/tenant/configuracoes/empresa
Body: { razao_social, nome_fantasia, telefone, email_suporte, endereco, logo_url }

PUT /api/tenant/configuracoes/regras
Body: { alcance_maximo_niveis, modo_registro, dias_alerta_lead, fipe_estrategia, ... }

PUT /api/tenant/configuracoes/visual
Body: { cor_primaria, cor_secundaria, logo_url, favicon_url, nome_exibido }

1.3 Gestão de Termos Locais do Tenant

POST /api/tenant/termos
Body: { versao, conteudo_html, obriga_reaceite }
Return: { id, versao, publicado_em }

GET /api/tenant/termos/historico
Return: [{ versao, publicado_em, obriga_reaceite }]

Tenant

{
"id": "uuid",
"nome": "string",
"nome_fantasia": "string",
"cnpj": "string",
"subdominio": "string",
"status": "PROVISIONANDO | ATIVO | SUSPENSO | CANCELADO",
"schema_banco": "string",
"visual": {
"logo_url": "string | null",
"favicon_url": "string | null",
"cor_primaria": "#hex",
"cor_secundaria": "#hex",
"nome_exibido": "string"
},
"regras": {
"alcance_maximo_niveis": "integer | null",
"modo_registro": "CONVITE | ABERTO | ABERTO_COM_APROVACAO",
"dias_alerta_lead_sem_contato": 7,
"dias_expiracao_proposta": 15,
"desconto_maximo_consultor_pct": 5,
"desconto_maximo_gestor_pct": 15,
"max_tentativas_login": 5,
"vistoria_pos_assinatura_invalida_contrato": false,
"modalidades_vistoria_habilitadas": ["SELF_SERVICE_LINK"],
"aprovacao_laudo_obrigatoria": true,
"fipe_estrategia": "CACHE_COM_FALLBACK_API"
},
"criado_em": "datetime",
"atualizado_em": "datetime"
}

3. Segurança e Boas Práticas

Regra ArquiteturalImplementação
IsolamentoO banco deve usar search_path no PostgreSQL para segregar tenants ou bancos isolados.
Tratamento de NulosNas regras de configuração, valores null operam como permissão máxima (sem limite). O admin restringe o valor inserindo números inteiros.
Chaves de APICredenciais de integração (Integrações Ativas) devem ser guardadas com AES-256 e NUNCA listadas nas respostas da API (retornar "*****").