diff --git a/server/index.js b/server/index.js index 53bf966ee..f132457a2 100644 --- a/server/index.js +++ b/server/index.js @@ -6,7 +6,7 @@ import cookieParser from 'cookie-parser'; import grant from "grant"; import router from "./routes/user"; import { loadSuml } from './loader'; -import {buildLocaleList, isGranted} from "../src/helpers"; +import {isGranted} from "../src/helpers"; global.config = loadSuml('config'); @@ -25,8 +25,6 @@ app.use(session({ app.use(async function (req, res, next) { try { - req.config = global.config; - req.locales = buildLocaleList(global.config.locale); req.rawUser = authenticate(req); req.user = req.rawUser && req.rawUser.authenticated ? req.rawUser : null; req.isGranted = (area, locale = global.config.locale) => req.user && isGranted(req.user, locale, area); diff --git a/server/routes/admin.js b/server/routes/admin.js index 9b26a792e..821d858c8 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -2,7 +2,7 @@ import { Router } from 'express'; import SQL from 'sql-template-strings'; import avatar from '../avatar'; import {config as socialLoginConfig} from "../social"; -import {buildDict, now, shuffle, handleErrorAsync} from "../../src/helpers"; +import {buildDict, now, shuffle, handleErrorAsync, buildLocaleList} from "../../src/helpers"; import locales from '../../src/locales'; import {calculateStats, statsFile} from '../../src/stats'; import fs from 'fs'; @@ -22,9 +22,9 @@ router.get('/admin/list', handleErrorAsync(async (req, res) => { `); const adminsGroupped = buildDict(function* () { - yield [req.config.locale, []]; + yield [global.config.locale, []]; for (let [locale, , , published] of locales) { - if (locale !== req.config.locale && published) { + if (locale !== global.config.locale && published) { yield [locale, []]; } } @@ -52,12 +52,12 @@ router.get('/admin/list/footer', handleErrorAsync(async (req, res) => { SELECT u.username, p.footerName, p.footerAreas, p.locale FROM users u LEFT JOIN profiles p ON p.userId = u.id - WHERE p.locale = ${req.config.locale} + WHERE p.locale = ${global.config.locale} AND p.footerName IS NOT NULL AND p.footerName != '' AND p.footerAreas IS NOT NULL AND p.footerAreas != '' `); - const fromConfig = req.config.contact.authors || []; + const fromConfig = global.config.contact.authors || []; return [...fromDb, ...fromConfig]; }))); @@ -112,7 +112,7 @@ router.get('/admin/stats', handleErrorAsync(async (req, res) => { const stats = fs.existsSync(statsFile) ? JSON.parse(fs.readFileSync(statsFile)) - : await calculateStats(req.db, req.locales); + : await calculateStats(req.db, buildLocaleList(global.config.locale)); for (let locale in stats.locales) { if (stats.locales.hasOwnProperty(locale) && !req.isGranted('panel', locale)) { diff --git a/server/routes/banner.js b/server/routes/banner.js index 84cf767ac..64103118f 100644 --- a/server/routes/banner.js +++ b/server/routes/banner.js @@ -88,7 +88,7 @@ router.get('/banner/:pronounName*.png', handleErrorAsync(async (req, res) => { const logo = await loadImage('node_modules/@fortawesome/fontawesome-pro/svgs/light/tags.svg'); - if (!pronoun && pronounName !== req.config.pronouns.any) { + if (!pronoun && pronounName !== global.config.pronouns.any) { await fallback(); return canvas.toBuffer(mime); } @@ -97,7 +97,7 @@ router.get('/banner/:pronounName*.png', handleErrorAsync(async (req, res) => { context.font = 'regular 48pt Quicksand' context.fillText(translations.pronouns.intro + ':', width / leftRatio + imageSize / 1.5, height / 2 - 36) - const pronounNameOptions = pronounName === req.config.pronouns.any ? [req.config.pronouns.any] : pronoun.nameOptions(); + const pronounNameOptions = pronounName === global.config.pronouns.any ? [global.config.pronouns.any] : pronoun.nameOptions(); context.font = `bold ${pronounNameOptions.length <= 2 ? '70' : '36'}pt Quicksand` context.fillText(pronounNameOptions.join('\n'), width / leftRatio + imageSize / 1.5, height / 2 + (pronounNameOptions.length <= 2 ? 72 : 24)); diff --git a/server/routes/census.js b/server/routes/census.js index 79792cb66..1f7cff388 100644 --- a/server/routes/census.js +++ b/server/routes/census.js @@ -23,8 +23,8 @@ const hasFinished = async req => { if (req.user) { const byUser = await req.db.get(SQL` SELECT * FROM census - WHERE locale = ${req.config.locale} - AND edition = ${req.config.census.edition} + WHERE locale = ${global.config.locale} + AND edition = ${global.config.census.edition} AND userId = ${req.user.id} `); return !!byUser; @@ -33,8 +33,8 @@ const hasFinished = async req => { const fingerprint = buildFingerprint(req); const byFingerprint = await req.db.get(SQL` SELECT * FROM census - WHERE locale = ${req.config.locale} - AND edition = ${req.config.census.edition} + WHERE locale = ${global.config.locale} + AND edition = ${global.config.census.edition} AND fingerprint = ${fingerprint} AND userId IS NULL `); @@ -53,8 +53,8 @@ router.post('/census/submit', handleErrorAsync(async (req, res) => { const id = ulid(); await req.db.get(SQL`INSERT INTO census (id, locale, edition, userId, fingerprint, answers, writins, ip, userAgent, acceptLanguage, suspicious) VALUES ( ${id}, - ${req.config.locale}, - ${req.config.census.edition}, + ${global.config.locale}, + ${global.config.census.edition}, ${req.user ? req.user.id : null}, ${buildFingerprint(req)}, ${req.body.answers}, @@ -71,8 +71,8 @@ router.post('/census/submit', handleErrorAsync(async (req, res) => { router.get('/census/count', handleErrorAsync(async (req, res) => { return res.json((await req.db.get(SQL` SELECT COUNT(*) as c FROM census - WHERE locale = ${req.config.locale} - AND edition = ${req.config.census.edition} + WHERE locale = ${global.config.locale} + AND edition = ${global.config.census.edition} `)).c); })); @@ -84,8 +84,8 @@ router.get('/census/export', handleErrorAsync(async (req, res) => { const report = []; for (let {answers, writins} of await req.db.all(SQL` SELECT answers, writins FROM census - WHERE locale = ${req.config.locale} - AND edition = ${req.config.census.edition} + WHERE locale = ${global.config.locale} + AND edition = ${global.config.census.edition} AND suspicious = 0 `)) { answers = JSON.parse(answers); diff --git a/server/routes/inclusive.js b/server/routes/inclusive.js index 67862275c..17cfad57e 100644 --- a/server/routes/inclusive.js +++ b/server/routes/inclusive.js @@ -25,7 +25,7 @@ router.get('/inclusive', handleErrorAsync(async (req, res) => { return res.json(await req.db.all(SQL` SELECT i.*, u.username AS author FROM inclusive i LEFT JOIN users u ON i.author_id = u.id - WHERE i.locale = ${req.config.locale} + WHERE i.locale = ${global.config.locale} AND i.approved >= ${req.isGranted('inclusive') ? 0 : 1} AND i.deleted = 0 ORDER BY i.approved, i.insteadOf @@ -37,7 +37,7 @@ router.get('/inclusive/search/:term', handleErrorAsync(async (req, res) => { return res.json(await req.db.all(SQL` SELECT i.*, u.username AS author FROM inclusive i LEFT JOIN users u ON i.author_id = u.id - WHERE i.locale = ${req.config.locale} + WHERE i.locale = ${global.config.locale} AND i.approved >= ${req.isGranted('inclusive') ? 0 : 1} AND i.deleted = 0 AND (i.insteadOf like ${term} OR i.say like ${term}) @@ -56,7 +56,7 @@ router.post('/inclusive/submit', handleErrorAsync(async (req, res) => { VALUES ( ${id}, ${req.body.insteadOf.join('|')}, ${req.body.say.join('|')}, ${req.body.because}, - 0, ${req.body.base}, ${req.config.locale}, ${req.user ? req.user.id : null}, + 0, ${req.body.base}, ${global.config.locale}, ${req.user ? req.user.id : null}, ${req.body.categories.join(',')}, ${JSON.stringify(req.body.links)} ) `); diff --git a/server/routes/nouns.js b/server/routes/nouns.js index 9abaee5ab..b02ada00f 100644 --- a/server/routes/nouns.js +++ b/server/routes/nouns.js @@ -31,7 +31,7 @@ const addVersions = async (req, nouns) => { const sources = await req.db.all(SQL` SELECT s.*, u.username AS submitter FROM sources s LEFT JOIN users u ON s.submitter_id = u.id - WHERE s.locale == ${req.config.locale} + WHERE s.locale == ${global.config.locale} AND s.deleted = 0 AND s.approved >= ${req.isGranted('sources') ? 0 : 1} AND s.key IN (`.append([...keys].join(',')).append(SQL`) @@ -72,7 +72,7 @@ router.get('/nouns', handleErrorAsync(async (req, res) => { return res.json(await addVersions(req, await req.db.all(SQL` SELECT n.*, u.username AS author FROM nouns n LEFT JOIN users u ON n.author_id = u.id - WHERE n.locale = ${req.config.locale} + WHERE n.locale = ${global.config.locale} AND n.deleted = 0 AND n.approved >= ${req.isGranted('nouns') ? 0 : 1} ORDER BY n.approved, n.masc @@ -84,7 +84,7 @@ router.get('/nouns/search/:term', handleErrorAsync(async (req, res) => { return res.json(await addVersions(req, await req.db.all(SQL` SELECT n.*, u.username AS author FROM nouns n LEFT JOIN users u ON n.author_id = u.id - WHERE n.locale = ${req.config.locale} + WHERE n.locale = ${global.config.locale} AND n.approved >= ${req.isGranted('nouns') ? 0 : 1} AND n.deleted = 0 AND (n.masc like ${term} OR n.fem like ${term} OR n.neutr like ${term} OR n.mascPl like ${term} OR n.femPl like ${term} OR n.neutrPl like ${term}) @@ -105,7 +105,7 @@ router.post('/nouns/submit', handleErrorAsync(async (req, res) => { ${req.body.masc.join('|')}, ${req.body.fem.join('|')}, ${req.body.neutr.join('|')}, ${req.body.mascPl.join('|')}, ${req.body.femPl.join('|')}, ${req.body.neutrPl.join('|')}, ${req.body.sources || null}, - 0, ${req.body.base}, ${req.config.locale}, ${req.user ? req.user.id : null} + 0, ${req.body.base}, ${global.config.locale}, ${req.user ? req.user.id : null} ) `); @@ -171,7 +171,7 @@ router.get('/nouns/:word.png', handleErrorAsync(async (req, res) => { const term = '%' + query + '%'; const noun = (await req.db.all(SQL` SELECT * FROM nouns - WHERE locale = ${req.config.locale} + WHERE locale = ${global.config.locale} AND approved >= ${req.isGranted('nouns') ? 0 : 1} AND (masc like ${term} OR fem like ${term} OR neutr like ${term} OR mascPl like ${term} OR femPl like ${term} OR neutrPl like ${term}) ORDER BY masc diff --git a/server/routes/profile.js b/server/routes/profile.js index 98dd6451a..354f0e088 100644 --- a/server/routes/profile.js +++ b/server/routes/profile.js @@ -73,7 +73,7 @@ router.post('/profile/save', handleErrorAsync(async (req, res) => { } // TODO just make it a transaction... - const ids = (await req.db.all(SQL`SELECT * FROM profiles WHERE userId = ${req.user.id} AND locale = ${req.config.locale}`)).map(row => row.id); + const ids = (await req.db.all(SQL`SELECT * FROM profiles WHERE userId = ${req.user.id} AND locale = ${global.config.locale}`)).map(row => row.id); if (ids.length) { await req.db.get(SQL`UPDATE profiles SET @@ -92,7 +92,7 @@ router.post('/profile/save', handleErrorAsync(async (req, res) => { `); } else { await req.db.get(SQL`INSERT INTO profiles (id, userId, locale, names, pronouns, description, birthday, links, flags, customFlags, words, active, teamName, footerName, footerAreas) - VALUES (${ulid()}, ${req.user.id}, ${req.config.locale}, ${JSON.stringify(req.body.names)}, ${JSON.stringify(req.body.pronouns)}, + VALUES (${ulid()}, ${req.user.id}, ${global.config.locale}, ${JSON.stringify(req.body.names)}, ${JSON.stringify(req.body.pronouns)}, ${req.body.description}, ${req.body.birthday || null}, ${JSON.stringify(req.body.links.filter(x => !!x))}, ${JSON.stringify(req.body.flags)}, ${JSON.stringify(req.body.customFlags)}, ${JSON.stringify(req.body.words)}, 1, ${req.isGranted('users') ? req.body.teamName || null : ''}, diff --git a/server/routes/pronounce.js b/server/routes/pronounce.js index 1c3ca8132..df0f2e94f 100644 --- a/server/routes/pronounce.js +++ b/server/routes/pronounce.js @@ -35,7 +35,7 @@ router.get('/pronounce/:voice/:pronoun*', handleErrorAsync(async (req, res) => { return res.status(404).json({error: 'Not found'}); } - const voice = req.config.pronunciation.voices[req.params.voice]; + const voice = global.config.pronunciation.voices[req.params.voice]; if (!voice) { return res.status(404).json({error: 'Not found'}); } @@ -43,7 +43,7 @@ router.get('/pronounce/:voice/:pronoun*', handleErrorAsync(async (req, res) => { const s3 = new S3(awsConfig); const polly = new Polly(awsConfig); - const key = `pronunciation/${req.config.locale}-${req.params.voice}/${pronounString}/${sha1(text)}.mp3`; + const key = `pronunciation/${global.config.locale}-${req.params.voice}/${pronounString}/${sha1(text)}.mp3`; try { const s3getResponse = await s3.getObject({Key: key}).promise(); diff --git a/server/routes/sources.js b/server/routes/sources.js index 95f1fd761..977f1ac15 100644 --- a/server/routes/sources.js +++ b/server/routes/sources.js @@ -25,7 +25,7 @@ const linkOtherVersions = async (req, sources) => { const otherVersions = await req.db.all(SQL` SELECT s.*, u.username AS submitter FROM sources s LEFT JOIN users u ON s.submitter_id = u.id - WHERE s.locale != ${req.config.locale} + WHERE s.locale != ${global.config.locale} AND s.deleted = 0 AND s.approved >= ${req.isGranted('sources') ? 0 : 1} AND s.key IN (`.append([...keys].join(',')).append(SQL`) @@ -51,7 +51,7 @@ router.get('/sources', handleErrorAsync(async (req, res) => { let sql = SQL` SELECT s.*, u.username AS submitter FROM sources s LEFT JOIN users u ON s.submitter_id = u.id - WHERE s.locale = ${req.config.locale} + WHERE s.locale = ${global.config.locale} AND s.deleted = 0 AND s.approved >= ${req.isGranted('sources') ? 0 : 1} `; @@ -65,7 +65,7 @@ router.get('/sources/:id', handleErrorAsync(async (req, res) => { return res.json(await linkOtherVersions(req, await req.db.all(SQL` SELECT s.*, u.username AS submitter FROM sources s LEFT JOIN users u ON s.submitter_id = u.id - WHERE s.locale = ${req.config.locale} + WHERE s.locale = ${global.config.locale} AND s.deleted = 0 AND s.approved >= ${req.isGranted('sources') ? 0 : 1} AND s.id = ${req.params.id} @@ -77,7 +77,7 @@ router.post('/sources/submit', handleErrorAsync(async (req, res) => { await req.db.get(SQL` INSERT INTO sources (id, locale, pronouns, type, author, title, extra, year, fragments, comment, link, key, images, submitter_id, base_id) VALUES ( - ${id}, ${req.config.locale}, ${req.body.pronouns.join(';')}, + ${id}, ${global.config.locale}, ${req.body.pronouns.join(';')}, ${req.body.type}, ${req.body.author}, ${req.body.title}, ${req.body.extra}, ${req.body.year}, ${req.body.fragments.join('@').replace(/\n/g, '|')}, ${req.body.comment}, ${req.body.link}, ${req.body.key || null}, ${req.body.images || null}, diff --git a/server/routes/terms.js b/server/routes/terms.js index c3c31ad2c..5a50ddec0 100644 --- a/server/routes/terms.js +++ b/server/routes/terms.js @@ -27,7 +27,7 @@ router.get('/terms', handleErrorAsync(async (req, res) => { return req.db.all(SQL` SELECT i.*, u.username AS author FROM terms i LEFT JOIN users u ON i.author_id = u.id - WHERE i.locale = ${req.config.locale} + WHERE i.locale = ${global.config.locale} AND i.approved >= ${req.isGranted('terms') ? 0 : 1} AND i.deleted = 0 ORDER BY i.term @@ -40,7 +40,7 @@ router.get('/terms/search/:term', handleErrorAsync(async (req, res) => { return res.json(await req.db.all(SQL` SELECT i.*, u.username AS author FROM terms i LEFT JOIN users u ON i.author_id = u.id - WHERE i.locale = ${req.config.locale} + WHERE i.locale = ${global.config.locale} AND i.approved >= ${req.isGranted('terms') ? 0 : 1} AND i.deleted = 0 AND (i.term like ${term} OR i.original like ${term}) @@ -59,7 +59,7 @@ router.post('/terms/submit', handleErrorAsync(async (req, res) => { VALUES ( ${id}, ${req.body.term.join('|')}, ${req.body.original.join('|')}, ${req.body.definition}, - 0, ${req.body.base}, ${req.config.locale}, ${req.user ? req.user.id : null}, + 0, ${req.body.base}, ${global.config.locale}, ${req.user ? req.user.id : null}, ${req.body.category}, ${JSON.stringify(req.body.flags)}, ${req.body.images} ) `);