155 lines
4.6 KiB
JavaScript
155 lines
4.6 KiB
JavaScript
const { LiturgicalDay } = require('../models');
|
|
const { Op } = require('sequelize');
|
|
const axios = require('axios');
|
|
|
|
// Alle liturgischen Tage abrufen
|
|
const getAllLiturgicalDays = async (req, res) => {
|
|
try {
|
|
const days = await LiturgicalDay.findAll({
|
|
order: [['date', 'ASC']]
|
|
});
|
|
res.status(200).json(days);
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ message: 'Fehler beim Abrufen der liturgischen Tage' });
|
|
}
|
|
};
|
|
|
|
// Eindeutige Namen für Multiselect abrufen
|
|
const getLiturgicalDayNames = async (req, res) => {
|
|
try {
|
|
const days = await LiturgicalDay.findAll({
|
|
attributes: ['dayName'],
|
|
group: ['dayName'],
|
|
order: [['dayName', 'ASC']]
|
|
});
|
|
const names = days.map(day => day.dayName);
|
|
res.status(200).json(names);
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ message: 'Fehler beim Abrufen der Tag-Namen' });
|
|
}
|
|
};
|
|
|
|
// HTML von liturgischem Kalender parsen und in DB speichern
|
|
const loadLiturgicalYear = async (req, res) => {
|
|
const { year } = req.body;
|
|
|
|
if (!year) {
|
|
return res.status(400).json({ message: 'Jahr ist erforderlich' });
|
|
}
|
|
|
|
const currentYear = new Date().getFullYear();
|
|
if (year < currentYear || year > currentYear + 2) {
|
|
return res.status(400).json({ message: 'Jahr muss zwischen aktuellem Jahr und 2 Jahren in der Zukunft liegen' });
|
|
}
|
|
|
|
try {
|
|
const url = `https://www.eike-fleer.de/liturgischer-kalender/${year}.htm`;
|
|
const response = await axios.get(url, {
|
|
headers: {
|
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
|
}
|
|
});
|
|
|
|
const html = response.data;
|
|
|
|
// Parse HTML - suche nach Tabellenzeilen mit Datum und Name
|
|
// Format: "DD.MM.YYYY DayName"
|
|
const regex = /(\d{2}\.\d{2}\.\d{4})\s*(?: |\s)+(.+?)(?:<\/|$)/gi;
|
|
const matches = [...html.matchAll(regex)];
|
|
|
|
const liturgicalDays = [];
|
|
|
|
for (const match of matches) {
|
|
const dateStr = match[1]; // DD.MM.YYYY
|
|
let dayName = match[2];
|
|
|
|
// Bereinige den Tag-Namen von HTML-Tags und Entities
|
|
dayName = dayName
|
|
.replace(/<[^>]*>/g, '') // Entferne HTML-Tags
|
|
.replace(/ /g, ' ') // Ersetze
|
|
.replace(/ä/g, 'ä')
|
|
.replace(/ö/g, 'ö')
|
|
.replace(/ü/g, 'ü')
|
|
.replace(/Ä/g, 'Ä')
|
|
.replace(/Ö/g, 'Ö')
|
|
.replace(/Ü/g, 'Ü')
|
|
.replace(/ß/g, 'ß')
|
|
.trim();
|
|
|
|
// Konvertiere Datum von DD.MM.YYYY zu YYYY-MM-DD
|
|
const [day, month, yearPart] = dateStr.split('.');
|
|
const isoDate = `${yearPart}-${month}-${day}`;
|
|
|
|
if (dayName && dayName.length > 0) {
|
|
liturgicalDays.push({
|
|
date: isoDate,
|
|
dayName: dayName
|
|
});
|
|
}
|
|
}
|
|
|
|
if (liturgicalDays.length === 0) {
|
|
return res.status(500).json({ message: 'Keine liturgischen Tage gefunden. Möglicherweise hat sich das HTML-Format geändert.' });
|
|
}
|
|
|
|
// Speichere oder aktualisiere die Einträge
|
|
for (const day of liturgicalDays) {
|
|
await LiturgicalDay.upsert({
|
|
date: day.date,
|
|
dayName: day.dayName
|
|
});
|
|
}
|
|
|
|
res.status(200).json({
|
|
message: `${liturgicalDays.length} liturgische Tage für ${year} erfolgreich geladen`,
|
|
count: liturgicalDays.length
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Laden der liturgischen Tage:', error);
|
|
if (error.response && error.response.status === 404) {
|
|
return res.status(404).json({ message: `Liturgischer Kalender für ${year} nicht gefunden` });
|
|
}
|
|
res.status(500).json({ message: 'Fehler beim Laden der liturgischen Tage', error: error.message });
|
|
}
|
|
};
|
|
|
|
// Einzelnen Tag erstellen
|
|
const createLiturgicalDay = async (req, res) => {
|
|
try {
|
|
const day = await LiturgicalDay.create(req.body);
|
|
res.status(201).json(day);
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ message: 'Fehler beim Erstellen des liturgischen Tags' });
|
|
}
|
|
};
|
|
|
|
// Tag löschen
|
|
const deleteLiturgicalDay = async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
const deleted = await LiturgicalDay.destroy({
|
|
where: { id }
|
|
});
|
|
if (deleted) {
|
|
res.status(200).json({ message: 'Liturgischer Tag erfolgreich gelöscht' });
|
|
} else {
|
|
res.status(404).json({ message: 'Liturgischer Tag nicht gefunden' });
|
|
}
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ message: 'Fehler beim Löschen des liturgischen Tags' });
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
getAllLiturgicalDays,
|
|
getLiturgicalDayNames,
|
|
loadLiturgicalYear,
|
|
createLiturgicalDay,
|
|
deleteLiturgicalDay
|
|
};
|
|
|