import { Column, AfterLoad, CreateDateColumn, DeleteDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn, BeforeInsert, BeforeUpdate, OneToMany, } from 'typeorm'; import { Role } from '../../roles/entities/role.entity'; import { Status } from '../../statuses/entities/status.entity'; import * as bcrypt from 'bcryptjs'; import { EntityHelper } from 'src/utils/entity-helper'; import { AuthProvidersEnum } from 'src/auth/auth-providers.enum'; import { Exclude, Expose } from 'class-transformer'; import { Player } from 'src/players/entities/player.entity'; @Entity() export class User extends EntityHelper { @PrimaryGeneratedColumn() id: number; @Column({ unique: true, nullable: true }) email: string | null; @Column({ nullable: true }) @Exclude({ toPlainOnly: true }) password: string; @Exclude({ toPlainOnly: true }) public previousPassword: string; @AfterLoad() public loadPreviousPassword(): void { this.previousPassword = this.password; } @BeforeInsert() @BeforeUpdate() async setPassword() { if (this.previousPassword !== this.password && this.password) { const salt = await bcrypt.genSalt(); this.password = await bcrypt.hash(this.password, salt); } } @Column({ default: AuthProvidersEnum.email }) @Expose({ groups: ['exposeProvider'] }) provider: string; @Index() @Column({ nullable: true }) socialId: string | null; @Index() @Column({ nullable: true }) firstName: string | null; @Index() @Column({ nullable: true }) lastName: string | null; @Column({ default: true }) helpTextsEnabled: boolean; @ManyToOne(() => Role, { eager: true, }) role?: Role | null; @ManyToOne(() => Status, { eager: true, }) status?: Status; @OneToMany(() => Player, (player) => player.user) players: Player[]; @Column({ nullable: true }) @Index() @Exclude({ toPlainOnly: true }) hash: string | null; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; @DeleteDateColumn() deletedAt: Date; }