Tema
Arquivos — Endpoints
Base URL: /api/files
Permissões: todos os perfis autenticados
O upload de arquivos é feito diretamente para o Firebase Storage pelo frontend. A API apenas registra os metadados do arquivo após o upload.
GET /api/files
Lista arquivos da empresa com paginação.
Query params:
| Parâmetro | Tipo | Descrição |
|---|---|---|
page | integer | Página (padrão: 1) |
pageSize | integer | Itens por página |
search | string | Busca por nome do arquivo |
contentType | string | Filtro por tipo MIME (ex: image/jpeg, application/pdf) |
Resposta 200:
json
{
"data": [
{
"id": "l1m2n3o4-...",
"fileName": "contrato-joao-ap001.pdf",
"storagePath": "companies/empresa-id/contracts/contrato-joao-ap001.pdf",
"url": "https://storage.googleapis.com/imobitalk-app.appspot.com/...",
"contentType": "application/pdf",
"sizeBytes": 204800,
"uploadedBy": "admin@imob.com",
"createdAt": "2026-05-20T10:00:00Z"
}
],
"page": 1,
"pageSize": 20,
"total": 18,
"totalPages": 1,
"hasNext": false,
"hasPrevious": false
}POST /api/files
Registra metadados de um arquivo após upload no Firebase Storage.
Fluxo de upload:
1. Frontend faz upload direto para Firebase Storage
→ getDownloadURL() retorna a URL pública
↓
2. Frontend chama POST /api/files com os metadados
↓
3. API salva FileAsset no bancoBody:
json
{
"fileName": "foto-sala-ap001.jpg",
"storagePath": "companies/empresa-id/properties/ap001/foto-sala.jpg",
"url": "https://storage.googleapis.com/imobitalk-app.appspot.com/...",
"contentType": "image/jpeg",
"sizeBytes": 512000
}| Campo | Tipo | Obrigatório |
|---|---|---|
fileName | string | Sim |
storagePath | string | Sim |
url | string | Sim |
contentType | string | Sim |
sizeBytes | long | Sim |
Resposta 201:
json
{
"id": "l1m2n3o4-...",
"fileName": "foto-sala-ap001.jpg",
"url": "https://storage.googleapis.com/...",
"contentType": "image/jpeg",
"sizeBytes": 512000,
"createdAt": "2026-05-20T10:00:00Z"
}DELETE /api/files/:id
Remove o registro de metadados (soft delete).
O arquivo no Firebase Storage deve ser excluído separadamente pelo frontend via SDK.
Resposta 204: Sem conteúdo.
Exemplo de upload no Angular
typescript
// file.service.ts
async uploadFile(file: File, path: string): Promise<FileAsset> {
// 1. Upload para Firebase Storage
const storageRef = ref(this.storage, path);
const snapshot = await uploadBytes(storageRef, file);
const url = await getDownloadURL(snapshot.ref);
// 2. Registrar metadados na API
return this.http.post<FileAsset>(`${this.apiUrl}/files`, {
fileName: file.name,
storagePath: snapshot.ref.fullPath,
url,
contentType: file.type,
sizeBytes: file.size,
}).toPromise();
}Tipos de arquivo aceitos
| Tipo | MIME Types |
|---|---|
| Imagens | image/jpeg, image/png, image/webp |
| Documentos | application/pdf |
| Planilhas | application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
Tamanho máximo: 10 MB por arquivo (configurável no Firebase Storage).