import cron from 'node-cron'; import pool from '../db.js'; /** * Initialisiert alle zeitgesteuerten Hintergrund-Aufgaben (Cronjobs) für die Lobby. * Wird einmalig beim Serverstart aufgerufen. */ export const initLobbyCronJobs = () => { console.log('⏰ Initialisiere Lobby Cronjobs...'); // -------------------------------------------------------------------------- // CRON: Prüfung geschlossener Sektoren auf freie Kapazitäten // Format: 'Minute Stunde Tag Monat Wochentag' // '0 4 * * *' bedeutet: Jeden Tag exakt um 04:00 Uhr nachts. // -------------------------------------------------------------------------- cron.schedule('0 4 * * *', async () => { console.log('🔍 [CRON] Prüfe geschlossene Sektoren auf freie Startplätze...'); const client = await pool.connect(); try { // Alle Sektoren finden, deren Registrierung aktuell geschlossen ist const closedSectorsQuery = await client.query(` SELECT id, name, api_url FROM sectors WHERE is_registration_open = false `); const closedSectors = closedSectorsQuery.rows; if (closedSectors.length === 0) { console.log('✅ [CRON] Keine geschlossenen Sektoren gefunden. Nichts zu tun.'); return; } // Jeden geschlossenen Sektor einzeln über das Netzwerk abfragen for (const sector of closedSectors) { try { const response = await fetch(`${sector.api_url}/api/internal/slots`); if (!response.ok) { console.warn(`⚠️ [CRON] Sektor ${sector.name} hat einen Fehler gemeldet (Status: ${response.status}). Überspringe.`); continue; } const data = await response.json(); const freeSlots = data.freeSlots; // Auswertung der freien Plätze // Wenn der Sektor wieder mindestens 150 freie Plätze hat, machen wir ihn auf. if (freeSlots >= 150) { console.log(`🔓 [CRON] Sektor ${sector.name} hat ${freeSlots} freie Plätze. Öffne Sektor für Neuregistrierungen!`); await client.query(` UPDATE sectors SET is_registration_open = true WHERE id = $1 `, [sector.id]); } else { console.log(`🔒 [CRON] Sektor ${sector.name} hat nur ${freeSlots} freie Plätze (unter 150). Bleibt geschlossen.`); } } catch (fetchError) { console.warn(`⚠️ [CRON] Netzwerkfehler bei Abfrage von Sektor ${sector.name}:`, fetchError.message); } } } catch (error) { console.error('❌ [CRON] Kritischer Datenbank-Fehler beim Prüfen der Sektoren:', error); } finally { client.release(); } }); };