Wire campaign scheduler into server boot
This commit is contained in:
@@ -3,6 +3,7 @@ import { openDb, ensureSeeds } from '../src/db.mjs';
|
|||||||
import { createJobManager, recoverOrphans } from '../src/jobs/manager.mjs';
|
import { createJobManager, recoverOrphans } from '../src/jobs/manager.mjs';
|
||||||
import { createAppServer } from '../src/server/index.mjs';
|
import { createAppServer } from '../src/server/index.mjs';
|
||||||
import { startOutreachScheduler } from '../src/outreach/scheduler.mjs';
|
import { startOutreachScheduler } from '../src/outreach/scheduler.mjs';
|
||||||
|
import { startCampaignScheduler } from '../src/outreach/campaign-scheduler.mjs';
|
||||||
|
|
||||||
// Servidor local do GTI Maquina Comercial. Inicie com:
|
// Servidor local do GTI Maquina Comercial. Inicie com:
|
||||||
// npm start (ou node scripts/servidor.mjs, ou o GTI-Comercial.exe)
|
// npm start (ou node scripts/servidor.mjs, ou o GTI-Comercial.exe)
|
||||||
@@ -19,6 +20,7 @@ recoverOrphans(db, log);
|
|||||||
const jobs = createJobManager();
|
const jobs = createJobManager();
|
||||||
const server = createAppServer({ db, jobs, log });
|
const server = createAppServer({ db, jobs, log });
|
||||||
startOutreachScheduler({ db, log });
|
startOutreachScheduler({ db, log });
|
||||||
|
startCampaignScheduler({ db, log });
|
||||||
|
|
||||||
const port = GTI_PORT;
|
const port = GTI_PORT;
|
||||||
server.listen(port, '127.0.0.1', () => {
|
server.listen(port, '127.0.0.1', () => {
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import { runCampaignQueue } from './campaign-worker.mjs';
|
||||||
|
import { escalateWeeklyLimits } from './campaign-store.mjs';
|
||||||
|
|
||||||
|
const CICLO_MS = 20 * 60 * 1000;
|
||||||
|
|
||||||
|
// Timer interno separado do scheduler.mjs existente (run.mjs/runOutreachBatch)
|
||||||
|
// — mesmo padrao (setInterval com .unref(), primeiro ciclo antecipado pouco
|
||||||
|
// depois do boot), rodando ao lado sem interferir um no outro.
|
||||||
|
export function startCampaignScheduler({ db, log = () => {} }) {
|
||||||
|
const ciclo = () => {
|
||||||
|
escalateWeeklyLimits(db);
|
||||||
|
runCampaignQueue({ db, log }).catch((error) => {
|
||||||
|
log(`campanhas: erro inesperado no ciclo automatico: ${error.message}`);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const primeiro = setTimeout(ciclo, 45 * 1000);
|
||||||
|
primeiro.unref();
|
||||||
|
const timer = setInterval(ciclo, CICLO_MS);
|
||||||
|
timer.unref();
|
||||||
|
return () => {
|
||||||
|
clearTimeout(primeiro);
|
||||||
|
clearInterval(timer);
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { openDb } from '../src/db.mjs';
|
||||||
|
import { startCampaignScheduler } from '../src/outreach/campaign-scheduler.mjs';
|
||||||
|
|
||||||
|
test('startCampaignScheduler retorna funcao de parada que limpa os timers sem lancar erro', () => {
|
||||||
|
const db = openDb(':memory:');
|
||||||
|
const stop = startCampaignScheduler({ db, log: () => {} });
|
||||||
|
assert.equal(typeof stop, 'function');
|
||||||
|
assert.doesNotThrow(() => stop());
|
||||||
|
db.close();
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user