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

141 lines
7.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.OrganizationRepository = void 0;
const typeorm_1 = require("typeorm");
const ormconfig_1 = require("../ormconfig");
const OrganizationAggregate_1 = require("../../Domain/Organization/OrganizationAggregate");
const Logger_1 = require("../../Application/Services/Logger");
class OrganizationRepository {
constructor() {
this.repo = ormconfig_1.AppDataSource.getRepository(OrganizationAggregate_1.OrganizationAggregate);
}
async create(org) {
return this.repo.save(org);
}
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)(OrganizationAggregate_1.OrganizationState.SOFT_DELETE) }
});
// Get paginated results
const organizations = await this.repo.find({
where: { state: (0, typeorm_1.Not)(OrganizationAggregate_1.OrganizationState.SOFT_DELETE) },
order: { name: 'ASC' },
take: limit,
skip: offset
});
const endTime = performance.now();
(0, Logger_1.logDatabase)('Organization page query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${organizations.length}, total: ${totalCount}, from: ${from}, to: ${to}`);
return { organizations, totalCount };
}
catch (error) {
const endTime = performance.now();
(0, Logger_1.logDatabase)('Organization page query failed', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`);
(0, Logger_1.logError)('OrganizationRepository.findByPage error', error instanceof Error ? error : new Error(String(error)));
throw new Error('Failed to get organizations 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 organizations = await this.repo.find({
order: { name: 'ASC' },
take: limit,
skip: offset
});
const endTime = performance.now();
(0, Logger_1.logDatabase)('Organization page query completed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${organizations.length}, total: ${totalCount}, from: ${from}, to: ${to}`);
return { organizations, totalCount };
}
catch (error) {
const endTime = performance.now();
(0, Logger_1.logDatabase)('Organization page query failed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`);
(0, Logger_1.logError)('OrganizationRepository.findByPageIncludingDeleted error', error instanceof Error ? error : new Error(String(error)));
throw new Error('Failed to get organizations page from database');
}
}
async findById(id) {
return this.repo.findOne({
where: {
id,
state: (0, typeorm_1.Not)(OrganizationAggregate_1.OrganizationState.SOFT_DELETE)
}
});
}
async findByIdIncludingDeleted(id) {
return this.repo.findOneBy({ id });
}
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: OrganizationAggregate_1.OrganizationState.SOFT_DELETE });
return this.findById(id);
}
async search(query, limit = 20, offset = 0) {
const startTime = performance.now();
try {
const searchPattern = `%${query.toLowerCase()}%`;
const queryBuilder = this.repo.createQueryBuilder('org')
.where('org.state != :softDelete', { softDelete: OrganizationAggregate_1.OrganizationState.SOFT_DELETE })
.andWhere('(LOWER(org.name) LIKE :pattern OR LOWER(org.contactfname) LIKE :pattern OR LOWER(org.contactlname) LIKE :pattern OR LOWER(org.contactemail) LIKE :pattern OR LOWER(CONCAT(org.contactfname, \' \', org.contactlname)) LIKE :pattern)', { pattern: searchPattern });
const totalCount = await queryBuilder.getCount();
const organizations = await queryBuilder
.orderBy('org.name', 'ASC')
.limit(limit)
.offset(offset)
.getMany();
const endTime = performance.now();
(0, Logger_1.logDatabase)('Organization search completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${organizations.length}, total: ${totalCount}, searchTerm: "${query}", limit: ${limit}, offset: ${offset}`);
return { organizations, totalCount };
}
catch (error) {
const endTime = performance.now();
(0, Logger_1.logDatabase)('Organization search failed', `executionTime: ${Math.round(endTime - startTime)}ms, searchTerm: "${query}"`);
(0, Logger_1.logError)('OrganizationRepository.search error', error instanceof Error ? error : new Error(String(error)));
throw new Error('Failed to search organizations in database');
}
}
async searchIncludingDeleted(query, limit = 20, offset = 0) {
const startTime = performance.now();
try {
const searchPattern = `%${query.toLowerCase()}%`;
const queryBuilder = this.repo.createQueryBuilder('org')
.where('LOWER(org.name) LIKE :pattern', { pattern: searchPattern })
.orWhere('LOWER(org.contactfname) LIKE :pattern', { pattern: searchPattern })
.orWhere('LOWER(org.contactlname) LIKE :pattern', { pattern: searchPattern })
.orWhere('LOWER(org.contactemail) LIKE :pattern', { pattern: searchPattern })
.orWhere('LOWER(CONCAT(org.contactfname, \' \', org.contactlname)) LIKE :pattern', { pattern: searchPattern });
const totalCount = await queryBuilder.getCount();
const organizations = await queryBuilder
.orderBy('org.name', 'ASC')
.limit(limit)
.offset(offset)
.getMany();
const endTime = performance.now();
(0, Logger_1.logDatabase)('Organization search completed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${organizations.length}, total: ${totalCount}, searchTerm: "${query}", limit: ${limit}, offset: ${offset}`);
return { organizations, totalCount };
}
catch (error) {
const endTime = performance.now();
(0, Logger_1.logDatabase)('Organization search failed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, searchTerm: "${query}"`);
(0, Logger_1.logError)('OrganizationRepository.searchIncludingDeleted error', error instanceof Error ? error : new Error(String(error)));
throw new Error('Failed to search all organizations in database');
}
}
}
exports.OrganizationRepository = OrganizationRepository;
//# sourceMappingURL=OrganizationRepository.js.map