import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { FindOptionsWhere, Repository } from 'typeorm'; import { User } from '../../user/entities'; import { UserFiltersRequestDto } from '../dtos/request'; @Injectable() export class UserRepository { constructor(@InjectRepository(User) private readonly userRepository: Repository) {} createUnverifiedUser(data: Partial) { return this.userRepository.save( this.userRepository.create({ email: data.email, roles: data.roles, }), ); } findOne(where: FindOptionsWhere | FindOptionsWhere[]) { return this.userRepository.findOne({ where }); } update(userId: string, data: Partial) { return this.userRepository.update(userId, data); } createUser(data: Partial) { const user = this.userRepository.create({ ...data, }); return this.userRepository.save(user); } findUsers(filters: UserFiltersRequestDto) { const queryBuilder = this.userRepository.createQueryBuilder('user'); if (filters.role) { queryBuilder.andWhere(`user.roles @> ARRAY[:role]`, { role: filters.role }); } if (filters.search) { queryBuilder.andWhere(`user.email ILIKE :search OR user.phoneNumber ILIKE :search`, { search: `%${filters.search}%`, }); } queryBuilder.orderBy('user.createdAt', 'DESC'); queryBuilder.take(filters.size); queryBuilder.skip((filters.page - 1) * filters.size); return queryBuilder.getManyAndCount(); } }