Profile Server API

Modelo de dados

Núcleo de identidade e multi-tenancy — User, Customer, Tenant, App, os vínculos M:N (UserTenant, OrganizationTenant) e AuditLog.

Este documento cobre o núcleo de identidade e multi-tenancy do schema Prisma (prisma/schema.prisma, PostgreSQL): Customer, App, Tenant, User, os vínculos M:N UserTenant e OrganizationTenant, e AuditLog. A Organization (cooperativa) e suas tabelas aparecem aqui apenas de forma resumida — o detalhe está nos endpoints de organizations. As entidades de negócio usam soft delete (deletedAt).

Os dois vínculos M:N são a base da trava de acesso por tenant: um usuário só enxerga as cooperativas (e documentos) dos tenants dos quais faz parte (UserTenant), limitado às cooperativas alcançadas por esses tenants (OrganizationTenant).

Diagrama de entidades

Entidades

User

Perfil local vinculado a uma identidade Keycloak.

CampoTipoObservações
iduuidPK
idIdentitystringÚnico; o sub do Keycloak
namestring
emailstringÚnico
typestringAdmin | Technician | Cooperative
customerIduuid?Customer opcional (FK)
createdAt/updatedAt/deletedAtdatetimedeletedAt = soft delete

Customer

Cliente/empresa. Raiz do multi-tenancy.

CampoTipoObservações
iduuidPK
federalTaxIdvarchar(14)Único (CPF/CNPJ)
namestring
aliasstring?
emailstring?
phonestring?
logoPathstring?
activebooleanPadrão true

Tenant

Instância de um App para um Customer.

CampoTipoObservações
iduuidPK
customerIduuidFK → Customer (indexado)
appIduuidFK → App (indexado)
namestring
activebooleanPadrão true
metadatajson?Dados livres
keycloakClientIdstring?Único; client Keycloak para auth de serviço
allowedScopesjson?Escopos permitidos no fluxo app-to-app

App

Aplicação registrada (ex.: app1, app2).

CampoTipoObservações
iduuidPK
namestringÚnico

UserTenant

Vínculo M:N entre User e Tenant (membership) — a quais tenants o usuário pertence. Chave composta, sem soft delete (desvincular remove a linha).

CampoTipoObservações
userIduuidPK + FK → User
tenantIduuidPK + FK → Tenant
activebooleanPadrão true; membership só conta se ativa

Gerenciado via /api/users/:userId/tenants (POST/DELETE/GET).

OrganizationTenant

Vínculo M:N entre Organization (cooperativa) e Tenant — quais tenants alcançam cada cooperativa. Uma cooperativa pode pertencer a vários tenants. Chave composta, sem soft delete.

CampoTipoObservações
organizationIduuidPK + FK → Organization
tenantIduuidPK + FK → Tenant

Gerenciado via /service/organizations/:organizationId/tenants (POST/DELETE) e consultado via /api/tenants/:tenantId/organizations (GET).

AuditLog

Registro de auditoria gravado em operações de escrita (via @AuditLog).

CampoTipoObservações
iduuidPK
timestampdatetime
actionstringread | create | update | delete
entitystringEntidade afetada
entityIdstring?Id do registro afetado
metadatajson?
userIdstringAutor da ação