chore: import DH V2 D5.6.4 production baseline
This commit is contained in:
Executable
+160
@@ -0,0 +1,160 @@
|
||||
#!/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 "========== D1 · 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 "========== D1 · 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.15.0"' <<<"$dhv2_internal" || fail "Health interno no informa v0.15.0"
|
||||
grep -q '"phase":"D1"' <<<"$dhv2_internal" || fail "Health interno no informa D1"
|
||||
grep -q '"version":"0.15.0"' <<<"$dhv2_external" || fail "Health externo no informa v0.15.0"
|
||||
grep -q '"database":"ok"' <<<"$dhv2_external" || fail "La base no está saludable"
|
||||
echo "$dhv2_external"
|
||||
|
||||
echo
|
||||
echo "========== D1 · RUTAS PROTEGIDAS =========="
|
||||
for dhv2_path in \
|
||||
"inspection-visits" \
|
||||
"inspection-visits/$dhv2_nil_uuid" \
|
||||
"inspection-visits/assignees"; do
|
||||
dhv2_code="$(curl -sS --connect-timeout 10 --max-time 30 \
|
||||
-o /tmp/dhv2-d1-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-d1-response.json
|
||||
|
||||
echo
|
||||
echo "========== D1 · MODELO Y PERMISOS =========="
|
||||
dhv2_db_check="$(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 'tables', COUNT(*)
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name IN (
|
||||
'inspection_visits',
|
||||
'inspection_visit_assets',
|
||||
'inspection_visit_members'
|
||||
);
|
||||
|
||||
SELECT 'visit_checks', COUNT(*)
|
||||
FROM pg_constraint
|
||||
WHERE conname IN (
|
||||
'chk_inspection_visits_code',
|
||||
'chk_inspection_visits_status',
|
||||
'chk_inspection_visits_planned_dates',
|
||||
'chk_inspection_visits_actual_dates',
|
||||
'chk_inspection_visits_cancellation'
|
||||
);
|
||||
|
||||
SELECT 'closed_reserved', COUNT(*)
|
||||
FROM pg_constraint
|
||||
WHERE conname = 'chk_inspection_visits_status'
|
||||
AND pg_get_constraintdef(oid) LIKE '%CLOSED%';
|
||||
|
||||
SELECT 'visit_identity', COUNT(*)
|
||||
FROM pg_constraint
|
||||
WHERE conname = 'uq_inspection_visits_code';
|
||||
|
||||
SELECT 'asset_references', COUNT(*)
|
||||
FROM pg_constraint
|
||||
WHERE conname IN (
|
||||
'fk_inspection_visits_scope_asset',
|
||||
'fk_inspection_visit_assets_asset'
|
||||
);
|
||||
|
||||
SELECT 'team_references', COUNT(*)
|
||||
FROM pg_constraint
|
||||
WHERE conname IN (
|
||||
'fk_inspection_visits_lead_inspector',
|
||||
'fk_inspection_visit_members_user'
|
||||
);
|
||||
|
||||
SELECT 'permissions', COUNT(*)
|
||||
FROM permissions
|
||||
WHERE code IN (
|
||||
'inspections.read',
|
||||
'inspections.manage',
|
||||
'inspections.assign',
|
||||
'inspections.execute'
|
||||
);
|
||||
|
||||
SELECT 'read_roles', COUNT(*)
|
||||
FROM role_permissions role_permission
|
||||
INNER JOIN roles role ON role.id = role_permission.role_id
|
||||
INNER JOIN permissions permission ON permission.id = role_permission.permission_id
|
||||
WHERE role.code IN ('admin', 'director', 'supervisor', 'inspector', 'auditor')
|
||||
AND permission.code = 'inspections.read';
|
||||
|
||||
SELECT 'manage_roles', COUNT(*)
|
||||
FROM role_permissions role_permission
|
||||
INNER JOIN roles role ON role.id = role_permission.role_id
|
||||
INNER JOIN permissions permission ON permission.id = role_permission.permission_id
|
||||
WHERE role.code IN ('admin', 'supervisor')
|
||||
AND permission.code = 'inspections.manage';
|
||||
|
||||
SELECT 'assign_roles', COUNT(*)
|
||||
FROM role_permissions role_permission
|
||||
INNER JOIN roles role ON role.id = role_permission.role_id
|
||||
INNER JOIN permissions permission ON permission.id = role_permission.permission_id
|
||||
WHERE role.code IN ('admin', 'supervisor')
|
||||
AND permission.code = 'inspections.assign';
|
||||
|
||||
SELECT 'execute_roles', COUNT(*)
|
||||
FROM role_permissions role_permission
|
||||
INNER JOIN roles role ON role.id = role_permission.role_id
|
||||
INNER JOIN permissions permission ON permission.id = role_permission.permission_id
|
||||
WHERE role.code IN ('admin', 'supervisor', 'inspector')
|
||||
AND permission.code = 'inspections.execute';
|
||||
|
||||
SELECT 'app_visits_select', has_table_privilege(:'app_user', 'inspection_visits', 'SELECT');
|
||||
SELECT 'app_visits_update', has_table_privilege(:'app_user', 'inspection_visits', 'UPDATE');
|
||||
SELECT 'app_visits_delete', has_table_privilege(:'app_user', 'inspection_visits', 'DELETE');
|
||||
SELECT 'app_assets_delete', has_table_privilege(:'app_user', 'inspection_visit_assets', 'DELETE');
|
||||
SELECT 'app_members_delete', has_table_privilege(:'app_user', 'inspection_visit_members', 'DELETE');
|
||||
SQL
|
||||
)"
|
||||
grep -q 'tables|3' <<<"$dhv2_db_check" || fail "Faltan tablas de visitas"
|
||||
grep -q 'visit_checks|5' <<<"$dhv2_db_check" || fail "Faltan controles de integridad"
|
||||
grep -q 'closed_reserved|1' <<<"$dhv2_db_check" || fail "No quedó reservado el cierre documental"
|
||||
grep -q 'visit_identity|1' <<<"$dhv2_db_check" || fail "No se garantiza la identidad de visita"
|
||||
grep -q 'asset_references|2' <<<"$dhv2_db_check" || fail "La visita no referencia correctamente al Maestro"
|
||||
grep -q 'team_references|2' <<<"$dhv2_db_check" || fail "El equipo no referencia usuarios existentes"
|
||||
grep -q 'permissions|4' <<<"$dhv2_db_check" || fail "No se crearon los cuatro permisos D1"
|
||||
grep -q 'read_roles|5' <<<"$dhv2_db_check" || fail "Faltan roles de lectura"
|
||||
grep -q 'manage_roles|2' <<<"$dhv2_db_check" || fail "Faltan roles de gestión"
|
||||
grep -q 'assign_roles|2' <<<"$dhv2_db_check" || fail "Faltan roles de asignación"
|
||||
grep -q 'execute_roles|3' <<<"$dhv2_db_check" || fail "Faltan roles de ejecución"
|
||||
grep -q 'app_visits_select|t' <<<"$dhv2_db_check" || fail "La API no puede leer visitas"
|
||||
grep -q 'app_visits_update|t' <<<"$dhv2_db_check" || fail "La API no puede actualizar visitas"
|
||||
grep -q 'app_visits_delete|f' <<<"$dhv2_db_check" || fail "La API no debe borrar visitas físicamente"
|
||||
grep -q 'app_assets_delete|f' <<<"$dhv2_db_check" || fail "La API no debe borrar vínculos a activos"
|
||||
grep -q 'app_members_delete|f' <<<"$dhv2_db_check" || fail "La API no debe borrar vínculos de equipo"
|
||||
echo "$dhv2_db_check"
|
||||
|
||||
echo
|
||||
echo "========== D1 · FRONTEND =========="
|
||||
docker compose exec -T web sh -lc \
|
||||
'grep -R "0.15.0" /usr/share/nginx/html/assets >/dev/null && grep -R "Planificación y apertura de visitas" /usr/share/nginx/html/assets >/dev/null && grep -R "Una inspección es una visita" /usr/share/nginx/html/assets >/dev/null && grep -R "Nueva visita" /usr/share/nginx/html/assets >/dev/null && grep -R "ACTIVOS A INSPECCIONAR" /usr/share/nginx/html/assets >/dev/null'
|
||||
echo "Visitas, Maestro único, equipo y footer v0.15.0: OK"
|
||||
|
||||
echo
|
||||
echo "ACEPTACIÓN DE FASE D1: OK"
|
||||
Reference in New Issue
Block a user