import { Repository, DataSource } from 'typeorm'; import { User } from '../Database/entities/user.entity'; import { UserCreateDto, UserUpdateDto, UserResponseDto, UserBasicDto, UsersListResponseDto } from '../Database/dto/user.dto'; import { UserMapper } from '../Database/mappers/user.mapper'; import { IUserRepository } from './interfaces/IUserRepository'; export class UserRepository implements IUserRepository { private repository: Repository; constructor(dataSource: DataSource) { // console.log('🗃️ UserRepository constructor called with dataSource:', !!dataSource); this.repository = dataSource.getRepository(User); // console.log('🗃️ TypeORM Repository initialized:', !!this.repository); } // Basic CRUD operations async create(userCreateDto: UserCreateDto): Promise { // console.log('Creating user with DTO:', userCreateDto); const user = UserMapper.toEntity(userCreateDto); // console.log('Creating user with DTO:', user); const savedUser = await this.repository.save(user); // console.log('User created:', savedUser); return UserMapper.toResponseDto(savedUser); } async findById(id: number): Promise { const user = await this.repository.findOne({ where: { id } }); return user ? UserMapper.toResponseDto(user) : null; } async findByUsername(username: string): Promise { const user = await this.repository.findOne({ where: { username } }); return user ? UserMapper.toResponseDto(user) : null; } async findByEmail(email: string): Promise { const user = await this.repository.findOne({ where: { email } }); return user ? UserMapper.toResponseDto(user) : null; } async findAll(): Promise { const users = await this.repository.find(); const userDtos = users.map(user => UserMapper.toResponseDto(user)); return new UsersListResponseDto(userDtos); } async update(id: number, userUpdateDto: UserUpdateDto): Promise { const user = await this.repository.findOne({ where: { id } }); if (!user) return null; const updatedUser = UserMapper.updateEntity(user, userUpdateDto); const savedUser = await this.repository.save(updatedUser); return UserMapper.toResponseDto(savedUser); } async deleteById(id: number): Promise { const result = await this.repository.delete(id); return result.affected !== 0; } async exists(id: number): Promise { const count = await this.repository.count({ where: { id } }); return count > 0; } async usernameExists(username: string): Promise { const count = await this.repository.count({ where: { username } }); return count > 0; } async emailExists(email: string): Promise { const count = await this.repository.count({ where: { email } }); return count > 0; } // Company related queries // async findByCompanyId(companyId: number): Promise { // const users = await this.repository.find({ where: { CompanyId: companyId } }); // const userDtos = users.map(user => UserMapper.toResponseDto(user)); // return new UsersListResponseDto(userDtos); // } // async findByCompanyToken(companyToken: string): Promise { // const users = await this.repository.find({ where: { CompanyToken: companyToken } }); // const userDtos = users.map(user => UserMapper.toResponseDto(user)); // return new UsersListResponseDto(userDtos); // } // Search and filtering // async findByPartialUsername(partialUsername: string): Promise { // const users = await this.repository // .createQueryBuilder('user') // .where('user.username LIKE :username', { username: `%${partialUsername}%` }) // .getMany(); // const userDtos = users.map(user => UserMapper.toResponseDto(user)); // return new UsersListResponseDto(userDtos); // } // async findByPartialName(partialName: string): Promise { // const users = await this.repository // .createQueryBuilder('user') // .where('user.FirstName LIKE :name', { name: `%${partialName}%` }) // .orWhere('user.LastName LIKE :name', { name: `%${partialName}%` }) // .getMany(); // const userDtos = users.map(user => UserMapper.toResponseDto(user)); // return new UsersListResponseDto(userDtos); // } // Pagination // async findWithPagination(skip: number, take: number): Promise<{ users: UsersListResponseDto, total: number }> { // const [users, total] = await this.repository.findAndCount({ // skip, // take, // order: { RegDate: 'DESC' } // }); // const userDtos = users.map(user => UserMapper.toResponseDto(user)); // return { // users: new UsersListResponseDto(userDtos), // total // }; // } // Basic info // async findBasicById(id: number): Promise { // const user = await this.repository.findOne({ where: { id } }); // return user ? UserMapper.toBasicDto(user) : null; // } async findAllBasic(): Promise { const users = await this.repository.find(); return users.map(user => UserMapper.toBasicDto(user)); } // Relations async findWithCompany(id: number): Promise { const user = await this.repository.findOne({ where: { id }, relations: ['company'] }); return user ? UserMapper.toResponseDto(user) : null; } async findWithQuestionBanks(id: number): Promise { const user = await this.repository.findOne({ where: { id }, relations: ['questionBanks'] }); return user ? UserMapper.toResponseDto(user) : null; } // async findWithAllRelations(id: number): Promise { // const user = await this.repository.findOne({ // where: { id }, // relations: ['company', 'questionBanks'] // }); // return user ? UserMapper.toResponseDto(user) : null; // } // Counting // async count(): Promise { // return await this.repository.count(); // } // async countByCompany(companyId: number): Promise { // return await this.repository.count({ where: { CompanyId: companyId } }); // } // Date range queries // async findByDateRange(startDate: Date, endDate: Date): Promise { // const users = await this.repository // .createQueryBuilder('user') // .where('user.RegDate >= :startDate', { startDate }) // .andWhere('user.RegDate <= :endDate', { endDate }) // .getMany(); // const userDtos = users.map(user => UserMapper.toResponseDto(user)); // return new UsersListResponseDto(userDtos); // } // Bulk operations // async createMany(userCreateDtos: UserCreateDto[]): Promise { // const users = userCreateDtos.map(dto => UserMapper.toEntity(dto)); // const savedUsers = await this.repository.save(users); // const userDtos = savedUsers.map(user => UserMapper.toResponseDto(user)); // return new UsersListResponseDto(userDtos); // } // async deleteByIds(ids: number[]): Promise { // const result = await this.repository.delete(ids); // return result.affected !== 0; // } // Authentication support (returns raw entity for password verification) async findRawByUsername(username: string): Promise { console return await this.repository.findOne({ where: { username } }); } // async findRawById(id: number): Promise { // return await this.repository.findOne({ where: { id } }); // } async findRawByEmail(email: string): Promise { return await this.repository.findOne({ where: { email } }); } }