@digitalnodecom/node-red-contrib-analyzer
Version:
A Node-RED global service that monitors function nodes for debugging artifacts and performance issues. Features real-time quality metrics, Vue.js dashboard, and comprehensive code analysis.
248 lines (215 loc) • 8.44 kB
JavaScript
const { getDatabase } = require('../../database/db');
// Get all settings grouped by category
async function getSettings(req, res) {
try {
const db = req.db || getDatabase();
const settings = await db.all(`
SELECT key, value, description, category, type
FROM settings
ORDER BY category, key
`);
// Create both grouped and flat formats
const groupedSettings = settings.reduce((acc, setting) => {
if (!acc[setting.category]) {
acc[setting.category] = [];
}
// Convert value based on type
let convertedValue = setting.value;
if (setting.type === 'boolean') {
convertedValue = setting.value === 'true';
} else if (setting.type === 'number') {
convertedValue = parseFloat(setting.value);
}
acc[setting.category].push({
key: setting.key,
value: convertedValue,
description: setting.description,
type: setting.type
});
return acc;
}, {});
// Also create a flat settings object for easier frontend consumption
const flatSettings = settings.reduce((acc, setting) => {
let convertedValue = setting.value;
if (setting.type === 'boolean') {
convertedValue = setting.value === 'true';
} else if (setting.type === 'number') {
convertedValue = parseFloat(setting.value);
}
acc[setting.key] = convertedValue;
return acc;
}, {});
res.json({
settings: flatSettings, // Use flat format for current Settings.vue
grouped: groupedSettings, // Keep grouped format for future use
categories: Object.keys(groupedSettings).sort()
});
} catch (error) {
console.error('Error getting settings:', error);
res.status(500).json({ error: 'Failed to get settings' });
}
}
// Update a specific setting
async function updateSetting(req, res) {
try {
const { key } = req.params;
const { value } = req.body;
if (!key || value === undefined) {
return res.status(400).json({ error: 'Key and value are required' });
}
const db = req.db || getDatabase();
// Convert value to string for storage
const stringValue = typeof value === 'boolean' ? value.toString() : value.toString();
const result = await db.run(`
UPDATE settings
SET value = ?, updated_at = CURRENT_TIMESTAMP
WHERE key = ?
`, [stringValue, key]);
if (result.changes === 0) {
return res.status(404).json({ error: 'Setting not found' });
}
res.json({
success: true,
key,
value,
message: 'Setting updated successfully'
});
} catch (error) {
console.error('Error updating setting:', error);
res.status(500).json({ error: 'Failed to update setting' });
}
}
// Update multiple settings at once
async function updateSettings(req, res) {
try {
const { settings } = req.body;
if (!settings || typeof settings !== 'object') {
return res.status(400).json({ error: 'Settings object is required' });
}
const db = req.db || getDatabase();
const results = [];
for (const [key, value] of Object.entries(settings)) {
try {
const stringValue = typeof value === 'boolean' ? value.toString() : value.toString();
// Use INSERT OR REPLACE to ensure settings are always saved
const result = await db.run(`
UPDATE settings
SET value = ?, updated_at = CURRENT_TIMESTAMP
WHERE key = ?
`, [stringValue, key]);
// If no rows were updated, the key doesn't exist in the database
if (result.changes === 0) {
console.warn(`Setting key '${key}' not found in database, skipping`);
results.push({ key, value, success: false, error: `Setting '${key}' not found` });
} else {
results.push({ key, value, success: true });
}
} catch (error) {
console.error(`Error updating setting ${key}:`, error);
results.push({ key, value, success: false, error: error.message });
}
}
const successCount = results.filter(r => r.success).length;
const failureCount = results.filter(r => !r.success).length;
res.json({
success: failureCount === 0, // Only success if all updates succeeded
results,
message: `Updated ${successCount} settings${failureCount > 0 ? `, ${failureCount} failed` : ''}`,
details: {
total: results.length,
successful: successCount,
failed: failureCount,
failures: results.filter(r => !r.success)
}
});
} catch (error) {
console.error('Error updating settings:', error);
res.status(500).json({ error: 'Failed to update settings' });
}
}
// Get a specific setting by key
async function getSetting(req, res) {
try {
const { key } = req.params;
const db = req.db || getDatabase();
const setting = await db.get(`
SELECT key, value, description, category, type
FROM settings
WHERE key = ?
`, [key]);
if (!setting) {
return res.status(404).json({ error: 'Setting not found' });
}
// Convert value based on type
let convertedValue = setting.value;
if (setting.type === 'boolean') {
convertedValue = setting.value === 'true';
} else if (setting.type === 'number') {
convertedValue = parseFloat(setting.value);
}
res.json({
key: setting.key,
value: convertedValue,
description: setting.description,
category: setting.category,
type: setting.type
});
} catch (error) {
console.error('Error getting setting:', error);
res.status(500).json({ error: 'Failed to get setting' });
}
}
// Reset settings to defaults
async function resetSettings(req, res) {
try {
const db = req.db || getDatabase();
// Get default settings (this would ideally be stored in the database or config)
const defaultValues = {
codeAnalysis: 'true',
scanInterval: '30',
detectionLevel: '1',
autoStart: 'true',
queueScanning: 'false',
queueMessageFrequency: '1800',
queueScanMode: 'all',
queueLengthThreshold: '0',
performanceMonitoring: 'false',
performanceInterval: '10',
cpuThreshold: '75',
memoryThreshold: '80',
eventLoopThreshold: '20',
sustainedAlertDuration: '300',
alertCooldown: '1800',
dbRetentionDays: '7',
slackWebhookUrl: ''
};
const results = [];
for (const [key, value] of Object.entries(defaultValues)) {
try {
await db.run(`
UPDATE settings
SET value = ?, updated_at = CURRENT_TIMESTAMP
WHERE key = ?
`, [value, key]);
results.push({ key, success: true });
} catch (error) {
results.push({ key, success: false, error: error.message });
}
}
res.json({
success: true,
results,
message: 'Settings reset to defaults'
});
} catch (error) {
console.error('Error resetting settings:', error);
res.status(500).json({ error: 'Failed to reset settings' });
}
}
module.exports = {
getSettings,
updateSetting,
updateSettings,
getSetting,
resetSettings
};