aboutsummaryrefslogtreecommitdiffstats
path: root/packages/trpc/routers
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2024-11-30 19:12:45 +0000
committerMohamed Bassem <me@mbassem.com>2024-12-08 20:59:42 +0000
commit705d539c8e9c6a86882825ee4dabeff3027ba827 (patch)
tree9ac5d1c048393213d1302d005630a64a4789178c /packages/trpc/routers
parenta7b13869b149edbea9bdb220614c69c9a05d79b5 (diff)
downloadkarakeep-705d539c8e9c6a86882825ee4dabeff3027ba827.tar.zst
feature: Store crawling status code and allow users to find broken links. Fixes #169
Diffstat (limited to 'packages/trpc/routers')
-rw-r--r--packages/trpc/routers/bookmarks.ts59
1 files changed, 57 insertions, 2 deletions
diff --git a/packages/trpc/routers/bookmarks.ts b/packages/trpc/routers/bookmarks.ts
index c7fdcc17..9708706a 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, lt, lte, or } from "drizzle-orm";
+import { and, desc, eq, exists, gt, inArray, lt, lte, or } from "drizzle-orm";
import invariant from "tiny-invariant";
import { z } from "zod";
@@ -487,7 +487,14 @@ export const bookmarksAppRouter = router({
}),
)
.use(ensureBookmarkOwnership)
- .mutation(async ({ input }) => {
+ .mutation(async ({ input, ctx }) => {
+ await ctx.db
+ .update(bookmarkLinks)
+ .set({
+ crawlStatus: "pending",
+ crawlStatusCode: null,
+ })
+ .where(eq(bookmarkLinks.id, input.bookmarkId));
await LinkCrawlerQueue.enqueue({
bookmarkId: input.bookmarkId,
archiveFullPage: input.archiveFullPage,
@@ -995,6 +1002,54 @@ export const bookmarksAppRouter = router({
() => ({}),
);
}),
+ getBrokenLinks: authedProcedure
+ .output(
+ z.object({
+ bookmarks: z.array(
+ z.object({
+ id: z.string(),
+ url: z.string(),
+ statusCode: z.number().nullable(),
+ isCrawlingFailure: z.boolean(),
+ crawledAt: z.date().nullable(),
+ createdAt: z.date().nullable(),
+ }),
+ ),
+ }),
+ )
+ .query(async ({ ctx }) => {
+ const brokenLinkBookmarks = await ctx.db
+ .select({
+ id: bookmarkLinks.id,
+ url: bookmarkLinks.url,
+ crawlStatusCode: bookmarkLinks.crawlStatusCode,
+ crawlingStatus: bookmarkLinks.crawlStatus,
+ crawledAt: bookmarkLinks.crawledAt,
+ createdAt: bookmarks.createdAt,
+ })
+ .from(bookmarkLinks)
+ .leftJoin(bookmarks, eq(bookmarks.id, bookmarkLinks.id))
+ .where(
+ and(
+ eq(bookmarks.userId, ctx.user.id),
+ or(
+ eq(bookmarkLinks.crawlStatus, "failure"),
+ lt(bookmarkLinks.crawlStatusCode, 200),
+ gt(bookmarkLinks.crawlStatusCode, 299),
+ ),
+ ),
+ );
+ return {
+ bookmarks: brokenLinkBookmarks.map((b) => ({
+ id: b.id,
+ url: b.url,
+ statusCode: b.crawlStatusCode,
+ isCrawlingFailure: b.crawlingStatus === "failure",
+ crawledAt: b.crawledAt,
+ createdAt: b.createdAt,
+ })),
+ };
+ }),
summarizeBookmark: authedProcedure
.input(
z.object({