feat: implement module-based JWT authentication system with login and session handling

This commit is contained in:
2026-09-09 20:02:26 -03:00
parent 0caed24252
commit f6d7d42f10
+115 -1
View File
@@ -215,6 +215,114 @@ Ao implementar endpoints:
Não altere contratos existentes sem avaliar seus consumidores. Não altere contratos existentes sem avaliar seus consumidores.
## 9.1. Identificadores nos endpoints
**Endpoints devem utilizar exclusivamente UUID como identificador de recursos.**
É **proibido expor ou utilizar IDs numéricos (`id`) nos endpoints da API**, tanto em parâmetros de rota quanto em parâmetros destinados a identificar recursos.
Exemplos proibidos:
```text
GET /produtos/123
GET /clientes/456
GET /documentos-fiscais/789
DELETE /produtos/123
PUT /clientes/456
```
O padrão obrigatório é utilizar o `uuid`:
```text
GET /produtos/{uuid}
GET /clientes/{uuid}
GET /documentos-fiscais/{uuid}
DELETE /produtos/{uuid}
PUT /clientes/{uuid}
```
Também é proibido utilizar `id` numérico em:
* parâmetros de rota;
* query parameters quando o parâmetro representa a identificação de um recurso;
* payloads de entrada quando o objetivo for referenciar uma entidade externamente;
* respostas da API como identificador público;
* links e relacionamentos retornados pela API;
* filtros de endpoints que tenham como finalidade localizar uma entidade específica.
Exemplo proibido:
```json
{
"cliente_id": 123
}
```
Quando a referência for necessária através do contrato da API, utilize:
```json
{
"cliente_uuid": "019..."
}
```
ou, conforme o padrão já estabelecido no projeto:
```json
{
"cliente": "019..."
}
```
A nomenclatura deve seguir o padrão existente na API. Não crie uma nova convenção sem antes verificar como os recursos relacionados já são representados.
### Uso interno do `id`
O `id` numérico pode continuar sendo utilizado **internamente pela aplicação e pelo banco de dados**, quando essa for a estrutura existente.
Por exemplo:
```text
API
↓
UUID
↓
Controller / DTO
↓
Service
↓
Repository
↓
id interno
↓
Banco de dados
```
Nesse cenário, o UUID é o identificador público e o `id` é apenas um identificador interno.
É permitido, por exemplo, utilizar:
```sql
SELECT
id,
uuid,
nome
FROM cliente
WHERE uuid = :uuid;
```
e posteriormente utilizar o `id` internamente para relacionamentos, JOINs ou operações no banco, desde que o `id` **não seja exposto ao consumidor da API**.
### Regra absoluta
**`id` numérico é identificador interno. `uuid` é identificador público.**
Nenhum endpoint deve exigir que o consumidor conheça ou forneça o `id` numérico de uma entidade.
Antes de implementar ou alterar um endpoint, verifique se todos os identificadores expostos pelo contrato da API utilizam UUID.
Caso um endpoint existente utilize `id` numérico, não faça a alteração automaticamente. Analise os consumidores, apresente o impacto e solicite autorização antes de alterar o contrato.
## 10. Alterações mínimas ## 10. Alterações mínimas
Altere somente o necessário para atender à tarefa. Altere somente o necessário para atender à tarefa.
@@ -374,9 +482,15 @@ Antes de finalizar uma implementação:
* [ ] Nenhuma refatoração desnecessária. * [ ] Nenhuma refatoração desnecessária.
* [ ] Nenhum segredo ou credencial exposto. * [ ] Nenhum segredo ou credencial exposto.
* [ ] Resultado informado ao usuário. * [ ] Resultado informado ao usuário.
* [ ] Endpoints utilizam exclusivamente UUID como identificador público.
* [ ] Nenhum `id` numérico é exposto ou exigido pelos endpoints.
* [ ] IDs numéricos são utilizados somente internamente, quando necessário.
* [ ] Alterações em endpoints existentes que utilizam IDs numéricos foram analisadas antes de modificar o contrato.
## Regra de ouro ## Regra de ouro
**Use exclusivamente UUID nos endpoints.
Nunca exponha ou exija IDs numéricos (`id`) na API.
`id` é identificador interno; `uuid` é identificador público.**
**Planeje antes de implementar. **Planeje antes de implementar.
Peça autorização antes de alterar. Peça autorização antes de alterar.
Nunca utilize `SELECT *`. Nunca utilize `SELECT *`.