diff --git a/apps/server/package.json b/apps/server/package.json index d40c28b..95526d5 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -6,8 +6,9 @@ "license": "UNLICENSED", "author": "", "scripts": { - "dev": "nest start --watch -p tsconfig.build.json", - "build": "nest build", + "dev": "SEED_DEV=true nest start --watch -p tsconfig.build.json", + "build": "nest build -p tsconfig.build.json", + "start:dev": "SEED_DEV=true nest start --watch", "format": "oxfmt", "start": "nest start", "start:dev": "nest start --watch", diff --git a/apps/server/src/entities/user-ding-mapping.entity.ts b/apps/server/src/entities/user-ding-mapping.entity.ts new file mode 100644 index 0000000..f927a39 --- /dev/null +++ b/apps/server/src/entities/user-ding-mapping.entity.ts @@ -0,0 +1,52 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, + ManyToOne, + JoinColumn, +} from 'typeorm'; +import { User } from './user.entity'; + +/** + * Maps DingTalk user IDs to local User records. + * Used for incremental sync and attendance auto-matching. + * + * Mapping chain: + * dingtalk userid → UserDingMapping.dingUserId → UserDingMapping.userId + * → User.id → Student.userId → Student.id + * → DingAttendanceRaw.dingUserId → UserDingMapping.dingUserId → auto-match + */ +@Entity('user_ding_mapping') +export class UserDingMapping { + @PrimaryGeneratedColumn() + id: number; + + /** DingTalk user ID (from DingTalk API) */ + @Column({ name: 'ding_user_id', length: 100, unique: true }) + dingUserId: string; + + /** Local User ID */ + @Column({ name: 'user_id', type: 'integer', unique: true }) + userId: number; + + @ManyToOne(() => User, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'user_id' }) + user: User; + + /** DingTalk user name (cached for display) */ + @Column({ name: 'ding_name', length: 100, nullable: true }) + dingName: string; + + /** DingTalk mobile (cached for display) */ + @Column({ name: 'ding_mobile', length: 20, nullable: true }) + dingMobile: string; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; + + @UpdateDateColumn({ name: 'updated_at' }) + updatedAt: Date; +}