feat: 接入真实登录与成员权限

- auth/members/messages: 新增超级管理员登录、成员权限和密码消息流程
- agent-config/agent: 支持服务端保存 Agent 配置并取消未配置 mock 成功结果
- projects/deploy-runs/settings: 按当前用户权限保护真实接口
- prisma: 新增用户、项目权限和平台消息表结构
This commit is contained in:
湛兮
2026-06-12 00:38:23 +08:00
parent cf1bebf625
commit bc3aa31289
83 changed files with 3844 additions and 378 deletions
+56 -1
View File
@@ -1,10 +1,22 @@
/**
* 将代码内的纳管项目清单同步到数据库,保持项目、环境和 Jenkins Job 可重复初始化。
*/
const { EnvironmentKind, PrismaClient, ProjectStatus } = require('@prisma/client');
const {
EnvironmentKind,
PrismaClient,
ProjectStatus,
UserRole,
UserStatus,
} = require('@prisma/client');
const {
LOCAL_SUPER_ADMIN_INITIAL_PASSWORD,
SUPER_ADMIN_SEED,
} = require('../dist/auth/auth.constants');
const { PasswordService } = require('../dist/auth/password.service');
const { seedProjects } = require('../dist/projects/project.seed');
const prisma = new PrismaClient();
const passwordService = new PasswordService();
async function main() {
for (const project of seedProjects) {
@@ -44,6 +56,49 @@ async function main() {
await upsertEnvironment(projectRecord.id, environment);
}
}
await upsertSuperAdmin();
}
async function upsertSuperAdmin() {
const passwordHash = await passwordService.hashPassword(
resolveSuperAdminInitialPassword(),
);
await prisma.user.upsert({
where: {
account: SUPER_ADMIN_SEED.account,
},
create: {
id: SUPER_ADMIN_SEED.id,
account: SUPER_ADMIN_SEED.account,
displayName: SUPER_ADMIN_SEED.displayName,
role: UserRole.SUPER_ADMIN,
status: UserStatus.ACTIVE,
passwordHash,
mustChangePassword: false,
},
update: {
displayName: SUPER_ADMIN_SEED.displayName,
role: UserRole.SUPER_ADMIN,
status: UserStatus.ACTIVE,
mustChangePassword: false,
},
});
}
function resolveSuperAdminInitialPassword() {
if (process.env.SUPER_ADMIN_INITIAL_PASSWORD) {
return process.env.SUPER_ADMIN_INITIAL_PASSWORD;
}
if (process.env.NODE_ENV === 'production') {
throw new Error(
'Missing SUPER_ADMIN_INITIAL_PASSWORD in production seed run',
);
}
return LOCAL_SUPER_ADMIN_INITIAL_PASSWORD;
}
async function upsertEnvironment(projectId, environment) {