Neah/app/api/calendar/route.ts
2025-04-17 11:39:15 +02:00

166 lines
4.0 KiB
TypeScript

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 }
);
}
}