Payloads e Deep Links de Notificação
Pilar: 03 — Notificações
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
Módulos Conectados:gatein-server(app/core/firebase.py),gatein-app(src/navigation/RootNavigator.js)
1. Estrutura Padrão dos Payloads FCM
Todas as notificações enviadas pelo servidor Gatein seguem o padrão bidimensional do Firebase Cloud Messaging:
notification: Contém o título e corpo visíveis renderizados pelo SO.data: Objeto de chave-valor (onde todos os valores são obrigatoriamentestring) consumido pela engine de roteamento dinâmico do aplicativo mobile.
{
"notification": {
"title": "Check-in Aprovado",
"body": "Sua entrada no Terminal Santos foi liberada. Acesse seu Ticket."
},
"data": {
"type": "CHECKIN_APPROVED",
"appointment_id": "w8x9k2m1",
"ticket_id": "z9y8x7w6",
"terminal_id": "p4k2n8m9",
"click_action": "FLUTTER_NOTIFICATION_CLICK"
}
}
2. Dicionário Completo de Payloads por Tipo de Evento
2.1 Evento: CHECKIN_APPROVED
- Finalidade: Notificar o motorista que a entrada no terminal foi autorizada.
- Payload
data:
{
"type": "CHECKIN_APPROVED",
"appointment_id": "w8x9k2m1",
"ticket_id": "z9y8x7w6"
}
- Roteamento no App: Redireciona imediatamente para a tela
TicketScreencarregando o Ticketz9y8x7w6.
2.2 Evento: CHECKIN_REJECTED
- Finalidade: Informar que a solicitação de check-in foi recusada pelo operador.
- Payload
data:
{
"type": "CHECKIN_REJECTED",
"appointment_id": "w8x9k2m1",
"reason": "Doca ocupada. Aguarde nova orientação na área de triagem."
}
- Roteamento no App: Abre a tela
CheckinFailScreenexibindo o motivo retornado pelo operador.
2.3 Evento: REMINDER_1DAY
- Finalidade: Lembrete de véspera de atendimento.
- Payload
data:
{
"type": "REMINDER_1DAY",
"count": "1",
"appointment_id": "w8x9k2m1"
}
- Roteamento no App: Abre a tela principal
HomeScreencom o card do agendamento destacado.
2.4 Evento: COUNTDOWN (Lembrete de 12 Horas)
- Finalidade: Notificação com dados para contador regressivo na interface.
- Payload
data:
{
"type": "COUNTDOWN",
"appointment_id": "w8x9k2m1",
"target_timestamp": "2026-08-04T10:00:00Z",
"count": "1"
}
- Roteamento no App: Abre a tela
AppointmentDetailScreeniniciando o timer regressivo nativo.
2.5 Evento: WINDOW_OPEN
- Finalidade: Avisar que a tolerância inicial da janela agendada foi atingida.
- Payload
data:
{
"type": "WINDOW_OPEN",
"appointment_id": "w8x9k2m1"
}
- Roteamento no App: Abre a tela
CheckinScreenou habilita o botão de Check-in Remoto via GPS.
2.6 Evento: TRIP_ASSIGNED
- Finalidade: Notificar a atribuição de uma nova viagem de frete.
- Payload
data:
{
"type": "TRIP_ASSIGNED",
"trip_id": "t1k2m3n4"
}
- Roteamento no App: Redireciona para a aba
TripsTab/TripDetailScreen.
3. Matriz de Mapeamento de Deep Links no App Mobile
graph TD
PUSH[Notificação Recebida / Tocado pelo Usuário] --> PARSE[Leitura do data.type]
PARSE -->|CHECKIN_APPROVED| TICKET[TicketScreen / params: ticket_id]
PARSE -->|CHECKIN_REJECTED| FAIL[CheckinFailScreen / params: reason]
PARSE -->|REMINDER_1DAY| HOME[HomeScreen]
PARSE -->|COUNTDOWN| DETAIL[AppointmentDetailScreen / params: appointment_id]
PARSE -->|WINDOW_OPEN| CHECKIN[CheckinScreen / params: appointment_id]
PARSE -->|TRIP_ASSIGNED| TRIP[TripDetailScreen / params: trip_id]
PARSE -->|ANNOUNCEMENT_PUBLISHED| ANNOUNCEMENT[NotificationsScreen / params: announcement_id]
4. Regras de Sanitização de Payloads
- Apenas Strings no Dicionário
data: O SDK do Firebase Admin rejeita dicionários contendo valores booleanos, inteiros ou nulos dentro do campodata. Todos os atributos (comocountou timestamps) devem ser convertidos comstr()antes do envio. - Sqids Obrigatórios: Nenhum ID interno bruto (UUID ou Integer) pode ser enviado no payload de notificação. Todos os atributos identificadores devem utilizar
encode_id().