mirror of
https://github.com/jorgev259/soc_site-astro.git
synced 2025-06-29 07:57:41 +00:00
Delete album endpoint
This commit is contained in:
parent
12063db819
commit
ec311826f9
3 changed files with 44 additions and 7 deletions
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
31
src/pages/api/album/delete.ts
Normal file
31
src/pages/api/album/delete.ts
Normal file
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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<string, any> = {}
|
||||
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 }
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue