mono/packages/vfs/ref-server/entities/user.entity.ts

130 lines
3.1 KiB
TypeScript

import { IsEmail, IsNotEmpty, IsOptional, MaxLength, validateSync } from 'class-validator';
import * as hashers from 'node-django-hashers';
import {
BeforeInsert,
BeforeUpdate,
Column,
CreateDateColumn,
Entity,
JoinTable,
ManyToMany,
PrimaryGeneratedColumn,
UpdateDateColumn
} from 'typeorm';
import { Group } from './group.entity';
import { CustomValidationError } from '../exceptions/custom-validation.error';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 128 })
@MaxLength(128)
@IsOptional()
password: string;
@UpdateDateColumn({ name: 'last_login', nullable: true })
lastLogin: Date;
@Column({ name: 'is_superuser' })
@IsNotEmpty()
isSuperuser: boolean;
@Column({ length: 150, unique: true })
@IsNotEmpty()
@MaxLength(150)
username: string;
@Column({ name: 'first_name', length: 30 })
@IsNotEmpty()
@MaxLength(30)
firstName: string;
@Column({ name: 'last_name', length: 30 })
@IsNotEmpty()
@MaxLength(30)
lastName: string;
@Column({ length: 254 })
@IsNotEmpty()
@IsEmail()
@MaxLength(254)
email: string;
@Column({ name: 'is_staff' })
@IsNotEmpty()
isStaff: boolean;
@Column({ name: 'is_active' })
@IsNotEmpty()
isActive: boolean;
@CreateDateColumn({ name: 'date_joined' })
dateJoined: Date;
@Column({ type: Date, name: 'date_of_birth', nullable: true })
dateOfBirth: Date;
@ManyToMany(type => Group, {
cascade: ['remove']
})
@JoinTable({
//not work on run cli migration:
name: 'user_groups',
joinColumn: {
name: 'user_id',
referencedColumnName: 'id'
},
inverseJoinColumn: {
name: 'group_id',
referencedColumnName: 'id'
}
})
groups: Group[];
@BeforeInsert()
doBeforeInsertion() {
const errors = validateSync(this, { validationError: { target: false } });
if (errors.length > 0) {
throw new CustomValidationError(errors)
}
}
@BeforeUpdate()
doBeforeUpdate() {
const errors = validateSync(this, { validationError: { target: false } });
if (errors.length > 0) {
throw new CustomValidationError(errors)
}
}
makePassword(password: string) {
var h = new hashers.PBKDF2PasswordHasher();
var hash = h.encode(password, h.salt());
return hash;
}
verifyPassword(password: string) {
var h = new hashers.PBKDF2PasswordHasher();
return h.verify(password, this.password);
}
setPassword(password: string) {
if (password) {
this.password = this.makePassword(password);
} else {
this.password = undefined;
}
}
checkPermissions(permissions: string[]) {
permissions = permissions.map(permission => permission.toLowerCase());
return this.groups.filter(group =>
group.permissions.filter(permission =>
permissions.indexOf(permission.name.toLowerCase()) !== -1
).length > 0
).length > 0
}
}