Files
old.cms.fellies.org/packages/db/src/settings.ts

190 lines
4.2 KiB
TypeScript

import { db } from "./client"
const ADMIN_SELF_REGISTRATION_KEY = "admin.self_registration_enabled"
const PUBLIC_HEADER_BANNER_KEY = "public.header_banner"
type PublicHeaderBannerRecord = {
enabled: boolean
message: string
ctaLabel?: string
ctaHref?: string
}
export type PublicHeaderBanner = {
message: string
ctaLabel?: string
ctaHref?: string
}
export type PublicHeaderBannerConfig = {
enabled: boolean
message: string
ctaLabel: string | null
ctaHref: string | null
}
function resolveEnvFallback(): boolean {
return process.env.CMS_ADMIN_SELF_REGISTRATION_ENABLED === "true"
}
function parseStoredBoolean(value: string): boolean | null {
if (value === "true") {
return true
}
if (value === "false") {
return false
}
return null
}
function parsePublicHeaderBanner(value: string): PublicHeaderBannerRecord | null {
try {
const parsed = JSON.parse(value) as Record<string, unknown>
if (typeof parsed.enabled !== "boolean" || typeof parsed.message !== "string") {
return null
}
return {
enabled: parsed.enabled,
message: parsed.message,
ctaLabel: typeof parsed.ctaLabel === "string" ? parsed.ctaLabel : undefined,
ctaHref: typeof parsed.ctaHref === "string" ? parsed.ctaHref : undefined,
}
} catch {
return null
}
}
export async function isAdminSelfRegistrationEnabled(): Promise<boolean> {
try {
const setting = await db.systemSetting.findUnique({
where: { key: ADMIN_SELF_REGISTRATION_KEY },
select: { value: true },
})
if (!setting) {
return resolveEnvFallback()
}
const parsed = parseStoredBoolean(setting.value)
if (parsed === null) {
return resolveEnvFallback()
}
return parsed
} catch {
// Fallback while migrations are not yet applied in a local environment.
return resolveEnvFallback()
}
}
export async function setAdminSelfRegistrationEnabled(enabled: boolean): Promise<void> {
await db.systemSetting.upsert({
where: { key: ADMIN_SELF_REGISTRATION_KEY },
create: {
key: ADMIN_SELF_REGISTRATION_KEY,
value: enabled ? "true" : "false",
},
update: {
value: enabled ? "true" : "false",
},
})
}
export async function getPublicHeaderBanner(): Promise<PublicHeaderBanner | null> {
try {
const setting = await db.systemSetting.findUnique({
where: { key: PUBLIC_HEADER_BANNER_KEY },
select: { value: true },
})
if (!setting) {
return null
}
const parsed = parsePublicHeaderBanner(setting.value)
if (!parsed || !parsed.enabled) {
return null
}
return {
message: parsed.message,
ctaLabel: parsed.ctaLabel,
ctaHref: parsed.ctaHref,
}
} catch {
return null
}
}
export async function getPublicHeaderBannerConfig(): Promise<PublicHeaderBannerConfig> {
try {
const setting = await db.systemSetting.findUnique({
where: { key: PUBLIC_HEADER_BANNER_KEY },
select: { value: true },
})
if (!setting) {
return {
enabled: false,
message: "",
ctaLabel: null,
ctaHref: null,
}
}
const parsed = parsePublicHeaderBanner(setting.value)
if (!parsed) {
return {
enabled: false,
message: "",
ctaLabel: null,
ctaHref: null,
}
}
return {
enabled: parsed.enabled,
message: parsed.message,
ctaLabel: parsed.ctaLabel ?? null,
ctaHref: parsed.ctaHref ?? null,
}
} catch {
return {
enabled: false,
message: "",
ctaLabel: null,
ctaHref: null,
}
}
}
export async function setPublicHeaderBannerConfig(input: PublicHeaderBannerConfig): Promise<void> {
await db.systemSetting.upsert({
where: { key: PUBLIC_HEADER_BANNER_KEY },
create: {
key: PUBLIC_HEADER_BANNER_KEY,
value: JSON.stringify({
enabled: input.enabled,
message: input.message,
ctaLabel: input.ctaLabel ?? undefined,
ctaHref: input.ctaHref ?? undefined,
}),
},
update: {
value: JSON.stringify({
enabled: input.enabled,
message: input.message,
ctaLabel: input.ctaLabel ?? undefined,
ctaHref: input.ctaHref ?? undefined,
}),
},
})
}