Tema
Tratamento de Erros
A API retorna erros padronizados no formato JSON com detalhes suficientes para depuração.
Formato padrão de erro
json
{
"error": "Descrição curta do erro",
"details": "Detalhes adicionais (opcional)",
"statusCode": 400
}Para erros de validação (400), a resposta inclui os campos com problema:
json
{
"errors": {
"Code": ["O campo Code é obrigatório."],
"SalePrice": ["O valor deve ser maior que zero."]
},
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400
}Códigos HTTP utilizados
200 OK
Requisição bem-sucedida. Retorna o recurso solicitado ou lista paginada.
json
{
"data": [...],
"page": 1,
"pageSize": 20,
"total": 45,
"totalPages": 3
}201 Created
Recurso criado com sucesso. O objeto criado é retornado no body.
json
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"code": "AP-001",
"status": "Available",
"createdAt": "2026-05-19T10:30:00Z"
}400 Bad Request
Dados inválidos. Ocorre quando validações de campos falham.
Causas comuns:
- Campo obrigatório ausente
- Tipo de dado incorreto
- Valor fora do intervalo permitido
- Formato inválido (ex: CPF malformado)
json
{
"errors": {
"Email": ["Email inválido."],
"Phone": ["O campo Phone é obrigatório."]
},
"status": 400
}401 Unauthorized
Token de autenticação ausente, expirado ou inválido.
json
{
"error": "Token inválido ou expirado.",
"statusCode": 401
}Ação no frontend: o errorInterceptor redireciona automaticamente para /login.
403 Forbidden
Usuário autenticado, mas sem permissão para o recurso.
json
{
"error": "Você não tem permissão para realizar esta ação.",
"statusCode": 403
}Ação no frontend: exibe mensagem de "Acesso negado" sem redirecionar.
404 Not Found
O recurso solicitado não existe (ou foi deletado com soft delete).
json
{
"error": "Imóvel não encontrado.",
"statusCode": 404
}409 Conflict
Conflito com um recurso existente.
Casos comuns:
- CNPJ já cadastrado
- E-mail já em uso
- Código de imóvel duplicado na empresa
json
{
"error": "Já existe um imóvel com o código AP-001 nesta empresa.",
"statusCode": 409
}422 Unprocessable Entity
A requisição é válida sintaticamente, mas viola uma regra de negócio.
Casos comuns:
- Tentar aprovar uma proposta expirada
- Converter proposta não aprovada em contrato
- Alterar status inválido de imóvel
json
{
"error": "Proposta expirada não pode ser aprovada.",
"statusCode": 422
}500 Internal Server Error
Erro inesperado no servidor.
json
{
"error": "Ocorreu um erro interno. Tente novamente.",
"statusCode": 500
}Ação no frontend: o errorInterceptor exibe mensagem genérica de erro.
Tratamento no Angular
O errorInterceptor centraliza o tratamento de todos os erros HTTP:
typescript
// error.interceptor.ts
export const errorInterceptor: HttpInterceptorFn = (req, next) => {
return next(req).pipe(
catchError((error: HttpErrorResponse) => {
switch (error.status) {
case 401:
router.navigate(['/login']);
break;
case 403:
toastService.error('Acesso negado. Você não tem permissão para esta ação.');
break;
case 500:
toastService.error('Erro interno do servidor. Tente novamente.');
break;
}
return throwError(() => error);
})
);
};Timeout de requisição
O timeoutInterceptor cancela requisições que ultrapassem 30 segundos:
typescript
// Pode ser customizado via token de injeção
providers: [
{ provide: REQUEST_TIMEOUT, useValue: 60_000 } // 60 segundos
]Quando o timeout é atingido, um TimeoutError é lançado e tratado pelo errorInterceptor.
Logs de erros
Em ambiente de desenvolvimento, o loggingInterceptor registra todas as requisições e respostas no console do navegador, incluindo erros com stack trace.
No backend, o Serilog registra erros com nível Error e exceções com contexto de request.