From ee9c598013deb9cf20882e6971267942d0832d7b Mon Sep 17 00:00:00 2001 From: Dhravya Date: Fri, 12 Apr 2024 23:22:51 -0700 Subject: [PATCH] bookmark tweets feature --- apps/extension/src/SideBar.tsx | 14 +++-- apps/extension/src/background.ts | 27 ++++++++ apps/web/src/app/api/vectorizeTweets/route.ts | 61 +++++++++++++++++++ 3 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 apps/web/src/app/api/vectorizeTweets/route.ts diff --git a/apps/extension/src/SideBar.tsx b/apps/extension/src/SideBar.tsx index 9ecb8afa..4cce9a17 100644 --- a/apps/extension/src/SideBar.tsx +++ b/apps/extension/src/SideBar.tsx @@ -65,6 +65,14 @@ function SideBar({ jwt }: { jwt: string }) { saveToUser: string; } + function sendBookmarkedTweetsToAPI(tweets: TweetData[], token: string) { + chrome.runtime.sendMessage({ + type: "sendBookmarkedTweets", + jwt: token, + tweets, + }); + } + const fetchBookmarks = () => { const tweets: TweetData[] = []; // Initialize an empty array to hold all tweet elements @@ -161,11 +169,9 @@ function SideBar({ jwt }: { jwt: string }) { observer.observe(document.body, { childList: true, subtree: true }); function downloadTweetsAsJson(tweetsArray: TweetData[]) { + setLog([...log, "Saving the tweets to our database..."]); + sendBookmarkedTweetsToAPI(tweetsArray, jwt); setIsImportingTweets(false); - const jsonData = JSON.stringify(tweetsArray); // Convert the array to JSON - - // TODO: send jsonData to the API - console.log(jsonData); } }; diff --git a/apps/extension/src/background.ts b/apps/extension/src/background.ts index 44931dc4..7e12bba4 100644 --- a/apps/extension/src/background.ts +++ b/apps/extension/src/background.ts @@ -5,6 +5,15 @@ const backendUrl = ? "http://localhost:3000" : "https://supermemory.dhr.wtf"; +interface TweetData { + tweetText: string; + postUrl: string; + authorName: string; + handle: string; + time: string; + saveToUser: string; +} + // TODO: Implement getting bookmarks from Twitter API directly // let authorizationHeader: string | null = null; // let csrfToken: string | null = null; @@ -105,4 +114,22 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // cookies: cookies // }); // } + else if (request.type === "sendBookmarkedTweets") { + const jwt = request.jwt; + const tweets = request.tweets as TweetData[]; + + (async () => { + await fetch(`${backendUrl}/api/vectorizeTweets`, { + method: "POST", + headers: { + Authorization: `Bearer ${jwt}`, + }, + body: JSON.stringify(tweets), + }).then(async (response) => { + return response.json(); + }); + })(); + + return true; + } }); diff --git a/apps/web/src/app/api/vectorizeTweets/route.ts b/apps/web/src/app/api/vectorizeTweets/route.ts new file mode 100644 index 00000000..5dfb22f1 --- /dev/null +++ b/apps/web/src/app/api/vectorizeTweets/route.ts @@ -0,0 +1,61 @@ +import { db } from "@/server/db"; +import { eq } from "drizzle-orm"; +import { sessions, storedContent, users } from "@/server/db/schema"; +import { type NextRequest, NextResponse } from "next/server"; +import { env } from "@/env"; + +export const runtime = "edge"; + +interface TweetData { + tweetText: string; + postUrl: string; + authorName: string; + handle: string; + time: string; + saveToUser: string; +} + +export async function POST(req: NextRequest) { + const token = + req.cookies.get("next-auth.session-token")?.value ?? + req.cookies.get("__Secure-authjs.session-token")?.value ?? + req.cookies.get("authjs.session-token")?.value ?? + req.headers.get("Authorization")?.replace("Bearer ", ""); + + if (!token) { + return new Response( + JSON.stringify({ message: "Invalid Key, session not found." }), + { status: 404 }, + ); + } + + const sessionData = await db + .select() + .from(sessions) + .where(eq(sessions.sessionToken, token!)); + + if (!sessionData || sessionData.length === 0) { + return new Response( + JSON.stringify({ message: "Invalid Key, session not found." }), + { status: 404 }, + ); + } + + const body = (await req.json()) as TweetData[]; + + const resp = await fetch( + `https://cf-ai-backend.dhravya.workers.dev/batchUploadTweets`, + { + headers: { + "X-Custom-Auth-Key": env.BACKEND_SECURITY_KEY, + }, + method: "POST", + body: JSON.stringify(body), + }, + ); + + return new Response(await resp.text(), { + status: resp.status, + headers: resp.headers, + }); +}