109 lines
3.9 KiB
TypeScript
109 lines
3.9 KiB
TypeScript
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 })
|
|
}
|
|
}
|