diff --git a/apps/server/src/entities/department.entity.ts b/apps/server/src/entities/department.entity.ts new file mode 100644 index 0000000..d1b9fb9 --- /dev/null +++ b/apps/server/src/entities/department.entity.ts @@ -0,0 +1,49 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + ManyToOne, + OneToMany, + JoinColumn, +} from 'typeorm'; + +export enum DepartmentType { + CAMPUS = 'campus', + DEPARTMENT = 'department', +} + +@Entity('departments') +export class Department { + @PrimaryGeneratedColumn() + id: number; + + @Column({ length: 100 }) + name: string; + + @Column({ name: 'parent_id', type: 'integer', nullable: true }) + parentId: number; + + @ManyToOne(() => Department, { nullable: true, onDelete: 'SET NULL' }) + @JoinColumn({ name: 'parent_id' }) + parent: Department; + + @OneToMany(() => Department, (d) => d.parent) + children: Department[]; + + @Column({ length: 20, default: DepartmentType.DEPARTMENT }) + type: string; + + @Column({ name: 'sort_order', type: 'integer', default: 0 }) + sortOrder: number; + + @Column({ length: 20, default: 'active' }) + status: 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 f8aecea..008d081 100644 --- a/apps/server/src/entities/index.ts +++ b/apps/server/src/entities/index.ts @@ -24,3 +24,5 @@ export { SyncLog } from './sync-log.entity'; export { SyncState } from './sync-state.entity'; export { ExpenseType } from './expense-type.entity'; export { Notification, NotificationType } from './notification.entity'; +export { Department, DepartmentType } from './department.entity'; +export { UserDepartment } from './user-department.entity'; diff --git a/apps/server/src/entities/user-department.entity.ts b/apps/server/src/entities/user-department.entity.ts new file mode 100644 index 0000000..b093b3f --- /dev/null +++ b/apps/server/src/entities/user-department.entity.ts @@ -0,0 +1,38 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + ManyToOne, + JoinColumn, + Unique, +} from 'typeorm'; +import { User } from './user.entity'; +import { Department } from './department.entity'; + +@Entity('user_departments') +@Unique(['userId', 'departmentId']) +export class UserDepartment { + @PrimaryGeneratedColumn() + id: number; + + @Column({ name: 'user_id', type: 'integer' }) + userId: number; + + @ManyToOne(() => User, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'user_id' }) + user: User; + + @Column({ name: 'department_id', type: 'integer' }) + departmentId: number; + + @ManyToOne(() => Department, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'department_id' }) + department: Department; + + @Column({ name: 'is_default', type: 'boolean', default: false }) + isDefault: boolean; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; +}