Füge Unterstützung für liturgische Tage im Worship Management hinzu: Implementiere Multiselect für die Auswahl von Tag-Namen und lade die verfügbaren liturgischen Tage. Aktualisiere das Formular zur Anzeige und Auswahl des liturgischen Tages basierend auf dem Datum.
This commit is contained in:
154
controllers/liturgicalDayController.js
Normal file
154
controllers/liturgicalDayController.js
Normal file
@@ -0,0 +1,154 @@
|
||||
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
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user