Files
kalendartool/app/api/calendars/[id]/route.ts

79 lines
2.4 KiB
TypeScript

/**
* GET /api/calendars/[id] - Kalenderdetails (Owner oder Member).
* PATCH /api/calendars/[id] - bearbeiten (nur besitzender Admin).
*/
import { NextRequest, NextResponse } from 'next/server';
import { prisma } from '@/lib/db/client';
import { requireCalendarContext } from '@/lib/api/context';
import { updateCalendarSchema } from '@/lib/validation';
import { canManageCalendar } from '@/lib/permissions/permissions';
import { errorResponse, forbiddenResponse } from '@/lib/api/responses';
interface RouteParams {
params: Promise<{ id: string }>;
}
export async function GET(
_request: NextRequest,
{ params }: RouteParams,
): Promise<NextResponse> {
try {
const { id } = await params;
const context = await requireCalendarContext(id);
return NextResponse.json({ calendar: context.calendar });
} catch (error) {
return errorResponse(error);
}
}
export async function PATCH(
request: NextRequest,
{ params }: RouteParams,
): Promise<NextResponse> {
try {
const { id } = await params;
const context = await requireCalendarContext(id);
if (!canManageCalendar(context.user, context.calendar)) {
return forbiddenResponse();
}
const body = updateCalendarSchema.parse(await request.json());
const calendar = await prisma.calendar.update({
where: { id },
data: {
...(body.title !== undefined ? { title: body.title } : {}),
...(body.description !== undefined
? { description: body.description }
: {}),
...(body.timezone !== undefined ? { timezone: body.timezone } : {}),
...(body.isActive !== undefined ? { isActive: body.isActive } : {}),
...(body.maxReservationMinutes !== undefined
? { maxReservationMinutes: body.maxReservationMinutes }
: {}),
...(body.showTitleToMembers !== undefined
? { showTitleToMembers: body.showTitleToMembers }
: {}),
...(body.showNotesToMembers !== undefined
? { showNotesToMembers: body.showNotesToMembers }
: {}),
},
select: {
id: true,
title: true,
description: true,
timezone: true,
isActive: true,
maxReservationMinutes: true,
showTitleToMembers: true,
showNotesToMembers: true,
},
});
return NextResponse.json({ calendar });
} catch (error) {
return errorResponse(error);
}
}