Aparência
Schema e relações
A fonte do schema, a definição da estrutura do banco, é packages/db/prisma/schema.prisma. Prisma está na versão 6 neste projeto.
Inventário e telemetria
| Modelo / tabela | Identidade e campos importantes | Papel |
|---|---|---|
| InverterSource / inverter_sources | serialNumber único; adapterKey; host/port; enabled | Fonte de coleta física, configuração restrita |
| Device / devices | Par único type + externalId; name, active, metadata, lastSeenAt | Catálogo reconhecido pela ingestão |
| MetricDefinition / metric_definitions | key; unit, description, active | Catálogo global de grandezas |
| Measurement / measurements | deviceId, metricKey, valueNum, measuredAt, receivedAt | Uma amostra por grandeza |
| RawMessage / raw_messages | topic, payloadRaw, payloadJson, valid, error; deviceId opcional | Auditoria de chegada e validação |
Measurement referencia Device e MetricDefinition. RawMessage pode não ter Device, sobretudo quando a mensagem é inválida.
O par deviceId + metricKey + measuredAt é indexado, não único. Uma repetição MQTT pode criar outra linha.
Catálogo ativo não comanda o hardware
InverterSource.enabled decide elegibilidade no coletor. Device.active é uma revisão do catálogo e pode influenciar consultas/painéis. MetricDefinition.active também é catálogo; a persistência atual não usa esse campo para rejeitar valores recebidos.
A ingestão preserva campos já revisados pelo operador.
Administração
| Modelo | O que guarda | O que não deve expor |
|---|---|---|
| AdminUser | Conta, papel, status e hash de senha | Hash e dados restritos |
| AdminSession | Hash de token, expiração, revogação e estado CSRF | Token de sessão |
| AdminAuditLog | Ator, ação, recurso e nomes dos campos alterados | Valores sensíveis e credenciais |
As transações administrativas incluem atualização e auditoria. Sessões revogadas não voltam a valer apenas porque uma conta foi reativada.
Horários e retenção
Separar measuredAt e receivedAt permite observar atraso, mas exige consistência de relógio/fuso nas consultas. Não interpretar lastSeenAt como potência atual.
O armazenamento não possui deduplicação automática de medições nem uma política automática de retenção/particionamento implementada. Mudanças de schema e migrations são operações próprias, com revisão e confirmação.
Revisão editorial: 07/10/2026. Fontes: schema.prisma, persistence.ts e repositórios do Admin.