Skip to content

Commit e62aef0

Browse files
authored
feat(bull): add clean jobs button for completed and failed (#675)
1 parent 956c5f6 commit e62aef0

File tree

6 files changed

+69
-27
lines changed

6 files changed

+69
-27
lines changed

public/dashboard.js

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -210,38 +210,60 @@ $(document).ready(() => {
210210
queueState,
211211
};
212212

213-
$bulkActionContainer.each((index, value) => {
214-
const isChecked = $(value).find('[name=jobChecked]').is(':checked');
215-
const id = encodeURIComponent($(value).find('[name=jobId]').val());
213+
if (action !== 'clean') {
214+
$bulkActionContainer.each((index, value) => {
215+
const isChecked = $(value).find('[name=jobChecked]').is(':checked');
216+
const id = encodeURIComponent($(value).find('[name=jobId]').val());
217+
218+
if (isChecked) {
219+
data.jobs.push(id);
220+
}
221+
});
222+
}
216223

217-
if (isChecked) {
218-
data.jobs.push(id);
219-
}
220-
});
224+
const count = action === 'clean' ? 1000 : data.jobs.length;
221225

222226
const r = window.confirm(
223-
`${capitalize(action)} ${data.jobs.length} ${
224-
data.jobs.length > 1 ? 'jobs' : 'job'
227+
`${capitalize(action)} ${count} ${
228+
count > 1 ? 'jobs' : 'job'
225229
} in queue "${queueHost}/${queueName}"?`
226230
);
227231
if (r) {
228-
$.ajax({
229-
method: action === 'remove' ? 'POST' : 'PATCH',
230-
url: `${basePath}/api/queue/${encodeURIComponent(
231-
queueHost
232-
)}/${encodeURIComponent(queueName)}/${
233-
action === 'promote' ? 'delayed/' : ''
234-
}job/bulk`,
235-
data: JSON.stringify(data),
236-
contentType: 'application/json',
237-
})
238-
.done(() => {
239-
window.location.reload();
232+
if (action === 'clean') {
233+
$.ajax({
234+
method: 'DELETE',
235+
url: `${basePath}/api/queue/${encodeURIComponent(
236+
queueHost
237+
)}/${encodeURIComponent(queueName)}/jobs/bulk`,
238+
data: JSON.stringify(data),
239+
contentType: 'application/json',
240240
})
241-
.fail((jqXHR) => {
242-
window.alert(`Request failed, check console for error.`);
243-
console.error(jqXHR.responseText);
244-
});
241+
.done(() => {
242+
window.location.reload();
243+
})
244+
.fail((jqXHR) => {
245+
window.alert(`Request failed, check console for error.`);
246+
console.error(jqXHR.responseText);
247+
});
248+
} else {
249+
$.ajax({
250+
method: action === 'remove' ? 'POST' : 'PATCH',
251+
url: `${basePath}/api/queue/${encodeURIComponent(
252+
queueHost
253+
)}/${encodeURIComponent(queueName)}/${
254+
action === 'promote' ? 'delayed/' : ''
255+
}job/bulk`,
256+
data: JSON.stringify(data),
257+
contentType: 'application/json',
258+
})
259+
.done(() => {
260+
window.location.reload();
261+
})
262+
.fail((jqXHR) => {
263+
window.alert(`Request failed, check console for error.`);
264+
console.error(jqXHR.responseText);
265+
});
266+
}
245267
} else {
246268
$(this).prop('disabled', false);
247269
}

src/server/views/api/bulkAction.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const _ = require('lodash');
22

3-
const ACTIONS = ['remove', 'retry', 'promote'];
3+
const ACTIONS = ['clean', 'remove', 'retry', 'promote'];
44

55
function bulkAction(action) {
66
return async function handler(req, res) {
@@ -19,7 +19,7 @@ function bulkAction(action) {
1919
const {jobs, queueState} = req.body;
2020

2121
try {
22-
if (!_.isEmpty(jobs)) {
22+
if (!_.isEmpty(jobs) && job.length > 0) {
2323
const jobsPromises = jobs.map((id) =>
2424
queue.getJob(decodeURIComponent(id))
2525
);
@@ -39,6 +39,9 @@ function bulkAction(action) {
3939
: fetchedJobs.map((job) => job[action]());
4040
await Promise.all(actionPromises);
4141
return res.sendStatus(200);
42+
} else if (action === 'clean') {
43+
await queue.clean(1000, queueState);
44+
return res.sendStatus(200);
4245
}
4346
} catch (e) {
4447
const body = {

src/server/views/api/bulkJobsClean.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const bulkAction = require('./bulkAction');
2+
3+
module.exports = bulkAction('clean');

src/server/views/api/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const jobRetry = require('./jobRetry');
88
const jobRemove = require('./jobRemove');
99
const jobDataUpdate = require('./jobDataUpdate');
1010
const repeatableJobRemove = require('./repeatableJobRemove');
11+
const bulkJobsClean = require('./bulkJobsClean');
1112
const bulkJobsPromote = require('./bulkJobsPromote');
1213
const bulkJobsRemove = require('./bulkJobsRemove');
1314
const bulkJobsRetry = require('./bulkJobsRetry');
@@ -30,5 +31,6 @@ router.patch('/queue/:queueHost/:queueName/job/:id', jobRetry);
3031
router.put('/queue/:queueHost/:queueName/pause', queuePause);
3132
router.put('/queue/:queueHost/:queueName/resume', queueResume);
3233
router.delete('/queue/:queueHost/:queueName/job/:id', jobRemove);
34+
router.delete('/queue/:queueHost/:queueName/jobs/bulk', bulkJobsClean);
3335

3436
module.exports = router;

src/server/views/dashboard/queueJobsByState.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ async function _html(req, res) {
153153
state === 'failed' ||
154154
(state === 'delayed' && !queue.IS_BEE)
155155
);
156+
const disableClean = !(
157+
state === 'failed' ||
158+
state === 'completed' ||
159+
!queue.IS_BULL
160+
);
156161

157162
return res.render('dashboard/templates/queueJobsByState', {
158163
basePath,
@@ -164,6 +169,7 @@ async function _html(req, res) {
164169
disablePagination:
165170
queue.IS_BEE && (state === 'succeeded' || state === 'failed'),
166171
disableOrdering: queue.IS_BEE,
172+
disableClean,
167173
disablePromote,
168174
disableRetry,
169175
currentPage: page,

src/server/views/dashboard/templates/queueJobsByState.hbs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@
5050
data-queue-state="{{ state }}" class="js-bulk-action btn btn-danger">
5151
Remove Jobs
5252
</button>
53+
{{#unless disableClean}}
54+
<button type="button" data-action="clean" data-queue-name="{{ queueName }}" data-queue-host="{{ queueHost }}"
55+
data-queue-state="{{ state }}" class="js-bulk-action btn btn-danger">
56+
Clean 1000 Jobs
57+
</button>
58+
{{/unless}}
5359
{{#unless disableRetry}}
5460
<button type="button" data-action="retry" data-queue-name="{{ queueName }}" data-queue-host="{{ queueHost }}"
5561
data-queue-state="{{ state }}" class="js-bulk-action btn btn-success">

0 commit comments

Comments
 (0)