aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorxuatz <xzlow10@gmail.com>2025-05-19 00:18:58 +0900
committerGitHub <noreply@github.com>2025-05-18 16:18:58 +0100
commit4e06ea7bdbaaa196da5c3e2a755aeefb25cf4228 (patch)
tree1f9aab52078eaa485430cfc6e514c655da122ea5 /apps
parent70d572096706cb2d7f5d3f29b51e6ba1d86578c6 (diff)
downloadkarakeep-4e06ea7bdbaaa196da5c3e2a755aeefb25cf4228.tar.zst
feat(api): enable ?sortOrder= for relevant resources (#1398)
* feat(api): enable `?sortOrder=` for relevant resources * fix tests
Diffstat (limited to 'apps')
-rw-r--r--apps/web/app/api/v1/bookmarks/[bookmarkId]/route.ts4
-rw-r--r--apps/web/app/api/v1/bookmarks/route.ts9
-rw-r--r--apps/web/app/api/v1/bookmarks/search/route.ts1
-rw-r--r--apps/web/app/api/v1/lists/[listId]/bookmarks/route.ts4
-rw-r--r--apps/web/app/api/v1/tags/[tagId]/bookmarks/route.ts5
-rw-r--r--apps/web/app/api/v1/utils/types.ts12
6 files changed, 28 insertions, 7 deletions
diff --git a/apps/web/app/api/v1/bookmarks/[bookmarkId]/route.ts b/apps/web/app/api/v1/bookmarks/[bookmarkId]/route.ts
index fa551894..9ad18fd3 100644
--- a/apps/web/app/api/v1/bookmarks/[bookmarkId]/route.ts
+++ b/apps/web/app/api/v1/bookmarks/[bookmarkId]/route.ts
@@ -3,7 +3,7 @@ import { buildHandler } from "@/app/api/v1/utils/handler";
import { zUpdateBookmarksRequestSchema } from "@karakeep/shared/types/bookmarks";
-import { zGetBookmarkSearchParamsSchema } from "../../utils/types";
+import { zGetBookmarkQueryParamsSchema } from "../../utils/types";
export const dynamic = "force-dynamic";
@@ -13,7 +13,7 @@ export const GET = (
) =>
buildHandler({
req,
- searchParamsSchema: zGetBookmarkSearchParamsSchema,
+ searchParamsSchema: zGetBookmarkQueryParamsSchema,
handler: async ({ api, searchParams }) => {
const bookmark = await api.bookmarks.getBookmark({
bookmarkId: params.bookmarkId,
diff --git a/apps/web/app/api/v1/bookmarks/route.ts b/apps/web/app/api/v1/bookmarks/route.ts
index 1605d2b5..4df4f6ad 100644
--- a/apps/web/app/api/v1/bookmarks/route.ts
+++ b/apps/web/app/api/v1/bookmarks/route.ts
@@ -1,7 +1,10 @@
import { NextRequest } from "next/server";
import { z } from "zod";
-import { zNewBookmarkRequestSchema } from "@karakeep/shared/types/bookmarks";
+import {
+ zNewBookmarkRequestSchema,
+ zSortOrder,
+} from "@karakeep/shared/types/bookmarks";
import { buildHandler } from "../utils/handler";
import { adaptPagination, zPagination } from "../utils/pagination";
@@ -16,6 +19,10 @@ export const GET = (req: NextRequest) =>
.object({
favourited: zStringBool.optional(),
archived: zStringBool.optional(),
+ sortOrder: zSortOrder
+ .exclude([zSortOrder.Enum.relevance])
+ .optional()
+ .default(zSortOrder.Enum.desc),
// TODO: Change the default to false in a couple of releases.
includeContent: zStringBool.optional().default("true"),
})
diff --git a/apps/web/app/api/v1/bookmarks/search/route.ts b/apps/web/app/api/v1/bookmarks/search/route.ts
index 52081c7f..e85c7954 100644
--- a/apps/web/app/api/v1/bookmarks/search/route.ts
+++ b/apps/web/app/api/v1/bookmarks/search/route.ts
@@ -27,6 +27,7 @@ export const GET = (req: NextRequest) =>
const bookmarks = await api.bookmarks.searchBookmarks({
text: searchParams.q,
cursor: searchParams.cursor,
+ sortOrder: searchParams.sortOrder,
limit: searchParams.limit,
includeContent: searchParams.includeContent,
});
diff --git a/apps/web/app/api/v1/lists/[listId]/bookmarks/route.ts b/apps/web/app/api/v1/lists/[listId]/bookmarks/route.ts
index 3977413a..daf78449 100644
--- a/apps/web/app/api/v1/lists/[listId]/bookmarks/route.ts
+++ b/apps/web/app/api/v1/lists/[listId]/bookmarks/route.ts
@@ -1,14 +1,14 @@
import { NextRequest } from "next/server";
import { buildHandler } from "@/app/api/v1/utils/handler";
import { adaptPagination, zPagination } from "@/app/api/v1/utils/pagination";
-import { zGetBookmarkSearchParamsSchema } from "@/app/api/v1/utils/types";
+import { zGetBookmarkQueryParamsSchema } from "@/app/api/v1/utils/types";
export const dynamic = "force-dynamic";
export const GET = (req: NextRequest, params: { params: { listId: string } }) =>
buildHandler({
req,
- searchParamsSchema: zPagination.and(zGetBookmarkSearchParamsSchema),
+ searchParamsSchema: zPagination.and(zGetBookmarkQueryParamsSchema),
handler: async ({ api, searchParams }) => {
const bookmarks = await api.bookmarks.getBookmarks({
listId: params.params.listId,
diff --git a/apps/web/app/api/v1/tags/[tagId]/bookmarks/route.ts b/apps/web/app/api/v1/tags/[tagId]/bookmarks/route.ts
index cfc0af51..aaa5087b 100644
--- a/apps/web/app/api/v1/tags/[tagId]/bookmarks/route.ts
+++ b/apps/web/app/api/v1/tags/[tagId]/bookmarks/route.ts
@@ -1,7 +1,7 @@
import { NextRequest } from "next/server";
import { buildHandler } from "@/app/api/v1/utils/handler";
import { adaptPagination, zPagination } from "@/app/api/v1/utils/pagination";
-import { zGetBookmarkSearchParamsSchema } from "@/app/api/v1/utils/types";
+import { zGetBookmarkQueryParamsSchema } from "@/app/api/v1/utils/types";
export const dynamic = "force-dynamic";
@@ -11,10 +11,11 @@ export const GET = (
) =>
buildHandler({
req,
- searchParamsSchema: zPagination.and(zGetBookmarkSearchParamsSchema),
+ searchParamsSchema: zPagination.and(zGetBookmarkQueryParamsSchema),
handler: async ({ api, searchParams }) => {
const bookmarks = await api.bookmarks.getBookmarks({
tagId: params.tagId,
+ sortOrder: searchParams.sortOrder,
limit: searchParams.limit,
cursor: searchParams.cursor,
});
diff --git a/apps/web/app/api/v1/utils/types.ts b/apps/web/app/api/v1/utils/types.ts
index f0fe6231..bf181ce4 100644
--- a/apps/web/app/api/v1/utils/types.ts
+++ b/apps/web/app/api/v1/utils/types.ts
@@ -1,11 +1,23 @@
import { z } from "zod";
+import { zSortOrder } from "@karakeep/shared/types/bookmarks";
+
export const zStringBool = z
.string()
.refine((val) => val === "true" || val === "false", "Must be true or false")
.transform((val) => val === "true");
+export const zGetBookmarkQueryParamsSchema = z.object({
+ sortOrder: zSortOrder
+ .exclude([zSortOrder.Enum.relevance])
+ .optional()
+ .default(zSortOrder.Enum.desc),
+ // TODO: Change the default to false in a couple of releases.
+ includeContent: zStringBool.optional().default("true"),
+});
+
export const zGetBookmarkSearchParamsSchema = z.object({
+ sortOrder: zSortOrder.optional().default(zSortOrder.Enum.relevance),
// TODO: Change the default to false in a couple of releases.
includeContent: zStringBool.optional().default("true"),
});