2026-05-10 13:12:44 +08:00

137 lines
3.9 KiB
JavaScript
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.

/**
* 认知引导流程 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;