You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/meta/settings.js

109 lines
2.7 KiB
JavaScript

11 years ago
'use strict';
const db = require('../database');
const plugins = require('../plugins');
5 years ago
const Meta = require('./index');
const pubsub = require('../pubsub');
const Settings = module.exports;
11 years ago
Settings.get = async function (hash) {
const data = await db.getObject('settings:' + hash) || {};
const sortedLists = await db.getSetMembers('settings:' + hash + ':sorted-lists');
11 years ago
await Promise.all(sortedLists.map(async function (list) {
const members = await db.getSortedSetRange('settings:' + hash + ':sorted-list:' + list, 0, -1) || [];
const keys = [];
data[list] = [];
for (const order of members) {
keys.push('settings:' + hash + ':sorted-list:' + list + ':' + order);
}
const objects = await db.getObjects(keys);
objects.forEach(function (obj) {
data[list].push(obj);
});
}));
return data;
};
10 years ago
Settings.getOne = async function (hash, field) {
const data = await Settings.get(hash);
return data[field] !== undefined ? data[field] : null;
};
11 years ago
Settings.set = async function (hash, values, quiet) {
quiet = quiet || false;
const sortedLists = [];
for (const key in values) {
if (values.hasOwnProperty(key)) {
if (Array.isArray(values[key]) && typeof values[key][0] !== 'string') {
sortedLists.push(key);
}
}
8 years ago
}
if (sortedLists.length) {
await db.delete('settings:' + hash + ':sorted-lists');
await db.setAdd('settings:' + hash + ':sorted-lists', sortedLists);
await Promise.all(sortedLists.map(async function (list) {
await db.delete('settings:' + hash + ':sorted-list:' + list);
await Promise.all(values[list].map(async function (data, order) {
await db.delete('settings:' + hash + ':sorted-list:' + list + ':' + order);
}));
}));
const ops = [];
sortedLists.forEach(function (list) {
const arr = values[list];
delete values[list];
arr.forEach(function (data, order) {
ops.push(db.sortedSetAdd('settings:' + hash + ':sorted-list:' + list, order, order));
ops.push(db.setObject('settings:' + hash + ':sorted-list:' + list + ':' + order, data));
});
});
await Promise.all(ops);
}
if (Object.keys(values).length) {
await db.setObject('settings:' + hash, values);
}
plugins.fireHook('action:settings.set', {
plugin: hash,
settings: values,
});
pubsub.publish('action:settings.set.' + hash, values);
Meta.reloadRequired = !quiet;
};
11 years ago
Settings.setOne = async function (hash, field, value) {
const data = {};
8 years ago
data[field] = value;
await Settings.set(hash, data);
};
11 years ago
Settings.setOnEmpty = async function (hash, values) {
const settings = await Settings.get(hash) || {};
const empty = {};
Object.keys(values).forEach(function (key) {
if (!settings.hasOwnProperty(key)) {
empty[key] = values[key];
}
});
if (Object.keys(empty).length) {
await Settings.set(hash, empty);
}
8 years ago
};