2026-05-06 13:55:23 +08:00

223 lines
5.7 KiB
TypeScript
Vendored

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<string, SidebarSectionConfig>
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<SidebarModulesAdminConfig>(
(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<string, unknown>
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<string, unknown>
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<string, unknown>
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<string, unknown>).enabled,
defaultSection.enabled ?? true
),
}
Object.entries(raw as Record<string, unknown>).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)
}