fix: add create cursor util (#9086)

Followup of #9053
This commit is contained in:
Jérémy M
2024-12-17 12:05:55 +01:00
committed by GitHub
parent 1851bb8476
commit 1f4d1358a1
3 changed files with 75 additions and 8 deletions

View File

@ -0,0 +1,55 @@
import { encodeCursor } from '@/apollo/utils/encodeCursor';
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
describe('encodeCursor', () => {
it('should create a cursor with id only', () => {
const record: ObjectRecord = { __typename: 'ObjectRecord', id: '123' };
const cursor = encodeCursor(record);
const decoded = JSON.parse(Buffer.from(cursor, 'base64').toString('utf-8'));
expect(decoded).toEqual({ id: '123' });
});
it('should create a cursor with id and position', () => {
const record: ObjectRecord = {
__typename: 'ObjectRecord',
id: '123',
position: 1,
};
const cursor = encodeCursor(record);
const decoded = JSON.parse(Buffer.from(cursor, 'base64').toString('utf-8'));
expect(decoded).toEqual({ id: '123', position: 1 });
});
it('should create a cursor with id and position as 0', () => {
const record: ObjectRecord = {
__typename: 'ObjectRecord',
id: '123',
position: 0,
};
const cursor = encodeCursor(record);
const decoded = JSON.parse(Buffer.from(cursor, 'base64').toString('utf-8'));
expect(decoded).toEqual({ id: '123', position: 0 });
});
it('should create a cursor with id and ignore extra fields', () => {
const record: ObjectRecord = {
__typename: 'ObjectRecord',
id: '123',
position: 1,
extra: 'extra',
};
const cursor = encodeCursor(record);
const decoded = JSON.parse(Buffer.from(cursor, 'base64').toString('utf-8'));
expect(decoded).toEqual({ id: '123', position: 1 });
});
it('should throw an error if record does not have an id', () => {
const record = { position: 1 } as any;
expect(() => encodeCursor(record)).toThrow();
});
});

View File

@ -0,0 +1,18 @@
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { isDefined } from '~/utils/isDefined';
export const encodeCursor = (record: ObjectRecord) => {
if (!('id' in record) || !isDefined(record.id)) {
throw new Error('Record does not have an id');
}
const payload: {
id: string;
position?: number;
} = {
position: record.position,
id: record.id,
};
return Buffer.from(JSON.stringify(payload), 'utf-8').toString('base64');
};