65 lines
1.6 KiB
JavaScript
65 lines
1.6 KiB
JavaScript
|
import { Router } from 'express';
|
||
|
import SQL from 'sql-template-strings';
|
||
|
import sha1 from 'sha1';
|
||
|
import {ulid} from "ulid";
|
||
|
|
||
|
const buildFingerprint = req => sha1(`
|
||
|
${req.ip}
|
||
|
${req.headers['user-agent']}
|
||
|
${req.headers['accept-language']}
|
||
|
`);
|
||
|
|
||
|
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}
|
||
|
AND userId = ${req.user.id}
|
||
|
`);
|
||
|
if (byUser) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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}
|
||
|
AND fingerprint = ${fingerprint}
|
||
|
`);
|
||
|
if (byFingerprint) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
const router = Router();
|
||
|
|
||
|
router.get('/census/finished', async (req, res) => {
|
||
|
return res.json(await hasFinished(req));
|
||
|
});
|
||
|
|
||
|
router.post('/census/submit', async (req, res) => {
|
||
|
if (await hasFinished(req)) {
|
||
|
return res.status(401).json({error: 'Unauthorised'});
|
||
|
}
|
||
|
|
||
|
const id = ulid();
|
||
|
await req.db.get(SQL`INSERT INTO census (id, locale, edition, userId, fingerprint, answers, writins) VALUES (
|
||
|
${id},
|
||
|
${req.config.locale},
|
||
|
${req.config.census.edition},
|
||
|
${req.user ? req.user.id : null},
|
||
|
${buildFingerprint(req)},
|
||
|
${req.body.answers},
|
||
|
${req.body.writins}
|
||
|
)`);
|
||
|
|
||
|
return res.json(id);
|
||
|
});
|
||
|
|
||
|
export default router;
|