74 lines
3.1 KiB
JavaScript
74 lines
3.1 KiB
JavaScript
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();
|
|
}
|
|
});
|
|
}; |