From f5e925dc96d9033f34e5bbcc24b7745dc58780d0 Mon Sep 17 00:00:00 2001 From: Yared Yemane Date: Tue, 14 Apr 2026 07:13:50 -0700 Subject: [PATCH] separate lessons schema from practices in hierarchy Replace rename-based lesson migration with additive sub_module_lessons creation, preserve sub_module_practices as its own model, and enforce QUIZ/PRACTICE filtering in hierarchy reads to prevent cross-mixing. Made-with: Cursor --- ...me_sub_module_practices_to_lessons.down.sql | 6 ++---- ...name_sub_module_practices_to_lessons.up.sql | 17 +++++++++++++---- .../000032_add_sub_module_practices.up.sql | 18 ++++++++++++++++++ db/query/hierarchy.sql | 2 ++ gen/db/hierarchy.sql.go | 2 ++ 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/db/migrations/000031_rename_sub_module_practices_to_lessons.down.sql b/db/migrations/000031_rename_sub_module_practices_to_lessons.down.sql index d5538d5..84a9963 100644 --- a/db/migrations/000031_rename_sub_module_practices_to_lessons.down.sql +++ b/db/migrations/000031_rename_sub_module_practices_to_lessons.down.sql @@ -1,6 +1,4 @@ -ALTER TABLE IF EXISTS sub_module_lessons -RENAME TO sub_module_practices; +DROP INDEX IF EXISTS idx_sub_module_lessons_sub_module_id; -ALTER INDEX IF EXISTS idx_sub_module_lessons_sub_module_id -RENAME TO idx_sub_module_practices_sub_module_id; +DROP TABLE IF EXISTS sub_module_lessons; diff --git a/db/migrations/000031_rename_sub_module_practices_to_lessons.up.sql b/db/migrations/000031_rename_sub_module_practices_to_lessons.up.sql index 618c4c9..5a3c790 100644 --- a/db/migrations/000031_rename_sub_module_practices_to_lessons.up.sql +++ b/db/migrations/000031_rename_sub_module_practices_to_lessons.up.sql @@ -1,6 +1,15 @@ -ALTER TABLE IF EXISTS sub_module_practices -RENAME TO sub_module_lessons; +-- Keep practices as a separate feature and introduce lessons as a new table. +CREATE TABLE IF NOT EXISTS sub_module_lessons ( + id BIGSERIAL PRIMARY KEY, + sub_module_id BIGINT NOT NULL REFERENCES sub_modules(id) ON DELETE CASCADE, + question_set_id BIGINT NOT NULL REFERENCES question_sets(id) ON DELETE CASCADE, + intro_video_url TEXT, + display_order INT NOT NULL DEFAULT 0, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE(question_set_id) +); -ALTER INDEX IF EXISTS idx_sub_module_practices_sub_module_id -RENAME TO idx_sub_module_lessons_sub_module_id; +CREATE INDEX IF NOT EXISTS idx_sub_module_lessons_sub_module_id +ON sub_module_lessons(sub_module_id); diff --git a/db/migrations/000032_add_sub_module_practices.up.sql b/db/migrations/000032_add_sub_module_practices.up.sql index 48501b9..57ec79e 100644 --- a/db/migrations/000032_add_sub_module_practices.up.sql +++ b/db/migrations/000032_add_sub_module_practices.up.sql @@ -12,6 +12,24 @@ CREATE TABLE IF NOT EXISTS sub_module_practices ( UNIQUE(question_set_id) ); +-- If the table already existed from older unified hierarchy migrations, +-- backfill missing columns so practices keep their own richer schema. +ALTER TABLE sub_module_practices +ADD COLUMN IF NOT EXISTS title VARCHAR(255); + +ALTER TABLE sub_module_practices +ADD COLUMN IF NOT EXISTS description TEXT; + +ALTER TABLE sub_module_practices +ADD COLUMN IF NOT EXISTS thumbnail TEXT; + +UPDATE sub_module_practices +SET title = COALESCE(NULLIF(title, ''), 'Practice') +WHERE title IS NULL OR title = ''; + +ALTER TABLE sub_module_practices +ALTER COLUMN title SET NOT NULL; + CREATE INDEX IF NOT EXISTS idx_sub_module_practices_sub_module_id ON sub_module_practices(sub_module_id); diff --git a/db/query/hierarchy.sql b/db/query/hierarchy.sql index c8f4034..8e39b05 100644 --- a/db/query/hierarchy.sql +++ b/db/query/hierarchy.sql @@ -57,6 +57,7 @@ FROM sub_module_lessons smp JOIN question_sets qs ON qs.id = smp.question_set_id WHERE smp.sub_module_id = $1 AND smp.is_active = TRUE + AND qs.set_type = 'QUIZ' ORDER BY smp.display_order ASC, smp.id ASC; -- name: GetSubModulePractices :many @@ -77,6 +78,7 @@ FROM sub_module_practices smp JOIN question_sets qs ON qs.id = smp.question_set_id WHERE smp.sub_module_id = $1 AND smp.is_active = TRUE + AND qs.set_type = 'PRACTICE' ORDER BY smp.display_order ASC, smp.id ASC; -- name: GetFullHierarchyByCourseID :many diff --git a/gen/db/hierarchy.sql.go b/gen/db/hierarchy.sql.go index 069f657..4468a61 100644 --- a/gen/db/hierarchy.sql.go +++ b/gen/db/hierarchy.sql.go @@ -561,6 +561,7 @@ FROM sub_module_lessons smp JOIN question_sets qs ON qs.id = smp.question_set_id WHERE smp.sub_module_id = $1 AND smp.is_active = TRUE + AND qs.set_type = 'QUIZ' ORDER BY smp.display_order ASC, smp.id ASC ` @@ -628,6 +629,7 @@ FROM sub_module_practices smp JOIN question_sets qs ON qs.id = smp.question_set_id WHERE smp.sub_module_id = $1 AND smp.is_active = TRUE + AND qs.set_type = 'PRACTICE' ORDER BY smp.display_order ASC, smp.id ASC `