From fb297eaadee9b741ddb6731a91eb4648020dcb3b Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 20 Oct 2024 13:54:05 +0000 Subject: featue: Add infra for REST APIs and implement GET /bookmarks --- apps/web/app/api/v1/utils/pagination.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 apps/web/app/api/v1/utils/pagination.ts (limited to 'apps/web/app/api/v1/utils/pagination.ts') diff --git a/apps/web/app/api/v1/utils/pagination.ts b/apps/web/app/api/v1/utils/pagination.ts new file mode 100644 index 00000000..5ce9ac8f --- /dev/null +++ b/apps/web/app/api/v1/utils/pagination.ts @@ -0,0 +1,32 @@ +import { z } from "zod"; + +import { + MAX_NUM_BOOKMARKS_PER_PAGE, + zCursorV2, +} from "@hoarder/shared/types/bookmarks"; + +export const zPagination = z.object({ + limit: z.coerce.number().max(MAX_NUM_BOOKMARKS_PER_PAGE).optional(), + cursor: z + .string() + .refine((val) => val.includes("_"), "Must be a valid cursor") + .transform((val) => { + const [id, createdAt] = val.split("_"); + return { id, createdAt }; + }) + .pipe(z.object({ id: z.string(), createdAt: z.coerce.date() })) + .optional(), +}); + +export function adaptPagination< + T extends { nextCursor: z.infer | null }, +>(input: T) { + const { nextCursor, ...rest } = input; + if (!nextCursor) { + return input; + } + return { + ...rest, + nextCursor: `${nextCursor.id}_${nextCursor.createdAt.toISOString()}`, + }; +} -- cgit v1.2.3-70-g09d2