117 lines
2.6 KiB
TypeScript
117 lines
2.6 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
|
|
}
|
|
|
|
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
|
|
}
|
|
}
|