E-Commerce-Module/backend/src/models/SystemSettings.js

181 lines
No EOL
5.1 KiB
JavaScript

/**
* System settings model
* This module handles database operations for system settings
*/
/**
* Get all system settings
* @param {Object} db - Database connection pool
* @param {Function} query - Query function
* @returns {Promise<Array>} - Array of settings
*/
const getAllSettings = async (db, query) => {
try {
const result = await query(
'SELECT * FROM system_settings ORDER BY category, key'
);
return result.rows;
} catch (error) {
console.error('Error retrieving system settings:', error);
throw error;
}
};
/**
* Get settings by category
* @param {Object} db - Database connection pool
* @param {Function} query - Query function
* @param {string} category - Settings category
* @returns {Promise<Array>} - Array of settings in the category
*/
const getSettingsByCategory = async (db, query, category) => {
try {
const result = await query(
'SELECT * FROM system_settings WHERE category = $1 ORDER BY key',
[category]
);
return result.rows;
} catch (error) {
console.error(`Error retrieving ${category} settings:`, error);
throw error;
}
};
/**
* Get a specific setting
* @param {Object} db - Database connection pool
* @param {Function} query - Query function
* @param {string} key - Setting key
* @returns {Promise<Object>} - Setting value
*/
const getSetting = async (db, query, key) => {
try {
const result = await query(
'SELECT * FROM system_settings WHERE key = $1',
[key]
);
return result.rows[0];
} catch (error) {
console.error(`Error retrieving setting ${key}:`, error);
throw error;
}
};
/**
* Update a setting
* @param {Object} db - Database connection pool
* @param {Function} query - Query function
* @param {string} key - Setting key
* @param {string} value - Setting value
* @param {string} category - Setting category
* @returns {Promise<Object>} - Updated setting
*/
const updateSetting = async (db, query, key, value, category) => {
try {
// Check if setting exists
const existing = await query(
'SELECT * FROM system_settings WHERE key = $1',
[key]
);
if (existing.rows.length === 0) {
// Create new setting
const result = await query(
'INSERT INTO system_settings (key, value, category) VALUES ($1, $2, $3) RETURNING *',
[key, value, category]
);
return result.rows[0];
} else {
// Update existing setting
const result = await query(
'UPDATE system_settings SET value = $1, updated_at = NOW() WHERE key = $2 RETURNING *',
[value, key]
);
return result.rows[0];
}
} catch (error) {
console.error(`Error updating setting ${key}:`, error);
throw error;
}
};
/**
* Update multiple settings at once
* @param {Object} db - Database connection pool
* @param {Function} query - Query function
* @param {Array} settings - Array of settings objects {key, value, category}
* @returns {Promise<Array>} - Array of updated settings
*/
const updateSettings = async (db, query, settings) => {
const client = await db.connect();
try {
await client.query('BEGIN');
const updatedSettings = [];
for (const setting of settings) {
const { key, value, category } = setting;
// Check if setting exists
const existing = await client.query(
'SELECT * FROM system_settings WHERE key = $1',
[key]
);
let result;
if (existing.rows.length === 0) {
// Create new setting
result = await client.query(
'INSERT INTO system_settings (key, value, category) VALUES ($1, $2, $3) RETURNING *',
[key, value, category]
);
} else {
// Update existing setting
result = await client.query(
'UPDATE system_settings SET value = $1, updated_at = NOW() WHERE key = $2 RETURNING *',
[value, key]
);
}
updatedSettings.push(result.rows[0]);
}
await client.query('COMMIT');
return updatedSettings;
} catch (error) {
await client.query('ROLLBACK');
console.error('Error updating settings:', error);
throw error;
} finally {
client.release();
}
};
/**
* Delete a setting
* @param {Object} db - Database connection pool
* @param {Function} query - Query function
* @param {string} key - Setting key
* @returns {Promise<boolean>} - Success status
*/
const deleteSetting = async (db, query, key) => {
try {
await query(
'DELETE FROM system_settings WHERE key = $1',
[key]
);
return true;
} catch (error) {
console.error(`Error deleting setting ${key}:`, error);
throw error;
}
};
module.exports = {
getAllSettings,
getSettingsByCategory,
getSetting,
updateSetting,
updateSettings,
deleteSetting
};