import { NextResponse } from 'next/server' import { prisma } from '@/lib/prisma' import { getCurrentUser } from '@/lib/auth' export async function GET(request: Request, { params }: { params: { id: string } }) { try { const user = await getCurrentUser() if (!user) return NextResponse.json({ error: 'Non authentifié' }, { status: 401 }) const tickets: any[] = await prisma.$queryRawUnsafe(` SELECT t.*, c.name as client_name, c.name as client_company, c.email as client_email, s.name as server_name, s.ip as server_ip FROM "Ticket" t LEFT JOIN "Client" c ON c.id = t."clientId" LEFT JOIN "Server" s ON s.id = t."serverId" WHERE t.id = $1 AND t."userId" = $2 `, params.id, user.id) if (!tickets.length) { return NextResponse.json({ error: 'Ticket introuvable' }, { status: 404 }) } const results = await Promise.all([ prisma.$queryRawUnsafe(` SELECT * FROM "TicketMessage" WHERE "ticketId" = $1 ORDER BY "createdAt" ASC `, params.id), prisma.$queryRawUnsafe(` SELECT id, filename, "contentType", "contentId", "messageId", "createdAt" FROM "TicketAttachment" WHERE "ticketId" = $1 ORDER BY "createdAt" ASC `, params.id), ]) const messages = results[0] as any[] const attachments = results[1] as any[] return NextResponse.json({ ...tickets[0], messages, attachments }) } catch (error) { console.error(error) return NextResponse.json({ error: 'Erreur serveur' }, { status: 500 }) } } export async function PATCH(request: Request, { params }: { params: { id: string } }) { try { const user = await getCurrentUser() if (!user) return NextResponse.json({ error: 'Non authentifié' }, { status: 401 }) const body = await request.json() const now = new Date() const check: any[] = await prisma.$queryRawUnsafe(`SELECT id FROM "Ticket" WHERE id = $1 AND "userId" = $2`, params.id, user.id) if (!check.length) return NextResponse.json({ error: 'Ticket introuvable' }, { status: 404 }) const allowed = ['status', 'priority', 'clientId', 'serverId', 'subject', 'description', 'assignedTo'] const fields: string[] = [] const values: any[] = [] let idx = 1 for (const key of allowed) { if (body[key] !== undefined) { fields.push(`"${key}" = $${idx++}`) values.push(body[key]) } } if (fields.length === 0) { return NextResponse.json({ error: 'Aucun champ à mettre à jour' }, { status: 400 }) } fields.push(`"updatedAt" = $${idx++}`) values.push(now) values.push(params.id) values.push(user.id) await prisma.$executeRawUnsafe(` UPDATE "Ticket" SET ${fields.join(', ')} WHERE id = $${idx} AND "userId" = $${idx + 1} `, ...values) const updated: any[] = await prisma.$queryRawUnsafe(`SELECT * FROM "Ticket" WHERE id = $1`, params.id) return NextResponse.json(updated[0]) } catch (error) { console.error(error) return NextResponse.json({ error: 'Erreur serveur' }, { status: 500 }) } } export async function DELETE(request: Request, { params }: { params: { id: string } }) { try { const user = await getCurrentUser() if (!user) return NextResponse.json({ error: 'Non authentifié' }, { status: 401 }) const check: any[] = await prisma.$queryRawUnsafe(`SELECT id FROM "Ticket" WHERE id = $1 AND "userId" = $2`, params.id, user.id) if (!check.length) return NextResponse.json({ error: 'Ticket introuvable' }, { status: 404 }) await prisma.$executeRawUnsafe(`DELETE FROM "TicketAttachment" WHERE "ticketId" = $1`, params.id) await prisma.$executeRawUnsafe(`DELETE FROM "TicketMessage" WHERE "ticketId" = $1`, params.id) await prisma.$executeRawUnsafe(`DELETE FROM "Ticket" WHERE id = $1`, params.id) return NextResponse.json({ success: true }) } catch (error) { console.error(error) return NextResponse.json({ error: 'Erreur serveur' }, { status: 500 }) } }