Files
SerpentRace/SerpentRace_Backend/src/Repositories/UserRepository.ts
T
2025-07-11 19:56:28 +02:00

205 lines
7.7 KiB
TypeScript

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<User>;
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<UserResponseDto> {
// 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<UserResponseDto | null> {
const user = await this.repository.findOne({ where: { id } });
return user ? UserMapper.toResponseDto(user) : null;
}
async findByUsername(username: string): Promise<UserResponseDto | null> {
const user = await this.repository.findOne({ where: { username } });
return user ? UserMapper.toResponseDto(user) : null;
}
async findByEmail(email: string): Promise<UserResponseDto | null> {
const user = await this.repository.findOne({ where: { email } });
return user ? UserMapper.toResponseDto(user) : null;
}
async findAll(): Promise<UsersListResponseDto> {
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<UserResponseDto | null> {
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<boolean> {
const result = await this.repository.delete(id);
return result.affected !== 0;
}
async exists(id: number): Promise<boolean> {
const count = await this.repository.count({ where: { id } });
return count > 0;
}
async usernameExists(username: string): Promise<boolean> {
const count = await this.repository.count({ where: { username } });
return count > 0;
}
async emailExists(email: string): Promise<boolean> {
const count = await this.repository.count({ where: { email } });
return count > 0;
}
// Company related queries
// async findByCompanyId(companyId: number): Promise<UsersListResponseDto> {
// 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<UsersListResponseDto> {
// 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<UsersListResponseDto> {
// 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<UsersListResponseDto> {
// 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<UserBasicDto | null> {
// const user = await this.repository.findOne({ where: { id } });
// return user ? UserMapper.toBasicDto(user) : null;
// }
async findAllBasic(): Promise<UserBasicDto[]> {
const users = await this.repository.find();
return users.map(user => UserMapper.toBasicDto(user));
}
// Relations
async findWithCompany(id: number): Promise<UserResponseDto | null> {
const user = await this.repository.findOne({
where: { id },
relations: ['company']
});
return user ? UserMapper.toResponseDto(user) : null;
}
async findWithQuestionBanks(id: number): Promise<UserResponseDto | null> {
const user = await this.repository.findOne({
where: { id },
relations: ['questionBanks']
});
return user ? UserMapper.toResponseDto(user) : null;
}
// async findWithAllRelations(id: number): Promise<UserResponseDto | null> {
// const user = await this.repository.findOne({
// where: { id },
// relations: ['company', 'questionBanks']
// });
// return user ? UserMapper.toResponseDto(user) : null;
// }
// Counting
// async count(): Promise<number> {
// return await this.repository.count();
// }
// async countByCompany(companyId: number): Promise<number> {
// return await this.repository.count({ where: { CompanyId: companyId } });
// }
// Date range queries
// async findByDateRange(startDate: Date, endDate: Date): Promise<UsersListResponseDto> {
// 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<UsersListResponseDto> {
// 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<boolean> {
// const result = await this.repository.delete(ids);
// return result.affected !== 0;
// }
// Authentication support (returns raw entity for password verification)
async findRawByUsername(username: string): Promise<User | null> {
console
return await this.repository.findOne({ where: { username } });
}
// async findRawById(id: number): Promise<User | null> {
// return await this.repository.findOne({ where: { id } });
// }
async findRawByEmail(email: string): Promise<User | null> {
return await this.repository.findOne({ where: { email } });
}
}