import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany, RelationCount, } from 'typeorm'; import { Permission, hasPermission } from '../lib/permissions'; import { MediaRequest } from './MediaRequest'; @Entity() export class User { public static filterMany(users: User[]): Partial[] { return users.map((u) => u.filter()); } static readonly filteredFields: string[] = ['plexToken']; @PrimaryGeneratedColumn() public id: number; @Column({ unique: true }) public email: string; @Column() public username: string; @Column({ select: false }) public plexId: number; @Column({ nullable: true, select: false }) public plexToken?: string; @Column({ type: 'integer', default: 0 }) public permissions = 0; @Column() public avatar: string; @RelationCount((user: User) => user.requests) public requestCount: number; @OneToMany(() => MediaRequest, (request) => request.requestedBy) public requests: MediaRequest[]; @CreateDateColumn() public createdAt: Date; @UpdateDateColumn() public updatedAt: Date; constructor(init?: Partial) { Object.assign(this, init); } public filter(): Partial { const filtered: Partial = Object.assign( {}, ...(Object.keys(this) as (keyof User)[]) .filter((k) => !User.filteredFields.includes(k)) .map((k) => ({ [k]: this[k] })) ); return filtered; } public hasPermission(permissions: Permission | Permission[]): boolean { return !!hasPermission(permissions, this.permissions); } }