import { Role } from '@prisma/client'; import { NextResponse } from 'next/server'; import { prisma } from '../../../../../../lib/prisma'; import { requireAuth } from '../../../../../../lib/jwt'; export async function DELETE(req: Request, { params }: { params: { id: string; imageId: string } }) { try { const auth = await requireAuth(req); const listing = await prisma.listing.findUnique({ where: { id: params.id, removedAt: null }, select: { id: true, ownerId: true, status: true, images: { orderBy: { order: 'asc' }, select: { id: true, isCover: true, order: true } }, }, }); if (!listing) { return NextResponse.json({ error: 'Listing not found' }, { status: 404 }); } const isOwner = listing.ownerId === auth.userId; const isAdmin = auth.role === Role.ADMIN; if (!isOwner && !isAdmin) { return NextResponse.json({ error: 'Forbidden' }, { status: 403 }); } const targetImage = listing.images.find((img) => img.id === params.imageId); if (!targetImage) { return NextResponse.json({ error: 'Image not found' }, { status: 404 }); } if (listing.images.length <= 1) { return NextResponse.json({ error: 'At least one image is required' }, { status: 400 }); } const remaining = listing.images.filter((img) => img.id !== params.imageId); const newCoverId = remaining.find((img) => img.isCover)?.id ?? remaining[0]?.id ?? null; await prisma.$transaction([ prisma.listingImage.delete({ where: { id: params.imageId } }), ...remaining.map((img, idx) => prisma.listingImage.update({ where: { id: img.id }, data: { order: idx + 1, isCover: newCoverId ? img.id === newCoverId : img.isCover }, }), ), ]); const updated = await prisma.listing.findUnique({ where: { id: listing.id }, select: { images: { orderBy: { order: 'asc' }, select: { id: true, url: true, altText: true, order: true, isCover: true, size: true, mimeType: true }, }, }, }); return NextResponse.json({ ok: true, images: updated?.images ?? [] }); } catch (error: any) { console.error('Delete listing image error', error); if (String(error).includes('Unauthorized')) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } return NextResponse.json({ error: 'Failed to delete image' }, { status: 500 }); } } export const dynamic = 'force-dynamic';