diff options
| author | MohamedBassem <me@mbassem.com> | 2024-05-19 13:44:27 +0100 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-05-19 13:46:33 +0100 |
| commit | e8b47751660e24a6bd24941b6cb6b0ee79ffad3c (patch) | |
| tree | f59c11d3dae9698c4b6e2f824da8eab7e60427ec /packages/trpc/routers/bookmarks.ts | |
| parent | d1ad84be48bb3b6914c0d478d13f92861889c466 (diff) | |
| download | karakeep-e8b47751660e24a6bd24941b6cb6b0ee79ffad3c.tar.zst | |
fix: Fix missing bookmarks during pagination if they got created in the same second. Fixes #140
Diffstat (limited to 'packages/trpc/routers/bookmarks.ts')
| -rw-r--r-- | packages/trpc/routers/bookmarks.ts | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/packages/trpc/routers/bookmarks.ts b/packages/trpc/routers/bookmarks.ts index a7db564b..0a9747c9 100644 --- a/packages/trpc/routers/bookmarks.ts +++ b/packages/trpc/routers/bookmarks.ts @@ -1,5 +1,5 @@ import { experimental_trpcMiddleware, TRPCError } from "@trpc/server"; -import { and, desc, eq, exists, inArray, lte, or } from "drizzle-orm"; +import { and, desc, eq, exists, inArray, lt, lte, or } from "drizzle-orm"; import invariant from "tiny-invariant"; import { z } from "zod"; @@ -516,11 +516,21 @@ export const bookmarksAppRouter = router({ ), ) : undefined, - input.cursor ? lte(bookmarks.createdAt, input.cursor) : undefined, + input.cursor + ? input.cursor instanceof Date + ? lte(bookmarks.createdAt, input.cursor) + : or( + lt(bookmarks.createdAt, input.cursor.createdAt), + and( + eq(bookmarks.createdAt, input.cursor.createdAt), + lte(bookmarks.id, input.cursor.id), + ), + ) + : undefined, ), ) .limit(input.limit + 1) - .orderBy(desc(bookmarks.createdAt)), + .orderBy(desc(bookmarks.createdAt), desc(bookmarks.id)), ); // TODO: Consider not inlining the tags in the response of getBookmarks as this query is getting kinda expensive const results = await ctx.db @@ -532,7 +542,7 @@ export const bookmarksAppRouter = router({ .leftJoin(bookmarkLinks, eq(bookmarkLinks.id, sq.id)) .leftJoin(bookmarkTexts, eq(bookmarkTexts.id, sq.id)) .leftJoin(bookmarkAssets, eq(bookmarkAssets.id, sq.id)) - .orderBy(desc(sq.createdAt)); + .orderBy(desc(sq.createdAt), desc(sq.id)); const bookmarksRes = results.reduce<Record<string, ZBookmark>>( (acc, row) => { @@ -578,10 +588,25 @@ export const bookmarksAppRouter = router({ const bookmarksArr = Object.values(bookmarksRes); + bookmarksArr.sort((a, b) => { + if (a.createdAt != b.createdAt) { + return b.createdAt.getTime() - a.createdAt.getTime(); + } else { + return b.id.localeCompare(a.id); + } + }); + let nextCursor = null; if (bookmarksArr.length > input.limit) { - const nextItem = bookmarksArr.pop(); - nextCursor = nextItem?.createdAt ?? null; + const nextItem = bookmarksArr.pop()!; + if (input.useCursorV2) { + nextCursor = { + id: nextItem.id, + createdAt: nextItem.createdAt, + }; + } else { + nextCursor = nextItem.createdAt; + } } return { bookmarks: bookmarksArr, nextCursor }; |
