const pddiktiService = require('../services/v2/pddikti.service') const waJobService = require('../services/waJob.service') const { processBatchUpdateSanksi } = require('../services/batchSanksi.service') const { logInfo, logError } = require('../utils/logger') let isWaWorkerRunning = false let isBatchWorkerRunning = false let waTimer = null let batchTimer = null const processWaJobs = async () => { if (isWaWorkerRunning) return isWaWorkerRunning = true try { const job = await waJobService.processNextJob() if (job) { logInfo('WA_WORKER', 'Processing job', { jobId: job._id, templateId: job.templateId }) try { const response = await pddiktiService.whatsapp( job.templateId, job.contacts, job.body, job.buttons ) await waJobService.markJobSuccess(job._id, response) } catch (error) { await waJobService.markJobFailed(job._id, error, job.attempt + 1) } } } catch (err) { logError('WA_WORKER', 'Error in worker tick', { error: err.message }) } finally { isWaWorkerRunning = false } } const processBatchJobs = async () => { if (isBatchWorkerRunning) return isBatchWorkerRunning = true try { const { processed, error } = await processBatchUpdateSanksi() if (processed > 0) { logInfo('BATCH_WORKER', `Processed ${processed} batch items`, { errors: error.length }) } } catch (err) { logError('BATCH_WORKER', 'Error in batch worker tick', { error: err.message }) } finally { isBatchWorkerRunning = false } } const startWorker = (waIntervalMs = 3000, batchIntervalMs = 30000) => { logInfo('WORKER', `Starting Background Workers (WA: ${waIntervalMs}ms, Batch: ${batchIntervalMs}ms)`) waJobService.resetStuckJobs() waTimer = setInterval(processWaJobs, waIntervalMs) batchTimer = setInterval(processBatchJobs, batchIntervalMs) } const stopWorker = () => { if (waTimer) clearInterval(waTimer) if (batchTimer) clearInterval(batchTimer) logInfo('WORKER', 'Stopped Background Workers') } module.exports = { startWorker, stopWorker, }