Tema
Notificações — Endpoints
Base URL: /api/notifications
Permissões: todos os perfis autenticados
GET /api/notifications
Lista notificações do usuário atual.
Query params:
| Parâmetro | Tipo | Descrição |
|---|---|---|
page | integer | Página (padrão: 1) |
pageSize | integer | Itens por página (padrão: 20) |
unreadOnly | boolean | Retornar apenas não lidas |
Resposta 200:
json
{
"data": [
{
"id": "j1k2l3m4-...",
"type": "ContractExpiry",
"title": "Contrato prestes a vencer",
"message": "O contrato AP-001 / João da Silva vence em 28 dias.",
"isRead": false,
"resourceType": "Contract",
"resourceId": "d1e2f3a4-...",
"createdAt": "2026-05-19T08:00:00Z"
},
{
"id": "k1l2m3n4-...",
"type": "PaymentDefault",
"title": "Pagamento em atraso",
"message": "Aluguel de maio/2026 do imóvel CS-010 está em atraso.",
"isRead": true,
"resourceType": "Payment",
"resourceId": "e1f2a3b4-...",
"createdAt": "2026-05-06T09:00:00Z"
}
],
"page": 1,
"pageSize": 20,
"total": 7,
"totalPages": 1,
"hasNext": false,
"hasPrevious": false,
"unreadCount": 3
}Tipos de notificação (type)
| Tipo | Descrição |
|---|---|
ContractExpiry | Contrato vencendo em 30 dias |
PaymentDefault | Pagamento em atraso |
NewProposal | Nova proposta criada |
ProposalApproved | Proposta aprovada |
VisitConfirmed | Visita confirmada |
CommissionApproved | Comissão aprovada |
CommissionPaid | Comissão paga |
General | Notificação genérica |
PATCH /api/notifications/:id/read
Marca uma notificação como lida.
Body: (vazio)
Resposta 200:
json
{
"id": "j1k2l3m4-...",
"isRead": true,
"readAt": "2026-05-19T10:05:00Z"
}PATCH /api/notifications/read-all
Marca todas as notificações do usuário como lidas.
Resposta 200:
json
{
"markedAsRead": 3
}POST /api/notifications/check-alerts
Dispara verificação manual de alertas automáticos (contratos vencendo, inadimplência).
Permissões: Admin
Body: (vazio)
Resposta 200:
json
{
"contractsExpiring": 2,
"paymentsDefaulted": 1,
"notificationsCreated": 3
}Este endpoint é executado automaticamente pelo sistema de forma agendada. O endpoint manual é fornecido para triggering on-demand e testes.
Notificações em tempo real (Firestore)
As notificações são sincronizadas em tempo real via Firestore no frontend. O notification.service.ts mantém uma subscription ativa:
typescript
// notification.service.ts
getRealtimeNotifications(): Observable<Notification[]> {
const q = query(
collection(this.firestore, `notifications/${userId}/items`),
where('isRead', '==', false),
orderBy('createdAt', 'desc')
);
return collectionData(q) as Observable<Notification[]>;
}O badge no ícone de notificações é atualizado automaticamente sem polling.