SaaS_Backend / dist /routes /knowledge-base.js
ChiragPatankar's picture
Upload 24 files
6980b1d verified
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = __importDefault(require("express"));
const multer_1 = __importDefault(require("multer"));
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const database_1 = require("../db/database");
const router = express_1.default.Router();
// Configure multer for file uploads
const storage = multer_1.default.diskStorage({
destination: (req, file, cb) => {
const uploadDir = process.env.UPLOAD_DIR || './uploads';
if (!fs_1.default.existsSync(uploadDir)) {
fs_1.default.mkdirSync(uploadDir, { recursive: true });
}
cb(null, uploadDir);
},
filename: (req, file, cb) => {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
cb(null, file.fieldname + '-' + uniqueSuffix + path_1.default.extname(file.originalname));
}
});
const upload = (0, multer_1.default)({
storage,
limits: {
fileSize: parseInt(process.env.MAX_FILE_SIZE || '10485760') // 10MB default
},
fileFilter: (req, file, cb) => {
const allowedTypes = ['.pdf', '.docx', '.txt', '.md'];
const ext = path_1.default.extname(file.originalname).toLowerCase();
if (allowedTypes.includes(ext)) {
cb(null, true);
}
else {
cb(new Error('Invalid file type. Only PDF, DOCX, TXT, and MD files are allowed.'));
}
}
});
// Get knowledge base documents
router.get('/', async (req, res) => {
try {
const { tenantId } = req.user;
const documents = await database_1.database.query('SELECT id, name, type, source, status, size, created_at, updated_at FROM knowledge_base WHERE tenant_id = ? ORDER BY created_at DESC', [tenantId]);
res.json({ documents });
}
catch (error) {
console.error('Get knowledge base error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
// Upload document
router.post('/upload', upload.single('document'), async (req, res) => {
try {
const { tenantId } = req.user;
if (!req.file) {
return res.status(400).json({ error: 'No file uploaded' });
}
const { originalname, filename, size, mimetype } = req.file;
const fileType = path_1.default.extname(originalname).toLowerCase().substring(1);
// Save to database
const result = await database_1.database.run('INSERT INTO knowledge_base (tenant_id, name, type, source, status, size, metadata) VALUES (?, ?, ?, ?, ?, ?, ?)', [
tenantId,
originalname,
fileType,
filename,
'processing',
size,
JSON.stringify({ mimetype, uploadedAt: new Date().toISOString() })
]);
// Log analytics event
await database_1.database.run('INSERT INTO analytics_events (tenant_id, event_type, event_data) VALUES (?, ?, ?)', [tenantId, 'document_uploaded', JSON.stringify({
documentId: result.lastID,
type: fileType,
size
})]);
res.status(201).json({
id: result.lastID,
name: originalname,
type: fileType,
status: 'processing',
message: 'Document uploaded successfully'
});
}
catch (error) {
console.error('Upload document error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
// Add website URL
router.post('/url', async (req, res) => {
try {
const { tenantId } = req.user;
const { url, name } = req.body;
if (!url) {
return res.status(400).json({ error: 'URL is required' });
}
// Basic URL validation
try {
new URL(url);
}
catch {
return res.status(400).json({ error: 'Invalid URL format' });
}
const displayName = name || new URL(url).hostname;
// Save to database
const result = await database_1.database.run('INSERT INTO knowledge_base (tenant_id, name, type, source, status, metadata) VALUES (?, ?, ?, ?, ?, ?)', [
tenantId,
displayName,
'website',
url,
'processing',
JSON.stringify({ addedAt: new Date().toISOString() })
]);
// Log analytics event
await database_1.database.run('INSERT INTO analytics_events (tenant_id, event_type, event_data) VALUES (?, ?, ?)', [tenantId, 'website_added', JSON.stringify({
documentId: result.lastID,
url
})]);
res.status(201).json({
id: result.lastID,
name: displayName,
type: 'website',
source: url,
status: 'processing',
message: 'Website added successfully'
});
}
catch (error) {
console.error('Add URL error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
// Delete document
router.delete('/:documentId', async (req, res) => {
try {
const { tenantId } = req.user;
const { documentId } = req.params;
// Get document info
const document = await database_1.database.get('SELECT * FROM knowledge_base WHERE id = ? AND tenant_id = ?', [documentId, tenantId]);
if (!document) {
return res.status(404).json({ error: 'Document not found' });
}
// Delete file if it's a uploaded document
if (document.type !== 'website') {
const filePath = path_1.default.join(process.env.UPLOAD_DIR || './uploads', document.source);
if (fs_1.default.existsSync(filePath)) {
fs_1.default.unlinkSync(filePath);
}
}
// Delete from database
await database_1.database.run('DELETE FROM knowledge_base WHERE id = ? AND tenant_id = ?', [documentId, tenantId]);
// Log analytics event
await database_1.database.run('INSERT INTO analytics_events (tenant_id, event_type, event_data) VALUES (?, ?, ?)', [tenantId, 'document_deleted', JSON.stringify({
documentId,
name: document.name,
type: document.type
})]);
res.json({ message: 'Document deleted successfully' });
}
catch (error) {
console.error('Delete document error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
// Update document status (for processing updates)
router.put('/:documentId/status', async (req, res) => {
try {
const { tenantId } = req.user;
const { documentId } = req.params;
const { status } = req.body;
if (!['processing', 'active', 'error'].includes(status)) {
return res.status(400).json({ error: 'Invalid status' });
}
await database_1.database.run('UPDATE knowledge_base SET status = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND tenant_id = ?', [status, documentId, tenantId]);
res.json({ message: 'Document status updated successfully' });
}
catch (error) {
console.error('Update document status error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
// Get document by ID
router.get('/:documentId', async (req, res) => {
try {
const { tenantId } = req.user;
const { documentId } = req.params;
const document = await database_1.database.get('SELECT * FROM knowledge_base WHERE id = ? AND tenant_id = ?', [documentId, tenantId]);
if (!document) {
return res.status(404).json({ error: 'Document not found' });
}
res.json({
...document,
metadata: JSON.parse(document.metadata || '{}')
});
}
catch (error) {
console.error('Get document error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
exports.default = router;
//# sourceMappingURL=knowledge-base.js.map