130 lines
3.1 KiB
TypeScript
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
|
|
}
|
|
} |