diff --git a/apps/server/src/entities/class-student.entity.ts b/apps/server/src/entities/class-student.entity.ts new file mode 100644 index 0000000..4b9906c --- /dev/null +++ b/apps/server/src/entities/class-student.entity.ts @@ -0,0 +1,47 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + ManyToOne, + JoinColumn, + Unique, +} from 'typeorm'; +import { Class } from './class.entity'; +import { Student } from './student.entity'; + +@Entity('class_student') +@Unique(['classId', 'studentId']) +export class ClassStudent { + @PrimaryGeneratedColumn() + id: number; + + @Column({ name: 'class_id', type: 'integer' }) + classId: number; + + @ManyToOne(() => Class, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'class_id' }) + class: Class; + + @Column({ name: 'student_id', type: 'integer' }) + studentId: number; + + @ManyToOne(() => Student) + @JoinColumn({ name: 'student_id' }) + student: Student; + + @Column({ name: 'enrollment_id', type: 'integer', nullable: true }) + enrollmentId: number; + + @Column({ name: 'join_date', type: 'date', nullable: true }) + joinDate: string; + + @Column({ name: 'leave_date', type: 'date', nullable: true }) + leaveDate: string; + + @Column({ name: 'status', length: 10, default: 'active' }) + status: string; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; +} diff --git a/apps/server/src/entities/class-teacher.entity.ts b/apps/server/src/entities/class-teacher.entity.ts new file mode 100644 index 0000000..6b36c12 --- /dev/null +++ b/apps/server/src/entities/class-teacher.entity.ts @@ -0,0 +1,48 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + ManyToOne, + JoinColumn, + Unique, +} from 'typeorm'; +import { Class } from './class.entity'; +import { User } from './user.entity'; + +export enum TeacherRoleType { + SUBJECT_TEACHER = 'subject_teacher', + HEAD_TEACHER = 'head_teacher', + LIFE_TEACHER = 'life_teacher', + ACADEMIC_TEACHER = 'academic_teacher', +} + +@Entity('class_teacher') +@Unique(['classId', 'userId', 'roleType']) +export class ClassTeacher { + @PrimaryGeneratedColumn() + id: number; + + @Column({ name: 'class_id', type: 'integer' }) + classId: number; + + @ManyToOne(() => Class, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'class_id' }) + class: Class; + + @Column({ name: 'user_id', type: 'integer' }) + userId: number; + + @ManyToOne(() => User) + @JoinColumn({ name: 'user_id' }) + user: User; + + @Column({ name: 'role_type', length: 30 }) + roleType: string; + + @Column({ name: 'subject', length: 50, nullable: true }) + subject: string; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; +} diff --git a/apps/server/src/entities/class.entity.ts b/apps/server/src/entities/class.entity.ts new file mode 100644 index 0000000..5bfe35a --- /dev/null +++ b/apps/server/src/entities/class.entity.ts @@ -0,0 +1,76 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + ManyToOne, + JoinColumn, +} from 'typeorm'; + +export enum ClassType { + CULTURE = 'culture', + PROFESSIONAL = 'professional', + BOOTCAMP = 'bootcamp', + SPRINT = 'sprint', +} + +export enum ClassStatus { + ENROLLING = 'enrolling', + ACTIVE = 'active', + ENDED = 'ended', + SUSPENDED = 'suspended', +} + +@Entity('classes') +export class Class { + @PrimaryGeneratedColumn() + id: number; + + @Column({ name: 'name', length: 100 }) + name: string; + + @Column({ name: 'code', length: 50, unique: true }) + code: string; + + @Column({ name: 'department_id', type: 'integer', nullable: true }) + departmentId: number; + + // Forward reference — Department entity will be added later + @ManyToOne('Department', { nullable: true }) + @JoinColumn({ name: 'department_id' }) + department: unknown; + + @Column({ name: 'class_type', length: 20 }) + classType: string; + + @Column({ name: 'start_date', type: 'date', nullable: true }) + startDate: string; + + @Column({ name: 'end_date', type: 'date', nullable: true }) + endDate: string; + + @Column({ name: 'status', length: 20, default: ClassStatus.ENROLLING }) + status: string; + + @Column({ name: 'head_teacher_id', type: 'integer', nullable: true }) + headTeacherId: number; + + @Column({ name: 'life_teacher_id', type: 'integer', nullable: true }) + lifeTeacherId: number; + + @Column({ name: 'academic_teacher_id', type: 'integer', nullable: true }) + academicTeacherId: number; + + @Column({ name: 'max_students', type: 'integer', default: 0 }) + maxStudents: number; + + @Column({ name: 'notes', type: 'text', nullable: true }) + notes: string; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; + + @UpdateDateColumn({ name: 'updated_at' }) + updatedAt: Date; +} diff --git a/apps/server/src/entities/index.ts b/apps/server/src/entities/index.ts index 7f1fdc6..872b79f 100644 --- a/apps/server/src/entities/index.ts +++ b/apps/server/src/entities/index.ts @@ -13,3 +13,6 @@ export { Tenant } from './tenant.entity'; export { ClassroomRental } from './classroom-rental.entity'; export { Permission } from './permission.entity'; export { Role } from './role.entity'; +export { Class, ClassType, ClassStatus } from './class.entity'; +export { ClassStudent } from './class-student.entity'; +export { ClassTeacher, TeacherRoleType } from './class-teacher.entity';