diff options
| author | MohamedBassem <me@mbassem.com> | 2024-02-14 01:26:45 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-02-14 10:36:38 +0000 |
| commit | 50c3c5e132643fc33d39fb9dc1fe951efe766337 (patch) | |
| tree | 0af73f6b3835833792b6cac67fea01a6e943b296 /packages/web | |
| parent | 580b842f7835a3d1fa171afdc7e0b52cc3f9dfc6 (diff) | |
| download | karakeep-50c3c5e132643fc33d39fb9dc1fe951efe766337.tar.zst | |
feature: Add ability to refresh bookmark details
Diffstat (limited to 'packages/web')
| -rw-r--r-- | packages/web/app/dashboard/bookmarks/components/BookmarkOptions.tsx | 25 | ||||
| -rw-r--r-- | packages/web/server/api/routers/bookmarks.ts | 39 |
2 files changed, 62 insertions, 2 deletions
diff --git a/packages/web/app/dashboard/bookmarks/components/BookmarkOptions.tsx b/packages/web/app/dashboard/bookmarks/components/BookmarkOptions.tsx index 4496d820..4123dc36 100644 --- a/packages/web/app/dashboard/bookmarks/components/BookmarkOptions.tsx +++ b/packages/web/app/dashboard/bookmarks/components/BookmarkOptions.tsx @@ -11,7 +11,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Archive, MoreHorizontal, Star, Trash2 } from "lucide-react"; +import { Archive, MoreHorizontal, RotateCw, Star, Trash2 } from "lucide-react"; export default function BookmarkOptions({ bookmark }: { bookmark: ZBookmark }) { const { toast } = useToast(); @@ -55,6 +55,25 @@ export default function BookmarkOptions({ bookmark }: { bookmark: ZBookmark }) { router.refresh(); }; + const crawlBookmark = async () => { + try { + await api.bookmarks.recrawlBookmark.mutate({ + bookmarkId: linkId, + }); + toast({ + description: "Re-fetch has been enqueued!", + }); + } catch (e) { + toast({ + variant: "destructive", + title: "Something went wrong", + description: "There was a problem with your request.", + }); + } + + router.refresh(); + }; + return ( <DropdownMenu> <DropdownMenuTrigger asChild> @@ -82,6 +101,10 @@ export default function BookmarkOptions({ bookmark }: { bookmark: ZBookmark }) { <Archive className="mr-2 size-4" /> <span>{bookmark.archived ? "Un-archive" : "Archive"}</span> </DropdownMenuItem> + <DropdownMenuItem onClick={crawlBookmark}> + <RotateCw className="mr-2 size-4" /> + <span>Refresh</span> + </DropdownMenuItem> <DropdownMenuItem className="text-destructive" onClick={unbookmarkLink}> <Trash2 className="mr-2 size-4" /> <span>Delete</span> diff --git a/packages/web/server/api/routers/bookmarks.ts b/packages/web/server/api/routers/bookmarks.ts index 953dab66..a77275d9 100644 --- a/packages/web/server/api/routers/bookmarks.ts +++ b/packages/web/server/api/routers/bookmarks.ts @@ -11,6 +11,8 @@ import { } from "@/lib/types/api/bookmarks"; import { prisma } from "@remember/db"; import { LinkCrawlerQueue } from "@remember/shared/queues"; +import { TRPCError, experimental_trpcMiddleware } from "@trpc/server"; +import { User } from "next-auth"; const defaultBookmarkFields = { id: true, @@ -33,6 +35,32 @@ const defaultBookmarkFields = { }, }; +const ensureBookmarkOwnership = experimental_trpcMiddleware<{ + ctx: { user: User }; + input: { bookmarkId: string }; +}>().create(async (opts) => { + const bookmark = await prisma.bookmark.findUnique({ + where: { id: opts.input.bookmarkId }, + select: { + userId: true, + }, + }); + if (!bookmark) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "Bookmark not found", + }); + } + if (bookmark.userId != opts.ctx.user.id) { + throw new TRPCError({ + code: "FORBIDDEN", + message: "User is not allowed to access resource", + }); + } + + return opts.next(); +}); + async function dummyPrismaReturnType() { const x = await prisma.bookmark.findFirstOrThrow({ select: defaultBookmarkFields, @@ -82,7 +110,6 @@ export const bookmarksAppRouter = router({ // Enqueue crawling request await LinkCrawlerQueue.add("crawl", { bookmarkId: bookmark.id, - url: url, }); return toZodSchema(bookmark); @@ -91,6 +118,7 @@ export const bookmarksAppRouter = router({ updateBookmark: authedProcedure .input(zUpdateBookmarksRequestSchema) .output(zBookmarkSchema) + .use(ensureBookmarkOwnership) .mutation(async ({ input, ctx }) => { const bookmark = await prisma.bookmark.update({ where: { @@ -108,6 +136,7 @@ export const bookmarksAppRouter = router({ deleteBookmark: authedProcedure .input(z.object({ bookmarkId: z.string() })) + .use(ensureBookmarkOwnership) .mutation(async ({ input, ctx }) => { await prisma.bookmark.delete({ where: { @@ -116,6 +145,14 @@ export const bookmarksAppRouter = router({ }, }); }), + recrawlBookmark: authedProcedure + .input(z.object({ bookmarkId: z.string() })) + .use(ensureBookmarkOwnership) + .mutation(async ({ input }) => { + await LinkCrawlerQueue.add("crawl", { + bookmarkId: input.bookmarkId, + }); + }), getBookmarks: authedProcedure .input(zGetBookmarksRequestSchema) .output(zGetBookmarksResponseSchema) |
