Skip to main content

High Level Design (HLD) - Alpura Dashboard Microservice

1. Resumen Ejecutivo

Este documento describe la arquitectura y diseño técnico del microservicio alpura-java-back-msa-dashboard, un componente REST desarrollado en Java con Spring Boot.

Propósito: El microservicio centraliza la lógica de negocio para alimentar un Dashboard operativo (Sienpro). Sus principales responsabilidades son:

  • Gestión y consulta de ejecuciones de procesos batch (Jobs).
  • Gestión de usuarios del sistema (CRUD).
  • Consulta y reporte de transacciones de redención (producto a empleado).
  • Visualización de métricas y resúmenes operativos.

Rol en el Ecosistema: Servicio de Backend (Capability Domain: Operaciones/Reportes) que expone datos consolidados para un Frontend (y aplicación movil a futuro).


2. Contexto Arquitectónico

El microservicio se ejecuta dentro del ecosistema de Alpura, integrándose con servicios de infraestructura estándar.

  • Runtime: Java 21 (Spring Boot 3.4.4).
  • Base de Datos Primaria (Negocio): PostgreSQL. Almacena usuarios, jobs, steps y transacciones.
  • Base de Datos Secundaria (Telemetría): PostgreSQL. Almacena logs de auditoría y errores.
  • Seguridad / IAM: Keycloak (OAuth2 / OIDC). El servicio actúa como Resource Server validando JWTs y como Client para integraciones (Client Credentials).
  • Comunicación:
    • Entrada: REST API (JSON) consumida por Clientes (Web/Mobile).
    • Salida: JDBC a Bases de Datos.

3. Arquitectura de Alto Nivel (HLD)

El servicio sigue un patrón de Arquitectura en Capas (Layered Architecture) con separación estricta de responsabilidades.

Diagrama de Arquitectura (Conceptual)

Componentes Principales

  1. Web Layer (Controllers): Maneja las peticiones HTTP, validación de entrada (@Validated) y serialización de respuesta.
    • DashboardController: Métricas globales.
    • JobsController: Gestión de procesos batch.
    • TransactionsController: Reporte de transacciones.
    • UserController: Administración de usuarios.
  2. Facade Layer: Intermediario transaccional (en algunos casos) y orquestador simple. Desacopla el Controller del Service.
  3. Service Layer: Contiene la lógica de negocio pura, transformaciones de datos y reglas de validación.
  4. Persistence Layer: Interfaces JpaRepository para acceso a datos. Uso de Specification para consultas dinámicas complejas (Transacciones).
  5. Shared Libraries: Uso extensivo de librerías internas (alpura-model-ex, alpura-common-utilities) para estandarización.

4. Contrato de API y Endpoints

El servicio expone una API REST bajo el prefijo base /api/v1.

4.1 Dashboard (/api/v1/dashboard)

MétodoEndpointDescripciónResponse
GET/summaryObtiene resumen de métricas (jobs ok/error).SingleResponseVO<DashboardSummaryVO>

4.2 Jobs (/api/v1/jobs)

MétodoEndpointQuery ParamsDescripción
GET/fromDate, toDate, status, page, sizeListado paginado de ejecuciones de jobs.
GET/{jobId}page, size, sortDetalle de un job específico (reportes asociados).

4.3 Transactions (/api/v1/transaction)

MétodoEndpointQuery ParamsDescripción
GET/fromDate, toDate, category, payrollBúsqueda dinámica de transacciones (JSONB support).

4.4 Users (/api/v1/users)

MétodoEndpointDescripciónBody (Create/Update)
GET/Listado de usuarios con filtros.N/A
GET/{id}Detalle de usuario.N/A
POST/Crear usuario.UserVO
PUT/{id}Actualizar usuario.UserVO
DELETE/{id}Eliminación lógica (soft delete).N/A

5. Flujos Funcionales Principales

5.1 Consulta de Transacciones (Dynamic Query)

Este flujo destaca por el manejo de campos dinámicos en base de datos (JSONB).

  1. Request: Cliente solicita transacciones filtrando por category o payroll.
  2. Service:
    • Construye un Specification JPA.
    • Si filtra por category, usa funciones nativas de BD (jsonb_exists) sobre el campo redeemed_amount.
  3. Repository: Ejecuta query optimizada en PostgreSQL.
  4. Mapping: Itera sobre el JSON de respuesta, cruza con CategoryRepository (cacheado en memoria por request) para enriquecer nombres de categorías.
  5. Response: Retorna lista paginada.

5.2 Gestión de Usuarios

  1. Create/Update:
    • Recibe UserVO.
    • Mapea a Entidad UserDO.
    • Utils llenan campos de Auditoría (creationUser, date, etc.).
    • Persiste en DB.
  2. Delete:
    • No borra físicamente.
    • Marca active = false.
    • Actualiza auditoría.

6. Casos de Uso

Caso de UsoActorDescripciónFlujo Principal
Monitorear JobsOperadorVer estado de ejecuciones batch.1. Consultar resumen.
2. Ver lista de jobs fallidos.
3. Ver detalle de job específico.
Auditar TransaccionesAuditorRevisar movimientos financieros/puntos.1. Filtrar por rango de fechas y nómina.
2. Sistema busca en JSONB.
3. Muestra desglose por categoría.
Admin UsuariosAdminGestionar acceso al Dashboard.CRUD completo sobre tabla user_tbl.

7. Integraciones Técnicas

7.1 Persistencia (PostgreSQL)

  • Driver: org.postgresql.Driver
  • Dialect: org.hibernate.dialect.PostgreSQLDialect
  • Configuración: Pool HikariCP (min: 5, max: 10).
  • Esquemas:
    • Primary: Datos de negocio (user_tbl, JobDO implícita, RedemptionTransactionDO).
    • Secondary: Auditoría técnica (audit_log, error_log).

7.2 Librerías Internas (Nexus/Artifact Registry)

El proyecto depende fuertemente de librerías corporativas hospedadas en artifact-registry (Google Cloud):

  • back-java-lib-common-utilities: Utilerías base, VOs genéricos.
  • back-java-lib-model-ex: Entidades de dominio común.
  • back-java-lib-model-sienpro: Entidades específicas de Sienpro.
  • back-java-lib-common-telemetry: Auditoría y trazas.

8. Seguridad

  • Framework: Spring Security 6 (vía Spring Boot 3.4).
  • Mecanismo: OAuth2 Resource Server (JWT).
  • Proveedor de Identidad: Keycloak (hub-uat-login.alpura.com).
  • Validación:
    • jwk-set-uri: Descarga llaves públicas para validar firma del token.
    • issuer-uri: Valida el emisor del token.
  • Configuración Custom:
    • Propiedades alpuraSecurity.evaluateRoles y disableSecurity permiten flexibilizar la seguridad en entornos bajos.

9. Observabilidad y Operación

  • Health Checks: Actuator habilitado (/actuator/health).
  • Métricas: Prometheus (/actuator/prometheus) vía Micrometer.
  • Auditoría: Implementación custom (@IAuditable) en Servicios. Guarda logs en DB Secundaria (audit_log).
  • Logging:
    • Interceptor HTTP (JsonResponseInterceptor) para trazabilidad de requests.
    • Configuración de logs de auditoría activable por properties (audit.config.logAuditable).

10. Modelo de Datos (ERD Inferido)

A partir del análisis de Repositories y entidades inferidas de librerías externas:

10.2 Diccionario de Datos

Esta sección detalla las estructuras de las tablas principales identificadas. Algunas columnas han sido inferidas del código o de archivos de esquema de prueba.

Tabla: user_tbl (Usuarios)

Fuente: src/main/resources/schema.sql

ColumnaTipo de Dato (SQL)DescripciónRestricciones
idINTEGERIdentificador único del usuario.PK, Auto Increment
nameUserVARCHAR(255)Nombre de pila.-
lastNameUserVARCHAR(255)Apellidos.-
DN_USUARIO_MODIFICADORVARCHAR(255)Usuario que realizó la última modificación.NOT NULL
DD_FECHA_MODIFICACIONTIMESTAMPFecha/hora de última modificación.Default: Current TB
DN_USUARIO_CREADORVARCHAR(255)Usuario que creó el registro.NOT NULL
DD_FECHA_CREACIONTIMESTAMPFecha/hora de creación.Default: Current TB
DN_ACTIVOBOOLEANBandera de borrado lógico.Default: TRUE

Tabla: redemption_transaction_do (Transacciones de Redención)

Fuente: Inferencia desde RedemptionTransactionDO y TransactionsServiceImpl

ColumnaTipo de Dato (Inferred)DescripciónNotas
transaction_idVARCHARIdentificador único de transacción.PK
payroll_numberBIGINTNúmero de nómina del empleado.-
transaction_dateTIMESTAMPFecha de la operación.Indexado para rangos.
balance_beforeJSONBSaldo antes de la operación.Estructura dinámica.
redeemed_amountJSONBMonto redimido.Usado en búsquedas jsonb_exists.
balance_afterJSONBSaldo resultante.Estructura dinámica.

Tabla: job_do (Jobs Batch)

Fuente: Inferencia de uso en BatchServiceImpl repository usage

ColumnaTipo de Dato (Inferred)DescripciónNotas
job_idVARCHARIdentificador del Job (UUID).PK
status_idINTEGEREstado del Job (1=PENDING, 2=IN_PROGRESS, 3=COMPLETED, 4=FAILED).Enum Mapped
created_atTIMESTAMPFecha de creación del job.-
process_started_atTIMESTAMPFecha inicio real de procesamiento.-
process_finished_atTIMESTAMPFecha fin de procesamiento.-
input_parametersTEXTParámetros de entrada del job.JSON o CSV string

Tabla: tickets_report_detail (Detalle de Reportes)

Fuente: Inferencia desde TicketsReportDetailDO

ColumnaTipo de Dato (Inferred)DescripciónNotas
report_detail_idBIGINTID autogenerado del detalle.PK
report_header_idVARCHARLink al Job/Header padre.FK
employee_numberVARCHARNúmero de empleado asociado.-
concept_codeVARCHARCódigo del concepto reportado.-
total_amountDECIMALMonto monetario o puntos.-
is_processedBOOLEANIndica si el registro ya fue procesado.-
creation_dateTIMESTAMPFecha de inserción.-

Tablas de Auditoría (Secundarias)

Fuente: src/main/resources/schema.sql

TablaDescripcionColumnas Clave
audit_logLogs de auditoría de negocio.id (PK), id_app, dx_audit_log_json (Payload)
error_logLogs de errores de ap

11. Consideraciones No Funcionales

  • Performance:
    • Uso de Specification y proyecciones para consultas complejas.
    • Paginación obligatoria en endpoints de listado para evitar OOM.
    • Mapeo manual de JSON optimizado con caché local de Categorías.
  • Resiliencia:
    • Pool de conexiones gestionado.
    • Manejo de errores centralizado (vía librerías base).
  • Escalabilidad:
    • Servicio Stateless (sesión delegada en Token JWT).
    • Desacoplamiento de DB de auditoría para no impactar rendimiento transaccional.

12. Estructura del Proyecto

com.alpura.java.arch
├── common
│ └── vo # Value Objects (DTOs)
├── config # Configuración Spring (DB, Datasource)
├── facade # Capa de Orquestación
│ └── impl # Implementación de Facades
├── persistence # Repositorios JPA y Espeficaciones
├── service # Capa de Negocio
│ └── impl # Lógica de Negocio
├── validations # Grupos de validación
├── web # Controladores REST
└── ExApplication.java # Main Entrypoint