📎 Implementar sistema de upload de arquivos polimórfico
Descrição
Implementar a estrutura completa de upload e gerenciamento de arquivos do e-Fomento.
O sistema utilizará uma tabela centralizada files com relacionamento polimórfico,
servindo múltiplas entidades através do padrão object_type + object_id com morph map do Eloquent.
Contexto técnico
A tabela files funcionará como repositório único de arquivos para todas as entidades
do sistema. Cada arquivo pertence a uma entidade específica, é armazenado em uma estrutura
de pastas organizada por tipo e ID (project/998877/contrato.pdf) e possui controle de
visibilidade pública/privada.
Entidades contempladas
Notice
Project
Opening
Formalization
Budget
Payment
Monitoring
LegalAnalysis
Critérios de aceite
Regras de negócio
- Arquivos
private = true não expõem URL pública
- Path gerado automaticamente no padrão
{object_type}/{object_id}/{slug}.{ext}
- MD5 calculado automaticamente no upload para controle de integridade
- Tamanho máximo por arquivo: 20MB
- Sem suporte a variantes de tamanho ou arquivos derivados (sem
parent_id)
Rotas
| Método |
Endpoint |
Ação |
POST |
/files/{objectType}/{objectId} |
Upload de arquivo |
DELETE |
/files/{fileId} |
Remoção de arquivo |
Artefatos a serem criados
| Arquivo |
Tipo |
database/migrations/xxxx_create_files_table.php |
Migration |
app/Models/File.php |
Model |
app/Traits/HasFiles.php |
Trait |
app/Services/FileService.php |
Service |
app/Http/Requests/FileRequest.php |
Request |
app/Http/Controllers/FileController.php |
Controller |
app/Http/Resources/FileResource.php |
Resource |
Stack
- Laravel 12 / PHP 8.3
- Eloquent ORM — Polymorphic Relationships
- Storage nativo do Laravel (sem pacotes externos)
Referências
📎 Implementar sistema de upload de arquivos polimórfico
Descrição
Implementar a estrutura completa de upload e gerenciamento de arquivos do e-Fomento.
O sistema utilizará uma tabela centralizada
filescom relacionamento polimórfico,servindo múltiplas entidades através do padrão
object_type+object_idcom morph map do Eloquent.Contexto técnico
A tabela
filesfuncionará como repositório único de arquivos para todas as entidadesdo sistema. Cada arquivo pertence a uma entidade específica, é armazenado em uma estrutura
de pastas organizada por tipo e ID (
project/998877/contrato.pdf) e possui controle devisibilidade pública/privada.
Entidades contempladas
NoticeProjectOpeningFormalizationBudgetPaymentMonitoringLegalAnalysisCritérios de aceite
filescriada com todos os campos, índices e soft deleteFilecom soft delete, acessor de URL, scopes e relacionamento polimórficoHasFilescriada e aplicada em todas as entidades listadasFileServiceimplementado com métodosupload,deleteebuildPathFileRequestcom validação dos campos de uploadFileControllercom actionsstoreedestroyFileResourceexpondo os campos públicos do arquivoAppServiceProviderapi.php.envcom variávelFILE_DISKRegras de negócio
private = truenão expõem URL pública{object_type}/{object_id}/{slug}.{ext}parent_id)Rotas
POST/files/{objectType}/{objectId}DELETE/files/{fileId}Artefatos a serem criados
database/migrations/xxxx_create_files_table.phpapp/Models/File.phpapp/Traits/HasFiles.phpapp/Services/FileService.phpapp/Http/Requests/FileRequest.phpapp/Http/Controllers/FileController.phpapp/Http/Resources/FileResource.phpStack
Referências
files: (link da conversa ou PR de decisão)