131 lines
3.1 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|