import type { MaintenanceSettings } from '../types' export type HeaderNavPricingConfig = { enabled: boolean requireAuth: boolean } export type HeaderNavModulesConfig = { home: boolean console: boolean pricing: HeaderNavPricingConfig docs: boolean about: boolean [key: string]: boolean | HeaderNavPricingConfig } export type SidebarSectionConfig = { enabled: boolean [key: string]: boolean } export type SidebarModulesAdminConfig = Record export const HEADER_NAV_DEFAULT: HeaderNavModulesConfig = { home: true, console: true, pricing: { enabled: true, requireAuth: false, }, docs: true, about: true, } export const SIDEBAR_MODULES_DEFAULT: SidebarModulesAdminConfig = { chat: { enabled: true, playground: true, chat: true, }, console: { enabled: true, detail: true, token: true, log: true, midjourney: true, task: true, }, personal: { enabled: true, topup: true, personal: true, }, admin: { enabled: true, channel: true, models: true, redemption: true, user: true, setting: true, subscription: true, }, } export const DEFAULT_MAINTENANCE_SETTINGS: MaintenanceSettings = { Notice: '', LogConsumeEnabled: false, HeaderNavModules: JSON.stringify(HEADER_NAV_DEFAULT), SidebarModulesAdmin: JSON.stringify(SIDEBAR_MODULES_DEFAULT), 'performance_setting.disk_cache_enabled': false, 'performance_setting.disk_cache_threshold_mb': 10, 'performance_setting.disk_cache_max_size_mb': 1024, 'performance_setting.disk_cache_path': '', 'performance_setting.monitor_enabled': false, 'performance_setting.monitor_cpu_threshold': 90, 'performance_setting.monitor_memory_threshold': 90, 'performance_setting.monitor_disk_threshold': 95, 'perf_metrics_setting.enabled': true, 'perf_metrics_setting.flush_interval': 5, 'perf_metrics_setting.bucket_time': 'hour', 'perf_metrics_setting.retention_days': 0, } const toBoolean = (value: unknown, fallback: boolean): boolean => { if (typeof value === 'boolean') return value if (typeof value === 'number') return value === 1 if (typeof value === 'string') { const normalized = value.trim().toLowerCase() if (normalized === 'true' || normalized === '1') return true if (normalized === 'false' || normalized === '0') return false } return fallback } const cloneHeaderNavDefault = (): HeaderNavModulesConfig => ({ ...HEADER_NAV_DEFAULT, pricing: { ...HEADER_NAV_DEFAULT.pricing }, }) const cloneSidebarDefault = (): SidebarModulesAdminConfig => Object.entries(SIDEBAR_MODULES_DEFAULT).reduce( (acc, [section, config]) => { acc[section] = { ...config } return acc }, {} ) export function parseHeaderNavModules( value: string | null | undefined ): HeaderNavModulesConfig { const base = cloneHeaderNavDefault() if (!value) { return base } try { const parsed = JSON.parse(value) as Record const result: HeaderNavModulesConfig = { ...base, pricing: { ...base.pricing }, } Object.entries(parsed).forEach(([key, raw]) => { if (key === 'pricing') { if (raw && typeof raw === 'object') { const rawPricing = raw as Record result.pricing = { enabled: toBoolean( rawPricing.enabled, base.pricing?.enabled ?? true ), requireAuth: toBoolean( rawPricing.requireAuth, base.pricing?.requireAuth ?? false ), } } return } if (typeof raw === 'boolean') { result[key] = raw return } if (typeof raw === 'string' || typeof raw === 'number') { result[key] = toBoolean(raw, Boolean(base[key])) return } }) return result } catch { return base } } export function serializeHeaderNavModules( config: HeaderNavModulesConfig ): string { return JSON.stringify(config) } export function parseSidebarModulesAdmin( value: string | null | undefined ): SidebarModulesAdminConfig { const defaults = cloneSidebarDefault() // If empty string, null, or undefined, use default config if (!value || value.trim() === '') return defaults try { const parsed = JSON.parse(value) as Record const result: SidebarModulesAdminConfig = {} Object.entries(parsed).forEach(([sectionKey, raw]) => { if (!raw || typeof raw !== 'object') return const defaultSection = defaults[sectionKey] ?? { enabled: true } const sectionConfig: SidebarSectionConfig = { enabled: toBoolean( (raw as Record).enabled, defaultSection.enabled ?? true ), } Object.entries(raw as Record).forEach( ([moduleKey, moduleValue]) => { if (moduleKey === 'enabled') return sectionConfig[moduleKey] = toBoolean( moduleValue, defaultSection[moduleKey] ?? true ) } ) result[sectionKey] = sectionConfig }) // Merge defaults to ensure expected sections exist Object.entries(defaults).forEach(([sectionKey, config]) => { if (!result[sectionKey]) { result[sectionKey] = { ...config } return } Object.entries(config).forEach(([moduleKey, moduleValue]) => { if (!(moduleKey in result[sectionKey])) { result[sectionKey][moduleKey] = moduleValue } }) }) return result } catch { return defaults } } export function serializeSidebarModulesAdmin( config: SidebarModulesAdminConfig ): string { return JSON.stringify(config) }