import { NextResponse } from "next/server"; import { getServerSession } from "next-auth/next"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); // GET events export async function GET(req: Request) { try { const session = await getServerSession(authOptions); if (!session) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const { searchParams } = new URL(req.url); const start = searchParams.get("start"); const end = searchParams.get("end"); // First get all calendars for the user const calendars = await prisma.calendar.findMany({ where: { userId: session.user.id, }, }); // Then get events with calendar information const events = await prisma.event.findMany({ where: { calendarId: { in: calendars.map(cal => cal.id) }, ...(start && end ? { start: { gte: new Date(start), }, end: { lte: new Date(end), }, } : {}), }, include: { calendar: true, }, orderBy: { start: "asc", }, }); // Map the events to include calendar color and name const eventsWithCalendarInfo = events.map(event => ({ ...event, calendarColor: event.calendar.color, calendarName: event.calendar.name, calendar: undefined, // Remove the full calendar object })); return NextResponse.json(eventsWithCalendarInfo); } catch (error) { console.error("Error fetching events:", error); return NextResponse.json( { error: "Erreur lors du chargement des événements" }, { status: 500 } ); } } // POST new event export async function POST(req: Request) { try { const session = await getServerSession(authOptions); if (!session?.user) { return NextResponse.json( { error: "Non autorisé" }, { status: 401 } ); } const data = await req.json(); const { title, description, start, end, location, calendarId } = data; const event = await prisma.event.create({ data: { title, description, start: new Date(start), end: new Date(end), isAllDay: data.allDay || false, location: location || null, calendarId, }, }); return NextResponse.json(event); } catch (error) { console.error("Error creating event:", error); return NextResponse.json( { error: "Erreur lors de la création de l'événement" }, { status: 500 } ); } } // PUT update event export async function PUT(req: Request) { try { const session = await getServerSession(authOptions); if (!session) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const body = await req.json(); const { id, ...data } = body; const event = await prisma.event.update({ where: { id, }, data, }); return NextResponse.json(event); } catch (error) { console.error("Error updating event:", error); return NextResponse.json( { error: "Error updating event" }, { status: 500 } ); } } // DELETE event export async function DELETE(req: Request) { try { const session = await getServerSession(authOptions); if (!session) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const { searchParams } = new URL(req.url); const id = searchParams.get("id"); if (!id) { return NextResponse.json( { error: "Event ID is required" }, { status: 400 } ); } await prisma.event.delete({ where: { id, }, }); return NextResponse.json({ success: true }); } catch (error) { console.error("Error deleting event:", error); return NextResponse.json( { error: "Error deleting event" }, { status: 500 } ); } }