import { addCalendarDays, organizerDate, readCalendar } from "../../_lib/calendar-feed"; import { readSettings } from "../../_lib/store"; export const dynamic = "force-dynamic"; export async function GET() { const { calendars } = await readSettings(); const feeds = calendars.filter((calendar) => calendar.enabled); if (!feeds.length) { return Response.json({ items: [], calendarsAvailable: 0, calendarsTotal: 0, updatedAt: new Date().toISOString() }, { status: 503 }); } const now = Date.now(); const windowStart = now - 45 * 24 * 60 * 60 * 1_000; const horizon = now + 60 * 24 * 60 * 60 * 1_000; const today = organizerDate(new Date(now)); const windowStartDate = addCalendarDays(today, -45); const horizonDate = addCalendarDays(today, 60); const results = await Promise.allSettled( feeds.map((feed, feedIndex) => readCalendar(feed.url, { feedIndex, tone: feed.tone, nameOverride: feed.name }, windowStart, horizon, windowStartDate, horizonDate), ), ); const successful = results.filter((result): result is PromiseFulfilledResult>> => result.status === "fulfilled"); const items = successful .flatMap((result) => result.value.items) .filter((item, index, all) => all.findIndex((candidate) => candidate.id === item.id) === index) .sort((left, right) => { const leftValue = left.allDay ? `${left.start}T00:00:00` : left.start; const rightValue = right.allDay ? `${right.start}T00:00:00` : right.start; return leftValue.localeCompare(rightValue); }) .slice(0, 160); return Response.json( { items, calendarsAvailable: successful.length, calendarsTotal: feeds.length, updatedAt: new Date().toISOString(), }, { status: successful.length ? 200 : 503, headers: { "Cache-Control": "private, max-age=60, stale-while-revalidate=240" }, }, ); }