137 lines
3.9 KiB
JavaScript
137 lines
3.9 KiB
JavaScript
|
|
/**
|
|||
|
|
* 认知引导流程 API 路由
|
|||
|
|
*
|
|||
|
|
* GET /api/onboarding/status — 获取引导状态
|
|||
|
|
* POST /api/onboarding/start — 开始引导
|
|||
|
|
* POST /api/onboarding/complete — 完成引导(自动升级权限)
|
|||
|
|
* GET /api/tools — 获取可用工具列表(根据权限过滤)
|
|||
|
|
*
|
|||
|
|
* 版权:国作登字-2026-A-00037559
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
'use strict';
|
|||
|
|
|
|||
|
|
var express = require('express');
|
|||
|
|
var router = express.Router();
|
|||
|
|
var authMiddleware = require('../middleware/auth');
|
|||
|
|
var intentRouter = require('../middleware/intent-router');
|
|||
|
|
var onboardingScript = require('../config/onboarding-script.json');
|
|||
|
|
var permissions = require('../config/permissions');
|
|||
|
|
|
|||
|
|
// 引导状态存储(内存,生产环境应持久化)
|
|||
|
|
var onboardingState = new Map();
|
|||
|
|
|
|||
|
|
// ====== 获取引导状态 ======
|
|||
|
|
router.get('/onboarding/status',
|
|||
|
|
authMiddleware.requireAuth,
|
|||
|
|
function(req, res) {
|
|||
|
|
var devId = req.user.devId;
|
|||
|
|
var state = onboardingState.get(devId);
|
|||
|
|
|
|||
|
|
if (!state) {
|
|||
|
|
// 未开始引导
|
|||
|
|
res.json({
|
|||
|
|
started: false,
|
|||
|
|
completed: false,
|
|||
|
|
currentRound: 0,
|
|||
|
|
totalRounds: onboardingScript.onboarding.length,
|
|||
|
|
permissionLevel: req.user.permissionLevel
|
|||
|
|
});
|
|||
|
|
} else {
|
|||
|
|
res.json({
|
|||
|
|
started: true,
|
|||
|
|
completed: state.completed,
|
|||
|
|
currentRound: state.currentRound,
|
|||
|
|
totalRounds: onboardingScript.onboarding.length,
|
|||
|
|
permissionLevel: req.user.permissionLevel,
|
|||
|
|
script: state.completed ? null : onboardingScript.onboarding[state.currentRound - 1]
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// ====== 开始/推进引导 ======
|
|||
|
|
router.post('/onboarding/start',
|
|||
|
|
authMiddleware.requireAuth,
|
|||
|
|
function(req, res) {
|
|||
|
|
var devId = req.user.devId;
|
|||
|
|
var state = onboardingState.get(devId);
|
|||
|
|
|
|||
|
|
if (!state) {
|
|||
|
|
// 开始新引导
|
|||
|
|
state = { currentRound: 1, completed: false, startedAt: new Date().toISOString() };
|
|||
|
|
onboardingState.set(devId, state);
|
|||
|
|
} else if (!state.completed) {
|
|||
|
|
// 推进到下一轮
|
|||
|
|
if (state.currentRound < onboardingScript.onboarding.length) {
|
|||
|
|
state.currentRound++;
|
|||
|
|
} else {
|
|||
|
|
state.completed = true;
|
|||
|
|
state.completedAt = new Date().toISOString();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var script = state.completed ? null : onboardingScript.onboarding[state.currentRound - 1];
|
|||
|
|
|
|||
|
|
res.json({
|
|||
|
|
currentRound: state.currentRound,
|
|||
|
|
totalRounds: onboardingScript.onboarding.length,
|
|||
|
|
completed: state.completed,
|
|||
|
|
script: script
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// ====== 完成引导(自动升级权限)======
|
|||
|
|
router.post('/onboarding/complete',
|
|||
|
|
authMiddleware.requireAuth,
|
|||
|
|
function(req, res) {
|
|||
|
|
var devId = req.user.devId;
|
|||
|
|
var state = onboardingState.get(devId);
|
|||
|
|
|
|||
|
|
if (!state) {
|
|||
|
|
return res.status(400).json({
|
|||
|
|
error: true,
|
|||
|
|
code: 'NOT_STARTED',
|
|||
|
|
message: '引导尚未开始'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 标记完成
|
|||
|
|
state.completed = true;
|
|||
|
|
state.completedAt = new Date().toISOString();
|
|||
|
|
|
|||
|
|
// 自动升级权限:Level 0 → Level 1
|
|||
|
|
var devConfig = permissions.DEV_PERMISSIONS[devId];
|
|||
|
|
if (devConfig && devConfig.level === 0) {
|
|||
|
|
devConfig.level = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
previousLevel: 0,
|
|||
|
|
newLevel: devConfig ? devConfig.level : 0,
|
|||
|
|
reply: '🎉 恭喜!你已完成认知引导。\n\n你的权限已从「👀 观察者」升级为「📖 学习者」。\n现在可以在预览站创建工单、提交日志、触发部署了。\n\n有什么问题随时找我。'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// ====== 获取可用工具列表 ======
|
|||
|
|
router.get('/tools',
|
|||
|
|
authMiddleware.requireAuth,
|
|||
|
|
function(req, res) {
|
|||
|
|
var available = intentRouter.getAvailableTools(req.user);
|
|||
|
|
|
|||
|
|
res.json({
|
|||
|
|
dev_id: req.user.devId,
|
|||
|
|
permission_level: req.user.permissionLevel,
|
|||
|
|
permission_label: req.user.permissionLabel,
|
|||
|
|
environment: req.user.environment,
|
|||
|
|
tools_count: available.length,
|
|||
|
|
tools: available
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
module.exports = router;
|