From 4439c91f426a8c8a13c4a84c8cb685ae67cc07e6 Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sat, 4 Jan 2025 14:03:42 +0000 Subject: feat: Expose asset manipulation endpoints in the REST API --- .../[bookmarkId]/assets/[assetId]/route.ts | 37 ++++++++++++++++++++++ .../api/v1/bookmarks/[bookmarkId]/assets/route.ts | 36 +++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 apps/web/app/api/v1/bookmarks/[bookmarkId]/assets/[assetId]/route.ts create mode 100644 apps/web/app/api/v1/bookmarks/[bookmarkId]/assets/route.ts (limited to 'apps') diff --git a/apps/web/app/api/v1/bookmarks/[bookmarkId]/assets/[assetId]/route.ts b/apps/web/app/api/v1/bookmarks/[bookmarkId]/assets/[assetId]/route.ts new file mode 100644 index 00000000..3fc50801 --- /dev/null +++ b/apps/web/app/api/v1/bookmarks/[bookmarkId]/assets/[assetId]/route.ts @@ -0,0 +1,37 @@ +import { NextRequest } from "next/server"; +import { buildHandler } from "@/app/api/v1/utils/handler"; +import { z } from "zod"; + +export const dynamic = "force-dynamic"; + +export const PUT = ( + req: NextRequest, + params: { params: { bookmarkId: string; assetId: string } }, +) => + buildHandler({ + req, + bodySchema: z.object({ assetId: z.string() }), + handler: async ({ api, body }) => { + await api.bookmarks.replaceAsset({ + bookmarkId: params.params.bookmarkId, + oldAssetId: params.params.assetId, + newAssetId: body!.assetId, + }); + return { status: 204 }; + }, + }); + +export const DELETE = ( + req: NextRequest, + params: { params: { bookmarkId: string; assetId: string } }, +) => + buildHandler({ + req, + handler: async ({ api }) => { + await api.bookmarks.detachAsset({ + bookmarkId: params.params.bookmarkId, + assetId: params.params.assetId, + }); + return { status: 204 }; + }, + }); diff --git a/apps/web/app/api/v1/bookmarks/[bookmarkId]/assets/route.ts b/apps/web/app/api/v1/bookmarks/[bookmarkId]/assets/route.ts new file mode 100644 index 00000000..e5284a39 --- /dev/null +++ b/apps/web/app/api/v1/bookmarks/[bookmarkId]/assets/route.ts @@ -0,0 +1,36 @@ +import { NextRequest } from "next/server"; +import { buildHandler } from "@/app/api/v1/utils/handler"; + +import { zAssetSchema } from "@hoarder/shared/types/bookmarks"; + +export const dynamic = "force-dynamic"; + +export const GET = ( + req: NextRequest, + params: { params: { bookmarkId: string } }, +) => + buildHandler({ + req, + handler: async ({ api }) => { + const resp = await api.bookmarks.getBookmark({ + bookmarkId: params.params.bookmarkId, + }); + return { status: 200, resp: { assets: resp.assets } }; + }, + }); + +export const POST = ( + req: NextRequest, + params: { params: { bookmarkId: string } }, +) => + buildHandler({ + req, + bodySchema: zAssetSchema, + handler: async ({ api, body }) => { + const asset = await api.bookmarks.attachAsset({ + bookmarkId: params.params.bookmarkId, + asset: body!, + }); + return { status: 201, resp: asset }; + }, + }); -- cgit v1.2.3-70-g09d2