mailtrain/lib/models/settings.js
Tomas Bures a6d25e668b Release candidate of the selectable unsubscription
Implemented the resubscription process - i.e. pre-filling in the form when the subscription link is clicked in the unsubscription notice.
2017-05-04 17:42:46 -04:00

77 lines
2.2 KiB
JavaScript

'use strict';
let tools = require('../tools');
let db = require('../db');
module.exports = {
list: listValues,
get: getValue,
set: setValue
};
function listValues(filter, callback) {
if (!callback && typeof filter === 'function') {
callback = filter;
filter = false;
}
// TODO: It would be good to cache the settings. It feels awkward to always go to DB to retrieve something what is essentially a constant
filter = [].concat(filter || []).map(key => tools.toDbKey(key));
db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
let query;
if (filter.length) {
query = 'SELECT * FROM settings WHERE `key` IN (' + filter.map(() => '?').join(',') + ')';
} else {
query = 'SELECT * FROM settings';
}
connection.query(query, filter, (err, rows) => {
connection.release();
if (err) {
return callback(err);
}
let settings = {};
(rows || []).forEach(row => {
settings[row.key] = row.value;
});
return callback(null, tools.convertKeys(settings));
});
});
}
function getValue(key, callback) {
db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
connection.query('SELECT `value` FROM settings WHERE `key`=?', [tools.toDbKey(key)], (err, rows) => {
connection.release();
if (err) {
return callback(err);
}
return callback(null, rows && rows[0] && rows[0].value || false);
});
});
}
function setValue(key, value, callback) {
db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
connection.query('INSERT INTO settings (`key`, `value`) VALUES (?,?) ON DUPLICATE KEY UPDATE `key`=?, `value`=?', [key, value, key, value], (err, response) => {
connection.release();
if (err) {
return callback(err);
}
return callback(null, response && response.insertId || 0);
});
});
}