Skip to content

Commit 24ab67f

Browse files
authored
feat(details): update job data (#674)
1 parent 502afd3 commit 24ab67f

File tree

9 files changed

+110
-4
lines changed

9 files changed

+110
-4
lines changed

docker-compose.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
version: '3.2'
2+
services:
3+
redis:
4+
image: redis:6-alpine
5+
container_name: redis-6
6+
ports:
7+
- 6379:6379

example/bee.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async function main() {
3030
.delayUntil(Date.now() + 60 * 1000)
3131
.save();
3232

33-
const job = await queue.createJob({}).save();
33+
await queue.createJob({}).save();
3434

3535
Arena(
3636
{

example/bull.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ async function main() {
3939
}
4040
});
4141

42-
await queue.add({});
42+
await queue.add({data: 'data'});
4343

4444
// adding delayed jobs
4545
const delayedJob = await queue.add({}, {delay: 60 * 1000});

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
"ci": "npm run lint && if [ -z \"$CI\" ]; then npm run ci:commitlint; fi",
4141
"ci:commitlint": "commitlint --from \"origin/${GITHUB_BASE_REF:-master}\"",
4242
"cm": "git cz",
43+
"dc:up": "docker-compose -f docker-compose.yml up -d",
44+
"dc:down": "docker-compose -f docker-compose.yml down",
4345
"dry:run": "npm publish --dry-run",
4446
"lint": "prettier -c .",
4547
"lint:staged": "lint-staged",

public/dashboard.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,38 @@ $(document).ready(() => {
314314
});
315315
});
316316

317+
$('.js-update-job-data').on('click', function (e) {
318+
e.preventDefault();
319+
const jobId = $(this).data('job-id');
320+
const queueName = $(this).data('queue-name');
321+
const queueHost = $(this).data('queue-host');
322+
const stringifiedData = JSON.stringify(window.jsonEditor.get());
323+
const r = window.confirm(
324+
`Update job #${jobId} data in queue "${queueHost}/${queueName}"?`
325+
);
326+
327+
if (r) {
328+
$.ajax({
329+
url: `${basePath}/api/queue/${encodeURIComponent(
330+
queueHost
331+
)}/${encodeURIComponent(queueName)}/job/${encodeURIComponent(
332+
jobId
333+
)}/data`,
334+
type: 'PUT',
335+
data: stringifiedData,
336+
contentType: 'application/json',
337+
})
338+
.done(() => {
339+
alert('Job data successfully updated!');
340+
window.location.reload();
341+
})
342+
.fail((jqXHR) => {
343+
window.alert('Failed to update job data, check console for error.');
344+
console.error(jqXHR.responseText);
345+
});
346+
}
347+
});
348+
317349
$('.js-add-flow').on('click', function () {
318350
const data = window.jsonEditor.get();
319351
const flow = JSON.stringify({data});

src/server/views/api/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const jobAdd = require('./jobAdd');
66
const jobPromote = require('./jobPromote');
77
const jobRetry = require('./jobRetry');
88
const jobRemove = require('./jobRemove');
9+
const jobDataUpdate = require('./jobDataUpdate');
910
const repeatableJobRemove = require('./repeatableJobRemove');
1011
const bulkJobsPromote = require('./bulkJobsPromote');
1112
const bulkJobsRemove = require('./bulkJobsRemove');
@@ -24,6 +25,7 @@ router.delete(
2425
'/queue/:queueHost/:queueName/repeatable/job/:id',
2526
repeatableJobRemove
2627
);
28+
router.put('/queue/:queueHost/:queueName/job/:id/data', jobDataUpdate);
2729
router.patch('/queue/:queueHost/:queueName/job/:id', jobRetry);
2830
router.put('/queue/:queueHost/:queueName/pause', queuePause);
2931
router.put('/queue/:queueHost/:queueName/resume', queueResume);

src/server/views/api/jobDataUpdate.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
async function handler(req, res) {
2+
const {queueName, queueHost, id} = req.params;
3+
const data = req.body;
4+
5+
const {Queues} = req.app.locals;
6+
7+
const queue = await Queues.get(queueName, queueHost);
8+
if (!queue) return res.status(404).json({error: 'queue not found'});
9+
10+
const job = await queue.getJob(id);
11+
if (!job) return res.status(404).send({error: 'job not found'});
12+
13+
try {
14+
if (job.updateData) {
15+
await job.updateData(data);
16+
} else {
17+
await job.update(data);
18+
}
19+
} catch (err) {
20+
return res.status(500).json({error: err.message});
21+
}
22+
return res.sendStatus(200);
23+
}
24+
25+
module.exports = handler;

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h2>Queue <code>{{ queueHost }}/{{ queueName }}</code></h2>
22

3-
{{> dashboard/jobDetails job basePath=basePath queueName=queueName queueHost=queueHost jobState=jobState stacktraces=stacktraces}}
3+
{{> dashboard/jobDetails job basePath=basePath queueName=queueName queueHost=queueHost jobState=jobState stacktraces=stacktraces view=true}}
44

55
{{#contentFor 'sidebar'}}
66
<li><a href="{{ basePath }}/">Queues Overview</a></li>
@@ -12,4 +12,11 @@
1212
{{#if hasFlows}}
1313
<li><a href="{{ basePath }}/flows/">Flows Overview</a></li>
1414
{{/if}}
15+
{{/contentFor}}
16+
17+
{{#contentFor 'script'}}
18+
if(document.getElementById('jsoneditor')) {
19+
window.jsonEditor = new JSONEditor(document.getElementById('jsoneditor'), { modes: ['code','tree','text'] });
20+
window.jsonEditor.set({{json job.data true}})
21+
}
1522
{{/contentFor}}

src/server/views/partials/dashboard/jobDetails.hbs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,10 @@
7575
<div class="row">
7676
<div class="col-sm-4">
7777
<h5>Permalinks</h5>
78+
{{#unless view}}
7879
<a href="{{ basePath }}/{{ encodeURI queueHost }}/{{ encodeURI queueName }}/{{ encodeURI this.id }}" class="btn btn-info">Job
7980
{{ this.id }}</a>
81+
{{/unless}}
8082
<a href="{{ basePath }}/{{ encodeURI queueHost }}/{{ encodeURI queueName }}/{{ encodeURI this.id }}?json=true"
8183
class="btn btn-info">JSON</a>
8284
</div>
@@ -133,7 +135,36 @@
133135

134136

135137
<h5>Data</h5>
136-
<pre><code class="json">{{json this.data true}}</code></pre>
138+
139+
{{#unless queue.IS_BEE}}
140+
{{#if view }}
141+
<div class="panel with-nav-tabs panel-primary">
142+
<ul class="nav nav-tabs nav-justified">
143+
<li class="active"><a href="#tab1primary" data-toggle="tab">View</a></li>
144+
<li><a class="text-white" href="#tab2primary" data-toggle="tab">Edit</a></li>
145+
</ul>
146+
<div class="panel-body">
147+
<div class="tab-content">
148+
<div class="tab-pane fade in active" id="tab1primary">
149+
{{/if}}
150+
{{/unless}}
151+
<pre><code class="json">{{json this.data true}}</code></pre>
152+
{{#unless queue.IS_BEE}}
153+
{{#if view }}
154+
</div>
155+
<div class="tab-pane fade" id="tab2primary">
156+
<div class="jsoneditorx" id="jsoneditor" style="height:300px;"></div>
157+
<br />
158+
<div class="form-inline pull-right">
159+
<div class="js-update-job-data btn btn-primary btn-sm" data-queue-host="{{ queueHost }}" data-queue-name="{{ queueName }}"
160+
data-job-id="{{ this.id }}">Update</div>
161+
</div>
162+
</div>
163+
</div>
164+
</div>
165+
</div>
166+
{{/if}}
167+
{{/unless}}
137168

138169
{{#if this.queue.IS_BULLMQ}}
139170
{{#if this.parent }}

0 commit comments

Comments
 (0)