mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-07-16 02:36:19 +00:00
fix pagination
This commit is contained in:
@ -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<any>) {
|
||||
return Object.assign(repository, {
|
||||
findAll: async function (
|
||||
query: Partial<TypeORMCustomModelFindAllQuery>,
|
||||
customQueryBuilder?: SelectQueryBuilder<any>,
|
||||
): Promise<TypeORMCustomModelFindAllResponse> {
|
||||
// Extract values from the query
|
||||
const {
|
||||
page = 1,
|
||||
size = 10,
|
||||
@ -82,12 +82,7 @@ export function TypeORMCustomModel(repository: Repository<any>) {
|
||||
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<any>) {
|
||||
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 = {
|
||||
|
@ -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<SpaceModelDto>(
|
||||
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,
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user