diff options
| author | MohamedBassem <me@mbassem.com> | 2024-02-09 01:50:35 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-02-09 01:57:31 +0000 |
| commit | 08a5694e451218f1bcb2ad9eb42fd93250afbb96 (patch) | |
| tree | 2cc2351f26b0ab98268db4bc463c0c3aa3f78a3b /packages/workers | |
| parent | c5bfa5000f178475d0b019b5a960916134b2ecfb (diff) | |
| download | karakeep-08a5694e451218f1bcb2ad9eb42fd93250afbb96.tar.zst | |
[refactor] Extract the bookmark model to be a high level model to support other type of bookmarks
Diffstat (limited to 'packages/workers')
| -rw-r--r-- | packages/workers/crawler.ts | 32 | ||||
| -rw-r--r-- | packages/workers/openai.ts | 61 |
2 files changed, 41 insertions, 52 deletions
diff --git a/packages/workers/crawler.ts b/packages/workers/crawler.ts index 817bba45..c76b2c42 100644 --- a/packages/workers/crawler.ts +++ b/packages/workers/crawler.ts @@ -29,10 +29,10 @@ export default async function runCrawler(job: Job<ZCrawlLinkRequest, void>) { return; } - const { url, linkId } = request.data; + const { url, bookmarkId } = request.data; logger.info( - `[Crawler][${jobId}] Will crawl "${url}" for link with id "${linkId}"`, + `[Crawler][${jobId}] Will crawl "${url}" for link with id "${bookmarkId}"`, ); // TODO(IMPORTANT): Run security validations on the input URL (e.g. deny localhost, etc) @@ -46,33 +46,19 @@ export default async function runCrawler(job: Job<ZCrawlLinkRequest, void>) { await prisma.bookmarkedLink.update({ where: { - id: linkId, + id: bookmarkId, }, data: { - details: { - upsert: { - create: { - title: meta.title, - description: meta.description, - imageUrl: meta.image, - favicon: meta.logo, - }, - update: { - title: meta.title, - description: meta.description, - imageUrl: meta.image, - favicon: meta.logo, - }, - }, - }, - }, - include: { - details: true, + title: meta.title, + description: meta.description, + imageUrl: meta.image, + favicon: meta.logo, + crawledAt: new Date(), }, }); // Enqueue openai job OpenAIQueue.add("openai", { - linkId, + bookmarkId, }); } diff --git a/packages/workers/openai.ts b/packages/workers/openai.ts index 893aa1af..b6044dd3 100644 --- a/packages/workers/openai.ts +++ b/packages/workers/openai.ts @@ -1,4 +1,4 @@ -import prisma, { BookmarkedLink, BookmarkedLinkDetails } from "@remember/db"; +import prisma, { BookmarkedLink } from "@remember/db"; import logger from "@remember/shared/logger"; import { ZOpenAIRequest, zOpenAIRequestSchema } from "@remember/shared/queues"; import { Job } from "bullmq"; @@ -9,14 +9,6 @@ const openAIResponseSchema = z.object({ tags: z.array(z.string()), }); -let openai: OpenAI | undefined; - -if (process.env.OPENAI_API_KEY && process.env.OPENAI_ENABLED) { - openai = new OpenAI({ - apiKey: process.env["OPENAI_API_KEY"], // This is the default and can be omitted - }); -} - function buildPrompt(url: string, description: string) { return ` You are a bot who given an article, extracts relevant "hashtags" out of them. @@ -27,24 +19,19 @@ Description: ${description} `; } -async function fetchLink(linkId: string) { - return await prisma.bookmarkedLink.findUnique({ +async function fetchBookmark(linkId: string) { + return await prisma.bookmark.findUnique({ where: { id: linkId, }, include: { - details: true, + link: true, }, }); } -async function inferTags( - jobId: string, - link: BookmarkedLink, - linkDetails: BookmarkedLinkDetails | null, - openai: OpenAI, -) { - const linkDescription = linkDetails?.description; +async function inferTags(jobId: string, link: BookmarkedLink, openai: OpenAI) { + const linkDescription = link?.description; if (!linkDescription) { throw new Error( `[openai][${jobId}] No description found for link "${link.id}". Skipping ...`, @@ -119,14 +106,15 @@ async function createTags(tags: string[], userId: string) { return existingTags.map((t) => t.id).concat(newTagObjects.map((t) => t.id)); } -async function connectTags(linkId: string, tagIds: string[]) { +async function connectTags(bookmarkId: string, tagIds: string[]) { // TODO: Prisma doesn't support createMany in Sqlite await Promise.all( tagIds.map((tagId) => { - return prisma.tagsOnLinks.create({ + return prisma.tagsOnBookmarks.create({ data: { tagId, - linkId, + bookmarkId, + attachedBy: "ai", }, }); }), @@ -136,6 +124,13 @@ async function connectTags(linkId: string, tagIds: string[]) { export default async function runOpenAI(job: Job<ZOpenAIRequest, void>) { const jobId = job.id || "unknown"; + if (!process.env.OPENAI_API_KEY || !process.env.OPENAI_ENABLED) { + return; + } + + const openai = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, + }); if (!openai) { logger.debug( `[openai][${jobId}] OpenAI is not configured, nothing to do now`, @@ -150,14 +145,22 @@ export default async function runOpenAI(job: Job<ZOpenAIRequest, void>) { ); } - const { linkId } = request.data; - const link = await fetchLink(linkId); - if (!link) { - throw new Error(`[openai][${jobId}] link with id ${linkId} was not found`); + const { bookmarkId } = request.data; + const bookmark = await fetchBookmark(bookmarkId); + if (!bookmark) { + throw new Error( + `[openai][${jobId}] bookmark with id ${bookmarkId} was not found`, + ); + } + + if (!bookmark.link) { + throw new Error( + `[openai][${jobId}] bookmark with id ${bookmarkId} doesn't have a link`, + ); } - const tags = await inferTags(jobId, link, link.details, openai); + const tags = await inferTags(jobId, bookmark.link, openai); - const tagIds = await createTags(tags, link.userId); - await connectTags(linkId, tagIds); + const tagIds = await createTags(tags, bookmark.userId); + await connectTags(bookmarkId, tagIds); } |
