aboutsummaryrefslogtreecommitdiffstats
path: root/packages/trpc/routers/bookmarks.ts
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-07-01 22:51:59 +0000
committerMohamed Bassem <me@mbassem.com>2025-07-04 16:27:29 +0000
commit545cac1967f6882780021407a474690fea3f11ed (patch)
treec30ea2cbc05d061e6726df97baae946f3d6db920 /packages/trpc/routers/bookmarks.ts
parent73a0c951375d38d84cb1eaf5253b558c35882288 (diff)
downloadkarakeep-545cac1967f6882780021407a474690fea3f11ed.tar.zst
feat: Add per user bookmark count quota
Diffstat (limited to 'packages/trpc/routers/bookmarks.ts')
-rw-r--r--packages/trpc/routers/bookmarks.ts25
1 files changed, 24 insertions, 1 deletions
diff --git a/packages/trpc/routers/bookmarks.ts b/packages/trpc/routers/bookmarks.ts
index 2a02a0cd..f1fe10d7 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, eq, gt, inArray, lt, or } from "drizzle-orm";
+import { and, count, eq, gt, inArray, lt, or } from "drizzle-orm";
import invariant from "tiny-invariant";
import { z } from "zod";
@@ -19,6 +19,7 @@ import {
bookmarkTexts,
customPrompts,
tagsOnBookmarks,
+ users,
} from "@karakeep/db/schema";
import {
deleteAsset,
@@ -267,6 +268,28 @@ export const bookmarksAppRouter = router({
return { ...alreadyExists, alreadyExists: true };
}
}
+
+ // Check user quota
+ const user = await ctx.db.query.users.findFirst({
+ where: eq(users.id, ctx.user.id),
+ columns: {
+ bookmarkQuota: true,
+ },
+ });
+
+ if (user?.bookmarkQuota !== null && user?.bookmarkQuota !== undefined) {
+ const currentBookmarkCount = await ctx.db
+ .select({ count: count() })
+ .from(bookmarks)
+ .where(eq(bookmarks.userId, ctx.user.id));
+
+ if (currentBookmarkCount[0].count >= user.bookmarkQuota) {
+ throw new TRPCError({
+ code: "FORBIDDEN",
+ message: `Bookmark quota exceeded. You can only have ${user.bookmarkQuota} bookmarks.`,
+ });
+ }
+ }
const bookmark = await ctx.db.transaction(async (tx) => {
const bookmark = (
await tx