From 5c265c04ad513d845a41c7866c3ed231c8d5e68e Mon Sep 17 00:00:00 2001 From: Noah Loomans Date: Sat, 7 Jul 2018 17:34:02 +0200 Subject: server: Use database for users --- src/shared/lib/axios.js | 35 ++++++++++++++++++++++++ src/shared/lib/db.js | 62 ++++++++++++++++++++++++++++++++++++++++++ src/shared/lib/getURLOfUser.js | 35 ++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 src/shared/lib/axios.js create mode 100644 src/shared/lib/db.js create mode 100644 src/shared/lib/getURLOfUser.js (limited to 'src/shared') diff --git a/src/shared/lib/axios.js b/src/shared/lib/axios.js new file mode 100644 index 0000000..2de6047 --- /dev/null +++ b/src/shared/lib/axios.js @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2018 Noah Loomans + * + * This file is part of rooster.hetmml.nl. + * + * rooster.hetmml.nl is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * rooster.hetmml.nl is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with rooster.hetmml.nl. If not, see . + * + */ + +const axios = require('axios'); +const iconv = require('iconv-lite'); + +/** + * Create a new axios instance with sensible defaults for connecting to + * meetingpointmco.nl +*/ +const instance = axios.create({ + baseURL: 'http://www.meetingpointmco.nl/Roosters-AL/doc/', + timeout: 5000, + responseType: 'arraybuffer', + transformResponse: [responseBody => iconv.decode(responseBody, 'iso-8859-1')], +}); + +module.exports = instance; diff --git a/src/shared/lib/db.js b/src/shared/lib/db.js new file mode 100644 index 0000000..cb0be09 --- /dev/null +++ b/src/shared/lib/db.js @@ -0,0 +1,62 @@ +/** + * Copyright (C) 2018 Noah Loomans + * + * This file is part of rooster.hetmml.nl. + * + * rooster.hetmml.nl is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * rooster.hetmml.nl is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with rooster.hetmml.nl. If not, see . + * + */ + +const { Pool } = require('pg'); + +const pool = new Pool({ + database: process.env.PGDATABASE || 'rooster_hetmml_nl', +}); + +// the pool with emit an error on behalf of any idle clients +// it contains if a backend error or network partition happens +pool.on('error', (error) => { + console.error('Unexpected error on idle client', error); + // TODO: Do we want to exit here? + process.exit(-1); +}); + +async function insertUsers(users) { + await pool.query('TRUNCATE TABLE schedule_user'); + const promises = users.map(user => ( + pool.query( + 'INSERT INTO schedule_user(key, type, name, alt_name, index) VALUES ($1, $2, $3, $4, $5)', + [user.key, user.type, user.name, user.altName, user.index], + ) + )); + await Promise.all(promises); +} + +async function getUsers() { + const { rows } = await pool.query( + 'SELECT key, type, name, alt_name, index FROM schedule_user', + ); + + const users = rows.map(row => ({ + key: row.key, + type: row.type, + name: row.name, + altName: row.altName, + index: row.index, + })); + + return users; +} + +module.exports = { insertUsers, getUsers }; diff --git a/src/shared/lib/getURLOfUser.js b/src/shared/lib/getURLOfUser.js new file mode 100644 index 0000000..934f235 --- /dev/null +++ b/src/shared/lib/getURLOfUser.js @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2018 Noah Loomans + * + * This file is part of rooster.hetmml.nl. + * + * rooster.hetmml.nl is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * rooster.hetmml.nl is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with rooster.hetmml.nl. If not, see . + * + */ + +const leftPad = require('left-pad'); // I imported this just to piss you off ;) + +const shortTypeOf = { + class: 'c', + teacher: 't', + student: 's', + room: 'r', +}; + +function getURLOfUser(scheduleType, longType, index, week) { + const type = shortTypeOf[longType]; + return `/${scheduleType}roosters/${leftPad(week, 2, '0')}/${type}/${type}${leftPad(index + 1, 5, '0')}.htm`; +} + +module.exports = getURLOfUser; -- cgit v1.1