import { Table, Column, DataType, Model, ForeignKey, BelongsTo, Index, } from 'sequelize-typescript'; import { Challenge } from './challenge.model'; import { User } from '../../users/models/user.model'; export enum ChallengeParticipantStatus { ACTIVE = 'active', COMPLETED = 'completed', LEFT = 'left', } @Table({ tableName: 't_challenge_participants', underscored: true, }) export class ChallengeParticipant extends Model { @Column({ type: DataType.CHAR(36), defaultValue: DataType.UUIDV4, primaryKey: true, }) declare id: string; @ForeignKey(() => Challenge) @Column({ type: DataType.CHAR(36), allowNull: false, comment: '挑战 ID', }) declare challengeId: string; @ForeignKey(() => User) @Column({ type: DataType.STRING(64), allowNull: false, comment: '用户 ID', }) declare userId: string; @Column({ type: DataType.INTEGER, allowNull: false, defaultValue: 0, comment: '当前进度值', }) declare progressValue: number; @Column({ type: DataType.INTEGER, allowNull: false, comment: '目标值,通常与挑战 targetValue 相同', }) declare targetValue: number; @Column({ type: DataType.ENUM('active', 'completed', 'left'), allowNull: false, defaultValue: ChallengeParticipantStatus.ACTIVE, comment: '参与状态', }) declare status: ChallengeParticipantStatus; @Column({ type: DataType.DATE, allowNull: false, defaultValue: DataType.NOW, comment: '加入时间', }) declare joinedAt: Date; @Column({ type: DataType.DATE, allowNull: true, comment: '退出时间', }) declare leftAt: Date | null; @Column({ type: DataType.DATE, allowNull: true, comment: '最近一次更新进度的时间', }) declare lastProgressAt: Date | null; @BelongsTo(() => Challenge) declare challenge?: Challenge; @BelongsTo(() => User) declare user?: User; }