Backend half

This commit is contained in:
2025-07-11 19:56:28 +02:00
parent fa868e7c1d
commit 8600fa7c1d
19426 changed files with 3750448 additions and 8108 deletions
@@ -0,0 +1,155 @@
import { Repository, DataSource } from 'typeorm';
import { Company } from '../Database/entities/company.entity';
import { CompanyCreateDto, CompanyUpdateDto, CompanyResponseDto, CompanyBasicDto } from '../Database/dto/company.dto';
import { CompanyMapper } from '../Database/mappers/company.mapper';
import { ICompanyRepository } from './interfaces/ICompanyRepository';
export class CompanyRepository implements ICompanyRepository {
private repository: Repository<Company>;
constructor(dataSource: DataSource) {
this.repository = dataSource.getRepository(Company);
}
// Basic CRUD operations
async create(companyCreateDto: CompanyCreateDto): Promise<CompanyResponseDto> {
const company = CompanyMapper.toEntity(companyCreateDto);
const savedCompany = await this.repository.save(company);
return CompanyMapper.toResponseDto(savedCompany);
}
async findById(id: number): Promise<CompanyResponseDto | null> {
const company = await this.repository.findOne({ where: { CompanyId: id } });
return company ? CompanyMapper.toResponseDto(company) : null;
}
async findByName(name: string): Promise<CompanyResponseDto | null> {
const company = await this.repository.findOne({ where: { Name: name } });
return company ? CompanyMapper.toResponseDto(company) : null;
}
// async findByContactEmail(email: string): Promise<CompanyResponseDto | null> {
// const company = await this.repository.findOne({ where: { ContactEmail: email } });
// return company ? CompanyMapper.toResponseDto(company) : null;
// }
async findAll(): Promise<CompanyResponseDto[]> {
const companies = await this.repository.find({
order: { RegDate: 'DESC' }
});
return companies.map(company => CompanyMapper.toResponseDto(company));
}
async update(id: number, companyUpdateDto: CompanyUpdateDto): Promise<CompanyResponseDto | null> {
const company = await this.repository.findOne({ where: { CompanyId: id } });
if (!company) return null;
const updatedCompany = CompanyMapper.updateEntity(company, companyUpdateDto);
const savedCompany = await this.repository.save(updatedCompany);
return CompanyMapper.toResponseDto(savedCompany);
}
async deleteById(id: number): Promise<boolean> {
const result = await this.repository.delete({ CompanyId: id });
return result.affected !== 0;
}
// async exists(id: number): Promise<boolean> {
// const count = await this.repository.count({ where: { CompanyId: id } });
// return count > 0;
// }
// async nameExists(name: string): Promise<boolean> {
// const count = await this.repository.count({ where: { Name: name } });
// return count > 0;
// }
// async contactEmailExists(email: string): Promise<boolean> {
// const count = await this.repository.count({ where: { ContactEmail: email } });
// return count > 0;
// }
// Search and filtering
// async findByPartialName(partialName: string): Promise<CompanyResponseDto[]> {
// const companies = await this.repository
// .createQueryBuilder('company')
// .where('company.Name LIKE :name', { name: `%${partialName}%` })
// .orderBy('company.RegDate', 'DESC')
// .getMany();
// return companies.map(company => CompanyMapper.toResponseDto(company));
// }
// async findByPartialContactName(partialName: string): Promise<CompanyResponseDto[]> {
// const companies = await this.repository
// .createQueryBuilder('company')
// .where('company.ContactFirstName LIKE :name', { name: `%${partialName}%` })
// .orWhere('company.ContactLastName LIKE :name', { name: `%${partialName}%` })
// .orderBy('company.RegDate', 'DESC')
// .getMany();
// return companies.map(company => CompanyMapper.toResponseDto(company));
// }
// Pagination
// async findWithPagination(skip: number, take: number): Promise<{ companies: CompanyResponseDto[], total: number }> {
// const [companies, total] = await this.repository.findAndCount({
// skip,
// take,
// order: { RegDate: 'DESC' }
// });
// const companyDtos = companies.map(company => CompanyMapper.toResponseDto(company));
// return {
// companies: companyDtos,
// total
// };
// }
// Basic info
async findBasicById(id: number): Promise<CompanyBasicDto | null> {
const company = await this.repository.findOne({ where: { CompanyId: id } });
return company ? CompanyMapper.toBasicDto(company) : null;
}
async findAllBasic(): Promise<CompanyBasicDto[]> {
const companies = await this.repository.find({
order: { RegDate: 'DESC' }
});
return companies.map(company => CompanyMapper.toBasicDto(company));
}
// Relations
async findWithUsers(id: number): Promise<CompanyResponseDto | null> {
const company = await this.repository.findOne({
where: { CompanyId: id },
relations: ['users']
});
return company ? CompanyMapper.toResponseDto(company) : null;
}
// Counting
// async count(): Promise<number> {
// return await this.repository.count();
// }
// Date range queries
// async findByDateRange(startDate: Date, endDate: Date): Promise<CompanyResponseDto[]> {
// const companies = await this.repository
// .createQueryBuilder('company')
// .where('company.RegDate >= :startDate', { startDate })
// .andWhere('company.RegDate <= :endDate', { endDate })
// .orderBy('company.RegDate', 'DESC')
// .getMany();
// return companies.map(company => CompanyMapper.toResponseDto(company));
// }
// Bulk operations
// async createMany(companyCreateDtos: CompanyCreateDto[]): Promise<CompanyResponseDto[]> {
// const companies = companyCreateDtos.map(dto => CompanyMapper.toEntity(dto));
// const savedCompanies = await this.repository.save(companies);
// return savedCompanies.map(company => CompanyMapper.toResponseDto(company));
// }
// async deleteByIds(ids: number[]): Promise<boolean> {
// const result = await this.repository.delete(ids);
// return result.affected !== 0;
// }
}
@@ -0,0 +1,203 @@
import { Repository, DataSource } from 'typeorm';
import { QBank } from '../Database/entities/qbank.entity';
import { QBankCreateDto, QBankUpdateDto, QBankResponseDto, QBankBasicDto, QBankListResponseDto } from '../Database/dto/qbank.dto';
import { QBankMapper } from '../Database/mappers/qbank.mapper';
import { IQBankRepository } from './interfaces/IQBankRepository';
export class QBankRepository implements IQBankRepository {
private repository: Repository<QBank>;
constructor(dataSource: DataSource) {
this.repository = dataSource.getRepository(QBank);
}
// Basic CRUD operations
async create(qbankCreateDto: QBankCreateDto, creatorId: number): Promise<QBankResponseDto> {
const qbank = QBankMapper.toEntity(qbankCreateDto, creatorId);
const savedQBank = await this.repository.save(qbank);
return QBankMapper.toResponseDto(savedQBank);
}
async findById(id: number): Promise<QBankResponseDto | null> {
const qbank = await this.repository.findOne({ where: { QBankId: id } });
return qbank ? QBankMapper.toResponseDto(qbank) : null;
}
async findByTitle(title: string): Promise<QBankResponseDto | null> {
const qbank = await this.repository.findOne({ where: { Title: title } });
return qbank ? QBankMapper.toResponseDto(qbank) : null;
}
async findAll(): Promise<QBankListResponseDto> {
const qbanks = await this.repository.find();
const qbankDtos = qbanks.map(qbank => QBankMapper.toResponseDto(qbank));
return new QBankListResponseDto(qbankDtos);
}
async update(id: number, qbankUpdateDto: QBankUpdateDto): Promise<QBankResponseDto | null> {
const qbank = await this.repository.findOne({ where: { QBankId: id } });
if (!qbank) return null;
const updatedQBank = QBankMapper.updateEntity(qbank, qbankUpdateDto);
const savedQBank = await this.repository.save(updatedQBank);
return QBankMapper.toResponseDto(savedQBank);
}
async deleteById(id: number): Promise<boolean> {
const result = await this.repository.delete({ QBankId: id });
return result.affected !== 0;
}
async exists(id: number): Promise<boolean> {
const count = await this.repository.count({ where: { QBankId: id } });
return count > 0;
}
async titleExists(title: string): Promise<boolean> {
const count = await this.repository.count({ where: { Title: title } });
return count > 0;
}
// Creator related queries
async findByCreator(creatorId: number): Promise<QBankListResponseDto> {
const qbanks = await this.repository.find({ where: { Creator: creatorId } });
const qbankDtos = qbanks.map(qbank => QBankMapper.toResponseDto(qbank));
return new QBankListResponseDto(qbankDtos);
}
async findByCreatorAndTitle(creatorId: number, title: string): Promise<QBankResponseDto | null> {
const qbank = await this.repository.findOne({
where: { Creator: creatorId, Title: title }
});
return qbank ? QBankMapper.toResponseDto(qbank) : null;
}
// Search and filtering
async findByPartialTitle(partialTitle: string): Promise<QBankListResponseDto> {
const qbanks = await this.repository
.createQueryBuilder('qbank')
.where('qbank.Title LIKE :title', { title: `%${partialTitle}%` })
.getMany();
const qbankDtos = qbanks.map(qbank => QBankMapper.toResponseDto(qbank));
return new QBankListResponseDto(qbankDtos);
}
async findByQuestionCount(minCount: number, maxCount?: number): Promise<QBankListResponseDto> {
let query = this.repository
.createQueryBuilder('qbank')
.where('qbank.no_question >= :minCount', { minCount });
if (maxCount !== undefined) {
query = query.andWhere('qbank.no_question <= :maxCount', { maxCount });
}
const qbanks = await query.getMany();
const qbankDtos = qbanks.map(qbank => QBankMapper.toResponseDto(qbank));
return new QBankListResponseDto(qbankDtos);
}
// Pagination
async findWithPagination(skip: number, take: number): Promise<{ qbanks: QBankListResponseDto, total: number }> {
const [qbanks, total] = await this.repository.findAndCount({
skip,
take,
order: { Creation_Date: 'DESC' }
});
const qbankDtos = qbanks.map(qbank => QBankMapper.toResponseDto(qbank));
return {
qbanks: new QBankListResponseDto(qbankDtos),
total
};
}
// Basic info
async findBasicById(id: number): Promise<QBankBasicDto | null> {
const qbank = await this.repository.findOne({ where: { QBankId: id } });
return qbank ? QBankMapper.toBasicDto(qbank) : null;
}
async findAllBasic(): Promise<QBankBasicDto[]> {
const qbanks = await this.repository.find();
return qbanks.map(qbank => QBankMapper.toBasicDto(qbank));
}
async findBasicByCreator(creatorId: number): Promise<QBankBasicDto[]> {
const qbanks = await this.repository.find({ where: { Creator: creatorId } });
return qbanks.map(qbank => QBankMapper.toBasicDto(qbank));
}
// Relations
async findWithCreator(id: number): Promise<QBankResponseDto | null> {
const qbank = await this.repository.findOne({
where: { QBankId: id },
relations: ['creator']
});
return qbank ? QBankMapper.toResponseDto(qbank) : null;
}
// Counting
async count(): Promise<number> {
return await this.repository.count();
}
async countByCreator(creatorId: number): Promise<number> {
return await this.repository.count({ where: { Creator: creatorId } });
}
// Date range queries
async findByDateRange(startDate: Date, endDate: Date): Promise<QBankListResponseDto> {
const qbanks = await this.repository
.createQueryBuilder('qbank')
.where('qbank.Creation_Date >= :startDate', { startDate })
.andWhere('qbank.Creation_Date <= :endDate', { endDate })
.getMany();
const qbankDtos = qbanks.map(qbank => QBankMapper.toResponseDto(qbank));
return new QBankListResponseDto(qbankDtos);
}
async findByCreatorAndDateRange(creatorId: number, startDate: Date, endDate: Date): Promise<QBankListResponseDto> {
const qbanks = await this.repository
.createQueryBuilder('qbank')
.where('qbank.Creator = :creatorId', { creatorId })
.andWhere('qbank.Creation_Date >= :startDate', { startDate })
.andWhere('qbank.Creation_Date <= :endDate', { endDate })
.getMany();
const qbankDtos = qbanks.map(qbank => QBankMapper.toResponseDto(qbank));
return new QBankListResponseDto(qbankDtos);
}
// Bulk operations
async createMany(qbankCreateDtos: QBankCreateDto[], creatorId: number): Promise<QBankListResponseDto> {
const qbanks = qbankCreateDtos.map(dto => QBankMapper.toEntity(dto, creatorId));
const savedQBanks = await this.repository.save(qbanks);
const qbankDtos = savedQBanks.map(qbank => QBankMapper.toResponseDto(qbank));
return new QBankListResponseDto(qbankDtos);
}
async deleteByIds(ids: number[]): Promise<boolean> {
const result = await this.repository.delete(ids);
return result.affected !== 0;
}
async deleteByCreator(creatorId: number): Promise<boolean> {
const result = await this.repository.delete({ Creator: creatorId });
return result.affected !== 0;
}
// Statistics
async getTotalQuestions(): Promise<number> {
const result = await this.repository
.createQueryBuilder('qbank')
.select('SUM(qbank.no_question)', 'total')
.getRawOne();
return parseInt(result.total) || 0;
}
async getAverageQuestionsPerBank(): Promise<number> {
const result = await this.repository
.createQueryBuilder('qbank')
.select('AVG(qbank.no_question)', 'average')
.getRawOne();
return parseFloat(result.average) || 0;
}
}
@@ -0,0 +1,205 @@
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 } });
}
}
@@ -0,0 +1,39 @@
import { CompanyCreateDto, CompanyUpdateDto, CompanyResponseDto, CompanyBasicDto } from '../../Database/dto/company.dto';
export interface ICompanyRepository {
// Basic CRUD operations
create(companyCreateDto: CompanyCreateDto): Promise<CompanyResponseDto>;
findById(id: number): Promise<CompanyResponseDto | null>;
findByName(name: string): Promise<CompanyResponseDto | null>;
// findByContactEmail(email: string): Promise<CompanyResponseDto | null>;
findAll(): Promise<CompanyResponseDto[]>;
update(id: number, companyUpdateDto: CompanyUpdateDto): Promise<CompanyResponseDto | null>;
deleteById(id: number): Promise<boolean>;
// exists(id: number): Promise<boolean>;
// nameExists(name: string): Promise<boolean>;
// contactEmailExists(email: string): Promise<boolean>;
// Search and filtering
// // findByPartialName(partialName: string): Promise<CompanyResponseDto[]>;
// // findByPartialContactName(partialName: string): Promise<CompanyResponseDto[]>;
// Pagination
// findWithPagination(skip: number, take: number): Promise<{ companies: CompanyResponseDto[], total: number }>;
// Basic info
findBasicById(id: number): Promise<CompanyBasicDto | null>;
findAllBasic(): Promise<CompanyBasicDto[]>;
// Relations
// findWithUsers(id: number): Promise<CompanyResponseDto | null>;
// Counting
// count(): Promise<number>;
// Date range queries
// findByDateRange(startDate: Date, endDate: Date): Promise<CompanyResponseDto[]>;
// Bulk operations
// createMany(companyCreateDtos: CompanyCreateDto[]): Promise<CompanyResponseDto[]>;
// deleteByIds(ids: number[]): Promise<boolean>;
}
@@ -0,0 +1,50 @@
import { QBank } from '../../Database/entities/qbank.entity';
import { QBankCreateDto, QBankUpdateDto, QBankResponseDto, QBankBasicDto, QBankListResponseDto } from '../../Database/dto/qbank.dto';
export interface IQBankRepository {
// Basic CRUD operations
create(qbankCreateDto: QBankCreateDto, creatorId: number): Promise<QBankResponseDto>;
findById(id: number): Promise<QBankResponseDto | null>;
findByTitle(title: string): Promise<QBankResponseDto | null>;
findAll(): Promise<QBankListResponseDto>;
update(id: number, qbankUpdateDto: QBankUpdateDto): Promise<QBankResponseDto | null>;
deleteById(id: number): Promise<boolean>;
exists(id: number): Promise<boolean>;
titleExists(title: string): Promise<boolean>;
// Creator related queries
findByCreator(creatorId: number): Promise<QBankListResponseDto>;
findByCreatorAndTitle(creatorId: number, title: string): Promise<QBankResponseDto | null>;
// Search and filtering
findByPartialTitle(partialTitle: string): Promise<QBankListResponseDto>;
findByQuestionCount(minCount: number, maxCount?: number): Promise<QBankListResponseDto>;
// Pagination
findWithPagination(skip: number, take: number): Promise<{ qbanks: QBankListResponseDto, total: number }>;
// Basic info
findBasicById(id: number): Promise<QBankBasicDto | null>;
findAllBasic(): Promise<QBankBasicDto[]>;
findBasicByCreator(creatorId: number): Promise<QBankBasicDto[]>;
// Relations
findWithCreator(id: number): Promise<QBankResponseDto | null>;
// Counting
count(): Promise<number>;
countByCreator(creatorId: number): Promise<number>;
// Date range queries
findByDateRange(startDate: Date, endDate: Date): Promise<QBankListResponseDto>;
findByCreatorAndDateRange(creatorId: number, startDate: Date, endDate: Date): Promise<QBankListResponseDto>;
// Bulk operations
createMany(qbankCreateDtos: QBankCreateDto[], creatorId: number): Promise<QBankListResponseDto>;
deleteByIds(ids: number[]): Promise<boolean>;
deleteByCreator(creatorId: number): Promise<boolean>;
// Statistics
getTotalQuestions(): Promise<number>;
getAverageQuestionsPerBank(): Promise<number>;
}
@@ -0,0 +1,52 @@
import { User } from '../../Database/entities/user.entity';
import { UserCreateDto, UserUpdateDto, UserResponseDto, UserBasicDto, UsersListResponseDto } from '../../Database/dto/user.dto';
export interface IUserRepository {
// Basic CRUD operations
create(userCreateDto: UserCreateDto): Promise<UserResponseDto>;
findById(id: number): Promise<UserResponseDto | null>;
// findByUsername(username: string): Promise<UserResponseDto | null>;
findByEmail(email: string): Promise<UserResponseDto | null>;
findAll(): Promise<UsersListResponseDto>;
update(id: number, userUpdateDto: UserUpdateDto): Promise<UserResponseDto | null>;
deleteById(id: number): Promise<boolean>;
exists(id: number): Promise<boolean>;
usernameExists(username: string): Promise<boolean>;
emailExists(email: string): Promise<boolean>;
// Company related queries
// findByCompanyId(companyId: number): Promise<UsersListResponseDto>;
// findByCompanyToken(companyToken: string): Promise<UsersListResponseDto>;
// Search and filtering
// findByPartialUsername(partialUsername: string): Promise<UsersListResponseDto>;
// findByPartialName(partialName: string): Promise<UsersListResponseDto>;
// Pagination
// findWithPagination(skip: number, take: number): Promise<{ users: UsersListResponseDto, total: number }>;
// Basic info
// findBasicById(id: number): Promise<UserBasicDto | null>;
findAllBasic(): Promise<UserBasicDto[]>;
// Relations
findWithCompany(id: number): Promise<UserResponseDto | null>;
findWithQuestionBanks(id: number): Promise<UserResponseDto | null>;
// findWithAllRelations(id: number): Promise<UserResponseDto | null>;
// Counting
// count(): Promise<number>;
// countByCompany(companyId: number): Promise<number>;
// Date range queries
// findByDateRange(startDate: Date, endDate: Date): Promise<UsersListResponseDto>;
// Bulk operations
// createMany(userCreateDtos: UserCreateDto[]): Promise<UsersListResponseDto>;
// deleteByIds(ids: number[]): Promise<boolean>;
// Authentication support (returns raw entity for password verification)
findRawByUsername(username: string): Promise<User | null>;
// findRawById(id: number): Promise<User | null>;
findRawByEmail(email: string): Promise<User | null>;
}