import { Column, CreateDateColumn, Entity, Generated, Index, ManyToOne, OneToMany, PrimaryColumn } from 'typeorm'; import { ApiProperty } from '@nestjs/swagger'; import { RefCode } from './refcode.entity'; import { Wallet } from './wallet.entity'; @Entity() export class User { @PrimaryColumn() @ApiProperty() uid: string; @Column({ default: 'Funkier' }) @ApiProperty() name: string; @Column({ nullable: true }) @ApiProperty({ nullable: true }) email: string | null; @Index({ unique: true }) @Column({ nullable: true }) @ApiProperty({ nullable: true }) telegramId?: string; @Index({ unique: true }) @Column({ nullable: true }) @ApiProperty({ nullable: true }) xId?: string; @Index({ unique: true }) @Column({ nullable: true }) @ApiProperty({ nullable: true }) discordId?: string; @Index({ unique: true }) @Column({ nullable: true }) @ApiProperty({ nullable: true }) redditId?: string; @Index({ unique: true }) @Column({ nullable: true }) @ApiProperty({ nullable: true }) steamId?: string; @Column({ type: 'json', nullable: true }) @ApiProperty({ nullable: true, type: 'object', properties: { id: { type: 'string' }, displayName: { type: 'string' }, username: { type: 'string' }, avatar: { type: 'string', nullable: true }, allowSendPM: { type: 'boolean' }, ages: { type: 'number', nullable: true }, }, }) telegram: { id: string; username: string; avatar: string | null; allowSendPM: boolean; ages: number | null; }; @Column({ type: 'json', nullable: true }) @ApiProperty({ nullable: true, type: 'object', properties: { ages: { type: 'number', nullable: true }, id: { type: 'string' }, name: { type: 'string' }, username: { type: 'string' }, avatar: { type: 'string', nullable: true }, }, }) x: Record; @Column({ type: 'json', nullable: true }) @ApiProperty({ nullable: true, type: 'object', properties: { ages: { type: 'number', nullable: true }, id: { type: 'string' }, username: { type: 'string' }, avatar: { type: 'string', nullable: true }, email: { type: 'string', nullable: true }, }, }) discord: Record; @Column({ type: 'json', nullable: true }) @ApiProperty({ nullable: true, type: 'object', properties: { karma: { type: 'number', nullable: true }, }, }) reddit: Record; @Column({ type: 'json', nullable: true }) @ApiProperty({ nullable: true, type: 'object', properties: { ownedGames: { type: 'number', nullable: true }, steamLevel: { type: 'number', nullable: true }, }, }) steam: Record; @OneToMany(() => Wallet, wallet => wallet.user, { cascade: true }) @ApiProperty({ type: () => [Wallet] }) wallets: Wallet[]; @OneToMany(() => RefCode, refCode => refCode.owner, { cascade: true }) @ApiProperty({ type: () => [RefCode] }) refCodes: RefCode[]; @Column({ default: false }) @ApiProperty() hasRequestedDeletion: boolean; @OneToMany(() => User, user => user.referrer) @ApiProperty({ type: () => [User] }) referees: User[]; @Column({ nullable: true }) @ApiProperty({ nullable: true }) referrerUid?: string; @ManyToOne(() => User, user => user.refCodes, { onDelete: 'SET NULL' }) @ApiProperty({ type: () => User }) referrer?: User; @Column({ default: false }) @ApiProperty() onboarded: boolean; @Column({ default: null }) @ApiProperty({ nullable: true }) @Index({ unique: true }) onboardWallet: string | null; @Column() @Generated('increment') @ApiProperty() waitlistOrder: number; @ApiProperty() @CreateDateColumn() createdAt: string; }