import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn, CreateDateColumn, UpdateDateColumn, Index, Unique, } from 'typeorm'; import type { Relation } from 'typeorm'; import { SectionStatus } from '../enums'; import type { Course } from './course.entity'; import type { CourseSchedule } from './course-schedule.entity'; import type { Semester } from '../../campus/entities/semester.entity'; @Entity('course_sections') @Unique(['courseId', 'semesterId', 'sectionNumber']) @Index(['courseId', 'semesterId']) @Index(['semesterId', 'status']) export class CourseSection { @PrimaryGeneratedColumn('increment', { name: 'section_id', type: 'bigint', unsigned: true, }) id: number; @Column({ type: 'bigint', unsigned: true, nullable: false, name: 'course_id', }) courseId: number; @Column({ type: 'bigint', unsigned: true, nullable: false, name: 'semester_id', }) semesterId: number; @Column({ type: 'varchar', length: 50, nullable: false, name: 'section_number', }) sectionNumber: string; @Column({ type: 'int', nullable: false, name: 'max_capacity', }) maxCapacity: number; @Column({ type: 'int', default: 0, name: 'current_enrollment', }) currentEnrollment: number; @Column({ type: 'varchar', length: 255, nullable: true, name: 'location', }) location: string | null; @Column({ type: 'enum', enum: SectionStatus, default: SectionStatus.OPEN, name: 'status', }) status: SectionStatus; @CreateDateColumn({ name: 'created_at', }) createdAt: Date; @UpdateDateColumn({ name: 'updated_at', }) updatedAt: Date; @ManyToOne('Course', 'sections', { onDelete: 'CASCADE', }) @JoinColumn({ name: 'course_id' }) course: Relation; @ManyToOne('Semester', { onDelete: 'CASCADE', }) @JoinColumn({ name: 'semester_id' }) semester: Relation; @OneToMany('CourseSchedule', 'section', { cascade: true, }) schedules: Relation[]; }