142 lines
2.5 KiB
TypeScript
142 lines
2.5 KiB
TypeScript
import { IsBoolean, IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString, IsUUID } from "class-validator";
|
|
import { Column, Entity, JoinTable, ManyToMany, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
|
import { Permission } from './Permission';
|
|
import { UserAction } from './UserAction';
|
|
import { UserGroup } from './UserGroup';
|
|
|
|
/**
|
|
* Defines a admin user.
|
|
*/
|
|
@Entity()
|
|
export class User {
|
|
/**
|
|
* autogenerated unique id (primary key).
|
|
*/
|
|
@PrimaryGeneratedColumn()
|
|
@IsInt()
|
|
id: number;
|
|
|
|
/**
|
|
* uuid
|
|
*/
|
|
@Column()
|
|
@IsUUID(4)
|
|
uuid: string;
|
|
|
|
/**
|
|
* user email
|
|
*/
|
|
@Column({ nullable: true })
|
|
@IsEmail()
|
|
email?: string;
|
|
|
|
/**
|
|
* user phone
|
|
*/
|
|
@Column({ nullable: true })
|
|
@IsOptional()
|
|
@IsPhoneNumber("ZZ")
|
|
phone?: string;
|
|
|
|
/**
|
|
* username
|
|
*/
|
|
@Column({ nullable: true })
|
|
@IsString()
|
|
username?: string;
|
|
|
|
/**
|
|
* firstname
|
|
*/
|
|
@Column()
|
|
@IsString()
|
|
@IsNotEmpty()
|
|
firstname: string;
|
|
|
|
/**
|
|
* middlename
|
|
*/
|
|
@Column({ nullable: true })
|
|
@IsString()
|
|
@IsOptional()
|
|
middlename?: string;
|
|
|
|
/**
|
|
* lastname
|
|
*/
|
|
@Column()
|
|
@IsString()
|
|
@IsNotEmpty()
|
|
lastname: string;
|
|
|
|
/**
|
|
* password
|
|
*/
|
|
@Column()
|
|
@IsString()
|
|
@IsNotEmpty()
|
|
password: string;
|
|
|
|
/**
|
|
* permissions
|
|
*/
|
|
@IsOptional()
|
|
@ManyToOne(() => Permission, permission => permission.users, { nullable: true })
|
|
permissions?: Permission[];
|
|
|
|
/**
|
|
* groups
|
|
*/
|
|
@IsOptional()
|
|
@ManyToMany(() => UserGroup, { nullable: true })
|
|
@JoinTable()
|
|
groups: UserGroup[];
|
|
|
|
/**
|
|
* is user enabled?
|
|
*/
|
|
@Column()
|
|
@IsBoolean()
|
|
enabled: boolean = true;
|
|
|
|
/**
|
|
* jwt refresh count
|
|
*/
|
|
@IsInt()
|
|
@Column({ default: 1 })
|
|
refreshTokenCount?: number;
|
|
|
|
/**
|
|
* profilepic
|
|
*/
|
|
@Column({ nullable: true })
|
|
@IsString()
|
|
@IsOptional()
|
|
profilePic?: string;
|
|
|
|
/**
|
|
* actions
|
|
*/
|
|
@IsOptional()
|
|
@OneToMany(() => UserAction, action => action.user, { nullable: true })
|
|
actions: UserAction[]
|
|
|
|
/**
|
|
* calculate all permissions
|
|
*/
|
|
public get calc_permissions(): Permission[] {
|
|
let final_permissions = []
|
|
this.groups.forEach((permission) => {
|
|
if (!final_permissions.includes(permission)) {
|
|
final_permissions.push(permission)
|
|
}
|
|
})
|
|
this.permissions.forEach((permission) => {
|
|
if (!final_permissions.includes(permission)) {
|
|
final_permissions.push(permission)
|
|
}
|
|
})
|
|
return final_permissions
|
|
}
|
|
}
|