131 lines
3.1 KiB
JavaScript
131 lines
3.1 KiB
JavaScript
|
|
// Notion 同步模块 · sync-to-notion.js
|
|||
|
|
// GitHub → Notion(主控台进度回写)
|
|||
|
|
// HoloLake · M-DINGTALK Phase 3
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
const fs = require('fs');
|
|||
|
|
const path = require('path');
|
|||
|
|
|
|||
|
|
// Notion API配置(后续由霜砚提供真实Token)
|
|||
|
|
const NOTION_CONFIG = {
|
|||
|
|
apiBase: 'https://api.notion.com/v1',
|
|||
|
|
apiVersion: '2022-06-28',
|
|||
|
|
token: process.env.NOTION_TOKEN || 'mock-notion-token'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 回写日志
|
|||
|
|
const WRITEBACK_LOG = path.join(__dirname, '..', 'data', 'notion-writeback-log.json');
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 模拟回写进度到Notion主控台
|
|||
|
|
* (Phase 3先做模拟,Phase 4接入真实Notion API)
|
|||
|
|
*/
|
|||
|
|
async function updateProgress(syslogData) {
|
|||
|
|
console.log('[Notion Sync] 准备回写进度到Notion...');
|
|||
|
|
|
|||
|
|
const writebackRecord = {
|
|||
|
|
timestamp: new Date().toISOString(),
|
|||
|
|
dev_id: syslogData.dev_id,
|
|||
|
|
session_id: syslogData.session_id,
|
|||
|
|
status: syslogData.completion_status,
|
|||
|
|
target: 'notion-main-console'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 检查是否有真实Token
|
|||
|
|
if (NOTION_CONFIG.token === 'mock-notion-token') {
|
|||
|
|
console.log('[Notion Sync] ⚠️ 使用模拟模式(未配置Notion Token)');
|
|||
|
|
writebackRecord.mode = 'mock';
|
|||
|
|
writebackRecord.result = '模拟回写成功';
|
|||
|
|
|
|||
|
|
// 记录到本地日志
|
|||
|
|
saveWritebackLog(writebackRecord);
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
status: 'mock-success',
|
|||
|
|
message: '模拟回写完成(真实Token待配置)',
|
|||
|
|
record: writebackRecord
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 真实Notion API调用(Phase 4启用)
|
|||
|
|
try {
|
|||
|
|
// 未来这里会调用 Notion API
|
|||
|
|
// const response = await fetch(...);
|
|||
|
|
writebackRecord.mode = 'real';
|
|||
|
|
writebackRecord.result = '回写成功';
|
|||
|
|
|
|||
|
|
saveWritebackLog(writebackRecord);
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
status: 'success',
|
|||
|
|
record: writebackRecord
|
|||
|
|
};
|
|||
|
|
} catch (err) {
|
|||
|
|
writebackRecord.mode = 'real';
|
|||
|
|
writebackRecord.result = `回写失败: ${err.message}`;
|
|||
|
|
|
|||
|
|
saveWritebackLog(writebackRecord);
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
status: 'error',
|
|||
|
|
error: err.message
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 执行完整同步
|
|||
|
|
*/
|
|||
|
|
async function sync() {
|
|||
|
|
console.log('[Notion Sync] 执行Notion同步...');
|
|||
|
|
|
|||
|
|
// 读取回写日志
|
|||
|
|
const log = loadWritebackLog();
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
status: NOTION_CONFIG.token === 'mock-notion-token' ? 'mock-ready' : 'ready',
|
|||
|
|
totalWritebacks: log.length,
|
|||
|
|
lastWriteback: log.length > 0 ? log[0].timestamp : null,
|
|||
|
|
message: NOTION_CONFIG.token === 'mock-notion-token'
|
|||
|
|
? '模拟模式·等待真实Token配置'
|
|||
|
|
: 'Notion API已就绪'
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 保存回写日志
|
|||
|
|
*/
|
|||
|
|
function saveWritebackLog(record) {
|
|||
|
|
const logDir = path.dirname(WRITEBACK_LOG);
|
|||
|
|
if (!fs.existsSync(logDir)) {
|
|||
|
|
fs.mkdirSync(logDir, { recursive: true });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let log = loadWritebackLog();
|
|||
|
|
|
|||
|
|
log.unshift(record);
|
|||
|
|
|
|||
|
|
if (log.length > 100) log = log.slice(0, 100);
|
|||
|
|
|
|||
|
|
fs.writeFileSync(WRITEBACK_LOG, JSON.stringify(log, null, 2), 'utf-8');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 加载回写日志
|
|||
|
|
*/
|
|||
|
|
function loadWritebackLog() {
|
|||
|
|
if (fs.existsSync(WRITEBACK_LOG)) {
|
|||
|
|
try {
|
|||
|
|
return JSON.parse(fs.readFileSync(WRITEBACK_LOG, 'utf-8'));
|
|||
|
|
} catch {
|
|||
|
|
return [];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return [];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
module.exports = {
|
|||
|
|
updateProgress,
|
|||
|
|
sync
|
|||
|
|
};
|