Initial commit: SecourIT Gestion

This commit is contained in:
2026-08-23 09:06:18 +00:00
commit cab93c7f7c
85 changed files with 15801 additions and 0 deletions
+108
View File
@@ -0,0 +1,108 @@
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 })
}
}