diff --git a/libs/common/src/models/typeOrmCustom.model.ts b/libs/common/src/models/typeOrmCustom.model.ts index 2f11102..76054d0 100644 --- a/libs/common/src/models/typeOrmCustom.model.ts +++ b/libs/common/src/models/typeOrmCustom.model.ts @@ -1,4 +1,4 @@ -import { FindManyOptions, Repository } from 'typeorm'; +import { FindManyOptions, Repository, SelectQueryBuilder } from 'typeorm'; import { InternalServerErrorException } from '@nestjs/common'; import { BaseResponseDto } from '../dto/base.response.dto'; import { PageResponseDto } from '../dto/pagination.response.dto'; @@ -70,8 +70,8 @@ export function TypeORMCustomModel(repository: Repository) { return Object.assign(repository, { findAll: async function ( query: Partial, + customQueryBuilder?: SelectQueryBuilder, ): Promise { - // Extract values from the query const { page = 1, size = 10, @@ -82,12 +82,7 @@ export function TypeORMCustomModel(repository: Repository) { select, } = getDefaultQueryOptions(query); - // Ensure modelName is set before proceeding if (!modelName) { - console.error( - 'modelName is missing after getDefaultQueryOptions:', - query, - ); throw new InternalServerErrorException( `[TypeORMCustomModel] Cannot findAll with unknown modelName`, ); @@ -96,19 +91,40 @@ export function TypeORMCustomModel(repository: Repository) { const skip = (page - 1) * size; const order = buildTypeORMSortQuery(sort); const relations = buildTypeORMIncludeQuery(modelName, include); - - // Use the where clause directly, without wrapping it under 'where' const whereClause = buildTypeORMWhereClause({ where }); - // Ensure the whereClause is passed directly to findAndCount - const [data, count] = await repository.findAndCount({ - where: whereClause, - take: size, - skip: skip, - order: order, - select: select, - relations: relations, - }); + let data: any[] = []; + let count = 0; + + if (customQueryBuilder) { + const qb = customQueryBuilder.skip(skip).take(size); + if (order) { + Object.keys(order).forEach((key) => { + qb.addOrderBy(key, order[key]); + }); + } + if (whereClause) { + qb.where(whereClause); + } + if (select) { + const selectColumns = Array.isArray(select) + ? select + : Object.keys(select).map( + (key) => `${customQueryBuilder.alias}.${key}`, + ); + qb.select(selectColumns as string[]); + } + [data, count] = await qb.getManyAndCount(); + } else { + [data, count] = await repository.findAndCount({ + where: whereClause, + take: size, + skip: skip, + order: order, + select: select, + relations: relations, + }); + } const paginationResponseDto = getPaginationResponseDto(count, page, size); const baseResponseDto: BaseResponseDto = { diff --git a/src/space-model/services/space-model.service.ts b/src/space-model/services/space-model.service.ts index 245fffa..7d46eec 100644 --- a/src/space-model/services/space-model.service.ts +++ b/src/space-model/services/space-model.service.ts @@ -13,7 +13,6 @@ import { TypeORMCustomModelFindAllQuery, } from '@app/common/models/typeOrmCustom.model'; import { PageResponse } from '@app/common/dto/pagination.response.dto'; -import { SpaceModelDto } from '@app/common/modules/space-model/dtos'; import { SpaceModelParam } from '../dtos/space-model-param'; import { ProjectService } from 'src/project/services'; import { ProjectEntity } from '@app/common/modules/project/entities'; @@ -25,6 +24,7 @@ import { ModifiedTagsModelPayload, ModifySubspaceModelPayload, } from '../interfaces'; +import { SpaceModelDto } from '@app/common/modules/space-model/dtos'; @Injectable() export class SpaceModelService { @@ -117,20 +117,30 @@ export class SpaceModelService { pageable.where = { project: { uuid: param.projectUuid }, disabled: false, - subspaceModels: { - disabled: false, - }, - tags: { - disabled: false, - }, }; pageable.include = 'subspaceModels,tags,subspaceModels.tags,tags.product,subspaceModels.tags.product'; - const customModel = TypeORMCustomModel(this.spaceModelRepository); + const queryBuilder = this.spaceModelRepository + .createQueryBuilder('spaceModel') + .leftJoinAndSelect('spaceModel.subspaceModels', 'subspaceModels') + .leftJoinAndSelect('spaceModel.tags', 'tags') + .leftJoinAndSelect('subspaceModels.tags', 'subspaceModelTags') + .where('spaceModel.disabled = :disabled', { disabled: false }) + .andWhere('spaceModel.project = :projectUuid', { + projectUuid: param.projectUuid, + }); + const customModel = TypeORMCustomModel(this.spaceModelRepository); const { baseResponseDto, paginationResponseDto } = - await customModel.findAll(pageable); + await customModel.findAll( + { + page: pageable.page || 1, + size: pageable.size || 10, + modelName: 'spaceModel', + }, + queryBuilder, + ); return new PageResponse( baseResponseDto, @@ -138,8 +148,7 @@ export class SpaceModelService { ); } catch (error) { throw new HttpException( - error.message || - 'An error occurred while fetching space models in project.', + `Error fetching paginated list: ${error.message}`, HttpStatus.INTERNAL_SERVER_ERROR, ); }