aboutsummaryrefslogtreecommitdiffstats
path: root/packages/web/app/api/v1/links
diff options
context:
space:
mode:
Diffstat (limited to 'packages/web/app/api/v1/links')
-rw-r--r--packages/web/app/api/v1/links/[linkId]/route.ts32
-rw-r--r--packages/web/app/api/v1/links/route.ts49
2 files changed, 81 insertions, 0 deletions
diff --git a/packages/web/app/api/v1/links/[linkId]/route.ts b/packages/web/app/api/v1/links/[linkId]/route.ts
new file mode 100644
index 00000000..39449d6d
--- /dev/null
+++ b/packages/web/app/api/v1/links/[linkId]/route.ts
@@ -0,0 +1,32 @@
+import { authOptions } from "@/lib/auth";
+import { unbookmarkLink } from "@/lib/services/links";
+import { Prisma } from "@remember/db";
+
+import { getServerSession } from "next-auth";
+import { NextRequest } from "next/server";
+
+export async function DELETE(
+ _request: NextRequest,
+ { params }: { params: { linkId: string } },
+) {
+ // TODO: We probably should be using an API key here instead of the session;
+ const session = await getServerSession(authOptions);
+ if (!session) {
+ return new Response(null, { status: 401 });
+ }
+
+ try {
+ await unbookmarkLink(params.linkId, session.user.id);
+ } catch (e: unknown) {
+ if (
+ e instanceof Prisma.PrismaClientKnownRequestError &&
+ e.code === "P2025" // RecordNotFound
+ ) {
+ return new Response(null, { status: 404 });
+ } else {
+ throw e;
+ }
+ }
+
+ return new Response(null, { status: 201 });
+}
diff --git a/packages/web/app/api/v1/links/route.ts b/packages/web/app/api/v1/links/route.ts
new file mode 100644
index 00000000..87541634
--- /dev/null
+++ b/packages/web/app/api/v1/links/route.ts
@@ -0,0 +1,49 @@
+import { authOptions } from "@/lib/auth";
+import { bookmarkLink, getLinks } from "@/lib/services/links";
+
+import {
+ zNewBookmarkedLinkRequestSchema,
+ ZGetLinksResponse,
+ ZBookmarkedLink,
+} from "@/lib/types/api/links";
+import { getServerSession } from "next-auth";
+import { NextRequest, NextResponse } from "next/server";
+
+export async function POST(request: NextRequest) {
+ // TODO: We probably should be using an API key here instead of the session;
+ const session = await getServerSession(authOptions);
+ if (!session) {
+ return new Response(null, { status: 401 });
+ }
+
+ const linkRequest = zNewBookmarkedLinkRequestSchema.safeParse(
+ await request.json(),
+ );
+
+ if (!linkRequest.success) {
+ return NextResponse.json(
+ {
+ error: linkRequest.error.toString(),
+ },
+ { status: 400 },
+ );
+ }
+
+ const link = await bookmarkLink(linkRequest.data.url, session.user.id);
+
+ let response: ZBookmarkedLink = { ...link };
+ return NextResponse.json(response, { status: 201 });
+}
+
+export async function GET() {
+ // TODO: We probably should be using an API key here instead of the session;
+ const session = await getServerSession(authOptions);
+ if (!session) {
+ return new Response(null, { status: 401 });
+ }
+
+ const links = await getLinks(session.user.id);
+
+ let response: ZGetLinksResponse = { links };
+ return NextResponse.json(response);
+}