1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
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;
|