Files
void-genesis/dev/lobby/lobby-backend/src/services/cron.service.js
T

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