Files
Docker-Proxy/hubcmdui/services/documentationServiceDB.js

243 lines
6.4 KiB
JavaScript

/**
* 基于SQLite的文档服务模块
*/
const logger = require('../logger');
const database = require('../database/database');
class DocumentationServiceDB {
/**
* 获取文档列表
*/
async getDocumentationList() {
try {
const documents = await database.all(
'SELECT doc_id, title, published, created_at, updated_at FROM documents ORDER BY updated_at DESC'
);
return documents.map(doc => ({
id: doc.doc_id,
title: doc.title,
published: Boolean(doc.published),
createdAt: doc.created_at,
updatedAt: doc.updated_at
}));
} catch (error) {
logger.error('获取文档列表失败:', error);
throw error;
}
}
/**
* 获取已发布文档列表
*/
async getPublishedDocuments() {
try {
const documents = await database.all(
'SELECT doc_id, title, published, created_at, updated_at FROM documents WHERE published = 1 ORDER BY updated_at DESC'
);
return documents.map(doc => ({
id: doc.doc_id,
title: doc.title,
published: Boolean(doc.published),
createdAt: doc.created_at,
updatedAt: doc.updated_at
}));
} catch (error) {
logger.error('获取已发布文档列表失败:', error);
throw error;
}
}
/**
* 获取单个文档
*/
async getDocument(docId) {
try {
const document = await database.get(
'SELECT * FROM documents WHERE doc_id = ?',
[docId]
);
if (!document) {
return null;
}
return {
id: document.doc_id,
title: document.title,
content: document.content,
published: Boolean(document.published),
createdAt: document.created_at,
updatedAt: document.updated_at
};
} catch (error) {
logger.error(`获取文档 ${docId} 失败:`, error);
throw error;
}
}
/**
* 保存文档
*/
async saveDocument(docId, title, content, published = false) {
try {
const id = docId || Date.now().toString();
const now = new Date().toISOString();
const existingDoc = await database.get(
'SELECT id FROM documents WHERE doc_id = ?',
[id]
);
if (existingDoc) {
// 更新现有文档
await database.run(
'UPDATE documents SET title = ?, content = ?, published = ?, updated_at = ? WHERE doc_id = ?',
[title, content, published ? 1 : 0, now, id]
);
logger.info(`文档 ${id} 已更新`);
} else {
// 创建新文档
await database.run(
'INSERT INTO documents (doc_id, title, content, published, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)',
[id, title, content, published ? 1 : 0, now, now]
);
logger.info(`文档 ${id} 已创建`);
}
return {
id,
title,
content,
published: Boolean(published),
createdAt: existingDoc ? existingDoc.created_at : now,
updatedAt: now
};
} catch (error) {
logger.error('保存文档失败:', error);
throw error;
}
}
/**
* 删除文档
*/
async deleteDocument(docId) {
try {
const result = await database.run(
'DELETE FROM documents WHERE doc_id = ?',
[docId]
);
if (result.changes === 0) {
throw new Error(`文档 ${docId} 不存在`);
}
logger.info(`文档 ${docId} 已删除`);
return true;
} catch (error) {
logger.error(`删除文档 ${docId} 失败:`, error);
throw error;
}
}
/**
* 切换文档发布状态
*/
async toggleDocumentPublish(docId) {
try {
const document = await this.getDocument(docId);
const newPublishedStatus = !document.published;
await database.run(
'UPDATE documents SET published = ?, updated_at = ? WHERE doc_id = ?',
[newPublishedStatus ? 1 : 0, new Date().toISOString(), docId]
);
logger.info(`文档 ${docId} 发布状态已切换为: ${newPublishedStatus}`);
return {
...document,
published: newPublishedStatus,
updatedAt: new Date().toISOString()
};
} catch (error) {
logger.error(`切换文档 ${docId} 发布状态失败:`, error);
throw error;
}
}
/**
* 批量更新文档发布状态
*/
async batchUpdatePublishStatus(docIds, published) {
try {
const placeholders = docIds.map(() => '?').join(',');
const params = [...docIds, published ? 1 : 0, new Date().toISOString()];
const result = await database.run(
`UPDATE documents SET published = ?, updated_at = ? WHERE doc_id IN (${placeholders})`,
params
);
logger.info(`批量更新 ${result.changes} 个文档的发布状态`);
return result.changes;
} catch (error) {
logger.error('批量更新文档发布状态失败:', error);
throw error;
}
}
/**
* 搜索文档
*/
async searchDocuments(keyword, publishedOnly = false) {
try {
let sql = 'SELECT doc_id, title, published, created_at, updated_at FROM documents WHERE (title LIKE ? OR content LIKE ?)';
const params = [`%${keyword}%`, `%${keyword}%`];
if (publishedOnly) {
sql += ' AND published = 1';
}
sql += ' ORDER BY updated_at DESC';
const documents = await database.all(sql, params);
return documents.map(doc => ({
id: doc.doc_id,
title: doc.title,
published: Boolean(doc.published),
createdAt: doc.created_at,
updatedAt: doc.updated_at
}));
} catch (error) {
logger.error('搜索文档失败:', error);
throw error;
}
}
/**
* 获取文档统计信息
*/
async getDocumentStats() {
try {
const totalCount = await database.get('SELECT COUNT(*) as count FROM documents');
const publishedCount = await database.get('SELECT COUNT(*) as count FROM documents WHERE published = 1');
const unpublishedCount = await database.get('SELECT COUNT(*) as count FROM documents WHERE published = 0');
return {
total: totalCount.count,
published: publishedCount.count,
unpublished: unpublishedCount.count
};
} catch (error) {
logger.error('获取文档统计信息失败:', error);
throw error;
}
}
}
module.exports = new DocumentationServiceDB();