UNPKG

mira-app-server

Version:

Mira Server - standalone server application using mira-app-core

119 lines 5.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DatabaseRoutes = void 0; const express_1 = require("express"); class DatabaseRoutes { constructor(backend) { this.backend = backend; this.router = (0, express_1.Router)(); this.setupRoutes(); } getLibraryService(libraryId) { const libraryObj = this.backend.libraries.getLibrary(libraryId); if (!libraryObj?.libraryService) return null; if (!this.backend.libraries.isLibraryActive(libraryId)) return null; return libraryObj.libraryService; } setupRoutes() { // 获取数据库表列表 this.router.get('/tables', async (req, res) => { try { const libraryId = req.query.libraryId; if (!libraryId) { return res.status(400).json({ error: 'libraryId is required' }); } const service = this.getLibraryService(libraryId); if (!service) { return res.status(404).json({ error: 'Library not found or inactive' }); } // 查询 SQLite 真实表列表 const tables = []; const tableNames = await service.getSql("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name"); for (const row of tableNames) { const name = row.name; const countResult = await service.getSql(`SELECT COUNT(*) as cnt FROM "${name}"`); const schemaResult = await service.getSql(`PRAGMA table_info("${name}")`); const schemaStr = schemaResult.map((c) => `${c.name}(${c.type})`).join(', '); tables.push({ name, schema: schemaStr, rowCount: countResult[0]?.cnt || 0, }); } res.json(tables); } catch (error) { console.error('Error getting database tables:', error); res.status(500).json({ error: 'Failed to get database tables' }); } }); // 获取表数据 this.router.get('/tables/:tableName/data', async (req, res) => { try { const { tableName } = req.params; const libraryId = req.query.libraryId; const limit = Math.min(parseInt(req.query.limit) || 100, 1000); const offset = parseInt(req.query.offset) || 0; if (!libraryId) { return res.status(400).json({ error: 'libraryId is required' }); } const service = this.getLibraryService(libraryId); if (!service) { return res.status(404).json({ error: 'Library not found or inactive' }); } const data = await service.getSql(`SELECT * FROM "${tableName}" LIMIT ? OFFSET ?`, [limit, offset]); res.json(data); } catch (error) { console.error('Error getting table data:', error); res.status(500).json({ error: 'Failed to get table data' }); } }); // 获取表结构 this.router.get('/tables/:tableName/schema', async (req, res) => { try { const { tableName } = req.params; const libraryId = req.query.libraryId; if (!libraryId) { return res.status(400).json({ error: 'libraryId is required' }); } const service = this.getLibraryService(libraryId); if (!service) { return res.status(404).json({ error: 'Library not found or inactive' }); } const schema = await service.getSql(`PRAGMA table_info("${tableName}")`); res.json(schema); } catch (error) { console.error('Error getting table schema:', error); res.status(500).json({ error: 'Failed to get table schema' }); } }); // SQL 查询 this.router.post('/query', async (req, res) => { try { const { sql, libraryId } = req.body; if (!sql || !libraryId) { return res.status(400).json({ error: 'sql and libraryId are required' }); } const service = this.getLibraryService(libraryId); if (!service) { return res.status(404).json({ error: 'Library not found or inactive' }); } const result = await service.getSql(sql); res.json(result); } catch (error) { console.error('Error executing SQL:', error); res.status(500).json({ error: 'Failed to execute SQL' }); } }); } getRouter() { return this.router; } } exports.DatabaseRoutes = DatabaseRoutes; //# sourceMappingURL=DatabaseRoutes.js.map