#!/usr/bin/env bash set -Eeuo pipefail ROOT="${ROOT:-/var/www/dhv2.korexlabs.com}" API_URL="${API_URL:-http://127.0.0.1:3101/api/v3}" TMP_MIGRATION="/tmp/dhv2-d562-accept-migration-$$.log" trap 'rm -f "$TMP_MIGRATION"' EXIT cd "$ROOT" echo "========== D5.6.2 · VERSIONES ==========" [[ "$(node -p "require('./api-v3/package.json').version")" == "0.19.6-2" ]] [[ "$(node -p "require('./web-v2/package.json').version")" == "0.19.6-2" ]] grep -Fq "API_PHASE = 'D5.6.2'" api-v3/src/version.ts grep -Fq "APP_PHASE = 'Fase D5.6.2 · Accesos y compatibilidad Android'" web-v2/src/config/version.ts echo "API: 0.19.6-2" echo "WEB: 0.19.6-2" echo echo "========== D5.6.2 · DB Y MIGRACIONES ==========" [[ "$(docker inspect dhv2-db --format '{{.State.Health.Status}}')" == "healthy" ]] docker compose exec -T db sh -lc 'pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB"' docker compose --profile tools run --rm migrate npm run migration:show 2>&1 | tee "$TMP_MIGRATION" grep -Fq 'Pending migrations: no' "$TMP_MIGRATION" echo "Sin migraciones pendientes: OK" echo echo "========== D5.6.2 · HEALTH ==========" HEALTH="$(curl -fsS "$API_URL/health")" echo "$HEALTH" grep -Fq '"version":"0.19.6-2"' <<<"$HEALTH" grep -Fq '"phase":"D5.6.2"' <<<"$HEALTH" grep -Fq '"database":"ok"' <<<"$HEALTH" echo echo "========== D5.6.2 · RESET DE CONTRASEÑA ADMIN ==========" grep -Fq "@Post(':id/reset-password')" api-v3/src/administration/users/users.controller.ts grep -Fq "@RequirePermissions('users.update')" api-v3/src/administration/users/users.controller.ts grep -Fq 'USER_PASSWORD_RESET' api-v3/src/administration/users/users.service.ts grep -Fq 'revokeUserSessions(id, undefined, manager)' api-v3/src/administration/users/users.service.ts grep -Fq 'passwordValueRecorded: false' api-v3/src/administration/users/users.service.ts grep -Fq 'Restablecer contraseña' web-v2/src/pages/UserDetailPage.tsx grep -Fq 'Exigir cambio en el próximo ingreso' web-v2/src/pages/UserDetailPage.tsx echo "Admin puede restablecer contraseña, revocar sesiones y exigir cambio posterior: OK" echo echo "========== D5.6.2 · CONTRATO API ANDROID ==========" grep -Fq "app.setGlobalPrefix('api/v3')" api-v3/src/main.ts grep -Fq "path: '/api/v3/auth'" api-v3/src/auth/services/cookie.service.ts echo "Host web y prefijo API /api/v3 permanecen separados: OK" echo echo "========== D5.6.2 · REGLAS D PRESERVADAS ==========" grep -Fq 'INSPECTION_VISIT_ACT_ALREADY_EXISTS' api-v3/src/inspection-acts/inspection-acts.service.ts grep -Fq 'INSPECTION_FINDING_RESPONSE_IMMUTABLE' api-v3/src/inspection-findings/inspection-findings.service.ts grep -Fq 'VERIFICATION_RESULT_IMMUTABLE' api-v3/src/inspection-verifications/inspection-verifications.service.ts grep -Fq 'assertMobileInspector(principal)' api-v3/src/inspection-visits/inspection-visits.service.ts grep -Fq 'ensureWordForAct(actId)' api-v3/src/inspection-closing/inspection-closing.service.ts echo "Una visita = una Acta, historia append-only e inicio APK-only preservados: OK" echo echo "========== D5.6.2 · SIN MIGRACIÓN NUEVA ==========" if find api-v3/src/database/migrations -maxdepth 1 -type f -iname '*d5-6-2*' | grep -q .; then echo "ERROR: D5.6.2 no debe introducir una migración" exit 1 fi echo "Hotfix sin cambio de modelo persistente: OK" echo echo "========== D5.6.2 · CONTENEDORES ==========" docker compose ps -a [[ "$(docker inspect dhv2-db --format '{{.State.Health.Status}}')" == "healthy" ]] [[ "$(docker inspect dhv2-api --format '{{.State.Status}}')" == "running" ]] [[ "$(docker inspect dhv2-web --format '{{.State.Status}}')" == "running" ]] echo echo "ACEPTACIÓN DE FASE D5.6.2: OK"