import { ColumnType } from 'kysely'; import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators'; import { UserAvatarColor, UserStatus } from 'src/enum'; import { users_delete_audit } from 'src/schema/functions'; import { AfterDeleteTrigger, Column, CreateDateColumn, DeleteDateColumn, Index, PrimaryGeneratedColumn, Table, UpdateDateColumn, } from 'src/sql-tools'; type Timestamp = ColumnType; type Generated = T extends ColumnType ? ColumnType : ColumnType; @Table('users') @UpdatedAtTrigger('users_updated_at') @AfterDeleteTrigger({ name: 'users_delete_audit', scope: 'statement', function: users_delete_audit, referencingOldTableAs: 'old', when: 'pg_trigger_depth() = 0', }) @Index({ name: 'IDX_users_updated_at_asc_id_asc', columns: ['updatedAt', 'id'] }) export class UserTable { @PrimaryGeneratedColumn() id!: Generated; @Column({ unique: true }) email!: string; @Column({ default: '' }) password!: Generated; @CreateDateColumn() createdAt!: Generated; @Column({ default: '' }) profileImagePath!: Generated; @Column({ type: 'boolean', default: false }) isAdmin!: Generated; @Column({ type: 'boolean', default: true }) shouldChangePassword!: Generated; @Column({ default: null }) avatarColor!: UserAvatarColor | null; @DeleteDateColumn() deletedAt!: Timestamp | null; @Column({ default: '' }) oauthId!: Generated; @UpdateDateColumn() updatedAt!: Generated; @Column({ unique: true, nullable: true, default: null }) storageLabel!: string | null; @Column({ default: '' }) name!: Generated; @Column({ type: 'bigint', nullable: true }) quotaSizeInBytes!: ColumnType | null; @Column({ type: 'bigint', default: 0 }) quotaUsageInBytes!: Generated>; @Column({ type: 'character varying', default: UserStatus.ACTIVE }) status!: Generated; @Column({ type: 'timestamp with time zone', default: () => 'now()' }) profileChangedAt!: Generated; @UpdateIdColumn({ indexName: 'IDX_users_update_id' }) updateId!: Generated; }