Files
twenty/packages/twenty-server/src/engine/api/common/utils/get-page-info.util.ts
T
Matt Van Horn 6ac797a69c fix: REST cursor encoding for nested order_by composite fields (#20974)
## Summary

fix: REST cursor encoding for nested order_by composite fields

Closes #20109

---
AI was used for assistance.

---------

Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Etienne <45695613+etiennejouan@users.noreply.github.com>
2026-06-02 07:10:20 +00:00

53 lines
1.7 KiB
TypeScript

import { type ObjectRecord } from 'twenty-shared/types';
import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface';
import { type CommonPageInfo } from 'src/engine/api/common/types/common-page-info.type';
import {
encodeCursor,
getPaginationInfo,
} from 'src/engine/api/graphql/graphql-query-runner/utils/cursors.util';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
export const getPageInfo = (
records: ObjectRecord[],
orderBy: ObjectRecordOrderBy,
limit: number,
isForwardPagination: boolean,
flatObjectMetadata: FlatObjectMetadata,
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>,
): CommonPageInfo => {
const { hasNextPage, hasPreviousPage, hasMoreRecords } = getPaginationInfo(
records,
limit,
isForwardPagination,
);
if (hasMoreRecords) {
records.pop();
}
const startCursor =
records.length > 0
? encodeCursor({
objectRecord: records[0],
order: orderBy,
flatObjectMetadata,
flatFieldMetadataMaps,
})
: null;
const endCursor =
records.length > 0
? encodeCursor({
objectRecord: records[records.length - 1],
order: orderBy,
flatObjectMetadata,
flatFieldMetadataMaps,
})
: null;
return { startCursor, endCursor, hasNextPage, hasPreviousPage };
};