Skip to content

Commit 7eb388d

Browse files
authored
fix: ensure deleteJobOnComplete property for jobs works (#9283)
Ensures that the `deleteJobOnComplete` (which is `true` by default) property works properly
1 parent 07c76aa commit 7eb388d

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

packages/payload/src/queues/operations/runJobs/index.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ export const runJobs = async ({
130130
if (jobsQuery?.docs?.length) {
131131
req.payload.logger.info(`Running ${jobsQuery.docs.length} jobs.`)
132132
}
133+
const jobsToDelete: (number | string)[] | undefined = req.payload.config.jobs.deleteJobOnComplete
134+
? []
135+
: undefined
133136

134137
const jobPromises = jobsQuery.docs.map(async (job) => {
135138
if (!job.workflowSlug && !job.taskSlug) {
@@ -191,6 +194,11 @@ export const runJobs = async ({
191194
workflowConfig,
192195
workflowHandler,
193196
})
197+
198+
if (result.status !== 'error' && jobsToDelete) {
199+
jobsToDelete.push(job.id)
200+
}
201+
194202
return { id: job.id, result }
195203
} else {
196204
const result = await runJSONJob({
@@ -200,11 +208,32 @@ export const runJobs = async ({
200208
workflowConfig,
201209
workflowHandler,
202210
})
211+
212+
if (result.status !== 'error' && jobsToDelete) {
213+
jobsToDelete.push(job.id)
214+
}
215+
203216
return { id: job.id, result }
204217
}
205218
})
206219

207220
const resultsArray = await Promise.all(jobPromises)
221+
222+
if (jobsToDelete && jobsToDelete.length > 0) {
223+
try {
224+
await req.payload.delete({
225+
collection: 'payload-jobs',
226+
req,
227+
where: { id: { in: jobsToDelete } },
228+
})
229+
} catch (err) {
230+
req.payload.logger.error({
231+
err,
232+
msg: `failed to delete jobs ${jobsToDelete.join(', ')} on complete`,
233+
})
234+
}
235+
}
236+
208237
const resultsObject: RunJobsResult['jobStatus'] = resultsArray.reduce((acc, cur) => {
209238
if (cur !== null) {
210239
// Check if there's a valid result to include

test/queues/int.spec.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ describe('Queues', () => {
151151
})
152152

153153
it('ensure job retrying works', async () => {
154+
payload.config.jobs.deleteJobOnComplete = false
154155
const job = await payload.jobs.queue({
155156
workflow: 'retriesTest',
156157
queue: 'default',
@@ -183,9 +184,11 @@ describe('Queues', () => {
183184

184185
// @ts-expect-error amountRetried is new arbitrary data and not in the type
185186
expect(jobAfterRun.input.amountRetried).toBe(3)
187+
payload.config.jobs.deleteJobOnComplete = true
186188
})
187189

188190
it('ensure workflow-level retries are respected', async () => {
191+
payload.config.jobs.deleteJobOnComplete = false
189192
const job = await payload.jobs.queue({
190193
workflow: 'retriesWorkflowLevelTest',
191194
input: {
@@ -217,6 +220,8 @@ describe('Queues', () => {
217220

218221
// @ts-expect-error amountRetried is new arbitrary data and not in the type
219222
expect(jobAfterRun.input.amountRetried).toBe(2)
223+
224+
payload.config.jobs.deleteJobOnComplete = true
220225
})
221226

222227
/*
@@ -256,6 +261,7 @@ describe('Queues', () => {
256261
})*/
257262

258263
it('ensure backoff strategy of task is respected', async () => {
264+
payload.config.jobs.deleteJobOnComplete = false
259265
const job = await payload.jobs.queue({
260266
workflow: 'retriesBackoffTest',
261267
input: {
@@ -338,6 +344,8 @@ describe('Queues', () => {
338344
expect(durations[1]).toBeGreaterThan(600)
339345
expect(durations[2]).toBeGreaterThan(1200)
340346
expect(durations[3]).toBeGreaterThan(2400)
347+
348+
payload.config.jobs.deleteJobOnComplete = true
341349
})
342350

343351
it('can create new inline jobs', async () => {
@@ -359,6 +367,43 @@ describe('Queues', () => {
359367
expect(allSimples.docs[0].title).toBe('hello!')
360368
})
361369

370+
it('should respect deleteJobOnComplete true default configuration', async () => {
371+
const { id } = await payload.jobs.queue({
372+
workflow: 'inlineTaskTest',
373+
input: {
374+
message: 'hello!',
375+
},
376+
})
377+
378+
const before = await payload.findByID({ collection: 'payload-jobs', id, disableErrors: true })
379+
expect(before.id).toBe(id)
380+
381+
await payload.jobs.run()
382+
383+
const after = await payload.findByID({ collection: 'payload-jobs', id, disableErrors: true })
384+
expect(after).toBeNull()
385+
})
386+
387+
it('should respect deleteJobOnComplete false configuration', async () => {
388+
payload.config.jobs.deleteJobOnComplete = false
389+
const { id } = await payload.jobs.queue({
390+
workflow: 'inlineTaskTest',
391+
input: {
392+
message: 'hello!',
393+
},
394+
})
395+
396+
const before = await payload.findByID({ collection: 'payload-jobs', id, disableErrors: true })
397+
expect(before.id).toBe(id)
398+
399+
await payload.jobs.run()
400+
401+
const after = await payload.findByID({ collection: 'payload-jobs', id, disableErrors: true })
402+
expect(after.id).toBe(id)
403+
404+
payload.config.jobs.deleteJobOnComplete = true
405+
})
406+
362407
it('can queue single tasks', async () => {
363408
await payload.jobs.queue({
364409
task: 'CreateSimple',
@@ -513,6 +558,7 @@ describe('Queues', () => {
513558
})
514559

515560
it('can queue single tasks 500 times', async () => {
561+
payload.config.jobs.deleteJobOnComplete = false
516562
for (let i = 0; i < 500; i++) {
517563
await payload.jobs.queue({
518564
task: 'CreateSimple',
@@ -534,6 +580,7 @@ describe('Queues', () => {
534580
expect(allSimples.totalDocs).toBe(500) // Default limit: 10
535581
expect(allSimples.docs[0].title).toBe('from single task')
536582
expect(allSimples.docs[490].title).toBe('from single task')
583+
payload.config.jobs.deleteJobOnComplete = true
537584
})
538585

539586
it('ensure default jobs run limit of 10 works', async () => {

0 commit comments

Comments
 (0)