2026-05-25 14:31:58 +08:00

131 lines
3.1 KiB
TypeScript

import { NextResponse } from 'next/server';
import { mainPrisma } from '@/lib/db';
import { getAdminSession } from '@/lib/auth';
export async function GET() {
try {
const session = await getAdminSession();
if (!session) {
return NextResponse.json(
{ error: '未登录' },
{ status: 401 }
);
}
// 超管可以查看所有项目
// 普通管理员只能查看被分配的项目
const admin = await mainPrisma.admin.findUnique({
where: { id: session.id },
include: {
adminProjects: {
include: {
project: true,
},
},
},
});
if (!admin) {
return NextResponse.json(
{ error: '管理员不存在' },
{ status: 404 }
);
}
let projects;
if (admin.isSuperAdmin) {
// 超管获取所有项目
projects = await mainPrisma.project.findMany({
orderBy: { createdAt: 'desc' },
});
} else {
// 普通管理员获取分配的项目
projects = admin.adminProjects.map((ap: { project: unknown }) => ap.project);
}
return NextResponse.json(projects);
} catch (error) {
console.error('获取项目列表失败:', error);
return NextResponse.json(
{ error: '服务器错误' },
{ status: 500 }
);
}
}
export async function POST(request: Request) {
try {
const session = await getAdminSession();
if (!session) {
return NextResponse.json(
{ error: '未登录' },
{ status: 401 }
);
}
// 检查是否是超管
const admin = await mainPrisma.admin.findUnique({
where: { id: session.id },
});
if (!admin || !admin.isSuperAdmin) {
return NextResponse.json(
{ error: '无权限创建项目' },
{ status: 403 }
);
}
const body = await request.json();
const { code, name, description, dbHost, dbPort, dbName, dbUser, dbPassword, dbSchema } = body;
// 验证必填字段
if (!code || !name || !dbHost || !dbName || !dbUser || !dbPassword) {
return NextResponse.json(
{ error: '缺少必填字段' },
{ status: 400 }
);
}
// 检查项目代码是否已存在
const existing = await mainPrisma.project.findUnique({
where: { code },
});
if (existing) {
return NextResponse.json(
{ error: '项目标识已存在' },
{ status: 400 }
);
}
// 加密数据库密码
const { encryptPassword } = await import('@/lib/db');
const encryptedPassword = encryptPassword(dbPassword);
// 创建项目
const project = await mainPrisma.project.create({
data: {
code,
name,
description,
dbHost,
dbPort: dbPort || 5432,
dbName,
dbUser,
dbPassword: encryptedPassword,
dbSchema: dbSchema || 'public',
},
});
return NextResponse.json(project);
} catch (error) {
console.error('创建项目失败:', error);
return NextResponse.json(
{ error: '服务器错误' },
{ status: 500 }
);
}
}