199 lines
8.8 KiB
Bash
Executable File
199 lines
8.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -Eeuo pipefail
|
|
|
|
dhv2_base_url="${DHV2_BASE_URL:-https://dhv2.korexlabs.com}"
|
|
dhv2_base_url="${dhv2_base_url%/}"
|
|
dhv2_nil_uuid="00000000-0000-4000-8000-000000000000"
|
|
|
|
fail() {
|
|
echo "ERROR: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
echo "========== D3 · MIGRACIONES =========="
|
|
dhv2_migration_status="$(docker compose --profile tools run --rm migrate npm run migration:show 2>&1)"
|
|
grep -q 'Pending migrations: no' <<<"$dhv2_migration_status" \
|
|
|| fail "Quedaron migraciones pendientes"
|
|
echo "Migraciones pendientes: no"
|
|
|
|
echo
|
|
echo "========== D3 · HEALTH =========="
|
|
dhv2_internal="$(curl -fsS --connect-timeout 10 --max-time 30 http://127.0.0.1:3101/api/v3/health)"
|
|
dhv2_external="$(curl -fsS --connect-timeout 10 --max-time 30 "$dhv2_base_url/api/v3/health")"
|
|
grep -q '"version":"0.17.0"' <<<"$dhv2_internal" || fail "Health interno no informa v0.17.0"
|
|
grep -q '"phase":"D3"' <<<"$dhv2_internal" || fail "Health interno no informa D3"
|
|
grep -q '"version":"0.17.0"' <<<"$dhv2_external" || fail "Health externo no informa v0.17.0"
|
|
grep -q '"database":"ok"' <<<"$dhv2_external" || fail "La base no está saludable"
|
|
echo "$dhv2_external"
|
|
|
|
echo
|
|
echo "========== D3 · RUTAS PROTEGIDAS =========="
|
|
for dhv2_path in \
|
|
"finding-catalog" \
|
|
"inspection-acts/$dhv2_nil_uuid/findings" \
|
|
"inspection-findings/$dhv2_nil_uuid" \
|
|
"dashboard/summary"; do
|
|
dhv2_code="$(curl -sS --connect-timeout 10 --max-time 30 \
|
|
-o /tmp/dhv2-d3-response.json -w '%{http_code}' \
|
|
"$dhv2_base_url/api/v3/$dhv2_path")"
|
|
test "$dhv2_code" = "401" \
|
|
|| fail "/api/v3/$dhv2_path devolvió HTTP $dhv2_code; se esperaba 401"
|
|
echo "/api/v3/$dhv2_path sin sesión: 401 OK"
|
|
done
|
|
rm -f /tmp/dhv2-d3-response.json
|
|
|
|
echo
|
|
echo "========== D3 · MODELO Y CATÁLOGO =========="
|
|
dhv2_db_check="$(docker compose exec -T db sh -lc \
|
|
'psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -v ON_ERROR_STOP=1 -At' <<'SQL'
|
|
SELECT 'tables', COUNT(*)
|
|
FROM information_schema.tables
|
|
WHERE table_schema = 'public'
|
|
AND table_name IN (
|
|
'finding_categories',
|
|
'finding_catalog_items',
|
|
'inspection_findings',
|
|
'inspection_finding_versions'
|
|
);
|
|
|
|
SELECT 'categories', COUNT(*) FROM finding_categories WHERE is_active = true;
|
|
SELECT 'catalog_items', COUNT(*) FROM finding_catalog_items WHERE is_active = true;
|
|
|
|
SELECT 'normalized_row', COUNT(*)
|
|
FROM finding_catalog_items
|
|
WHERE code = 'BOMBAS-003'
|
|
AND title = 'PUESTA A TIERRA'
|
|
AND import_note IS NOT NULL;
|
|
|
|
SELECT 'finding_checks', COUNT(*)
|
|
FROM pg_constraint
|
|
WHERE conname IN (
|
|
'chk_inspection_findings_number',
|
|
'chk_inspection_findings_code',
|
|
'chk_inspection_findings_status',
|
|
'chk_inspection_findings_content',
|
|
'chk_inspection_findings_response',
|
|
'chk_inspection_findings_commitment',
|
|
'chk_inspection_findings_closure'
|
|
);
|
|
|
|
SELECT 'open_state', COUNT(*)
|
|
FROM pg_constraint
|
|
WHERE conname = 'chk_inspection_findings_status'
|
|
AND pg_get_constraintdef(oid) LIKE '%OPEN%'
|
|
AND pg_get_constraintdef(oid) LIKE '%CLOSED%';
|
|
|
|
SELECT 'immutable_versions', COUNT(*)
|
|
FROM pg_constraint
|
|
WHERE conname IN (
|
|
'uq_inspection_finding_versions_number',
|
|
'chk_inspection_finding_versions_number',
|
|
'chk_inspection_finding_versions_event'
|
|
);
|
|
|
|
SELECT 'permissions', COUNT(*)
|
|
FROM permissions
|
|
WHERE code IN (
|
|
'finding_catalog.read',
|
|
'finding_catalog.manage',
|
|
'inspection_findings.read',
|
|
'inspection_findings.create',
|
|
'inspection_findings.update',
|
|
'inspection_findings.follow_up'
|
|
);
|
|
|
|
SELECT 'catalog_read_roles', COUNT(*)
|
|
FROM role_permissions rp
|
|
INNER JOIN roles role ON role.id = rp.role_id
|
|
INNER JOIN permissions permission ON permission.id = rp.permission_id
|
|
WHERE role.code IN ('admin', 'director', 'supervisor', 'inspector', 'auditor')
|
|
AND permission.code = 'finding_catalog.read';
|
|
|
|
SELECT 'catalog_manage_roles', COUNT(*)
|
|
FROM role_permissions rp
|
|
INNER JOIN roles role ON role.id = rp.role_id
|
|
INNER JOIN permissions permission ON permission.id = rp.permission_id
|
|
WHERE role.code IN ('admin', 'supervisor')
|
|
AND permission.code = 'finding_catalog.manage';
|
|
|
|
SELECT 'finding_read_roles', COUNT(*)
|
|
FROM role_permissions rp
|
|
INNER JOIN roles role ON role.id = rp.role_id
|
|
INNER JOIN permissions permission ON permission.id = rp.permission_id
|
|
WHERE role.code IN ('admin', 'director', 'supervisor', 'inspector', 'auditor')
|
|
AND permission.code = 'inspection_findings.read';
|
|
|
|
SELECT 'finding_create_roles', COUNT(*)
|
|
FROM role_permissions rp
|
|
INNER JOIN roles role ON role.id = rp.role_id
|
|
INNER JOIN permissions permission ON permission.id = rp.permission_id
|
|
WHERE role.code IN ('admin', 'supervisor', 'inspector')
|
|
AND permission.code = 'inspection_findings.create';
|
|
|
|
SELECT 'finding_update_roles', COUNT(*)
|
|
FROM role_permissions rp
|
|
INNER JOIN roles role ON role.id = rp.role_id
|
|
INNER JOIN permissions permission ON permission.id = rp.permission_id
|
|
WHERE role.code IN ('admin', 'supervisor', 'inspector')
|
|
AND permission.code = 'inspection_findings.update';
|
|
|
|
SELECT 'follow_up_roles', COUNT(*)
|
|
FROM role_permissions rp
|
|
INNER JOIN roles role ON role.id = rp.role_id
|
|
INNER JOIN permissions permission ON permission.id = rp.permission_id
|
|
WHERE role.code IN ('admin', 'director', 'supervisor', 'inspector')
|
|
AND permission.code = 'inspection_findings.follow_up';
|
|
SQL
|
|
)"
|
|
grep -q 'tables|4' <<<"$dhv2_db_check" || fail "Faltan tablas D3"
|
|
grep -q 'categories|19' <<<"$dhv2_db_check" || fail "El catálogo no tiene 19 categorías"
|
|
grep -q 'catalog_items|170' <<<"$dhv2_db_check" || fail "El catálogo no tiene 170 modelos"
|
|
grep -q 'normalized_row|1' <<<"$dhv2_db_check" || fail "No se registró la normalización BOMBAS-003"
|
|
grep -q 'finding_checks|7' <<<"$dhv2_db_check" || fail "Faltan restricciones de hallazgos"
|
|
grep -q 'open_state|1' <<<"$dhv2_db_check" || fail "No está definido el estado abierto"
|
|
grep -q 'immutable_versions|3' <<<"$dhv2_db_check" || fail "Faltan controles de versiones"
|
|
grep -q 'permissions|6' <<<"$dhv2_db_check" || fail "Faltan permisos D3"
|
|
grep -q 'catalog_read_roles|5' <<<"$dhv2_db_check" || fail "Faltan roles de lectura de catálogo"
|
|
grep -q 'catalog_manage_roles|2' <<<"$dhv2_db_check" || fail "Faltan roles de gestión de catálogo"
|
|
grep -q 'finding_read_roles|5' <<<"$dhv2_db_check" || fail "Faltan roles de lectura de hallazgos"
|
|
grep -q 'finding_create_roles|3' <<<"$dhv2_db_check" || fail "Faltan roles de creación de hallazgos"
|
|
grep -q 'finding_update_roles|3' <<<"$dhv2_db_check" || fail "Faltan roles de actualización de hallazgos"
|
|
grep -q 'follow_up_roles|4' <<<"$dhv2_db_check" || fail "Faltan roles de seguimiento"
|
|
echo "$dhv2_db_check"
|
|
|
|
echo
|
|
echo "========== D3 · PRIVILEGIOS RUNTIME =========="
|
|
dhv2_privileges="$(docker compose exec -T db sh -lc \
|
|
'psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -v ON_ERROR_STOP=1 -v app_user="$APP_DB_USER" -At' <<'SQL'
|
|
SELECT 'catalog_select', has_table_privilege(:'app_user', 'finding_catalog_items', 'SELECT');
|
|
SELECT 'catalog_update', has_table_privilege(:'app_user', 'finding_catalog_items', 'UPDATE');
|
|
SELECT 'catalog_delete', has_table_privilege(:'app_user', 'finding_catalog_items', 'DELETE');
|
|
SELECT 'findings_insert', has_table_privilege(:'app_user', 'inspection_findings', 'INSERT');
|
|
SELECT 'findings_update', has_table_privilege(:'app_user', 'inspection_findings', 'UPDATE');
|
|
SELECT 'findings_delete', has_table_privilege(:'app_user', 'inspection_findings', 'DELETE');
|
|
SELECT 'versions_insert', has_table_privilege(:'app_user', 'inspection_finding_versions', 'INSERT');
|
|
SELECT 'versions_update', has_table_privilege(:'app_user', 'inspection_finding_versions', 'UPDATE');
|
|
SELECT 'versions_delete', has_table_privilege(:'app_user', 'inspection_finding_versions', 'DELETE');
|
|
SQL
|
|
)"
|
|
grep -q 'catalog_select|t' <<<"$dhv2_privileges" || fail "La API no puede leer el catálogo"
|
|
grep -q 'catalog_update|t' <<<"$dhv2_privileges" || fail "La API no puede administrar el catálogo"
|
|
grep -q 'catalog_delete|f' <<<"$dhv2_privileges" || fail "La API no debe borrar el catálogo"
|
|
grep -q 'findings_insert|t' <<<"$dhv2_privileges" || fail "La API no puede crear hallazgos"
|
|
grep -q 'findings_update|t' <<<"$dhv2_privileges" || fail "La API no puede actualizar hallazgos"
|
|
grep -q 'findings_delete|f' <<<"$dhv2_privileges" || fail "La API no debe borrar hallazgos"
|
|
grep -q 'versions_insert|t' <<<"$dhv2_privileges" || fail "La API no puede crear versiones"
|
|
grep -q 'versions_update|f' <<<"$dhv2_privileges" || fail "La API no debe modificar versiones"
|
|
grep -q 'versions_delete|f' <<<"$dhv2_privileges" || fail "La API no debe borrar versiones"
|
|
echo "$dhv2_privileges"
|
|
|
|
echo
|
|
echo "========== D3 · FRONTEND =========="
|
|
docker compose exec -T web sh -lc \
|
|
'grep -R "0.17.0" /usr/share/nginx/html/assets >/dev/null && grep -R "Hallazgos y seguimiento" /usr/share/nginx/html/assets >/dev/null && grep -R "Múltiples hallazgos" /usr/share/nginx/html/assets >/dev/null && grep -R "Respuesta de la empresa" /usr/share/nginx/html/assets >/dev/null && grep -R "Próximos controles de hallazgos" /usr/share/nginx/html/assets >/dev/null'
|
|
echo "Hallazgos, seguimiento, dashboard y footer v0.17.0: OK"
|
|
|
|
echo
|
|
echo "ACEPTACIÓN DE FASE D3: OK"
|