import cron from 'node-cron'; import { TokenManager } from './services/token_manager'; import { AnalyticsService } from './services/analytics'; import { purgeOldMedia } from './services/media-purge'; import { tiktokService } from './services/tiktok'; export function startTokenCron() { // Toutes les 2 minutes — suivi des publications TikTok (API asynchrone) cron.schedule('*/2 * * * *', async () => { try { await tiktokService.syncPendingPublications(); } catch (error) { console.error('[Cron] TikTok publish status sync failed:', error); } }); console.log('[Cron] TikTok publish status job scheduled (*/2 * * * *).'); // Deux fois par jour (00:00 et 12:00) — contrôle et renouvellement des jetons. // Un jeton révoqué par Meta ne prévient pas : passer deux fois par jour // réduit d'autant la fenêtre pendant laquelle une publication échouerait. cron.schedule('0 0,12 * * *', async () => { console.log('[Cron] Running token check...'); const results = await TokenManager.checkAndRefreshTokens(); const renewed = results.filter(r => r.renewed).length; const failing = results.filter(r => r.status === 'expired' || r.status === 'error').length; console.log(`[Cron] Token check done: ${results.length} contrôlés, ${renewed} renouvelés, ${failing} en échec.`); }); console.log('[Cron] Token refresh job scheduled (0 0,12 * * *).'); // Run twice daily (08:00 and 20:00) — Analytics sync for all pages cron.schedule('0 8,20 * * *', async () => { console.log('[Cron] Running analytics sync for all pages...'); try { await AnalyticsService.syncAllPages(); } catch (error) { console.error('[Cron] Analytics sync failed:', error); } }); console.log('[Cron] Analytics sync job scheduled (0 8,20 * * *).'); // Run every day at 03:00 AM — Cleanup old media from Cloudinary and DB cron.schedule('0 3 * * *', async () => { console.log('[Cron] Running daily media purge check...'); try { await purgeOldMedia(); } catch (error) { console.error('[Cron] Media purge check failed:', error); } }); console.log('[Cron] Media purge job scheduled (0 3 * * *).'); }