Files
SerpentRace/SerpentRace_Backend/dist/Infrastructure/Repository/ContactRepository.js
T

110 lines
5.1 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ContactRepository = void 0;
const typeorm_1 = require("typeorm");
const ormconfig_1 = require("../ormconfig");
const ContactAggregate_1 = require("../../Domain/Contact/ContactAggregate");
const Logger_1 = require("../../Application/Services/Logger");
class ContactRepository {
constructor() {
this.repo = ormconfig_1.AppDataSource.getRepository(ContactAggregate_1.ContactAggregate);
}
async create(contact) {
return this.repo.save(contact);
}
async findById(id) {
return this.repo
.createQueryBuilder('contact')
.where('contact.id = :id', { id })
.andWhere('contact.state != :softDelete', { softDelete: ContactAggregate_1.ContactState.SOFT_DELETE })
.getOne();
}
async findByPage(from, to) {
const startTime = performance.now();
try {
const limit = to - from + 1;
const offset = from;
// Get total count for pagination
const totalCount = await this.repo.count({
where: {
state: (0, typeorm_1.Not)(ContactAggregate_1.ContactState.SOFT_DELETE)
}
});
// Get paginated results
const contacts = await this.repo
.createQueryBuilder('contact')
.where('contact.state != :softDelete', { softDelete: ContactAggregate_1.ContactState.SOFT_DELETE })
.orderBy('contact.createDate', 'DESC')
.limit(limit)
.offset(offset)
.getMany();
const endTime = performance.now();
(0, Logger_1.logDatabase)('Contact page query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${contacts.length}, total: ${totalCount}, from: ${from}, to: ${to}`);
return { contacts, totalCount };
}
catch (error) {
const endTime = performance.now();
(0, Logger_1.logDatabase)('Contact page query failed', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`);
(0, Logger_1.logError)('ContactRepository.findByPage error', error instanceof Error ? error : new Error(String(error)));
throw new Error('Failed to get contacts page from database');
}
}
async findByPageIncludingDeleted(from, to) {
const startTime = performance.now();
try {
const limit = to - from + 1;
const offset = from;
// Get total count for pagination
const totalCount = await this.repo.count();
// Get paginated results
const contacts = await this.repo
.createQueryBuilder('contact')
.orderBy('contact.createDate', 'DESC')
.limit(limit)
.offset(offset)
.getMany();
const endTime = performance.now();
(0, Logger_1.logDatabase)('Contact page query completed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${contacts.length}, total: ${totalCount}, from: ${from}, to: ${to}`);
return { contacts, totalCount };
}
catch (error) {
const endTime = performance.now();
(0, Logger_1.logDatabase)('Contact page query failed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`);
(0, Logger_1.logError)('ContactRepository.findByPageIncludingDeleted error', error instanceof Error ? error : new Error(String(error)));
throw new Error('Failed to get contacts page from database');
}
}
async update(id, update) {
await this.repo.update(id, update);
return this.findById(id);
}
async delete(id) {
return this.repo.delete(id);
}
async softDelete(id) {
await this.repo.update(id, { state: ContactAggregate_1.ContactState.SOFT_DELETE });
return this.findById(id);
}
async findByIdIncludingDeleted(id) {
return this.repo.findOneBy({ id }); // Returns contact regardless of state
}
async searchIncludingDeleted(searchTerm) {
return this.repo
.createQueryBuilder('contact')
.where('contact.name ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` })
.orWhere('contact.email ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` })
.orWhere('contact.txt ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` })
.getMany();
}
async search(searchTerm) {
return this.repo
.createQueryBuilder('contact')
.where('contact.name ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` })
.orWhere('contact.email ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` })
.orWhere('contact.txt ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` })
.andWhere('contact.state != :softDelete', { softDelete: ContactAggregate_1.ContactState.SOFT_DELETE })
.getMany();
}
}
exports.ContactRepository = ContactRepository;
//# sourceMappingURL=ContactRepository.js.map