From 0cdf3dd69180cd4cb904868d3c8670867ba027ca Mon Sep 17 00:00:00 2001 From: alma Date: Thu, 15 Jan 2026 13:15:12 +0100 Subject: [PATCH] Agenda refactor --- app/agenda/page.tsx | 55 +++++++++++++++++++++++++++++++++++++- app/api/calendars/route.ts | 44 +++++++++++++++++++++++++++++- 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/app/agenda/page.tsx b/app/agenda/page.tsx index 13a590e..aff67eb 100644 --- a/app/agenda/page.tsx +++ b/app/agenda/page.tsx @@ -45,8 +45,13 @@ export default async function CalendarPage() { const userId = session.user.username || session.user.email || ''; // Get all calendars for the user with mission relation and sync configuration + // This includes: + // 1. Personal calendars (userId = session.user.id) + // 2. Mission calendars where user is associated via MissionUser // Exclude "Privée" and "Default" calendars that are not synced (they should only exist if synced from courrier) - let calendars = await prisma.calendar.findMany({ + + // Get personal calendars + let personalCalendars = await prisma.calendar.findMany({ where: { userId: session?.user?.id || '', OR: [ @@ -89,6 +94,54 @@ export default async function CalendarPage() { } } }); + + // Get mission calendars where user is associated via MissionUser + const missionUserRelations = await prisma.missionUser.findMany({ + where: { + userId: session?.user?.id || '', + }, + include: { + mission: { + include: { + calendars: { + where: { + // Exclude calendars already owned by user (already in personalCalendars) + userId: { not: session?.user?.id || '' } + }, + include: { + events: { + orderBy: { + start: 'asc' + } + }, + mission: { + include: { + missionUsers: true + } + }, + syncConfig: { + include: { + mailCredential: { + select: { + id: true, + email: true, + display_name: true, + } + } + } + } + } + } + } + } + } + }); + + // Extract mission calendars + const missionCalendars = missionUserRelations.flatMap(mu => mu.mission.calendars); + + // Combine personal and mission calendars + let calendars = [...personalCalendars, ...missionCalendars]; // Auto-setup sync for email accounts from courrier (Microsoft only) // Get all Microsoft email accounts (OAuth) diff --git a/app/api/calendars/route.ts b/app/api/calendars/route.ts index 89c4a14..d3cafa5 100644 --- a/app/api/calendars/route.ts +++ b/app/api/calendars/route.ts @@ -47,7 +47,9 @@ export async function GET(req: NextRequest) { logger.debug('[CALENDAR] Fetching calendar data from database', { userId: session.user.id, }); - const calendars = await prisma.calendar.findMany({ + + // Get user's personal calendars + const personalCalendars = await prisma.calendar.findMany({ where: { userId: session.user.id, }, @@ -56,12 +58,52 @@ export async function GET(req: NextRequest) { orderBy: { start: 'asc' } + }, + mission: { + include: { + missionUsers: true + } } }, orderBy: { createdAt: "desc", }, }); + + // Get mission calendars where user is associated via MissionUser + const missionUserRelations = await prisma.missionUser.findMany({ + where: { + userId: session.user.id, + }, + include: { + mission: { + include: { + calendars: { + include: { + events: { + orderBy: { + start: 'asc' + } + }, + mission: { + include: { + missionUsers: true + } + } + } + } + } + } + } + }); + + // Extract mission calendars (excluding those already in personalCalendars) + const missionCalendars = missionUserRelations + .flatMap(mu => mu.mission.calendars) + .filter(cal => cal.userId !== session.user.id); // Exclude calendars owned by user (already in personalCalendars) + + // Combine personal and mission calendars + const calendars = [...personalCalendars, ...missionCalendars]; logger.debug('[CALENDAR] Fetched calendars with events', { userId: session.user.id,