workspace/projects/gamilit/apps/database/scripts/validations/validate-missions-objectives-structure.sql
rckrdmrd 289c5a4ee5
Some checks are pending
CI Pipeline / changes (push) Waiting to run
CI Pipeline / core (push) Blocked by required conditions
CI Pipeline / trading-backend (push) Blocked by required conditions
CI Pipeline / trading-data-service (push) Blocked by required conditions
CI Pipeline / trading-frontend (push) Blocked by required conditions
CI Pipeline / erp-core (push) Blocked by required conditions
CI Pipeline / erp-mecanicas (push) Blocked by required conditions
CI Pipeline / gamilit-backend (push) Blocked by required conditions
CI Pipeline / gamilit-frontend (push) Blocked by required conditions
Gamilit: Backend fixes, frontend API updates, deployment guides and validations
Backend:
- Fix email verification and password recovery services
- Fix exercise submission and student progress services

Frontend:
- Update missions, password, and profile API services
- Fix ExerciseContentRenderer component

Docs & Scripts:
- Add SSL/Certbot deployment guide
- Add quick deployment guide
- Database scripts for testing and validations
- Migration and homologation reports
- Functions inventory documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 23:42:48 -06:00

136 lines
4.6 KiB
SQL

-- =====================================================
-- Script de Validación: Estructura de Objectives en Missions
-- Fecha: 2025-11-26
-- Propósito: Validar que initialize_user_missions crea objectives como ARRAY
-- =====================================================
\echo '=================================================='
\echo 'VALIDACIÓN: Estructura de objectives en missions'
\echo '=================================================='
\echo ''
DO $$
DECLARE
v_test_user_id UUID;
v_objectives JSONB;
v_objectives_type TEXT;
v_mission_count INT;
v_total_missions INT;
v_test_passed BOOLEAN := true;
BEGIN
RAISE NOTICE '1. Buscando usuario de prueba...';
-- Buscar un usuario existente
SELECT id INTO v_test_user_id
FROM auth_management.profiles
LIMIT 1;
IF v_test_user_id IS NULL THEN
RAISE EXCEPTION 'No hay usuarios en la base de datos para testing';
END IF;
RAISE NOTICE 'Usuario de prueba: %', v_test_user_id;
RAISE NOTICE '2. Limpiando misiones previas...';
DELETE FROM gamification_system.missions WHERE user_id = v_test_user_id;
RAISE NOTICE '3. Ejecutando initialize_user_missions()...';
PERFORM gamilit.initialize_user_missions(v_test_user_id);
RAISE NOTICE '4. Verificando estructura de objectives...';
-- Verificar que se crearon 8 misiones
SELECT COUNT(*) INTO v_total_missions
FROM gamification_system.missions
WHERE user_id = v_test_user_id;
RAISE NOTICE 'Misiones creadas: %', v_total_missions;
IF v_total_missions != 8 THEN
RAISE NOTICE '❌ ERROR: Se esperaban 8 misiones, se crearon %', v_total_missions;
v_test_passed := false;
ELSE
RAISE NOTICE '✅ OK: Se crearon las 8 misiones esperadas';
END IF;
-- Verificar que TODAS las misiones tienen objectives como ARRAY
SELECT objectives, jsonb_typeof(objectives)
INTO v_objectives, v_objectives_type
FROM gamification_system.missions
WHERE user_id = v_test_user_id
LIMIT 1;
RAISE NOTICE 'Tipo de objectives: %', v_objectives_type;
RAISE NOTICE 'Ejemplo de objectives: %', v_objectives;
IF v_objectives_type != 'array' THEN
RAISE NOTICE '❌ ERROR: objectives NO es un array, es: %', v_objectives_type;
v_test_passed := false;
ELSE
RAISE NOTICE '✅ OK: objectives es un ARRAY';
END IF;
RAISE NOTICE '5. Verificando compatibilidad con operador @>...';
-- Test: Buscar misiones de tipo complete_exercises
SELECT COUNT(*) INTO v_mission_count
FROM gamification_system.missions
WHERE user_id = v_test_user_id
AND objectives @> '[{"type": "complete_exercises"}]'::jsonb;
RAISE NOTICE 'Misiones con type=complete_exercises encontradas con @>: %', v_mission_count;
IF v_mission_count = 0 THEN
RAISE NOTICE '❌ ERROR: El operador @> NO encuentra misiones';
v_test_passed := false;
ELSE
RAISE NOTICE '✅ OK: El operador @> funciona correctamente';
END IF;
-- Test: Buscar misión de earn_xp
SELECT COUNT(*) INTO v_mission_count
FROM gamification_system.missions
WHERE user_id = v_test_user_id
AND objectives @> '[{"type": "earn_xp"}]'::jsonb;
RAISE NOTICE 'Misiones con type=earn_xp encontradas: %', v_mission_count;
IF v_mission_count = 0 THEN
RAISE NOTICE '❌ ERROR: No se encuentra misión de earn_xp';
v_test_passed := false;
END IF;
-- Test: Verificar misión weekly_explorer con modules_visited
SELECT COUNT(*) INTO v_mission_count
FROM gamification_system.missions
WHERE user_id = v_test_user_id
AND template_id = 'weekly_explorer'
AND objectives @> '[{"type": "explore_modules"}]'::jsonb
AND objectives::text LIKE '%modules_visited%';
RAISE NOTICE 'Misión weekly_explorer con modules_visited: %', v_mission_count;
IF v_mission_count = 0 THEN
RAISE NOTICE '❌ ERROR: weekly_explorer no tiene modules_visited';
v_test_passed := false;
ELSE
RAISE NOTICE '✅ OK: weekly_explorer tiene modules_visited';
END IF;
RAISE NOTICE '6. Limpiando datos de prueba...';
DELETE FROM gamification_system.missions WHERE user_id = v_test_user_id;
RAISE NOTICE '';
RAISE NOTICE '==================================================';
IF v_test_passed THEN
RAISE NOTICE '✅ ✅ ✅ VALIDACIÓN EXITOSA ✅ ✅ ✅';
RAISE NOTICE 'La función initialize_user_missions está correcta';
ELSE
RAISE NOTICE '❌ ❌ ❌ VALIDACIÓN FALLIDA ❌ ❌ ❌';
RAISE NOTICE 'Hay problemas en la función initialize_user_missions';
END IF;
RAISE NOTICE '==================================================';
END;
$$;