Add Phase 7: grade history and session-plan item linking

- New tables: lesson_plan_item_grade_history (append-only), lesson_session_plan_item
- Grading an item updates current_grade_value and creates immutable history record
- Grading a not_started item auto-transitions it to in_progress
- Linking items to a session also auto-transitions not_started items
- Link operation is idempotent — re-linking same items produces no duplicates
- Endpoints: POST/GET /lesson-plan-items/:id/grades, GET /lesson-plan-items/:id/grade-history
- Endpoints: POST/GET /lesson-sessions/:id/plan-items
- 8 new integration tests
This commit is contained in:
Ryan Moon
2026-03-30 10:33:21 -05:00
parent 5cd2d05983
commit 2cc8f24535
8 changed files with 446 additions and 2 deletions

View File

@@ -218,6 +218,30 @@ export const lessonPlanItems = pgTable('lesson_plan_item', {
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
})
export const lessonPlanItemGradeHistory = pgTable('lesson_plan_item_grade_history', {
id: uuid('id').primaryKey().defaultRandom(),
lessonPlanItemId: uuid('lesson_plan_item_id')
.notNull()
.references(() => lessonPlanItems.id),
gradingScaleId: uuid('grading_scale_id').references(() => gradingScales.id),
gradeValue: varchar('grade_value', { length: 50 }).notNull(),
gradedBy: uuid('graded_by').references(() => users.id),
sessionId: uuid('session_id').references(() => lessonSessions.id),
notes: text('notes'),
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
})
export const lessonSessionPlanItems = pgTable('lesson_session_plan_item', {
id: uuid('id').primaryKey().defaultRandom(),
sessionId: uuid('session_id')
.notNull()
.references(() => lessonSessions.id),
lessonPlanItemId: uuid('lesson_plan_item_id')
.notNull()
.references(() => lessonPlanItems.id),
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
})
// --- Type exports ---
export type Instructor = typeof instructors.$inferSelect
@@ -244,3 +268,7 @@ export type LessonPlanSection = typeof lessonPlanSections.$inferSelect
export type LessonPlanSectionInsert = typeof lessonPlanSections.$inferInsert
export type LessonPlanItem = typeof lessonPlanItems.$inferSelect
export type LessonPlanItemInsert = typeof lessonPlanItems.$inferInsert
export type LessonPlanItemGradeHistory = typeof lessonPlanItemGradeHistory.$inferSelect
export type LessonPlanItemGradeHistoryInsert = typeof lessonPlanItemGradeHistory.$inferInsert
export type LessonSessionPlanItem = typeof lessonSessionPlanItems.$inferSelect
export type LessonSessionPlanItemInsert = typeof lessonSessionPlanItems.$inferInsert