import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { type FindOptionsWhere, Repository } from 'typeorm'; import { Transactional } from 'typeorm-transactional'; import { type PageDto } from '../../common/dto/page.dto'; import { type RoleType } from '../../constants'; import { UserNotFoundException } from '../../exceptions'; import { UserRegisterDto } from '../auth/dto/user-register.dto'; import { type UserDto } from './dtos/user.dto'; import { type UsersPageOptionsDto } from './dtos/users-page-options.dto'; import { UserEntity } from './user.entity'; @Injectable() export class UserService { constructor( @InjectRepository(UserEntity) private userRepository: Repository<UserEntity>, ) {} /** * Find single user */ async findOne( findData: FindOptionsWhere<UserEntity>, ): Promise<UserEntity | null> { return this.userRepository.findOneBy(findData); } async findMany(): Promise<UserEntity[]> { return this.userRepository.find(); } async findFirstUser(): Promise<UserEntity | null> { const queryBuilder = this.userRepository.createQueryBuilder('user'); queryBuilder.orderBy('user.createdAt', 'ASC'); return queryBuilder.getOne(); } @Transactional() async createUser(userRegisterDto: UserRegisterDto): Promise<UserEntity> { const user = this.userRepository.create(userRegisterDto); await this.userRepository.save(user); return user; } async getUsers( pageOptionsDto: UsersPageOptionsDto, ): Promise<PageDto<UserDto>> { const queryBuilder = this.userRepository.createQueryBuilder('user'); queryBuilder.orderBy('user.role', 'DESC'); const [items, pageMetaDto] = await queryBuilder.paginate(pageOptionsDto); return items.toPageDto(pageMetaDto); } async getUser(userId: Uuid): Promise<UserDto> { const queryBuilder = this.userRepository.createQueryBuilder('user'); queryBuilder.where('user.id = :userId', { userId }); const userEntity = await queryBuilder.getOne(); if (!userEntity) { throw new UserNotFoundException(); } return userEntity.toDto(); } async updateRoleType(user: UserEntity, role: RoleType): Promise<UserEntity> { user.role = role; return this.userRepository.save(user); } async updatePassword( user: UserEntity, password: string, ): Promise<UserEntity> { user.password = password; return this.userRepository.save(user); } async deleteUser(user: UserEntity): Promise<void> { await this.userRepository.remove(user); } }