Add Phase 8: lesson plan templates with deep-copy instantiation

- New tables: lesson_plan_template, lesson_plan_template_section, lesson_plan_template_item
- skill_level enum: beginner, intermediate, advanced, all_levels
- Templates are reusable curriculum definitions independent of any member/enrollment
- POST /lesson-plan-templates/:id/create-plan deep-copies the template into a member plan
- Instantiation uses template name as default plan title, accepts custom title override
- Instantiation deactivates any existing active plan on the enrollment (one-active rule)
- Plan items are independent copies — renaming the template does not affect existing plans
- 11 new integration tests
This commit is contained in:
Ryan Moon
2026-03-30 10:37:30 -05:00
parent 2cc8f24535
commit 7680a73d88
8 changed files with 623 additions and 2 deletions

View File

@@ -0,0 +1,35 @@
-- Phase 8: Lesson plan templates — reusable curriculum definitions
CREATE TYPE "skill_level" AS ENUM ('beginner', 'intermediate', 'advanced', 'all_levels');
CREATE TABLE "lesson_plan_template" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
"name" varchar(255) NOT NULL,
"description" text,
"instrument" varchar(100),
"skill_level" skill_level NOT NULL DEFAULT 'all_levels',
"created_by" uuid REFERENCES "user"("id"),
"is_active" boolean NOT NULL DEFAULT true,
"created_at" timestamptz NOT NULL DEFAULT now(),
"updated_at" timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE "lesson_plan_template_section" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
"template_id" uuid NOT NULL REFERENCES "lesson_plan_template"("id"),
"title" varchar(255) NOT NULL,
"description" text,
"sort_order" integer NOT NULL,
"created_at" timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE "lesson_plan_template_item" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
"section_id" uuid NOT NULL REFERENCES "lesson_plan_template_section"("id"),
"title" varchar(255) NOT NULL,
"description" text,
"grading_scale_id" uuid REFERENCES "grading_scale"("id"),
"target_grade_value" varchar(50),
"sort_order" integer NOT NULL,
"created_at" timestamptz NOT NULL DEFAULT now()
);

View File

@@ -253,6 +253,13 @@
"when": 1774950000000,
"tag": "0035_grade_history",
"breakpoints": true
},
{
"idx": 36,
"version": "7",
"when": 1774960000000,
"tag": "0036_lesson_plan_templates",
"breakpoints": true
}
]
}