From 95cf8f47300d6eb6efe36d44bcab0f44a8e27585 Mon Sep 17 00:00:00 2001 From: Ahmad Mujahid <55625580+AhmadMuj@users.noreply.github.com> Date: Fri, 12 Apr 2024 00:52:53 +0400 Subject: feature: Recrawl failed links from admin UI (#95) * feature: Retry failed crawling URLs * fix: Enhancing visuals and some minor changes. --- apps/web/app/dashboard/admin/page.tsx | 26 +++++++++++++++++++++----- apps/workers/crawlerWorker.ts | 20 ++++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) (limited to 'apps') diff --git a/apps/web/app/dashboard/admin/page.tsx b/apps/web/app/dashboard/admin/page.tsx index ac5e17fb..c1fa4dee 100644 --- a/apps/web/app/dashboard/admin/page.tsx +++ b/apps/web/app/dashboard/admin/page.tsx @@ -67,7 +67,7 @@ function ReleaseInfo() { function ActionsSection() { const { mutate: recrawlLinks, isPending: isRecrawlPending } = - api.admin.recrawlAllLinks.useMutation({ + api.admin.recrawlLinks.useMutation({ onSuccess: () => { toast({ description: "Recrawl enqueued", @@ -103,7 +103,15 @@ function ActionsSection() { className="lg:w-1/2" variant="destructive" loading={isRecrawlPending} - onClick={() => recrawlLinks()} + onClick={() => recrawlLinks({ crawlStatus: "failure" })} + > + Recrawl Failed Links Only + + recrawlLinks({ crawlStatus: "all" })} > Recrawl All Links @@ -153,18 +161,26 @@ function ServerStatsSection() {

Background Jobs

+ + Job + Pending + Failed + - Pending Crawling Jobs + Crawling Jobs {serverStats.pendingCrawls} + {serverStats.failedCrawls} - Pending Indexing Jobs + Indexing Jobs {serverStats.pendingIndexing} + {serverStats.failedIndexing} - Pending OpenAI Jobs + OpenAI Jobs {serverStats.pendingOpenai} + {serverStats.failedOpenai}
diff --git a/apps/workers/crawlerWorker.ts b/apps/workers/crawlerWorker.ts index eec8cd98..91b0a03f 100644 --- a/apps/workers/crawlerWorker.ts +++ b/apps/workers/crawlerWorker.ts @@ -124,17 +124,37 @@ export class CrawlerWorker { worker.on("completed", (job) => { const jobId = job?.id ?? "unknown"; logger.info(`[Crawler][${jobId}] Completed successfully`); + const bookmarkId = job?.data.bookmarkId; + if (bookmarkId) { + changeBookmarkStatus(bookmarkId, "success"); + } }); worker.on("failed", (job, error) => { const jobId = job?.id ?? "unknown"; logger.error(`[Crawler][${jobId}] Crawling job failed: ${error}`); + const bookmarkId = job?.data.bookmarkId; + if (bookmarkId) { + changeBookmarkStatus(bookmarkId, "failure"); + } }); return worker; } } +async function changeBookmarkStatus( + bookmarkId: string, + crawlStatus: "success" | "failure", +) { + await db + .update(bookmarkLinks) + .set({ + crawlStatus, + }) + .where(eq(bookmarkLinks.id, bookmarkId)); +} + async function getBookmarkUrl(bookmarkId: string) { const bookmark = await db.query.bookmarkLinks.findFirst({ where: eq(bookmarkLinks.id, bookmarkId), -- cgit v1.2.3-70-g09d2