Skip to content

[SCRUM-1070] US-03.1.1-M6: reglas de categoría en el Rules Service Java - #2

Merged
santiagohb2830 merged 5 commits into
developfrom
feature/SCRUM-1070-reglas-categoria-rules-java
Oct 17, 2026
Merged

santiagohb2830 merged 5 commits into
developfrom
feature/SCRUM-1070-reglas-categoria-rules-java

Conversation

@Alviz09

@Alviz09 Alviz09 commented Oct 16, 2026 •

Copy link
Copy Markdown

Descripción

Lleva las reglas evaluables de la categoría de servicio (antes en crear_categoria_servicio(), migración 003, SCRUM-857, y en Core Node) al Rules Service, para poder cambiarlas sin desplegar Core.

M6.1 · SCRUM-1225 (esqueleto)

  • Integra el esqueleto de pruebas de QA-06 (SCRUM-1123): JUnit 5 + JaCoCo + ci.yml.
  • CorrelationIdFilter (MDC + header), GlobalExceptionHandler con forma {error, code, correlationId} común con Core.
  • Bug corregido: el Gateway recorta /api/v1/rules antes de reenviar, así que /api/v1/rules/evaluate-rate llegaba como /evaluate-rate y respondía 404. Todo endpoint responde ahora con y sin el prefijo.
  • Se quita @CrossOrigin("*"): CORS es del Gateway.

M6.2 · SCRUM-1226 (evaluación)

  • POST /api/v1/rules/categories/evaluate con el contrato que Core declaró en US-03.1.1-M2.2: {allowed, ruleSetVersion, violations[]} + normalized.
  • CategoryRuleEvaluator (función pura): nombre normalizado de 3 a 60 caracteres con letra (MANI-CAT-422N), flujo permitido (MANI-CAT-422F), UPDATE parcial, OPERATE exige categoría activa (MANI-CAT-422C).
  • Tenant solo desde X-Tenant-Id (claim puesto por el Gateway o Core); un tenantId ajeno en el cuerpo da 403 TENANT_MISMATCH. CREATE/UPDATE exigen rol de administrador.
  • Parámetros en mani.rules.category.* con override por tenant y versión trazable; una configuración incoherente impide el arranque.

M6.3 · SCRUM-1227 (pruebas y gate)

  • 85 pruebas JUnit 5; cobertura 93.6 % líneas / 87.8 % ramas (código nuevo al 100 % de líneas).
  • jacoco:check en verify (≥ 85 % líneas, ≥ 80 % ramas).
  • SonarCloud con sonar.qualitygate.wait=true cuando exista el secret SONAR_TOKEN.

Evidencia

  • mvn verify en verde, y el gate falla si se fuerza un umbral de 99 %.
  • E2E con procesos reales Core → Rules: válida 201 normalizada; nombre corto 400 422N; flujo inválido 400 422F.
  • Objetivo de la historia: reiniciando solo Rules con tenants[tenant-e2e].name-min-length=2, "AB" pasó a 201 en ese tenant y siguió en 400 en otro, sin tocar Core.
  • Newman por el Gateway real (Docker): 17/17 requests, 71/71 aserciones.

Dependencias y orden de merge

  1. Este PR primero: el job contract-gate-rules del Gateway construye MANI-Java desde develop.
  2. Trama-AS/MANI-Node: Core consume Rules (apilado sobre el PR #21).
  3. Trama-AS/MANI-APIGateway: contrato rules.yaml + suite Newman (apilado sobre CFG-16).

Pendiente de DevOps: proyecto Trama-AS_MANI-Java en SonarCloud + secret SONAR_TOKEN; QA_RULES_SERVICE_URL para el CD de Core; despliegue de rules-service en QA.

Ticket relacionado

  • Jira: SCRUM-1070 (subtareas SCRUM-1225, SCRUM-1226, SCRUM-1227)

Checklist

  • El código pasa las reglas del linter.
  • Se ejecutaron las pruebas unitarias y de integración.
  • La cobertura de SonarQube cumple los umbrales (JaCoCo local sí; SonarCloud pendiente del token).
  • Se revisó el impacto en la arquitectura (ADRs).

🤖 Generated with Claude Code

Warriorr89 and others added 5 commits October 7, 2026 19:28
- Pruebas de humo con JUnit 5: arranque del contexto de Spring y
  endpoint de salud (/health y /api/v1/rules/health).
- JaCoCo 0.8.12 genera target/site/jacoco/jacoco.xml, la ruta que lee
  SonarQube por defecto.
- Workflow CI: mvn verify en cada PR y push a main; publica el reporte
  de cobertura como artefacto.
- README documenta como ejecutar pruebas y cobertura.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…6 (SCRUM-1123)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…res uniformes y rutas del Gateway

- CorrelationIdFilter: X-Correlation-ID al MDC (patron de logs ya lo leia) y
  a la respuesta; "none" si falta, igual que Core.
- GlobalExceptionHandler + ApiError: forma {error, code, correlationId}
  comun con Core para 400/404/405/415/500.
- HealthController separado; RulesController responde con y sin el prefijo
  /api/v1/rules porque el Gateway lo recorta antes de reenviar (antes
  /api/v1/rules/evaluate-rate llegaba como /evaluate-rate y daba 404).
- Quita @crossorigin("*"): CORS es responsabilidad unica del Gateway.
- CI tambien en push a develop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…les Service

POST /api/v1/rules/categories/evaluate (tambien sin prefijo, por el Gateway)
con el contrato declarado por Core en US-03.1.1-M2.2: { allowed,
ruleSetVersion, violations[] } + normalized.

- CategoryRuleEvaluator: funcion pura con las reglas de
  crear_categoria_servicio() (migracion 003): nombre normalizado 3-60 con
  letra (MANI-CAT-422N), flujo operativo permitido (MANI-CAT-422F); UPDATE
  parcial; OPERATE exige categoria activa (MANI-CAT-422C).
- Tenant solo desde X-Tenant-Id (claim del Gateway/Core); tenantId del
  cuerpo distinto => 403 TENANT_MISMATCH. CREATE/UPDATE exigen rol ADMIN.
- CategoryRulesProperties: parametros en mani.rules.category.* con override
  por tenant y version trazable; configuracion incoherente falla el arranque.
- El 409 por nombre duplicado sigue en el indice unico (requiere estado).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ra/Quality Gate

- CategoryRuleEvaluatorTest: limites 2/3/60/61, conteo por caracteres como
  char_length (emoji), letras Unicode, normalizacion, flujos, acumulacion
  de violaciones, UPDATE parcial, OPERATE, reglas configurables, determinismo.
- CategoryRulesPropertiesTest: binding real con override por tenant (UUID),
  version trazable y configuracion incoherente que impide el arranque.
- CategoryRulesControllerTest: contrato HTTP completo, prefijo del Gateway,
  roles ADMIN/admin_tenant vs ALLY, TENANT_REQUIRED/TENANT_MISMATCH,
  400/401/403/415; UnexpectedErrorTest: 500 uniforme sin filtrar detalle.
- jacoco:check en verify (lineas >= 85 %, ramas >= 80 %); hoy 93.6 % / 87.8 %.
- CI: SonarCloud con sonar.qualitygate.wait=true cuando existe SONAR_TOKEN;
  publica reportes de Surefire.

85 pruebas, mvn verify en verde.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@santiagohb2830 santiagohb2830 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QA: aprobado (SCRUM-1070 · subtareas SCRUM-1225, SCRUM-1226, SCRUM-1227)

Revisado sobre eab1457.

  • Evaluador puro y determinista; tenant solo desde X-Tenant-Id (el Gateway en main lo sobrescribe con el claim verificado) y 403 TENANT_MISMATCH si el cuerpo trae otro tenant.
  • CREATE/UPDATE exigen rol administrador; errores con forma {error, code, correlationId}, igual que Core.
  • CI "Pruebas (Java 17)" en verde; JaCoCo con umbral en verify.

Observaciones (no bloquean):

  • Este PR contiene el commit de Java#1 (QA-06), que ya se fusionó en main; develop y main quedan alineados con este merge.
  • SAD §7.1 dice que Rules lee las reglas de persistencia; hoy viven en application.properties por tenant. Válido como paso intermedio mientras se cierra SAD §7.4 P2.
  • Pendiente de DevOps: proyecto en SonarCloud y SONAR_TOKEN.

@santiagohb2830
santiagohb2830 merged commit b9cce31 into develop Oct 17, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants