"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