PRJ-001 · 2026 · API
Arquiva
API open-source de gestão documental, com plano de classificação em árvore, tabela de temporalidade versionada, sigilo em dois níveis e auditoria imutável.
- Código
- PRJ-001
- Ano
- 2026
- Tipo
- API
- Papel
- Projeto pessoal, do modelo de dados aos testes
- Stack
- Laravel 13PostgreSQL 16DockerPHPUnitPHPStan
GET /api/documentos?classe=010.1
{
"codigo": "010.1.1",
"sigilo": "reservado",
"status": "capturado",
"regra_vigente": { "versao": 3 },
"sha256": "9f3c…e21a ✓"
}
O problema
Órgãos e empresas precisam guardar documentos por prazos definidos em lei, saber quem pode ver cada um, provar que nada foi adulterado e responder “quem fez o quê, quando”. Um CRUD com upload não resolve isso: as regras mudam com o tempo, o acesso depende do sigilo e da unidade, e banco e disco precisam ficar consistentes mesmo quando algo falha no meio.
O que a API faz
- Autenticação por token (Sanctum), com expiração de 24 h e limite de tentativas de login.
- Quatro perfis (admin, gestor, operador, consulta) e usuários ligados a uma unidade.
- Sigilo em dois níveis: ver os metadados é diferente de baixar o arquivo.
- Plano de classificação em árvore (
010 > 010.1 > 010.1.1), com importação CSV tudo-ou-nada. - Tabela de temporalidade versionada: dá para perguntar qual regra valia em qualquer data.
- Fixidez diária: recalcula o SHA-256 de todos os arquivos e registra corrupção ou ausência.
- Auditoria imutável de alterações, logins e downloads.
- Busca sem acento:
licitacaoencontra “Licitação”.
Decisões técnicas
Cada decisão tem um teste que a comprova.
- Índice único parcial no PostgreSQL garante uma única regra vigente por classe, mesmo em condição de corrida.
- Banco antes do disco: o arquivo físico só é apagado depois do commit; se a transação falhar, ele continua lá.
- 404 para o que você não vê, 403 para o que você vê mas não pode fazer: um documento sigiloso de outra unidade nem revela que existe.
- Larastan nível 8: nenhum SQL bruto recebe texto vindo da requisição.
Projeto de portfólio, escrito do zero com dados 100% fictícios.