aboutsummaryrefslogtreecommitdiffstats
path: root/packages/workers
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-02-09 01:50:35 +0000
committerMohamedBassem <me@mbassem.com>2024-02-09 01:57:31 +0000
commit08a5694e451218f1bcb2ad9eb42fd93250afbb96 (patch)
tree2cc2351f26b0ab98268db4bc463c0c3aa3f78a3b /packages/workers
parentc5bfa5000f178475d0b019b5a960916134b2ecfb (diff)
downloadkarakeep-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.ts32
-rw-r--r--packages/workers/openai.ts61
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);
}