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
This commit is contained in:
parent
83f5541650
commit
f5e925dc96
|
|
@ -1,6 +1,4 @@
|
||||||
ALTER TABLE IF EXISTS sub_module_lessons
|
DROP INDEX IF EXISTS idx_sub_module_lessons_sub_module_id;
|
||||||
RENAME TO sub_module_practices;
|
|
||||||
|
|
||||||
ALTER INDEX IF EXISTS idx_sub_module_lessons_sub_module_id
|
DROP TABLE IF EXISTS sub_module_lessons;
|
||||||
RENAME TO idx_sub_module_practices_sub_module_id;
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,15 @@
|
||||||
ALTER TABLE IF EXISTS sub_module_practices
|
-- Keep practices as a separate feature and introduce lessons as a new table.
|
||||||
RENAME TO sub_module_lessons;
|
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
|
CREATE INDEX IF NOT EXISTS idx_sub_module_lessons_sub_module_id
|
||||||
RENAME TO idx_sub_module_lessons_sub_module_id;
|
ON sub_module_lessons(sub_module_id);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,24 @@ CREATE TABLE IF NOT EXISTS sub_module_practices (
|
||||||
UNIQUE(question_set_id)
|
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
|
CREATE INDEX IF NOT EXISTS idx_sub_module_practices_sub_module_id
|
||||||
ON sub_module_practices(sub_module_id);
|
ON sub_module_practices(sub_module_id);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ FROM sub_module_lessons smp
|
||||||
JOIN question_sets qs ON qs.id = smp.question_set_id
|
JOIN question_sets qs ON qs.id = smp.question_set_id
|
||||||
WHERE smp.sub_module_id = $1
|
WHERE smp.sub_module_id = $1
|
||||||
AND smp.is_active = TRUE
|
AND smp.is_active = TRUE
|
||||||
|
AND qs.set_type = 'QUIZ'
|
||||||
ORDER BY smp.display_order ASC, smp.id ASC;
|
ORDER BY smp.display_order ASC, smp.id ASC;
|
||||||
|
|
||||||
-- name: GetSubModulePractices :many
|
-- name: GetSubModulePractices :many
|
||||||
|
|
@ -77,6 +78,7 @@ FROM sub_module_practices smp
|
||||||
JOIN question_sets qs ON qs.id = smp.question_set_id
|
JOIN question_sets qs ON qs.id = smp.question_set_id
|
||||||
WHERE smp.sub_module_id = $1
|
WHERE smp.sub_module_id = $1
|
||||||
AND smp.is_active = TRUE
|
AND smp.is_active = TRUE
|
||||||
|
AND qs.set_type = 'PRACTICE'
|
||||||
ORDER BY smp.display_order ASC, smp.id ASC;
|
ORDER BY smp.display_order ASC, smp.id ASC;
|
||||||
|
|
||||||
-- name: GetFullHierarchyByCourseID :many
|
-- name: GetFullHierarchyByCourseID :many
|
||||||
|
|
|
||||||
|
|
@ -561,6 +561,7 @@ FROM sub_module_lessons smp
|
||||||
JOIN question_sets qs ON qs.id = smp.question_set_id
|
JOIN question_sets qs ON qs.id = smp.question_set_id
|
||||||
WHERE smp.sub_module_id = $1
|
WHERE smp.sub_module_id = $1
|
||||||
AND smp.is_active = TRUE
|
AND smp.is_active = TRUE
|
||||||
|
AND qs.set_type = 'QUIZ'
|
||||||
ORDER BY smp.display_order ASC, smp.id ASC
|
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
|
JOIN question_sets qs ON qs.id = smp.question_set_id
|
||||||
WHERE smp.sub_module_id = $1
|
WHERE smp.sub_module_id = $1
|
||||||
AND smp.is_active = TRUE
|
AND smp.is_active = TRUE
|
||||||
|
AND qs.set_type = 'PRACTICE'
|
||||||
ORDER BY smp.display_order ASC, smp.id ASC
|
ORDER BY smp.display_order ASC, smp.id ASC
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user