149 lines
4.7 KiB
JavaScript
Raw Normal View History

/**
* /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;