From 1ef69dc205d529573a66a9bf01430dd0d6645a57 Mon Sep 17 00:00:00 2001 From: Mathieu Date: Mon, 22 Jun 2026 12:10:26 +0200 Subject: [PATCH] feat: mockup template CRUD API routes --- src/app/api/mockup/templates/[id]/route.ts | 10 ++++++ .../templates/image/[filename]/route.ts | 14 +++++++++ src/app/api/mockup/templates/route.ts | 31 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 src/app/api/mockup/templates/[id]/route.ts create mode 100644 src/app/api/mockup/templates/image/[filename]/route.ts create mode 100644 src/app/api/mockup/templates/route.ts diff --git a/src/app/api/mockup/templates/[id]/route.ts b/src/app/api/mockup/templates/[id]/route.ts new file mode 100644 index 0000000..7e17e35 --- /dev/null +++ b/src/app/api/mockup/templates/[id]/route.ts @@ -0,0 +1,10 @@ +import { getServerSession } from 'next-auth' +import { authOptions } from '@/lib/auth' +import { deleteTemplate } from '@/lib/mockupTemplates' + +export async function DELETE(_req: Request, { params }: { params: { id: string } }) { + const session = await getServerSession(authOptions) + if (!session) return Response.json({ error: 'Non authentifié' }, { status: 401 }) + await deleteTemplate(params.id) + return Response.json({ ok: true }) +} diff --git a/src/app/api/mockup/templates/image/[filename]/route.ts b/src/app/api/mockup/templates/image/[filename]/route.ts new file mode 100644 index 0000000..dc58859 --- /dev/null +++ b/src/app/api/mockup/templates/image/[filename]/route.ts @@ -0,0 +1,14 @@ +import { readFile } from 'fs/promises' +import { getTemplateImagePath } from '@/lib/mockupTemplates' + +export async function GET(_req: Request, { params }: { params: { filename: string } }) { + try { + const filePath = getTemplateImagePath(params.filename) + const buffer = await readFile(filePath) + const ext = params.filename.split('.').pop() ?? 'jpg' + const contentType = ext === 'png' ? 'image/png' : 'image/jpeg' + return new Response(buffer, { headers: { 'Content-Type': contentType } }) + } catch { + return new Response('Not found', { status: 404 }) + } +} diff --git a/src/app/api/mockup/templates/route.ts b/src/app/api/mockup/templates/route.ts new file mode 100644 index 0000000..fd116ef --- /dev/null +++ b/src/app/api/mockup/templates/route.ts @@ -0,0 +1,31 @@ +import { NextRequest } from 'next/server' +import { getServerSession } from 'next-auth' +import { authOptions } from '@/lib/auth' +import { listTemplates, saveTemplate } from '@/lib/mockupTemplates' + +export async function GET() { + const session = await getServerSession(authOptions) + if (!session) return Response.json({ error: 'Non authentifié' }, { status: 401 }) + const templates = await listTemplates() + return Response.json(templates) +} + +export async function POST(req: NextRequest) { + const session = await getServerSession(authOptions) + if (!session) return Response.json({ error: 'Non authentifié' }, { status: 401 }) + + const form = await req.formData() + const name = form.get('name') as string + const family = form.get('family') as string + const description = (form.get('description') as string) ?? '' + const imageFile = form.get('image') as File + + if (!name || !family || !imageFile) { + return Response.json({ error: 'name, family et image requis' }, { status: 400 }) + } + + const buffer = Buffer.from(await imageFile.arrayBuffer()) + const ext = imageFile.name.split('.').pop() ?? 'jpg' + const template = await saveTemplate({ name, family, description, filename: '' }, buffer, ext) + return Response.json(template) +}