zhizhi/persona-studio/backend/routes/dashboard-api.js

99 lines
3.3 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.

// ══ BC-集成-005 新增: 开发者详情 ══
const express = require('express');
const router = express.Router();
const axios = require('axios');
// GET /api/dashboard/dev/:id
router.get('/dev/:id', async function(req, res) {
try {
var devId = req.params.id;
var resp = await axios.post(
'https://api.notion.com/v1/databases/' + process.env.DASHBOARD_DATABASE_ID + '/query',
{
filter: {
property: '孕育者',
rich_text: { contains: devId }
}
},
{
headers: {
'Authorization': 'Bearer ' + process.env.NOTION_TOKEN,
'Notion-Version': '2022-06-28',
'Content-Type': 'application/json'
}
}
);
var results = resp.data.results;
if (results.length === 0) {
return res.json({ source: 'notion', data: null, message: '未找到该开发者' });
}
var devModules = results.map(function(page) {
var p = page.properties;
function gt(prop) {
if (!prop) return '';
if (prop.title) return prop.title.map(function(t) {return t.plain_text;}).join('');
if (prop.rich_text) return prop.rich_text.map(function(t) {return t.plain_text;}).join('');
if (prop.select) return prop.select ? prop.select.name : '';
if (prop.status) return prop.status ? prop.status.name : '';
if (prop.checkbox !== undefined) return prop.checkbox;
return '';
}
return {
name: gt(p['名称']),
developer: gt(p['孕育者']),
status: gt(p['对接状态']),
version: gt(p['当前版本']),
persona: gt(p['宝宝人格体']),
notes: gt(p['备注']),
type: gt(p['类型'])
};
});
res.json({ source: 'notion', dev_id: devId, data: devModules });
} catch (err) {
console.log(' 开发者详情查询失败', err.message);
res.json({ source: 'fallback', data: {} });
}
});
// GET /api/dashboard/modules
router.get('/modules', async function(req, res) {
try {
var resp = await axios.post(
'https://api.notion.com/v1/databases/' + process.env.MODULE_DATABASE_ID + '/query',
{},
{
headers: {
'Authorization': 'Bearer ' + process.env.NOTION_TOKEN,
'Notion-Version': '2022-06-28',
'Content-Type': 'application/json'
}
}
);
var modules = resp.data.results.map(function(page) {
var p = page.properties;
function gt(prop) {
if (!prop) return '';
if (prop.title) return prop.title.map(function(t){return t.plain_text;}).join('');
if (prop.rich_text) return prop.rich_text.map(function(t){return t.plain_text;}).join('');
if (prop.select) return prop.select ? prop.select.name : '';
if (prop.multi_select) return prop.multi_select.map(function(s){return s.name;}).join(', ');
return '';
}
return {
module_id: gt(p['模块编号']),
name: gt(p['模块名称']),
status: gt(p['状态']),
developer: gt(p['执行者']),
tags: gt(p['功能标签']),
domain: gt(p['数据域'])
};
});
res.json({ source: 'notion', data: modules });
} catch (err) {
console.log('❌ 模块列表查询失败:', err.message);
res.json({ source: 'fallback', data: {} });
}
});
module.exports = router;