All files / web/src/db/schema classroom-enrollments.ts

100% Statements 53/53
100% Branches 3/3
100% Functions 2/2
100% Lines 53/53

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 542x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 39x 39x 39x 39x 39x 39x 39x 39x 39x 39x 39x 39x 2x 2x 2x 2x  
import { createId } from '@paralleldrive/cuid2'
import { index, integer, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core'
import { classrooms } from './classrooms'
import { players } from './players'
 
/**
 * Classroom enrollments - persistent student roster
 *
 * Links students (players) to classrooms. An enrolled student can:
 * - Be viewed by the teacher (skills, history, progress)
 * - Enter the classroom for live practice sessions
 * - Be unenrolled by teacher or parent at any time
 */
export const classroomEnrollments = sqliteTable(
  'classroom_enrollments',
  {
    /** Primary key */
    id: text('id')
      .primaryKey()
      .$defaultFn(() => createId()),
 
    /** Classroom this enrollment is for */
    classroomId: text('classroom_id')
      .notNull()
      .references(() => classrooms.id, { onDelete: 'cascade' }),
 
    /** Student (player) being enrolled */
    playerId: text('player_id')
      .notNull()
      .references(() => players.id, { onDelete: 'cascade' }),
 
    /** When this enrollment was created */
    enrolledAt: integer('enrolled_at', { mode: 'timestamp' })
      .notNull()
      .$defaultFn(() => new Date()),
  },
  (table) => ({
    /** Each student can only be enrolled once per classroom */
    classroomPlayerIdx: uniqueIndex('idx_enrollments_classroom_player').on(
      table.classroomId,
      table.playerId
    ),
 
    /** Index for finding all students in a classroom */
    classroomIdx: index('idx_enrollments_classroom').on(table.classroomId),
 
    /** Index for finding all classrooms a student is enrolled in */
    playerIdx: index('idx_enrollments_player').on(table.playerId),
  })
)
 
export type ClassroomEnrollment = typeof classroomEnrollments.$inferSelect
export type NewClassroomEnrollment = typeof classroomEnrollments.$inferInsert