From 7dab3da3690d32fbf7ca048f5847bb4e306d2c57 Mon Sep 17 00:00:00 2001 From: Alma Date: Sun, 13 Apr 2025 14:11:44 +0200 Subject: [PATCH] calendar 13 --- app/api/calendars/route.ts | 7 ++ app/api/events/[id]/route.ts | 43 +++++++++ app/api/events/route.ts | 110 ++++++++++++++++++++++++ components/calendar/calendar-client.tsx | 23 +++++ node_modules/fsevents/fsevents.node | Bin 163626 -> 0 bytes prisma/schema.prisma | 2 + 6 files changed, 185 insertions(+) create mode 100644 app/api/events/[id]/route.ts create mode 100644 app/api/events/route.ts delete mode 100755 node_modules/fsevents/fsevents.node diff --git a/app/api/calendars/route.ts b/app/api/calendars/route.ts index 70557ba9..ebf25132 100644 --- a/app/api/calendars/route.ts +++ b/app/api/calendars/route.ts @@ -29,6 +29,13 @@ export async function GET(req: NextRequest) { where: { userId: session.user.username, }, + include: { + events: { + orderBy: { + start: 'asc' + } + } + }, orderBy: { createdAt: "desc", }, diff --git a/app/api/events/[id]/route.ts b/app/api/events/[id]/route.ts new file mode 100644 index 00000000..a31a7ecc --- /dev/null +++ b/app/api/events/[id]/route.ts @@ -0,0 +1,43 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "@/app/api/auth/[...nextauth]/route"; +import { prisma } from "@/lib/prisma"; + +export async function DELETE( + req: NextRequest, + { params }: { params: { id: string } } +) { + const session = await getServerSession(authOptions); + + if (!session?.user?.username) { + return NextResponse.json({ error: "Non authentifié" }, { status: 401 }); + } + + try { + // Verify event ownership + const event = await prisma.event.findFirst({ + where: { + id: params.id, + userId: session.user.username, + }, + }); + + if (!event) { + return NextResponse.json( + { error: "Événement non trouvé ou non autorisé" }, + { status: 404 } + ); + } + + await prisma.event.delete({ + where: { + id: params.id, + }, + }); + + return NextResponse.json({ success: true }); + } catch (error) { + console.error("Erreur lors de la suppression de l'événement:", error); + return NextResponse.json({ error: "Erreur serveur" }, { status: 500 }); + } +} \ No newline at end of file diff --git a/app/api/events/route.ts b/app/api/events/route.ts new file mode 100644 index 00000000..9e40c785 --- /dev/null +++ b/app/api/events/route.ts @@ -0,0 +1,110 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "@/app/api/auth/[...nextauth]/route"; +import { prisma } from "@/lib/prisma"; + +export async function POST(req: NextRequest) { + const session = await getServerSession(authOptions); + + if (!session?.user?.username) { + return NextResponse.json({ error: "Non authentifié" }, { status: 401 }); + } + + try { + const { title, description, start, end, allDay, location, calendarId } = await req.json(); + + // Validation + if (!title || !start || !end || !calendarId) { + return NextResponse.json( + { error: "Titre, début, fin et calendrier sont requis" }, + { status: 400 } + ); + } + + // Verify calendar ownership + const calendar = await prisma.calendar.findFirst({ + where: { + id: calendarId, + userId: session.user.username, + }, + }); + + if (!calendar) { + return NextResponse.json( + { error: "Calendrier non trouvé ou non autorisé" }, + { status: 404 } + ); + } + + const event = await prisma.event.create({ + data: { + title, + description, + start: new Date(start), + end: new Date(end), + isAllDay: allDay || false, + location, + calendarId, + userId: session.user.username, + }, + }); + + return NextResponse.json(event, { status: 201 }); + } catch (error) { + console.error("Erreur lors de la création de l'événement:", error); + return NextResponse.json({ error: "Erreur serveur" }, { status: 500 }); + } +} + +export async function PUT(req: NextRequest) { + const session = await getServerSession(authOptions); + + if (!session?.user?.username) { + return NextResponse.json({ error: "Non authentifié" }, { status: 401 }); + } + + try { + const { id, title, description, start, end, allDay, location, calendarId } = await req.json(); + + // Validation + if (!id || !title || !start || !end || !calendarId) { + return NextResponse.json( + { error: "ID, titre, début, fin et calendrier sont requis" }, + { status: 400 } + ); + } + + // Verify event ownership + const existingEvent = await prisma.event.findFirst({ + where: { + id, + userId: session.user.username, + }, + }); + + if (!existingEvent) { + return NextResponse.json( + { error: "Événement non trouvé ou non autorisé" }, + { status: 404 } + ); + } + + const event = await prisma.event.update({ + where: { id }, + data: { + title, + description, + start: new Date(start), + end: new Date(end), + isAllDay: allDay || false, + location, + calendarId, + }, + }); + + return NextResponse.json(event); + } catch (error) { + console.error("Erreur lors de la mise à jour de l'événement:", error); + return NextResponse.json({ error: "Erreur serveur" }, { status: 500 }); + } +} \ No newline at end of file diff --git a/components/calendar/calendar-client.tsx b/components/calendar/calendar-client.tsx index 854545e2..5fc18a09 100644 --- a/components/calendar/calendar-client.tsx +++ b/components/calendar/calendar-client.tsx @@ -446,6 +446,7 @@ export function CalendarClient({ initialCalendars, userId, userProfile }: Calend const response = await fetch("/api/calendars"); if (!response.ok) throw new Error("Failed to fetch calendars"); const data = await response.json(); + console.log("Fetched calendars:", data); // Debug log setCalendars(data.map((cal: Calendar & { events: Event[] }) => ({ ...cal, events: cal.events || [] @@ -597,6 +598,26 @@ export function CalendarClient({ initialCalendars, userId, userProfile }: Calend } }; + // Add a calendar selector component + const CalendarSelector = () => ( +
+ {calendars.map((calendar) => ( + + ))} +
+ ); + return (
@@ -658,6 +679,8 @@ export function CalendarClient({ initialCalendars, userId, userProfile }: Calend
+ + {loading ? (
diff --git a/node_modules/fsevents/fsevents.node b/node_modules/fsevents/fsevents.node deleted file mode 100755 index 1cc3345ead403e72439746aee6b40645893c322b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163626 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 Is-vs_AMzay6aWAK diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e684c2db..1e118c75 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -32,8 +32,10 @@ model Event { isAllDay Boolean @default(false) calendar Calendar @relation(fields: [calendarId], references: [id], onDelete: Cascade) calendarId String + userId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([calendarId]) + @@index([userId]) } \ No newline at end of file