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 prismaClient from 'utils/prisma-client'
|
||||||
|
|
||||||
import { AlbumStatus } from '@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 { writeImg, getImgColor } from 'utils/img'
|
||||||
import { handleComplete } from 'integrations/requestCat'
|
import { handleComplete } from 'integrations/requestCat'
|
||||||
import { CreateAlbum } from 'schemas/album'
|
import { CreateAlbum } from 'schemas/album'
|
||||||
|
|
@ -16,11 +16,8 @@ export const POST: APIRoute = async ({ request, locals }) => {
|
||||||
|
|
||||||
let body
|
let body
|
||||||
try {
|
try {
|
||||||
const formData = await request.formData()
|
const formData = await parseForm(request)
|
||||||
const formObject = formToObject(formData)
|
body = s.create(formData, AlbumSchema)
|
||||||
const { data, ...rest } = formObject
|
|
||||||
|
|
||||||
body = s.create({ ...JSON.parse(data), ...rest }, CreateAlbum)
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return Status(422, (err as Error).message)
|
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 Status = (status: number, statusText?: string) => new Response(null, { status, statusText })
|
||||||
export const slug = (text: string) => slugify(text, { lower: true, strict: true })
|
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> = {}
|
const object: Record<string, any> = {}
|
||||||
for (const entry of formData.entries()) {
|
for (const entry of formData.entries()) {
|
||||||
const [key, value] = entry
|
const [key, value] = entry
|
||||||
|
|
@ -12,3 +12,12 @@ export function formToObject(formData: FormData) {
|
||||||
|
|
||||||
return object
|
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