Files
zod-backend/src/user/repositories/user.repository.ts
2025-05-19 17:00:32 +03:00

56 lines
1.5 KiB
TypeScript

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<User>) {}
createUnverifiedUser(data: Partial<User>) {
return this.userRepository.save(
this.userRepository.create({
email: data.email,
roles: data.roles,
}),
);
}
findOne(where: FindOptionsWhere<User> | FindOptionsWhere<User>[]) {
return this.userRepository.findOne({ where });
}
update(userId: string, data: Partial<User>) {
return this.userRepository.update(userId, data);
}
createUser(data: Partial<User>) {
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();
}
}