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, ) {} /** * Find single user */ async findOne( findData: FindOptionsWhere, ): Promise { return this.userRepository.findOneBy(findData); } async findMany(): Promise { return this.userRepository.find(); } async findFirstUser(): Promise { const queryBuilder = this.userRepository.createQueryBuilder('user'); queryBuilder.orderBy('user.createdAt', 'ASC'); return queryBuilder.getOne(); } @Transactional() async createUser(userRegisterDto: UserRegisterDto): Promise { const user = this.userRepository.create(userRegisterDto); await this.userRepository.save(user); return user; } async getUsers( pageOptionsDto: UsersPageOptionsDto, ): Promise> { 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 { 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 { user.role = role; return this.userRepository.save(user); } async updatePassword( user: UserEntity, password: string, ): Promise { user.password = password; return this.userRepository.save(user); } async deleteUser(user: UserEntity): Promise { await this.userRepository.remove(user); } }