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