149 lines
4.7 KiB
JavaScript
149 lines
4.7 KiB
JavaScript
|
|
/**
|
|||
|
|
* /api/databases/:name — 获取数据库数据路由
|
|||
|
|
* /api/syslogs — 获取最近 SYSLOG
|
|||
|
|
* /api/agents — 获取 Agent 注册表
|
|||
|
|
* /api/tickets — 获取活跃工单
|
|||
|
|
* /api/repo/status — 获取仓库状态
|
|||
|
|
*
|
|||
|
|
* 版权:国作登字-2026-A-00037559
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
'use strict';
|
|||
|
|
|
|||
|
|
var express = require('express');
|
|||
|
|
var router = express.Router();
|
|||
|
|
var notionService = require('../services/notion');
|
|||
|
|
var githubService = require('../services/github');
|
|||
|
|
var dbConfig = require('../config/databases');
|
|||
|
|
|
|||
|
|
// 通用数据库查询
|
|||
|
|
router.get('/databases/:name', async function(req, res) {
|
|||
|
|
var name = req.params.name;
|
|||
|
|
|
|||
|
|
var dbMap = {
|
|||
|
|
'agent-registry': dbConfig.agentRegistry,
|
|||
|
|
'syslog-recent': dbConfig.syslogInbox,
|
|||
|
|
'tickets-active': dbConfig.ticketBook,
|
|||
|
|
'maintenance-log': dbConfig.maintenanceLog,
|
|||
|
|
'receipt-tracker': dbConfig.receiptTracker
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
var dbId = dbMap[name];
|
|||
|
|
if (!dbId) {
|
|||
|
|
return res.status(404).json({
|
|||
|
|
error: true,
|
|||
|
|
code: 'DB_NOT_FOUND',
|
|||
|
|
message: '数据库不存在或未配置: ' + name
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
var sorts = null;
|
|||
|
|
var filter = null;
|
|||
|
|
var pageSize = 50;
|
|||
|
|
|
|||
|
|
// 不同数据库有不同的默认排序和筛选
|
|||
|
|
if (name === 'syslog-recent') {
|
|||
|
|
sorts = [{ property: 'Created time', direction: 'descending' }];
|
|||
|
|
} else if (name === 'tickets-active') {
|
|||
|
|
filter = { property: '状态', select: { does_not_equal: '已完成' } };
|
|||
|
|
sorts = [{ property: 'Created time', direction: 'descending' }];
|
|||
|
|
} else if (name === 'maintenance-log') {
|
|||
|
|
sorts = [{ property: 'Created time', direction: 'descending' }];
|
|||
|
|
pageSize = 20;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var result = await notionService.queryDB(dbId, filter, sorts, pageSize);
|
|||
|
|
res.json({
|
|||
|
|
synced: new Date().toISOString(),
|
|||
|
|
count: result.results ? result.results.length : 0,
|
|||
|
|
data: result.results || [],
|
|||
|
|
_source: 'realtime'
|
|||
|
|
});
|
|||
|
|
} catch (err) {
|
|||
|
|
console.error('[/api/databases/' + name + '] Error:', err.message);
|
|||
|
|
res.status(500).json({
|
|||
|
|
error: true,
|
|||
|
|
code: 'QUERY_FAILED',
|
|||
|
|
message: '数据库查询失败: ' + err.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 快捷路由:最近 SYSLOG
|
|||
|
|
router.get('/syslogs', async function(_req, res) {
|
|||
|
|
if (!dbConfig.syslogInbox) {
|
|||
|
|
return res.status(404).json({ error: true, code: 'DB_NOT_CONFIGURED', message: 'SYSLOG 数据库未配置' });
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
var result = await notionService.queryDB(dbConfig.syslogInbox, null,
|
|||
|
|
[{ property: 'Created time', direction: 'descending' }], 50);
|
|||
|
|
res.json({
|
|||
|
|
synced: new Date().toISOString(),
|
|||
|
|
count: result.results ? result.results.length : 0,
|
|||
|
|
data: result.results || [],
|
|||
|
|
_source: 'realtime'
|
|||
|
|
});
|
|||
|
|
} catch (err) {
|
|||
|
|
res.status(500).json({ error: true, code: 'QUERY_FAILED', message: err.message });
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 快捷路由:Agent 注册表
|
|||
|
|
router.get('/agents', async function(_req, res) {
|
|||
|
|
if (!dbConfig.agentRegistry) {
|
|||
|
|
return res.status(404).json({ error: true, code: 'DB_NOT_CONFIGURED', message: 'Agent 注册表未配置' });
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
var result = await notionService.queryDB(dbConfig.agentRegistry, null, null, 100);
|
|||
|
|
res.json({
|
|||
|
|
synced: new Date().toISOString(),
|
|||
|
|
count: result.results ? result.results.length : 0,
|
|||
|
|
data: result.results || [],
|
|||
|
|
_source: 'realtime'
|
|||
|
|
});
|
|||
|
|
} catch (err) {
|
|||
|
|
res.status(500).json({ error: true, code: 'QUERY_FAILED', message: err.message });
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 快捷路由:活跃工单
|
|||
|
|
router.get('/tickets', async function(_req, res) {
|
|||
|
|
if (!dbConfig.ticketBook) {
|
|||
|
|
return res.status(404).json({ error: true, code: 'DB_NOT_CONFIGURED', message: '工单簿未配置' });
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
var result = await notionService.queryDB(dbConfig.ticketBook,
|
|||
|
|
{ property: '状态', select: { does_not_equal: '已完成' } },
|
|||
|
|
[{ property: 'Created time', direction: 'descending' }], 50);
|
|||
|
|
res.json({
|
|||
|
|
synced: new Date().toISOString(),
|
|||
|
|
count: result.results ? result.results.length : 0,
|
|||
|
|
data: result.results || [],
|
|||
|
|
_source: 'realtime'
|
|||
|
|
});
|
|||
|
|
} catch (err) {
|
|||
|
|
res.status(500).json({ error: true, code: 'QUERY_FAILED', message: err.message });
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 仓库状态(GitHub API)
|
|||
|
|
router.get('/repo/status', async function(_req, res) {
|
|||
|
|
try {
|
|||
|
|
var status = await githubService.getRepoStatus('guanghulab');
|
|||
|
|
var commits = await githubService.getRecentCommits('guanghulab', 5);
|
|||
|
|
var workflows = await githubService.getWorkflowRuns('guanghulab', 5);
|
|||
|
|
res.json({
|
|||
|
|
repo: status,
|
|||
|
|
recent_commits: commits,
|
|||
|
|
recent_workflows: workflows,
|
|||
|
|
_source: 'realtime',
|
|||
|
|
timestamp: new Date().toISOString()
|
|||
|
|
});
|
|||
|
|
} catch (err) {
|
|||
|
|
res.status(500).json({ error: true, code: 'GITHUB_ERROR', message: err.message });
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
module.exports = router;
|