const assert = require('node:assert').strict; function parseLine(line) { const [datePart] = line.split(' ', 1); assert.equal(datePart !== undefined, true, `otsikkoa ei annettu rivillä ”${line}”`); const rest = line.substring(datePart.length + 1); let dateStrings = datePart.split('-'); if (dateStrings.length === 1) dateStrings.push(dateStrings[0]); assert.equal(dateStrings.length, 2, `päivämääräväli ”${datePart}” on virheellinen (ks. rivi ”${line}”)`); let d1 = dateStrings[0].split('.'); const d2 = dateStrings[1].split('.'); assert.equal(d2.length, 3, `päivämäärästä ”${dateStrings[1]}” puuttui päivä, kuukausi tai vuosi tai se on muutoin virheellinen (ks. rivi ”${line}”)`); if (d1[d1.length - 1].length === 0) { d1.pop(); } while (d1.length < 3) { d1.push(d2[d1.length]) } for (let i = 0; i < 3; i++) { d1[i] = parseInt(d1[i]); d2[i] = parseInt(d2[i]); let opts = ['päivä', 'kuukausi', 'vuosi']; assert.ok(!isNaN(d1[i]), `syötetty ”${opts[i]}“ ei koostunut pelkistä numeroista tai numeroita ei ollut tarpeeksi (ks. rivi ”${line}”)`); assert.ok(!isNaN(d2[i]), `syötetty ”${opts[i]}” ei koostunut pelkistä numeroista tai numeroita ei ollut tarpeeksi (ks. rivi ”${line}”)`); } const start = new Date(d1[2], d1[1] - 1, d1[0]); const end = new Date(d2[2], d2[1] - 1, d2[0]); assert(start <= end, `Ilmoituksen ensimmäisen päivämäärän ”${dateStrings[0]}” tulee olla ennen toista päivämäärää ”${dateStrings[1]}” (ks. rivi ”${line}”)`); let [header, message = ''] = rest.split('|', 2); assert((header !== undefined) && (header.length !== 0), `otsikko täytyy antaa (ks. rivi ”${line}”)`); header = header.trimEnd(); message = message.trimStart(); return [ start, end, header, message ]; } assert.deepEqual( parseLine('02.06.2024-07.08.2024 Hyvää kesää LYLLin väelle! | Kesäloma 2.6.-7.8.'), [ new Date(2024, 5, 2), new Date(2024, 7, 7), 'Hyvää kesää LYLLin väelle!', 'Kesäloma 2.6.-7.8.' ] ); async function updateExceptions(exceptions, DB) { await DB.query_raw('DELETE FROM exceptions'); let dbOperations = []; 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 (?, ?, ?, ?)', [start, end, header, message] )); } await Promise.all(dbOperations); return 0; } exports.updateExceptions = updateExceptions;