import { asc } from "drizzle-orm"; import { Settings } from "lucide-react"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { AdminPageShell } from "@/components/admin/admin-page-shell"; import { db, WebsiteSetting } from "@/lib/db"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { isSecretSettingKey, SECRET_PLACEHOLDER, } from "@/lib/services/setting-secrets"; import { AdvancedSettingsPanel } from "./advanced-settings-panel"; import { FIELD_DEFAULTS, MANAGED_SETTING_KEYS } from "./cms-settings-config"; import { CmsSettingsForm } from "./cms-settings-form"; export const metadata = { title: "CMS Settings" }; export default async function AdminSettings() { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.SETTINGS_VIEW, session.user.rank)) { redirect("/admin"); } const canEdit = canAccess( permissions, PERMS.SETTINGS_EDIT, session.user.rank, ); const t = await getTranslations("pages.admin.settings"); let settings: (typeof WebsiteSetting.$inferSelect)[] = []; try { settings = await db .select() .from(WebsiteSetting) .orderBy(asc(WebsiteSetting.key)); } catch { settings = []; } const dbValues = new Map(settings.map((s) => [s.key, s.value])); const values: Record = Object.fromEntries( MANAGED_SETTING_KEYS.map((key) => [ key, dbValues.get(key) ?? FIELD_DEFAULTS[key] ?? "", ]), ); const documented = settings.filter((s) => !!s.comment).length; return (
{t("keysInDatabase", { count: settings.length })} {t("managedInForm", { count: MANAGED_SETTING_KEYS.length })} {t("documented", { count: documented })}
({ key: s.key, value: isSecretSettingKey(s.key) ? SECRET_PLACEHOLDER : s.value, comment: s.comment, secret: isSecretSettingKey(s.key), }))} canEdit={canEdit} />
); }