142 lines
4.0 KiB
JavaScript
142 lines
4.0 KiB
JavaScript
require('dotenv').config()
|
|
const luxon = require('luxon');
|
|
const { WebUntis } = require('webuntis');
|
|
const PocketBase = require('pocketbase/cjs');
|
|
|
|
const pb = new PocketBase('https://fsae41.de');
|
|
|
|
async function getTimetabe() {
|
|
const untis = new WebUntis(process.env.WEBUNTIS_SCHOOL, process.env.WEBUNTIS_USER, process.env.WEBUNTIS_PASS, process.env.WEBUNTIS_URL);
|
|
let timetable;
|
|
try {
|
|
await untis.login();
|
|
// Start und Ende der aktuellen Woche bestimmen
|
|
|
|
const now = luxon.DateTime.local();
|
|
const startOfWeek = now.startOf('week').toJSDate(); // Montag
|
|
const endOfWeek = now.endOf('week').plus({ days: 7 * 4 * 4 }).toJSDate(); // Sonntag
|
|
|
|
// Stundenplan für diese Woche abrufen
|
|
timetable = await untis.getOwnTimetableForRange(startOfWeek, endOfWeek);
|
|
|
|
await untis.logout();
|
|
} catch (error) {
|
|
console.log(error);
|
|
}
|
|
return timetable;
|
|
}
|
|
|
|
|
|
setInterval(async () => {
|
|
const timetable = await getTimetabe();
|
|
|
|
if (!timetable || timetable.length === 0) {
|
|
console.log("No timetable data available.");
|
|
return;
|
|
}
|
|
|
|
|
|
let created = 0;
|
|
let updated = 0;
|
|
let skipped = 0;
|
|
|
|
|
|
const sorted = timetable.sort((a, b) => {
|
|
// Zuerst nach Datum
|
|
if (a.date !== b.date) {
|
|
return a.date - b.date;
|
|
}
|
|
// Falls Datum gleich, nach Startzeit
|
|
if (a.startTime !== b.startTime) {
|
|
return a.startTime - b.startTime;
|
|
}
|
|
// Falls Startzeit gleich, nach Endzeit
|
|
return a.endTime - b.endTime;
|
|
});
|
|
|
|
let final = []
|
|
|
|
for (let i = 0; i < sorted.length - 1; i++) {
|
|
let now = sorted[i];
|
|
let next = sorted[i + 1];
|
|
//gleicher tag
|
|
if (now.date == next.date) {
|
|
if (now.endTime == next.startTime) {
|
|
now.endTime = next.endTime;
|
|
final.push(now);
|
|
}
|
|
}
|
|
}
|
|
|
|
pb.autoCancellation(false);
|
|
|
|
const records = await pb.collection('classes').getFullList();
|
|
//console.log(records);
|
|
|
|
for (let i = 0; i < final.length; i++) {
|
|
let existingRecords;
|
|
|
|
try {
|
|
existingRecords = await pb.collection('classes').getList(1, 0, {
|
|
filter: 'untis_id = "' + final[i].id + '"',
|
|
});
|
|
existingRecords = existingRecords.items[0];
|
|
} catch (error) {
|
|
}
|
|
//console.log(typeof existingRecords);
|
|
|
|
|
|
if (!existingRecords) {
|
|
// Neu erstellen
|
|
const data = {
|
|
"untis_id": final[i].id,
|
|
"date": final[i].date,
|
|
"startTime": final[i].startTime,
|
|
"endTime": final[i].endTime,
|
|
"ro": JSON.stringify(final[i].ro),
|
|
"su": JSON.stringify(final[i].su),
|
|
"kl": JSON.stringify(final[i].kl),
|
|
"raw": JSON.stringify(final[i]),
|
|
"old_version": "JSON"
|
|
};
|
|
|
|
const record = await pb.collection('classes').create(data);
|
|
created++;
|
|
continue; // Überspringe die Erstellung, wenn der Datensatz bereits existiert
|
|
}
|
|
|
|
//console.log("Record with untis_id " + final[i].id + " already exists. Skipping creation.");
|
|
|
|
// Prüfe, ob etwas geändert wurde
|
|
const isChanged =
|
|
existingRecords.date != final[i].date ||
|
|
existingRecords.startTime != final[i].startTime ||
|
|
existingRecords.endTime != final[i].endTime ||
|
|
(existingRecords.kl[0].id != final[i].kl[0].id) ||
|
|
(existingRecords.ro[0].id != final[i].ro[0].id) ||
|
|
(existingRecords.su[0].id != final[i].su[0].id);
|
|
|
|
if (!isChanged) {
|
|
skipped++;
|
|
continue;
|
|
}
|
|
|
|
// Aktualisiere den bestehenden Datensatz
|
|
existingRecords.old_version = existingRecords.raw;
|
|
existingRecords.raw = JSON.stringify(final[i]);
|
|
existingRecords.date = final[i].date;
|
|
existingRecords.startTime = final[i].startTime;
|
|
existingRecords.endTime = final[i].endTime;
|
|
existingRecords.kl = final[i].kl;
|
|
existingRecords.ro = final[i].ro;
|
|
existingRecords.su = final[i].su;
|
|
existingRecords.last_update = new Date().toISOString();
|
|
|
|
const record = await pb.collection('classes').update(existingRecords.id, existingRecords);
|
|
|
|
updated++;
|
|
}
|
|
|
|
console.log(`✅ Sync done — Created: ${created}, Updated: ${updated}, Skipped: ${skipped}`);
|
|
|
|
}, 1000 * 60 * 30); // Alle 30 Minuten aktualisieren
|