ohmyform-api/src/service/user/user.update.service.ts
2022-02-28 22:48:19 +01:00

70 lines
1.8 KiB
TypeScript

import { Injectable } from '@nestjs/common'
import { InjectRepository } from '@nestjs/typeorm'
import { Repository } from 'typeorm'
import { rolesType } from '../../config/roles'
import { UserUpdateInput } from '../../dto/user/user.update.input'
import { UserEntity } from '../../entity/user.entity'
import { PasswordService } from '../auth/password.service'
@Injectable()
export class UserUpdateService {
constructor(
@InjectRepository(UserEntity)
private readonly userRepository: Repository<UserEntity>,
private readonly passwordService: PasswordService,
) {
}
async update(user: UserEntity, input: UserUpdateInput): Promise<UserEntity> {
if (this.shouldUpdate(input, user, 'firstName')) {
user.firstName = input.firstName
}
if (this.shouldUpdate(input, user, 'lastName')) {
user.lastName = input.lastName
}
if (this.shouldUpdate(input, user, 'email')) {
user.email = input.email
user.emailVerified = false
// TODO request email verification
if (undefined !== await this.userRepository.findOne({ email: input.email })) {
throw new Error('email already in use')
}
}
if (this.shouldUpdate(input, user, 'username')) {
user.username = input.username
}
if (this.shouldUpdate(input, user, 'roles')) {
user.roles = input.roles as rolesType
}
if (this.shouldUpdate(input, user, 'language')) {
user.language = input.language
}
if (input.password !== undefined) {
user.passwordHash = await this.passwordService.hash(input.password)
}
await this.userRepository.save(user)
return user
}
private shouldUpdate(
input: UserUpdateInput,
user: UserEntity,
property: keyof UserUpdateInput
): boolean {
if (input[property] === undefined) {
return false
}
return input[property] == user[property]
}
}