76 lines
2.4 KiB
TypeScript
76 lines
2.4 KiB
TypeScript
export const dynamic = "force-dynamic";
|
|
|
|
import { prisma } from "@/lib/prisma";
|
|
import { fail, ok } from "@/lib/api";
|
|
import { getSettings } from "@/lib/settings";
|
|
import { SETTING_KEYS } from "@/lib/constants";
|
|
import { enforceRateLimit } from "@/lib/rate-limit";
|
|
import { DEFAULT_TIMEZONE } from "@/lib/date";
|
|
|
|
export async function GET(req: Request) {
|
|
const limit = enforceRateLimit({
|
|
req,
|
|
scope: "public-staff",
|
|
limit: 120,
|
|
windowMs: 60_000
|
|
});
|
|
|
|
if (!limit.ok) {
|
|
return fail("Zu viele Anfragen. Bitte kurz warten.", 429, {
|
|
retryAfterSeconds: limit.retryAfterSeconds
|
|
});
|
|
}
|
|
|
|
const [mitarbeiter, settings] = await Promise.all([
|
|
prisma.user.findMany({
|
|
where: {
|
|
isActive: true,
|
|
role: "STAFF",
|
|
calendars: { some: {} }
|
|
},
|
|
orderBy: {
|
|
name: "asc"
|
|
},
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
slug: true,
|
|
bio: true,
|
|
avatarUrl: true,
|
|
timezone: true
|
|
}
|
|
}),
|
|
getSettings([
|
|
SETTING_KEYS.COMPANY_NAME,
|
|
SETTING_KEYS.BOOKING_NOTICE_TEXT,
|
|
SETTING_KEYS.DEFAULT_DURATION_MINUTES,
|
|
SETTING_KEYS.FRONTEND_HEADER_TEXT,
|
|
SETTING_KEYS.FRONTEND_HEADER_LOGO_URL,
|
|
SETTING_KEYS.FOOTER_PRIVACY_LABEL,
|
|
SETTING_KEYS.FOOTER_PRIVACY_URL,
|
|
SETTING_KEYS.FOOTER_IMPRINT_LABEL,
|
|
SETTING_KEYS.FOOTER_IMPRINT_URL,
|
|
SETTING_KEYS.FOOTER_COPYRIGHT_TEXT
|
|
])
|
|
]);
|
|
|
|
return ok({
|
|
mitarbeiter,
|
|
config: {
|
|
companyName: settings[SETTING_KEYS.COMPANY_NAME] ?? "CalBook",
|
|
bookingNoticeText: settings[SETTING_KEYS.BOOKING_NOTICE_TEXT] ?? "",
|
|
defaultDurationMinutes: Number(settings[SETTING_KEYS.DEFAULT_DURATION_MINUTES] ?? "60"),
|
|
headerText: settings[SETTING_KEYS.FRONTEND_HEADER_TEXT] ?? "Gespräch",
|
|
headerLogoUrl: settings[SETTING_KEYS.FRONTEND_HEADER_LOGO_URL] ?? "",
|
|
footerPrivacyLabel: settings[SETTING_KEYS.FOOTER_PRIVACY_LABEL] ?? "Datenschutz",
|
|
footerPrivacyUrl: settings[SETTING_KEYS.FOOTER_PRIVACY_URL] ?? "/datenschutz",
|
|
footerImprintLabel: settings[SETTING_KEYS.FOOTER_IMPRINT_LABEL] ?? "Impressum",
|
|
footerImprintUrl: settings[SETTING_KEYS.FOOTER_IMPRINT_URL] ?? "/impressum",
|
|
footerCopyrightText:
|
|
settings[SETTING_KEYS.FOOTER_COPYRIGHT_TEXT] ?? "© {{year}} {{companyName}}",
|
|
defaultTimezone: DEFAULT_TIMEZONE,
|
|
personCount: mitarbeiter.length
|
|
}
|
|
});
|
|
}
|