43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
import ical from "ical-generator";
|
|
import { NextResponse } from "next/server";
|
|
import { prisma } from "../../../../lib/prisma";
|
|
|
|
export async function GET(
|
|
_request: Request,
|
|
context: { params: { token: string } }
|
|
) {
|
|
const view = await prisma.userView.findUnique({
|
|
where: { token: context.params.token },
|
|
include: { items: { include: { event: true } }, user: true }
|
|
});
|
|
|
|
if (!view) {
|
|
return NextResponse.json({ error: "Not found" }, { status: 404 });
|
|
}
|
|
|
|
const calendar = ical({
|
|
name: `Vereinskalender - ${view.name}`,
|
|
timezone: "Europe/Berlin"
|
|
});
|
|
|
|
view.items
|
|
.map((item) => item.event)
|
|
.filter((event) => event.status === "APPROVED")
|
|
.forEach((event) => {
|
|
calendar.createEvent({
|
|
id: event.id,
|
|
summary: event.title,
|
|
description: event.description || undefined,
|
|
location: event.location || undefined,
|
|
start: event.startAt,
|
|
end: event.endAt
|
|
});
|
|
});
|
|
|
|
return new NextResponse(calendar.toString(), {
|
|
headers: {
|
|
"Content-Type": "text/calendar; charset=utf-8"
|
|
}
|
|
});
|
|
}
|