92 lines
2.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 上传系统Logo API
import { NextRequest, NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { prisma } from '@/lib/prisma';
import { uploadToS3 } from '@/lib/s3';
// POST - 上传Logo(仅管理员)
export async function POST(request: NextRequest) {
try {
const session = await getServerSession(authOptions);
if (!session?.user || !(session.user as any).id) {
return NextResponse.json(
{ error: '未登录' },
{ status: 401 }
);
}
const userRole = (session.user as any).role;
if (userRole !== 'ADMIN') {
return NextResponse.json(
{ error: '无权限' },
{ status: 403 }
);
}
const formData = await request.formData();
const logo = formData.get('logo') as File;
const type = formData.get('type') as string;
if (!logo) {
return NextResponse.json(
{ error: '请选择LOGO文件' },
{ status: 400 }
);
}
if (!type || !['header', 'login'].includes(type)) {
return NextResponse.json(
{ error: '请指定LOGO类型(header或login)' },
{ status: 400 }
);
}
// 验证文件类型
if (!logo.type.startsWith('image/')) {
return NextResponse.json(
{ error: '只支持图片格式' },
{ status: 400 }
);
}
// 转换为Buffer
const arrayBuffer = await logo.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
// 生成文件名
const timestamp = Date.now();
const ext = logo.name.split('.').pop();
const filename = `${type}-logo-${timestamp}.${ext}`;
// 上传到S3
const logoUrl = await uploadToS3(buffer, filename, logo.type);
// 更新数据库
let settings = await prisma.systemSettings.findFirst();
const fieldName = type === 'header' ? 'headerLogoUrl' : 'loginLogoUrl';
if (settings) {
settings = await prisma.systemSettings.update({
where: { id: settings.id },
data: { [fieldName]: logoUrl },
});
} else {
settings = await prisma.systemSettings.create({
data: { [fieldName]: logoUrl },
});
}
return NextResponse.json({
success: true,
logoUrl,
type,
});
} catch (error) {
console.error('Upload logo error:', error);
return NextResponse.json(
{ error: '上传LOGO失败' },
{ status: 500 }
);
}
}