feat: add Class, ClassStudent, ClassTeacher entities

This commit is contained in:
2026-07-05 18:53:12 +08:00
parent b89dff6d18
commit e1d9ce9709
4 changed files with 174 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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';