iGRPIGRP 3.0Documentation

Visão geral

Hub centralizado de notificações do ecossistema iGRP — email, SMS, WhatsApp, push, in-app e offline, com suporte a templates, envios em massa e recorrência.

O iGRP Notification Service é o microserviço de notificações do iGRP 3.0. Cada aplicação do Access Management envia notificações por um SDK (TypeScript ou Java) ou pela API REST; o serviço trata de canais, templates, retentativas, auditoria e RGPD.

Para ligar uma aplicação, segue a página Envio — SDKs e API. Templates e definições geram-se na Notifications UI, a consola de administração.


Já integrado nos processos

O runtime dos processos BPMN avisa por IN_APP quem tem acesso à etapa seguinte de cada processo — ver Notificações de tarefas.

Canais suportados

CanalProviderCaso de uso típico
EMAILSMTPRecibos, confirmações, convites
SMSAgregador HTTPAlertas urgentes, OTP
WHATSAPPMeta Cloud APIMensagens com templates aprovados
PUSHFirebase Cloud MessagingAplicações móveis
IN_APPCaixa de entrada na base de dadosSino de notificações na UI web
OFFLINESem transporte — fica registado para entrega manualBalcão, carta

Todos os providers vêm desligados: cada canal só envia depois de configurado — ver Configurar os canais.


Modos de envio

ModoDescrição
Recipient únicoUm destinatário, um ou mais canais
Multi-destinatárioLista de destinatários numa única chamada
BulkLista grande ou ficheiro CSV; resposta com batchId
GruposGrupos internos ou sincronizados com o Access Manager
RecorrenteCron ou intervalo via Temporal Schedules

Envio de notificações

Antes do primeiro envio, confirma estes quatro pontos. Cada um, se faltar, faz o pedido falhar com um erro diferente:

#RequisitoOnde se configuraSe faltar
1Cliente M2M associado à aplicação, com a permissão igrp.notification.sendAccess Management (conta de serviço do cliente)403, ou 422 ACCESS_MANAGER_UNAVAILABLE se o token não trouxer application_code
2Provider do canal ligado no serviço — para EMAIL, o SMTPVariáveis do Notification Service — Configurar os canais422 CHANNEL_NOT_ENABLED
3Canal ativo na aplicaçãoConsola › Definições › Canais permitidos422 CHANNEL_NOT_ENABLED
4Template publicado no código, canal e locale do envio (ou conteúdo inline)Consola › Templates422 TEMPLATE_ERROR

EMAIL precisa de SMTP configurado

Sem o provider SMTP configurado no Notification Service (NOTIFICATION_PROVIDERS_EMAILSMTP_*: servidor, porta, credenciais e remetente), nenhum email é enviado: a API recusa o pedido com 422 CHANNEL_NOT_ENABLED. Ver EMAIL (SMTP).

Com os requisitos cumpridos, o envio é um pedido M2M:

curl -X POST "$NOTIFICATION_SERVICE_BASE_URL/api/v1/notifications" \
  -H "Authorization: Bearer $TOKEN_M2M" \
  -H "Content-Type: application/json" \
  -d '{
    "channelStrategy": "SPECIFIC",
    "channels": ["EMAIL"],
    "recipients": [{ "email": "utente@exemplo.cv" }],
    "template": { "code": "pedido-confirmacao", "locale": "pt-CV" },
    "variables": { "nome": "Maria Silva", "numeroPedido": "PED-2026-0456" },
    "businessKey": "PED-2026-0456",
    "idempotencyKey": "pedido-confirmacao-PED-2026-0456"
  }'

A resposta é 202 Accepted, com uma entrega por destinatário e canal. A entrega segue em segundo plano: acompanha o estado (QUEUED → SENT → DELIVERED) em Envios na consola ou em GET /api/v1/notifications/{id}.

Para…Ver
Enviar a partir de uma app Next.js ou de um serviço Spring BootEnvio — SDKs e API
Os campos do pedido e os errosAPI REST › Notificações
Os SDKsTypeScript · Java

Arquitetura

QUEM CHAMAREST · SDKsNOTIFICATION SERVICESpring BootCANAISum provider por canalApp Next.jsSDK TypeScript · M2MServiço Spring BootSDK Java · M2MProcess Managementaviso da tarefa seguinteConsolaigrp-notifications-uiSino / Inboxtoken do utilizador/api/v1REST + GraphQL · 202 AcceptedTemporalfilas por prioridade · retentativasPostgreSQLenvios · inboxS3 / MinIOanexosworkflowEMAILSMTPSMSagregador HTTPWHATSAPPMeta Cloud APIPUSHFirebase (FCM)IN_APPinbox na base de dadosOFFLINEentrega manualAccess Managementtokens · permissões · acesso à appvalida o JWTrecibos → /webhooks/{providerId}
Os envios entram pela API (202 Accepted) e são entregues em segundo plano pelo Temporal, através do provider ativo de cada canal. A inbox e as leituras usam o token do utilizador; os envios usam um token M2M do Access Management.
  1. A aplicação chama POST /api/v1/notifications com um token M2M. O serviço valida o pedido (aplicação, canal ativo, template publicado), grava-o e responde 202 Accepted com uma entrega por destinatário e canal.
  2. O Temporal entrega em segundo plano, com filas por prioridade e retentativas. Se o Temporal não responder, a entrega é feita na hora, dentro do pedido.
  3. O provider do canal envia (SMTP, FCM, …). Os recibos de entrega e leitura voltam por /webhooks/{providerId} e atualizam o estado (SENT → DELIVERED → READ).
  4. IN_APP não sai do serviço: a mensagem fica na inbox do utilizador, lida com o token dele.

O código segue hexagonal + DDD em 13 módulos Maven:

MóduloResponsabilidade
notification-domainModelo de domínio (sem Spring)
notification-applicationCasos de uso e portas
notification-provider-spiInterface ChannelProvider
provider-email-smtpEMAIL por SMTP
provider-sms-aggregatorSMS
provider-whatsapp-metaWhatsApp
provider-push-fcmPUSH
provider-inapp, provider-offlineIN_APP e OFFLINE
provider-email-sendgridReservado — ainda sem implementação
notification-appExecutável Spring Boot 3.5 / Java 26 (API + workers)
clientSDK Java
notification-bomVersões

Um canal novo é um módulo provider-* novo, sem mexer no núcleo.


Configurar os canais

Um envio para um canal sem provider ativo é recusado logo na API com 422 CHANNEL_NOT_ENABLED. O canal tem de estar ligado no serviço (provider) e na aplicação (Definições › Canais permitidos).

EMAIL (SMTP)

Sem SMTP configurado, nenhum email sai. Liga o provider com o servidor de correio do ambiente:

PropriedadeVariável de ambienteNotas
notification.providers.email-smtp.enabledNOTIFICATION_PROVIDERS_EMAILSMTP_ENABLEDtrue para ativar
…email-smtp.hostNOTIFICATION_PROVIDERS_EMAILSMTP_HOSTServidor SMTP
…email-smtp.portNOTIFICATION_PROVIDERS_EMAILSMTP_PORTPor omissão 587
…email-smtp.username, …passwordNOTIFICATION_PROVIDERS_EMAILSMTP_USERNAME, …_PASSWORDSe o servidor exigir autenticação
…email-smtp.starttlsNOTIFICATION_PROVIDERS_EMAILSMTP_STARTTLSPor omissão true
…email-smtp.fromNOTIFICATION_PROVIDERS_EMAILSMTP_FROMRemetente de todos os emails

O remetente vem do SMTP

O From dos emails é sempre o from do provider SMTP. Os remetentes configurados nas Definições da aplicação ainda não são usados no envio.

Para testes sem enviar emails reais, aponta o SMTP para um servidor de captura (por exemplo Mailpit).

Outros canais

CanalAtivar comPrecisa de
IN_APPINAPP_ENABLED=true—
OFFLINEOFFLINE_ENABLED=true—
SMSnotification.providers.sms-aggregator.enabled=trueurl, token, from do agregador
WHATSAPPWHATSAPP_ENABLED=trueWHATSAPP_PHONE_NUMBER_ID, WHATSAPP_ACCESS_TOKEN, WHATSAPP_APP_SECRET
PUSHFCM_ENABLED=trueFCM_CREDENTIALS (conta de serviço Firebase)

Observabilidade

  • OpenAPI em /v3/api-docs · Swagger UI em /swagger-ui.html
  • Logs estruturados (ECS JSON em produção — LOG_STRUCTURED_FORMAT=ecs)
  • OpenTelemetry: tracing ligado por omissão, exportado para OTEL_EXPORTER_OTLP_ENDPOINT (desliga com TRACING_ENABLED=false)
  • GraphQL em /graphql (desliga a introspection em produção com GRAPHQL_INTROSPECTION=false)

Variáveis de ambiente

O serviço é distribuído como imagem e corre no cluster ou no Docker do workspace, ao lado dos outros serviços da plataforma. Configura-se por variáveis de ambiente.

Autenticação e Access Management

VariávelDescrição
AUTH_JWT_ISSUERObrigatória. Issuer do Access Management; o serviço valida os tokens com ele
NOTIFICATION_ACCESSMANAGEMENT_ENABLEDtrue para verificar se o utilizador tem acesso à aplicação de cada pedido (necessário para a consola e para tokens de utilizador)
NOTIFICATION_ACCESSMANAGEMENT_BASEURLBase do Access Management
NOTIFICATION_ACCESSMANAGEMENT_CLIENTID, …_CLIENTSECRETCliente M2M do serviço no Access Management

No arranque o serviço regista no Access Management as suas permissões (igrp.notification.*).

Base de dados, Temporal e anexos

VariávelDescrição
SPRING_DATASOURCE_URL, …_USERNAME, …_PASSWORDPostgreSQL (o esquema é criado pelo Flyway)
TEMPORAL_ENABLEDtrue por omissão; false entrega de forma síncrona, sem Temporal
TEMPORAL_TARGET, TEMPORAL_NAMESPACEServidor Temporal (host:7233) e namespace
STORAGE_ENDPOINT, STORAGE_BUCKET, STORAGE_REGIONArmazenamento S3 dos anexos (MinIO: endpoint próprio)
STORAGE_ACCESS_KEY, STORAGE_SECRET_KEYCredenciais S3
STORAGE_PATH_STYLE, STORAGE_SSEtrue/false para MinIO (path-style ligado, encriptação SSE desligada)
STORAGE_ALLOWED_MIME_TYPESTipos de anexo aceites

Canais e templates

VariávelDescrição
NOTIFICATION_PROVIDERS_EMAILSMTP_*, INAPP_ENABLED, …Providers — ver Configurar os canais
NOTIFICATION_SEED_DEFAULT_TEMPLATESfalse para não publicar os templates de convite no arranque

Observabilidade

VariávelDescrição
TRACING_ENABLED, TRACING_SAMPLING_PROBABILITY, OTEL_EXPORTER_OTLP_ENDPOINTTracing OpenTelemetry
LOG_STRUCTURED_FORMATFormato dos logs (ecs por omissão)
GRAPHQL_INTROSPECTIONfalse em produção
How is this guide?

Última atualização: