diff --git a/server/src/domain/jobs/job.repository.interface.ts b/server/src/domain/jobs/job.repository.interface.ts index 190323eed..d253523fa 100644 --- a/server/src/domain/jobs/job.repository.interface.ts +++ b/server/src/domain/jobs/job.repository.interface.ts @@ -72,4 +72,5 @@ export interface IJobsRepository { // ******************** findPage(pagination: JobPageQuery): Promise; findAll(): Promise; + countDueBacklog(now: number): Promise; // Scaling signal } diff --git a/server/src/domain/jobs/job.repository.mongo.ts b/server/src/domain/jobs/job.repository.mongo.ts index 89d8dfd04..60bd4cd77 100644 --- a/server/src/domain/jobs/job.repository.mongo.ts +++ b/server/src/domain/jobs/job.repository.mongo.ts @@ -301,6 +301,15 @@ class MongoJobsRepository implements IJobsRepository { const docs = await JobModel.find().lean(); return docs.map(this.toEntity); }; + + countDueBacklog = async (now: number) => { + return JobModel.countDocuments({ + type: "check", + isActive: true, + nextScheduledAt: { $lte: now }, + $or: [{ lockedUntil: null }, { lockedUntil: { $lt: now } }], // free or expired lock + }); + }; } export default MongoJobsRepository;