Backend half
This commit is contained in:
@@ -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>;
|
||||
}
|
||||
Reference in New Issue
Block a user