This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Zaimki/server/notify.js

73 lines
2.6 KiB
JavaScript
Raw Normal View History

2021-09-07 10:11:15 -07:00
require('../src/dotenv')();
2020-10-12 02:46:26 -07:00
const dbConnection = require('./db');
2020-10-31 13:33:59 -07:00
const mailer = require('../src/mailer');
2021-04-05 05:15:57 -07:00
// TODO duplication...
const isGranted = (user, locale, area) => {
if (area === '*') {
return user.roles.split('|').includes('*');
}
for (let permission of user.roles.split('|')) {
if (permission === '*') {
return true;
}
const [ permissionLocale, permissionArea ] = permission.split('-');
2021-07-24 10:43:17 -07:00
if ((permissionLocale === '*' || permissionLocale === locale || locale === null) && (permissionArea === '*' || permissionArea === area)) {
2021-04-05 05:15:57 -07:00
return true;
}
}
return false;
}
async function notify() {
2020-10-12 02:46:26 -07:00
const db = await dbConnection();
const awaitingModeration = [
...(await db.all(`SELECT 'nouns' as type, locale, count(*) as c FROM nouns WHERE approved = 0 AND deleted=0 GROUP BY locale`)),
...(await db.all(`SELECT 'inclusive' as type, locale, count(*) as c FROM inclusive WHERE approved = 0 AND deleted=0 GROUP BY locale`)),
...(await db.all(`SELECT 'terms' as type, locale, count(*) as c FROM terms WHERE approved = 0 AND deleted=0 GROUP BY locale`)),
2020-12-06 06:23:18 -08:00
...(await db.all(`SELECT 'sources' as type, locale, count(*) as c FROM sources WHERE approved = 0 AND deleted=0 GROUP BY locale`)),
2021-09-25 05:57:05 -07:00
...(await db.all(`SELECT 'names' as type, locale, count(*) as c FROM names WHERE approved = 0 AND deleted=0 GROUP BY locale`)),
2021-07-24 10:43:17 -07:00
...(await db.all(`SELECT 'reports' as type, null as locale, count(*) as c FROM reports WHERE isHandled = 0`)),
2021-12-23 05:16:33 -08:00
].filter(r => r.c > 0);
if (!awaitingModeration.length) {
console.log('No entries awaiting moderation');
return;
}
2021-04-05 05:15:57 -07:00
const admins = await db.all(`SELECT email, roles FROM users WHERE roles != ''`);
const awaitingModerationGrouped = {}
let count = 0;
for (let m of awaitingModeration) {
2021-04-05 05:15:57 -07:00
for (let admin of admins) {
if (isGranted(admin, m.locale, m.type)) {
if (awaitingModerationGrouped[admin.email] === undefined) {
awaitingModerationGrouped[admin.email] = {};
}
2021-07-24 10:43:17 -07:00
awaitingModerationGrouped[admin.email][(m.locale || '*') + '-' + m.type] = m.c;
2021-04-05 05:15:57 -07:00
}
}
count += m.c;
}
2021-04-05 05:15:57 -07:00
console.log('Entries awaiting moderation: ', count);
2021-04-05 05:15:57 -07:00
for (let email in awaitingModerationGrouped) {
if (!awaitingModerationGrouped.hasOwnProperty(email)) {
continue;
}
2021-12-03 13:39:08 -08:00
const stats = awaitingModerationGrouped[email];
console.log('Sending email:', email, stats);
2021-12-03 13:39:08 -08:00
mailer(email, 'notify', { stats });
}
2021-05-18 09:23:52 -07:00
await db.close();
}
notify();