Skip to main content

📣 Alpura Back Java Library — Notificaciones

Esta librería facilita la construcción y el envío uniforme de notificaciones desde tu aplicación Java 21 + Spring Boot 3.4.4 a un microservicio de notificaciones HTTP.


🛠️ Requisitos

  • Java: 21 (Temurin recomendado)
  • Spring Boot: 3.4.4 o superior

📥 Instalación

Usando Maven

<dependency>
<groupId>com.alpura.notification</groupId>
<artifactId>alpura-back-java-lib-notification</artifactId>
<version>1.0</version>
</dependency>

Para Gradle usa: implementation("com.alpura.notification:alpura-back-java-lib-notification:1.0")


🔍 Escanear paquete

Incluye el paquete en tu @ComponentScan para registrar automáticamente beans internos:

@SpringBootApplication
@ComponentScan({
"com.alpura.notification", // 🧠 Obligatorio
// otros paquetes
})
public class ExApplication {
public static void main(String[] args) {
SpringApplication.run(ExApplication.class, args);
}
}

🚀 ¿Qué hace esta librería?

  1. Modela la notificación completa en un solo objeto (NotificationVO).
  2. Valida campos obligatorios con Bean Validation.
  3. Separa la construcción del payload del envío HTTP.
  4. Simplifica reintentos y manejo de errores mediante RestTemplate.

📦 Estructura de datos

NotificationVO

public class NotificationVO {
@NotEmpty List<ChannelEnum> channel; // ✅ Obligatorio
@NotEmpty Map<String,String> data; // ✅ Obligatorio (≥1)
@NotEmpty List<RecipientVO> recipient; // ✅ Obligatorio (≥1)
List<FileVO> fileId; // ❌ Opcional
@NotNull Integer templateId; // ✅ Obligatorio
@NotNull UserLoggedInfoVO userLoggedInfo; // ✅ Obligatorio
}

(Ver paquete com.alpura.utilities.vo para getters/setters)

Campos clave

  • data: mapa de pares clave–valor que la plantilla sustituye. Ej.: username, orderId.
  • templateId: identificador numérico de la plantilla registrada en el microservicio de notificaciones.
  • userLoggedInfo: contexto del usuario autenticado (userId, email, roles, token) usado para auditoría y propagación del header Authorization.

RecipientVO

public class RecipientVO {
String userEmail; // Correo válido
String userPhone; // Teléfono internacional '+XXXXXXXXXXX'
}

FileVO

public class FileVO {
@NotBlank(message = "fileId is required")
String fileId; // UUID del archivo almacenado en tu File Service
@NotBlank(message = "fileName is required")
String fileName; // Nombre original del archivo (incluye extensión)
@NotBlank(message = "contentType is required")
String contentType; // Tipo MIME, p. ej. "application/pdf"
}
```java
public class FileVO {
String fileId; // UUID del archivo cargado
}

ChannelEnum

public enum ChannelEnum { EMAIL, WHATSAPP, TELEGRAM, TEAMS, PUSH }

🧩 Uso paso a paso

1. Configura la URL del servicio

application.yml:

notification:
service:
base-url: http://localhost:9090/api/v1/notification/message

2. Inyecta el servicio en la la clase a ocupar

@Autowired
private INotificationServiceLib notificationService;

3. Crea y envía una notificación

@PostMapping("/send")
public ResponseEntity<Void> sendNotification(
@Validated(BaseNoBlankGroup.class) @RequestBody NotificationVO notification) {
//Es importante mandar el UserLoggedInfo, para poder enviarle las cabeceras con la autorizacion a la api notification.
notification.setUserLoggedInfo(getUserInfoFromContext());
notificationService.sendNotification(notification);
return ResponseEntity.ok().build();
}

✅ Validaciones automáticas

  • channel, recipient, data no deben estar vacíos.
  • templateId y userLoggedInfo no deben ser nulos.
  • Formato de email/teléfono validado con anotaciones estándar.
  • Si falla alguna validación se lanza ConstraintViolationException con detalle.

📋 Ejemplo de payload JSON

{
"channel": ["EMAIL"],
"templateId": 42,
"data": {
"username": "María",
"orderId": "12345"
},
"fileId": [
{ "fileId": "uuid-del-archivo-1" }
],
"recipient": [
{
"userEmail": "maria.gomez@example.com",
"userPhone": "+525599988877"
}
],
"userLoggedInfo": {
"userId": "abc123",
"email": "admin@example.com",
"roles": ["ADMIN"],
"token": "eyJhbGciOi..."
}
}

🔧 Arquitectura interna

Componentes clave

ClasePaqueteRol
INotificationServiceLibcom.alpura.notification.serviceContrato para enviar notificaciones.
NotificationServiceImplcom.alpura.notification.service.implImplementación por defecto que construye la petición HTTP y maneja errores.
NotificationClientConfigcom.alpura.notification.configConfigura el RestTemplate con timeouts y Jackson.

Flujo de ejecución

Personalización rápida

  • Timeouts: notification.service.connect-timeout / read-timeout.
  • Token Bearer: Se extrae de UserLoggedInfoVO.token automáticamente.
  • Reintentos: Envuelve sendNotification en @Retryable o usa Resilience4j.