From ec311826f9895eaaa40a380ba58eeac32e5e1ac5 Mon Sep 17 00:00:00 2001 From: Jorge Vargas Date: Thu, 13 Mar 2025 22:16:46 -0600 Subject: [PATCH] Delete album endpoint --- src/pages/api/album/create.ts | 9 +++------ src/pages/api/album/delete.ts | 31 +++++++++++++++++++++++++++++++ src/utils/form.ts | 11 ++++++++++- 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 src/pages/api/album/delete.ts diff --git a/src/pages/api/album/create.ts b/src/pages/api/album/create.ts index 26b39f3..c95a2b3 100644 --- a/src/pages/api/album/create.ts +++ b/src/pages/api/album/create.ts @@ -3,7 +3,7 @@ import * as s from 'superstruct' import prismaClient from 'utils/prisma-client' import { AlbumStatus } from '@prisma/client' -import { Status, formToObject, slug } from 'utils/form' +import { Status, parseForm, slug } from 'utils/form' import { writeImg, getImgColor } from 'utils/img' import { handleComplete } from 'integrations/requestCat' import { CreateAlbum } from 'schemas/album' @@ -16,11 +16,8 @@ export const POST: APIRoute = async ({ request, locals }) => { let body try { - const formData = await request.formData() - const formObject = formToObject(formData) - const { data, ...rest } = formObject - - body = s.create({ ...JSON.parse(data), ...rest }, CreateAlbum) + const formData = await parseForm(request) + body = s.create(formData, AlbumSchema) } catch (err) { return Status(422, (err as Error).message) } diff --git a/src/pages/api/album/delete.ts b/src/pages/api/album/delete.ts new file mode 100644 index 0000000..0871f0c --- /dev/null +++ b/src/pages/api/album/delete.ts @@ -0,0 +1,31 @@ +import type { APIRoute } from 'astro' +import * as s from 'superstruct' + +import prismaClient from 'utils/prisma-client' +import { Status, parseForm } from 'utils/form' + +const DeleteAlbum = s.object({ albumId: s.number() }) + +export const POST: APIRoute = async ({ request, locals }) => { + const { session, permissions, user } = locals + + if (!session || !user) return Status(401) + if (!permissions.includes('CREATE')) return Status(403) + + let body + try { + const formData = await parseForm(request) + body = s.create(formData, DeleteAlbum) + await prismaClient.albums.findUniqueOrThrow({ where: { id: body.albumId }, select: { id: true } }) + } catch (err) { + return Status(422, (err as Error).message) + } + + try { + await prismaClient.albums.delete({ where: { id: body.albumId } }) + return Status(200, body.albumId.toString()) + } catch (err) { + console.error(err) + return Status(500, (err as Error).message) + } +} diff --git a/src/utils/form.ts b/src/utils/form.ts index 7c78464..bf8042f 100644 --- a/src/utils/form.ts +++ b/src/utils/form.ts @@ -3,7 +3,7 @@ import slugify from 'slugify' export const Status = (status: number, statusText?: string) => new Response(null, { status, statusText }) export const slug = (text: string) => slugify(text, { lower: true, strict: true }) -export function formToObject(formData: FormData) { +function formToObject(formData: FormData) { const object: Record = {} for (const entry of formData.entries()) { const [key, value] = entry @@ -12,3 +12,12 @@ export function formToObject(formData: FormData) { return object } + +export async function parseForm(request: Request) { + const formData = await request.formData() + const formObject = formToObject(formData) + const { data: dataInput, ...rest } = formObject + + const data = JSON.parse(dataInput) + return { ...data, ...rest } +}