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/nouns.js

109 lines
2.9 KiB
JavaScript
Raw Normal View History

2020-10-16 14:32:51 -07:00
import {renderJson} from "../src/helpers";
2020-10-12 02:46:26 -07:00
const dbConnection = require('./db');
2020-08-04 07:15:41 -07:00
const SQL = require('sql-template-strings');
import { ulid } from 'ulid'
2020-10-15 11:55:24 -07:00
import authenticate from './authenticate';
2020-08-04 07:15:41 -07:00
2020-08-04 07:15:41 -07:00
const getId = url => url.match(/\/([^/]+)$/)[1];
const approve = async (db, id) => {
const {base_id} = await db.get(SQL`SELECT base_id FROM nouns WHERE id=${id}`);
if (base_id) {
await db.get(SQL`
DELETE FROM nouns
WHERE id = ${base_id}
`);
}
await db.get(SQL`
UPDATE nouns
SET approved = 1, base_id = NULL
WHERE id = ${id}
`);
}
const hide = async (db, id) => {
await db.get(SQL`
UPDATE nouns
SET approved = 0
WHERE id = ${id}
`);
}
const remove = async (db, id) => {
await db.get(SQL`
DELETE FROM nouns
WHERE id = ${id}
`);
}
2020-08-06 06:59:08 -07:00
const trollWords = [
'cipeusz',
'feminazi',
'bruksela',
'zboczeń',
];
const isTroll = (body) => {
const jsonBody = JSON.stringify(body);
for (let trollWord of trollWords) {
if (jsonBody.indexOf(trollWord) > -1) {
return true;
}
}
return false;
}
2020-08-04 07:15:41 -07:00
export default async function (req, res, next) {
2020-10-12 02:46:26 -07:00
const db = await dbConnection();
2020-10-15 11:55:24 -07:00
const user = authenticate(req);
const isAdmin = user && user.authenticated && user.roles === 'admin';
2020-08-04 07:15:41 -07:00
2020-10-15 11:55:24 -07:00
if (req.method === 'GET' && req.url === '/all') {
2020-10-16 14:32:51 -07:00
return renderJson(res, await db.all(`
2020-08-04 07:15:41 -07:00
SELECT * FROM nouns
${isAdmin ? '' : 'WHERE approved = 1'}
ORDER BY approved, masc
2020-10-16 14:32:51 -07:00
`));
}
if (req.method === 'POST' && req.url === '/submit') {
2020-08-06 06:59:08 -07:00
if (isAdmin || !isTroll(req.body.data)) {
const id = ulid()
await db.get(SQL`
INSERT INTO nouns (id, masc, fem, neutr, mascPl, femPl, neutrPl, approved, base_id)
VALUES (
${id},
${req.body.data.masc.join('|')}, ${req.body.data.fem.join('|')}, ${req.body.data.neutr.join('|')},
${req.body.data.mascPl.join('|')}, ${req.body.data.femPl.join('|')}, ${req.body.data.neutrPl.join('|')},
0, ${req.body.data.base}
)
`);
if (isAdmin) {
await approve(db, id);
}
2020-08-04 07:15:41 -07:00
}
2020-10-16 14:32:51 -07:00
return renderJson(res, 'ok');
}
if (req.method === 'POST' && req.url.startsWith('/approve/') && isAdmin) {
2020-10-15 11:55:24 -07:00
await approve(db, getId(req.url));
2020-10-16 14:32:51 -07:00
return renderJson(res, 'ok');
}
if (req.method === 'POST' && req.url.startsWith('/hide/') && isAdmin) {
2020-10-15 11:55:24 -07:00
await hide(db, getId(req.url));
2020-10-16 14:32:51 -07:00
return renderJson(res, 'ok');
}
if (req.method === 'POST' && req.url.startsWith('/remove/') && isAdmin) {
2020-10-15 11:55:24 -07:00
await remove(db, getId(req.url));
2020-10-16 14:32:51 -07:00
return renderJson(res, 'ok');
2020-08-04 07:15:41 -07:00
}
2020-10-16 14:32:51 -07:00
return renderJson(res, {error: 'Not found'}, 404);
2020-08-04 07:15:41 -07:00
}