Files
NodeBB/src/rewards/admin.js

81 lines
2.2 KiB
JavaScript
Raw Normal View History

2017-02-18 01:56:23 -07:00
'use strict';
2015-02-19 14:20:13 -05:00
2019-09-15 22:41:25 -04:00
const plugins = require('../plugins');
const db = require('../database');
const utils = require('../utils');
2019-09-15 22:41:25 -04:00
const rewards = module.exports;
2015-02-19 14:20:13 -05:00
2019-09-15 22:41:25 -04:00
rewards.save = async function (data) {
async function save(data) {
2015-02-20 19:29:57 -05:00
if (!Object.keys(data.rewards).length) {
2019-09-15 22:41:25 -04:00
return;
2015-02-20 19:29:57 -05:00
}
2019-09-15 22:41:25 -04:00
const rewardsData = data.rewards;
2015-02-20 19:29:57 -05:00
delete data.rewards;
2019-09-15 22:41:25 -04:00
if (!parseInt(data.id, 10)) {
data.id = await db.incrObjectField('global', 'rewards:id');
2016-08-16 19:46:59 +02:00
}
2019-09-15 22:41:25 -04:00
await rewards.delete(data);
await db.setAdd('rewards:list', data.id);
await db.setObject('rewards:id:' + data.id, data);
await db.setObject('rewards:id:' + data.id + ':rewards', rewardsData);
}
2016-08-16 19:46:59 +02:00
2019-09-15 22:41:25 -04:00
await Promise.all(data.map(data => save(data)));
await saveConditions(data);
};
2015-02-19 14:20:13 -05:00
2019-09-15 22:41:25 -04:00
rewards.delete = async function (data) {
await Promise.all([
db.setRemove('rewards:list', data.id),
db.delete('rewards:id:' + data.id),
db.delete('rewards:id:' + data.id + ':rewards'),
]);
2015-02-19 23:49:36 -05:00
};
2019-09-15 22:41:25 -04:00
rewards.get = async function () {
return await utils.promiseParallel({
active: getActiveRewards(),
conditions: plugins.hooks.fire('filter:rewards.conditions', []),
conditionals: plugins.hooks.fire('filter:rewards.conditionals', []),
rewards: plugins.hooks.fire('filter:rewards.rewards', []),
2019-09-15 22:41:25 -04:00
});
2015-02-19 14:20:13 -05:00
};
2019-09-15 22:41:25 -04:00
async function saveConditions(data) {
const rewardsPerCondition = {};
await db.delete('conditions:active');
const conditions = [];
2015-02-20 12:16:13 -05:00
2019-09-15 22:41:25 -04:00
data.forEach(function (reward) {
conditions.push(reward.condition);
rewardsPerCondition[reward.condition] = rewardsPerCondition[reward.condition] || [];
rewardsPerCondition[reward.condition].push(reward.id);
2015-02-20 12:16:13 -05:00
});
2019-09-15 22:41:25 -04:00
await db.setAdd('conditions:active', conditions);
2019-09-15 22:41:25 -04:00
await Promise.all(Object.keys(rewardsPerCondition).map(c => db.setAdd('condition:' + c + ':rewards', rewardsPerCondition[c])));
}
2019-09-15 22:41:25 -04:00
async function getActiveRewards() {
async function load(id) {
const [main, rewards] = await Promise.all([
db.getObject('rewards:id:' + id),
db.getObject('rewards:id:' + id + ':rewards'),
]);
if (main) {
main.disabled = main.disabled === 'true';
main.rewards = rewards;
2016-08-16 19:46:59 +02:00
}
2019-09-15 22:41:25 -04:00
return main;
}
2016-08-16 19:46:59 +02:00
2019-09-15 22:41:25 -04:00
const rewardsList = await db.getSetMembers('rewards:list');
const rewardData = await Promise.all(rewardsList.map(id => load(id)));
return rewardData.filter(Boolean);
2015-02-19 14:20:13 -05:00
}
require('../promisify')(rewards);