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 };