aboutsummaryrefslogtreecommitdiffstats
path: root/packages/web/app
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/web/app
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/web/app')
-rw-r--r--packages/web/app/api/v1/bookmarks/[bookmarkId]/route.ts (renamed from packages/web/app/api/v1/links/[linkId]/route.ts)6
-rw-r--r--packages/web/app/api/v1/bookmarks/route.ts (renamed from packages/web/app/api/v1/links/route.ts)22
-rw-r--r--packages/web/app/dashboard/bookmarks/components/BookmarksGrid.tsx27
-rw-r--r--packages/web/app/dashboard/bookmarks/components/LinkCard.tsx15
-rw-r--r--packages/web/app/dashboard/bookmarks/components/LinksGrid.tsx21
-rw-r--r--packages/web/app/dashboard/bookmarks/page.tsx4
6 files changed, 50 insertions, 45 deletions
diff --git a/packages/web/app/api/v1/links/[linkId]/route.ts b/packages/web/app/api/v1/bookmarks/[bookmarkId]/route.ts
index 39449d6d..6adcf771 100644
--- a/packages/web/app/api/v1/links/[linkId]/route.ts
+++ b/packages/web/app/api/v1/bookmarks/[bookmarkId]/route.ts
@@ -1,5 +1,5 @@
import { authOptions } from "@/lib/auth";
-import { unbookmarkLink } from "@/lib/services/links";
+import { deleteBookmark } from "@/lib/services/bookmarks";
import { Prisma } from "@remember/db";
import { getServerSession } from "next-auth";
@@ -7,7 +7,7 @@ import { NextRequest } from "next/server";
export async function DELETE(
_request: NextRequest,
- { params }: { params: { linkId: string } },
+ { params }: { params: { bookmarkId: string } },
) {
// TODO: We probably should be using an API key here instead of the session;
const session = await getServerSession(authOptions);
@@ -16,7 +16,7 @@ export async function DELETE(
}
try {
- await unbookmarkLink(params.linkId, session.user.id);
+ await deleteBookmark(params.bookmarkId, session.user.id);
} catch (e: unknown) {
if (
e instanceof Prisma.PrismaClientKnownRequestError &&
diff --git a/packages/web/app/api/v1/links/route.ts b/packages/web/app/api/v1/bookmarks/route.ts
index 87541634..b9305ca8 100644
--- a/packages/web/app/api/v1/links/route.ts
+++ b/packages/web/app/api/v1/bookmarks/route.ts
@@ -1,11 +1,11 @@
import { authOptions } from "@/lib/auth";
-import { bookmarkLink, getLinks } from "@/lib/services/links";
+import { bookmarkLink, getBookmarks } from "@/lib/services/bookmarks";
import {
- zNewBookmarkedLinkRequestSchema,
- ZGetLinksResponse,
- ZBookmarkedLink,
-} from "@/lib/types/api/links";
+ zNewBookmarkRequestSchema,
+ ZGetBookmarksResponse,
+ ZBookmark,
+} from "@/lib/types/api/bookmarks";
import { getServerSession } from "next-auth";
import { NextRequest, NextResponse } from "next/server";
@@ -16,9 +16,7 @@ export async function POST(request: NextRequest) {
return new Response(null, { status: 401 });
}
- const linkRequest = zNewBookmarkedLinkRequestSchema.safeParse(
- await request.json(),
- );
+ const linkRequest = zNewBookmarkRequestSchema.safeParse(await request.json());
if (!linkRequest.success) {
return NextResponse.json(
@@ -29,9 +27,9 @@ export async function POST(request: NextRequest) {
);
}
- const link = await bookmarkLink(linkRequest.data.url, session.user.id);
+ const bookmark = await bookmarkLink(linkRequest.data.url, session.user.id);
- let response: ZBookmarkedLink = { ...link };
+ let response: ZBookmark = { ...bookmark };
return NextResponse.json(response, { status: 201 });
}
@@ -42,8 +40,8 @@ export async function GET() {
return new Response(null, { status: 401 });
}
- const links = await getLinks(session.user.id);
+ const bookmarks = await getBookmarks(session.user.id);
- let response: ZGetLinksResponse = { links };
+ let response: ZGetBookmarksResponse = { bookmarks };
return NextResponse.json(response);
}
diff --git a/packages/web/app/dashboard/bookmarks/components/BookmarksGrid.tsx b/packages/web/app/dashboard/bookmarks/components/BookmarksGrid.tsx
new file mode 100644
index 00000000..2b6b19b6
--- /dev/null
+++ b/packages/web/app/dashboard/bookmarks/components/BookmarksGrid.tsx
@@ -0,0 +1,27 @@
+import { getServerSession } from "next-auth";
+import { redirect } from "next/navigation";
+import { authOptions } from "@/lib/auth";
+import { getBookmarks } from "@/lib/services/bookmarks";
+import LinkCard from "./LinkCard";
+import { ZBookmark } from "@/lib/types/api/bookmarks";
+
+function renderBookmark(bookmark: ZBookmark) {
+ switch (bookmark.content.type) {
+ case "link":
+ return <LinkCard key={bookmark.id} bookmark={bookmark} />;
+ }
+}
+
+export default async function BookmarksGrid() {
+ const session = await getServerSession(authOptions);
+ if (!session) {
+ redirect("/");
+ }
+ const bookmarks = await getBookmarks(session.user.id);
+
+ return (
+ <div className="container grid gap-4 grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4">
+ {bookmarks.map((b) => renderBookmark(b))}
+ </div>
+ );
+}
diff --git a/packages/web/app/dashboard/bookmarks/components/LinkCard.tsx b/packages/web/app/dashboard/bookmarks/components/LinkCard.tsx
index b5a051e8..1cbd8865 100644
--- a/packages/web/app/dashboard/bookmarks/components/LinkCard.tsx
+++ b/packages/web/app/dashboard/bookmarks/components/LinkCard.tsx
@@ -16,7 +16,7 @@ import {
} from "@/components/ui/imageCard";
import { useToast } from "@/components/ui/use-toast";
import APIClient from "@/lib/api";
-import { ZBookmarkedLink } from "@/lib/types/api/links";
+import { ZBookmark } from "@/lib/types/api/bookmarks";
import { MoreHorizontal, Trash2 } from "lucide-react";
import Link from "next/link";
import { useRouter } from "next/navigation";
@@ -26,7 +26,7 @@ export function LinkOptions({ linkId }: { linkId: string }) {
const router = useRouter();
const unbookmarkLink = async () => {
- let [_, error] = await APIClient.unbookmarkLink(linkId);
+ let [_, error] = await APIClient.deleteBookmark(linkId);
if (error) {
toast({
@@ -59,7 +59,8 @@ export function LinkOptions({ linkId }: { linkId: string }) {
);
}
-export default function LinkCard({ link }: { link: ZBookmarkedLink }) {
+export default function LinkCard({ bookmark }: { bookmark: ZBookmark }) {
+ const link = bookmark.content;
const parsedUrl = new URL(link.url);
return (
@@ -67,15 +68,15 @@ export default function LinkCard({ link }: { link: ZBookmarkedLink }) {
className={
"bg-gray-50 duration-300 ease-in border border-grey-100 hover:transition-all hover:border-blue-300"
}
- image={link.details?.imageUrl ?? undefined}
+ image={link?.imageUrl ?? undefined}
>
<ImageCardTitle>
<Link className="line-clamp-3" href={link.url}>
- {link.details?.title ?? parsedUrl.host}
+ {link?.title ?? parsedUrl.host}
</Link>
</ImageCardTitle>
<ImageCardBody className="py-2 overflow-clip">
- {link.tags.map((t) => (
+ {bookmark.tags.map((t) => (
<Badge
variant="default"
className="bg-gray-300 text-gray-500"
@@ -92,7 +93,7 @@ export default function LinkCard({ link }: { link: ZBookmarkedLink }) {
{parsedUrl.host}
</Link>
</div>
- <LinkOptions linkId={link.id} />
+ <LinkOptions linkId={bookmark.id} />
</div>
</ImageCardFooter>
</ImageCard>
diff --git a/packages/web/app/dashboard/bookmarks/components/LinksGrid.tsx b/packages/web/app/dashboard/bookmarks/components/LinksGrid.tsx
deleted file mode 100644
index 66f0d766..00000000
--- a/packages/web/app/dashboard/bookmarks/components/LinksGrid.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { getServerSession } from "next-auth";
-import { redirect } from "next/navigation";
-import { authOptions } from "@/lib/auth";
-import { getLinks } from "@/lib/services/links";
-import LinkCard from "./LinkCard";
-
-export default async function LinksGrid() {
- const session = await getServerSession(authOptions);
- if (!session) {
- redirect("/");
- }
- const links = await getLinks(session.user.id);
-
- return (
- <div className="container grid gap-4 grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4">
- {links.map((l) => (
- <LinkCard key={l.id} link={l} />
- ))}
- </div>
- );
-}
diff --git a/packages/web/app/dashboard/bookmarks/page.tsx b/packages/web/app/dashboard/bookmarks/page.tsx
index b4158893..b9eabfe8 100644
--- a/packages/web/app/dashboard/bookmarks/page.tsx
+++ b/packages/web/app/dashboard/bookmarks/page.tsx
@@ -1,5 +1,5 @@
import AddLink from "./components/AddLink";
-import LinksGrid from "./components/LinksGrid";
+import BookmarksGrid from "./components/BookmarksGrid";
import type { Metadata } from "next";
export const metadata: Metadata = {
@@ -13,7 +13,7 @@ export default async function Bookmarks() {
<AddLink />
</div>
<div>
- <LinksGrid />
+ <BookmarksGrid />
</div>
</div>
);