141 lines
7.5 KiB
JavaScript
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
|