Files
openccb/services/cms-service/migrations/20260318000001_fix_test_templates_reference.sql
T

83 lines
2.5 KiB
PL/PgSQL

-- Fix test_templates to use mysql_course_id reference instead of level/course_type strings
-- This ensures data consistency and leverages the imported MySQL course data in PostgreSQL
-- Add mysql_course_id column to test_templates
ALTER TABLE test_templates
ADD COLUMN mysql_course_id INTEGER REFERENCES mysql_courses(mysql_id) ON DELETE SET NULL,
ALTER COLUMN level DROP NOT NULL,
ALTER COLUMN course_type DROP NOT NULL;
-- Create index for faster lookups
CREATE INDEX IF NOT EXISTS idx_test_templates_mysql_course ON test_templates(mysql_course_id);
-- Add comment for documentation
COMMENT ON COLUMN test_templates.mysql_course_id IS 'Reference to imported MySQL course (mysql_courses.mysql_id). Preferred over level/course_type fields.';
-- Create view for backward compatibility - shows calculated level/course_type from mysql_courses
CREATE OR REPLACE VIEW test_templates_with_course_info AS
SELECT
tt.*,
mc.name AS course_name,
mc.level_calculated,
mc.course_type AS calculated_course_type,
mc.duracion AS course_duration
FROM test_templates tt
LEFT JOIN mysql_courses mc ON tt.mysql_course_id = mc.mysql_id;
-- Function to get template with course info
CREATE OR REPLACE FUNCTION get_test_template_with_course(p_template_id UUID)
RETURNS TABLE (
id UUID,
organization_id UUID,
name VARCHAR,
description TEXT,
mysql_course_id INTEGER,
course_name VARCHAR,
level course_level,
level_calculated TEXT,
course_type course_type,
calculated_course_type TEXT,
test_type test_type,
duration_minutes INTEGER,
passing_score INTEGER,
total_points INTEGER,
instructions TEXT,
template_data JSONB,
tags TEXT[],
is_active BOOLEAN,
usage_count INTEGER,
created_by UUID,
created_at TIMESTAMPTZ,
updated_at TIMESTAMPTZ
) AS $$
BEGIN
RETURN QUERY
SELECT
tt.id,
tt.organization_id,
tt.name,
tt.description,
tt.mysql_course_id,
mc.name,
tt.level,
mc.level_calculated,
tt.course_type,
mc.course_type,
tt.test_type,
tt.duration_minutes,
tt.passing_score,
tt.total_points,
tt.instructions,
tt.template_data,
tt.tags,
tt.is_active,
tt.usage_count,
tt.created_by,
tt.created_at,
tt.updated_at
FROM test_templates tt
LEFT JOIN mysql_courses mc ON tt.mysql_course_id = mc.mysql_id
WHERE tt.id = p_template_id;
END;
$$ LANGUAGE plpgsql;