From e4bd0977da3621a8d3f82cab949a6734b169b71e Mon Sep 17 00:00:00 2001 From: Joel Kronqvist Date: Wed, 21 Jun 2023 16:47:34 +0000 Subject: Exception updation & minor polishing (but it's still WIP) --- Cont/404/index.html | 2 + Cont/custom-message/index.html | 2 + Cont/devs/index.html | 2 + Cont/index.html | 3 +- Cont/panel/index.html | 45 ++++++++++++++++++++++ Cont/updation/index.html | 41 -------------------- parseExceptions.js | 7 ++-- server.js | 85 ++++++++++++++++++++++++++++++------------ setup.sh | 2 +- update.js | 7 ++-- 10 files changed, 123 insertions(+), 73 deletions(-) create mode 100644 Cont/panel/index.html delete mode 100644 Cont/updation/index.html diff --git a/Cont/404/index.html b/Cont/404/index.html index 6b82d01..ce0ddda 100644 --- a/Cont/404/index.html +++ b/Cont/404/index.html @@ -20,6 +20,8 @@ diff --git a/Cont/custom-message/index.html b/Cont/custom-message/index.html index 791513d..a4b728a 100644 --- a/Cont/custom-message/index.html +++ b/Cont/custom-message/index.html @@ -19,6 +19,8 @@ diff --git a/Cont/devs/index.html b/Cont/devs/index.html index a4abbdb..667f539 100644 --- a/Cont/devs/index.html +++ b/Cont/devs/index.html @@ -20,6 +20,8 @@ diff --git a/Cont/index.html b/Cont/index.html index edd72f5..10a0928 100644 --- a/Cont/index.html +++ b/Cont/index.html @@ -37,7 +37,6 @@

- Päivitä ruoat
@@ -62,6 +61,8 @@ diff --git a/Cont/panel/index.html b/Cont/panel/index.html new file mode 100644 index 0000000..7715e9a --- /dev/null +++ b/Cont/panel/index.html @@ -0,0 +1,45 @@ + + + + + LYLL-ruokailuvuoro + + + + + +
+

Ruokailuvuorojen ja luokkien päivityssivu

+
+ +
+ +
+
+

Liitä allaolevaan tekstikenttään ruokailuvuorot (Wilma-viestin teksti):

+
+ +
+

Liitä allaolevaan tekstikenttään kurssitarjottimista tämä jakso. Voit avata kurssitarjottimet Excelissä tai Libreoffice Calcissa, valita alueen, jossa on jakson kurssit ja CTRL+C CTRL+V tähän. Toista sama kaikille jakson alueille kaikista vuoden kurssitarjottimista.

+
+ +
+
+

Alta voit muokata ilmoituksia.

+ +
+ +
+

Painikkeen painamisen jälkeen seuraavan sivun latautumisessa kestää, koska serveri käsittelee syötteesi loppuun asti ennen vastaamista, jotta se voi kertoa, onnistuiko päivitys.

+
+
+ + + + diff --git a/Cont/updation/index.html b/Cont/updation/index.html deleted file mode 100644 index 49167bc..0000000 --- a/Cont/updation/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - LYLL-ruokailuvuoro - - - - - -
-

Ruokailuvuorojen ja luokkien päivityssivu

-
- -
- -
-
-

Liitä allaolevaan tekstikenttään ruokailuvuorot (Wilma-viestin teksti):

-
- -
-

Kiitos paljon! Kun painat sivun lopusta 'Päivitä'-painiketta, toimii ruokailuvuorohaku (toivon mukaan) jälleen. Jos sinulla on yhtään enemmän aikaa, voit myös suorittaa allaolevan vaiheen. Sen suoritettuasi ruokailuvuoroja voi hakea opettajan ja kurssikoodin lisäksi luokkatilan perusteella.

-
-

Liitä allaolevaan tekstikenttään kurssitarjottimista tämä jakso. Voit avata kurssitarjottimet Excelissä tai Libreoffice Calcissa, valita alueen, jossa on jakson kurssit ja CTRL+C CTRL+V tähän. Toista sama kaikille jakson alueille kaikista vuoden kurssitarjottimista.

-
- -
- -
-

Painikkeen painamisen jälkeen seuraavan sivun latautumisessa kestää, koska serveri käsittelee syötteesi loppuun asti ennen vastaamista, jotta se voi kertoa, onnistuiko päivitys.

-
-
- - - - diff --git a/parseExceptions.js b/parseExceptions.js index 63cd6d2..42a1c50 100644 --- a/parseExceptions.js +++ b/parseExceptions.js @@ -50,9 +50,10 @@ assert.deepEqual( async function updateExceptions(exceptions, DB) { await DB.query_raw('DELETE FROM exceptions'); let dbOperations = []; - for (line of exceptions.split('\n')) { - if (line === '' || line[0] === '#') - continue + for (let line of exceptions.split('\n')) { + if ((line === '') || (line === '\r') || (line[0] === '#')) { + continue; + } const [start, end, header, message] = parseLine(line); dbOperations.push(DB.execute( 'INSERT INTO exceptions VALUE (?, ?, ?, ?)', diff --git a/server.js b/server.js index e682622..82d1066 100644 --- a/server.js +++ b/server.js @@ -2,6 +2,7 @@ const https = require("https"); const http = require("http"); const url = require("url"); const food = require("./food.js"); +const fs = require("node:fs/promises"); const SQL_DBS = require("./database.js"); const DBPARSE = require("./dbparse.js"); const open = require("./Functions/open.js"); @@ -9,13 +10,16 @@ const strFuncs = require("./Functions/stringFuncs.js"); const dateFuncs = require("./Functions/dateFuncs.js"); const updateDB = require("./update.js"); +const SHIFTPATH = "../Updation/shifts.txt"; +const CLASSPATH = "../Updation/classes.txt"; +const EXCEPTIONPATH = "../Updation/exceptions.txt"; async function init() { const build = { "./Cont/index.html": buildMain, "./Cont/index.css": buildDefault, - "./Cont/updation/index.html": buildDefault, + "./Cont/panel/index.html": buildPanel, "./Cont/devs/index.html": buildDevs, "./Cont/devs/index.css": buildDefault, "./Cont/404/index.css": buildDefault, @@ -25,8 +29,6 @@ async function init() "./Cont/Images/favicon.ico": buildImage, }; const errorPath = "./Cont/404/index.html"; - const SHIFTPATH = "../Updation/shifts.txt"; - const CLASSPATH = "../Updation/classes.txt"; const startDate = new Date(); let visitorCount = 0; @@ -50,7 +52,7 @@ async function init() // Update... // ...shifts and classes - await updateDB.update(SQLDB, SHIFTPATH, CLASSPATH); + await updateDB.update(SQLDB, SHIFTPATH, CLASSPATH, EXCEPTIONPATH); // ...foods dateFuncs.run_at_monday_mornings(() => food.build(SQLDB)); if ((new Date()).getDay() !== 1) // update if it's not monday. if it's monday, it has already been run by the scheduler above. @@ -76,36 +78,51 @@ async function init() let shifts = ""; let classes = ""; try { - shifts = decodeURIComponent(q.get("shifts")).replaceAll("+", " "); - classes = decodeURIComponent(q.get("classes")).replaceAll("+", " "); + shifts = decodeURIComponent(q.get("shifts")).replaceAll("+", " ").replaceAll('\r\n', '\n'); + classes = decodeURIComponent(q.get("classes")).replaceAll("+", " ").replaceAll('\r\n', '\n'); + exceptions = decodeURIComponent(q.get('exceptions').replaceAll("+", ' ')).replaceAll('\r\n', '\n'); } catch { console.log("Malformed url, presumably"); res.writeHead(400); - res.end(); + const cont = await buildCustomMessage("400: Virheellinen pyyntö", "Pyyntö sisälsi todennäköisesti merkkikoodeja, jotka eivät viittaa mihinkään olemassaolevaan merkkiin."); + res.end(cont); + return; } if (shifts === null || classes === null) { res.writeHead(400); - res.end("Avainta 'shifts' ja/tai 'classes' ei löytynyt pyynnöstä."); + const cont = await buildCustomMessage("400: Virheellinen pyyntö", "Avaimia 'shifts' ja/tai 'classes' ei löytynyt pyynnöstä"); + res.end(cont); + return; } - let shiftfile = await fs.open(SHIFTPATH, "w"); + let shiftfile = await fs.open(`${SHIFTPATH}.tmp`, "w"); await shiftfile.write(shifts); shiftfile.close(); - if (classes != "") { - let classfile = await fs.open(CLASSPATH, "w"); - await classfile.write(classes) - classfile.close(); - } + + let classfile = await fs.open(`${CLASSPATH}.tmp`, "w"); + await classfile.write(classes) + classfile.close(); + + let exceptionfile = await fs.open(`${EXCEPTIONPATH}.tmp`, "w"); + await exceptionfile.write(exceptions); + exceptionfile.close(); try { - await updateDB.update(SQLDB, SHIFTPATH, CLASSPATH); + await updateDB.update(SQLDB, `${SHIFTPATH}.tmp`, `${CLASSPATH}.tmp`, `${EXCEPTIONPATH}.tmp`); + await Promise.all([ + fs.rename(`${SHIFTPATH}.tmp`, SHIFTPATH), + fs.rename(`${CLASSPATH}.tmp`, CLASSPATH), + fs.rename(`${EXCEPTIONPATH}.tmp`, EXCEPTIONPATH) + ]); + res.writeHead(200); + const cont = await buildCustomMessage("Kiitos!", "Päivitysprosessi näyttää onnistuneen."); + res.end(cont); } catch(e) { - res.writeHead(400); - res.end("Virhe tietojen käsittelyssä. Ota yhteys kehittäjään."); console.log(e); + res.writeHead(400); + const cont = await buildCustomMessage("500: Virhe palvelimella", "Ruokailuvuorojen päivitysprosessi palautti virheen. Jos ruokailuvuorot on kirjoitettu jotenkin eri lailla kuin edellisissä viesteissä, selittynee virhe sillä. Jos pienellä muokkauksella et saa päivitystä toimimaan, ota yhteys kehittäjään."); + res.end(cont); return; } - res.writeHead(200); - res.end("Kiitos paljon! Näyttää siltä, että tiedot saatiin päivitettyä."); }); return; } @@ -287,8 +304,8 @@ async function buildMain(args) res["shift"] = "Kurssilla/opettajalla/luokalla ei ole ruokailua päivällä tai kurssia ei ole olemassa!"; // Show message if the normal schedule isn't in place - const examInfo = await SQLDB.query("SELECT * FROM exams"); - for(let week = 0; week < examInfo.length; week++) + const exceptionInfo = await SQLDB.query("SELECT * FROM exceptions"); + for(let week = 0; week < exceptionInfo.length; week++) { // get the date of the requested day const nextDate = new Date( @@ -299,11 +316,11 @@ async function buildMain(args) if (dateFuncs.between( nextDate, - new Date(examInfo[week].start), - new Date(examInfo[week].end) + new Date(exceptionInfo[week].start), + new Date(exceptionInfo[week].end) )) { - const message = `
${examInfo[week].message}
`; + const message = `

${exceptionInfo[week].header}

${(exceptionInfo[week].message.length > 0) ? '
' : ''}${exceptionInfo[week].message}
`; data_string = strFuncs.replaceElement(data_string, "div id=\"shift-result\" class=\"float-block\"", message); } } @@ -382,6 +399,26 @@ async function buildCustomMessage(header, message) { return data; } +async function buildPanel(args) +{ + let data = await open.file(args["path"]); + data = data.toString("utf-8"); + + let shifts = await open.file(SHIFTPATH); + shifts = shifts.toString("utf-8"); + + let classes = await open.file(CLASSPATH); + classes = classes.toString("utf-8"); + + let exceptions = await open.file(EXCEPTIONPATH); + exceptions = exceptions.toString("utf-8"); + return build_replace(data, { + "shifts": shifts, + "classes": classes, + "exceptions": exceptions + }); +} + async function build404(args) { args["path"] = args["path"].substring("./Cont".length); diff --git a/setup.sh b/setup.sh index b4111fe..3125a8c 100755 --- a/setup.sh +++ b/setup.sh @@ -89,7 +89,7 @@ if [ "$certans" != "n" ]; then fi echo 'Setting up MySQL database...' -echo -e "CREATE DATABASE lyllruoka;\nUSE lyllruoka;\n\nCREATE TABLE shiftnames (\n\tday INT,\n\tid INT,\n\tname VARCHAR(128) NOT NULL,\n\tPRIMARY KEY (day, id)\n);\nCREATE TABLE classes (\n\tcourse VARCHAR(6) PRIMARY KEY,\n\tclass VARCHAR(4)\n);\nCREATE TABLE shifts (\n\tday INT,\n\tshift INT,\n\tcourse VARCHAR(6),\n\tteacher VARCHAR(4),\n\tclass VARCHAR(4),\n\tPRIMARY KEY (day, course)\n);\nCREATE TABLE devs (\n\tid INT PRIMARY KEY AUTO_INCREMENT,\n\tname VARCHAR(30) NOT NULL,\n\tdescription VARCHAR(128),\n\tcontact VARCHAR(40) DEFAULT ''\n);\nCREATE TABLE stats (\n start DATE PRIMARY KEY,\n uptime INT,\n requests INT,\n requests_per_day INT\n);\nCREATE TABLE exams (\n\tstart DATE,\n\tend DATE,\n\tmessage VARCHAR(256),\n\tPRIMARY KEY (start, end)\n);\nCREATE TABLE foods ( \n week INT,\n day INT,\n vegetarian TINYINT,\n header VARCHAR(15),\n dateString VARCHAR(13),\n food VARCHAR(280)\n);\nCREATE USER '$name'@'localhost' IDENTIFIED BY '$passw';\nGRANT ALL ON lyllruoka.* TO '$name'@'localhost';\n" | sudo mysql > /dev/null +echo -e "CREATE DATABASE lyllruoka;\nUSE lyllruoka;\n\nCREATE TABLE shiftnames (\n\tday INT,\n\tid INT,\n\tname VARCHAR(128) NOT NULL,\n\tPRIMARY KEY (day, id)\n);\nCREATE TABLE classes (\n\tcourse VARCHAR(6) PRIMARY KEY,\n\tclass VARCHAR(4)\n);\nCREATE TABLE shifts (\n\tday INT,\n\tshift INT,\n\tcourse VARCHAR(6),\n\tteacher VARCHAR(4),\n\tclass VARCHAR(4),\n\tPRIMARY KEY (day, course)\n);\nCREATE TABLE devs (\n\tid INT PRIMARY KEY AUTO_INCREMENT,\n\tname VARCHAR(30) NOT NULL,\n\tdescription VARCHAR(128),\n\tcontact VARCHAR(40) DEFAULT ''\n);\nCREATE TABLE stats (\n start DATE PRIMARY KEY,\n uptime INT,\n requests INT,\n requests_per_day INT\n);\nCREATE TABLE exceptions (\n\tstart DATE,\n\tend DATE,\n\theader VARCHAR(64),\n\tmessage VARCHAR(256),\n\tPRIMARY KEY (start, end)\n);\nCREATE TABLE foods ( \n week INT,\n day INT,\n vegetarian TINYINT,\n header VARCHAR(15),\n dateString VARCHAR(13),\n food VARCHAR(256)\n);\nCREATE USER '$name'@'localhost' IDENTIFIED BY '$passw';\nGRANT ALL ON lyllruoka.* TO '$name'@'localhost';\n" | sudo mysql > /dev/null echo -e "{\n\t\"host\": \"localhost\",\n\t\"user\": \"$name\",\n\t\"password\": \"$passw\",\n\t\"database\": \"lyllruoka\"\n}" > dblogin.txt echo -e 'Done!\n' diff --git a/update.js b/update.js index be7794c..919fede 100644 --- a/update.js +++ b/update.js @@ -1,6 +1,7 @@ -const openFile = require("./Functions/open.js").file; -const parseClasses = require("./parseClasses.js").classes; -const parse = require("./dbparse.js"); +const openFile = require("./Functions/open.js").file; +const parseClasses = require("./parseClasses.js").classes; +const parse = require("./dbparse.js"); +const updateExceptions = require('./parseExceptions.js').updateExceptions; // Run this if you want to build the database from text files async function buildDB(dbconnection, shiftPath, classPath, exceptionPath) { -- cgit v1.2.3