WuYongJie f646b71813
Some checks failed
CI Check / check (push) Has been cancelled
chore: 初始化本地仓库并同步最近改动
2025-11-18 17:50:16 +08:00

209 lines
6.6 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/lib/auth'
import { prisma } from '@/lib/prisma'
import { defaultLogos, featureFlags } from '@/lib/config'
import { cache } from '@/lib/cache'
const CACHE_KEY = 'system-settings'
const CACHE_TTL = 60000 // 1分钟缓存
// GET - 获取系统设置(带缓存)
export async function GET() {
try {
// 先尝试从缓存获取
const cachedSettings = cache.get(CACHE_KEY)
if (cachedSettings) {
return NextResponse.json(cachedSettings)
}
// 获取或创建系统设置
let settings = await prisma.systemSettings.findFirst({
select: {
id: true,
headerBgColor: true,
headerLogoUrl: true,
loginLogoUrl: true,
siteName: true,
enableUserActivation: true,
enableRegistration: true,
enableAiImageEdit: true,
enableTunnelService: true,
s3Endpoint: true,
s3AccessKey: true,
s3SecretKey: true,
s3Bucket: true,
s3Region: true,
s3PublicUrl: true,
createdAt: true,
updatedAt: true,
}
})
if (!settings) {
// 如果不存在,创建默认设置
settings = await prisma.systemSettings.create({
data: {
headerBgColor: '#1f2937',
headerLogoUrl: defaultLogos.header,
loginLogoUrl: defaultLogos.login,
siteName: '由壹点3D素材',
enableUserActivation: false,
enableRegistration: true,
enableAiImageEdit: featureFlags.aiEditEnabled,
enableTunnelService: featureFlags.tunnelEnabled,
},
select: {
id: true,
headerBgColor: true,
headerLogoUrl: true,
loginLogoUrl: true,
siteName: true,
enableUserActivation: true,
enableRegistration: true,
enableAiImageEdit: true,
enableTunnelService: true,
s3Endpoint: true,
s3AccessKey: true,
s3SecretKey: true,
s3Bucket: true,
s3Region: true,
s3PublicUrl: true,
createdAt: true,
updatedAt: true,
}
})
}
// 存入缓存
cache.set(CACHE_KEY, settings, CACHE_TTL)
return NextResponse.json(settings)
} catch (error) {
console.error('[SystemSettings] Get error:', error)
return NextResponse.json(
{ error: '获取系统设置失败' },
{ status: 500 }
)
}
}
// PUT - 更新系统设置(仅管理员)
export async function PUT(request: NextRequest) {
try {
const session = await getServerSession(authOptions)
const isSuperAdmin = (session?.user as any)?.isSuperAdmin
if (!session || session.user.role !== 'ADMIN') {
return NextResponse.json(
{ error: '无权限' },
{ status: 403 }
)
}
const body = await request.json()
const {
headerBgColor,
siteName,
headerLogoUrl,
loginLogoUrl,
s3Endpoint,
s3AccessKey,
s3SecretKey,
s3Bucket,
s3Region,
s3PublicUrl,
enableUserActivation,
enableRegistration,
enableAiImageEdit,
enableTunnelService,
} = body
// 只有最高权限账号可以修改 enableUserActivation
if (
(enableUserActivation !== undefined ||
enableAiImageEdit !== undefined ||
enableTunnelService !== undefined) &&
!isSuperAdmin
) {
return NextResponse.json(
{ error: '只有最高权限账号可以修改受保护的功能开关' },
{ status: 403 }
)
}
// 获取或创建系统设置
let settings = await prisma.systemSettings.findFirst()
if (!settings) {
// 创建
settings = await prisma.systemSettings.create({
data: {
headerBgColor: headerBgColor || '#1f2937',
headerLogoUrl: headerLogoUrl ?? defaultLogos.header,
loginLogoUrl: loginLogoUrl ?? defaultLogos.login,
siteName: siteName || '由壹点3D素材',
enableUserActivation: enableUserActivation !== undefined ? enableUserActivation : false,
enableRegistration: enableRegistration !== undefined ? enableRegistration : true,
enableAiImageEdit:
enableAiImageEdit !== undefined ? enableAiImageEdit : featureFlags.aiEditEnabled,
enableTunnelService:
enableTunnelService !== undefined ? enableTunnelService : featureFlags.tunnelEnabled,
}
})
} else {
// 更新
const updateData: any = {}
if (headerBgColor !== undefined) updateData.headerBgColor = headerBgColor
if (siteName !== undefined) updateData.siteName = siteName
if (headerLogoUrl !== undefined) updateData.headerLogoUrl = headerLogoUrl
if (loginLogoUrl !== undefined) updateData.loginLogoUrl = loginLogoUrl
if (s3Endpoint !== undefined) updateData.s3Endpoint = s3Endpoint
if (s3AccessKey !== undefined) updateData.s3AccessKey = s3AccessKey
if (s3SecretKey !== undefined) updateData.s3SecretKey = s3SecretKey
if (s3Bucket !== undefined) updateData.s3Bucket = s3Bucket
if (s3Region !== undefined) updateData.s3Region = s3Region
if (s3PublicUrl !== undefined) updateData.s3PublicUrl = s3PublicUrl
if (enableUserActivation !== undefined) updateData.enableUserActivation = enableUserActivation
if (enableRegistration !== undefined) updateData.enableRegistration = enableRegistration
if (enableAiImageEdit !== undefined) updateData.enableAiImageEdit = enableAiImageEdit
if (enableTunnelService !== undefined) updateData.enableTunnelService = enableTunnelService
settings = await prisma.systemSettings.update({
where: { id: settings.id },
data: updateData,
select: {
id: true,
headerBgColor: true,
headerLogoUrl: true,
loginLogoUrl: true,
siteName: true,
enableUserActivation: true,
enableRegistration: true,
enableAiImageEdit: true,
enableTunnelService: true,
s3Endpoint: true,
s3AccessKey: true,
s3SecretKey: true,
s3Bucket: true,
s3Region: true,
s3PublicUrl: true,
createdAt: true,
updatedAt: true,
}
})
}
// 清除缓存,强制下次重新加载
cache.delete(CACHE_KEY)
return NextResponse.json(settings)
} catch (error) {
console.error('Update system settings error:', error)
return NextResponse.json(
{ error: '更新系统设置失败' },
{ status: 500 }
)
}
}