From 8b6dfe7a426d0774b27836cdc171f678c1b09a19 Mon Sep 17 00:00:00 2001 From: Taylor Schley Date: Sat, 25 Jun 2022 11:48:33 -0500 Subject: [PATCH] feat: return job after start/stop --- app/controllers/api/v1/control.js | 26 ++++++++++++++++---- app/controllers/api/v1/sse.js | 2 +- routes/api/v1/index.js | 40 +++++++++++++++++++++++++------ test/api/v1/restart.js | 2 ++ test/api/v1/sse.js | 17 ++++--------- test/api/v1/start.js | 2 ++ test/api/v1/stop.js | 2 ++ 7 files changed, 65 insertions(+), 26 deletions(-) diff --git a/app/controllers/api/v1/control.js b/app/controllers/api/v1/control.js index b3e61a6..328ecbb 100644 --- a/app/controllers/api/v1/control.js +++ b/app/controllers/api/v1/control.js @@ -9,37 +9,53 @@ async function checkJobName(ctx, next) { return next(); } -async function start(ctx) { +async function addJobNameToQuery(ctx, next) { + const { jobName } = ctx.params; + + ctx.query = { name: jobName }; + + return next(); +} + +async function start(ctx, next) { const { jobName } = ctx.params; await ctx.bree.start(jobName); ctx.body = {}; + + return next(); } -async function stop(ctx) { +async function stop(ctx, next) { const { jobName } = ctx.params; await ctx.bree.stop(jobName); ctx.body = {}; + + return next(); } -async function run(ctx) { +async function run(ctx, next) { const { jobName } = ctx.params; await ctx.bree.run(jobName); ctx.body = {}; + + return next(); } -async function restart(ctx) { +async function restart(ctx, next) { const { jobName } = ctx.params; await ctx.bree.stop(jobName); await ctx.bree.start(jobName); ctx.body = {}; + + return next(); } -module.exports = { checkJobName, start, stop, run, restart }; +module.exports = { checkJobName, addJobNameToQuery, start, stop, run, restart }; diff --git a/app/controllers/api/v1/sse.js b/app/controllers/api/v1/sse.js index d9d1989..80d3cf7 100644 --- a/app/controllers/api/v1/sse.js +++ b/app/controllers/api/v1/sse.js @@ -3,7 +3,7 @@ async function connect(ctx) { // send bree events over sse for (const event of ['worker created', 'worker deleted']) { ctx.bree.on(event, (name) => { - ctx.sse.send({ event, data: { name } }); + ctx.sse.send({ event, data: name }); }); } diff --git a/routes/api/v1/index.js b/routes/api/v1/index.js index c2458b2..ce4d4d2 100644 --- a/routes/api/v1/index.js +++ b/routes/api/v1/index.js @@ -19,16 +19,42 @@ router.post('/jobs', api.v1.jobs.add); router.use(api.v1.control.checkJobName); router.post('/start', api.v1.control.start); -router.post('/start/:jobName', api.v1.control.start); +router.post( + '/start/:jobName', + api.v1.control.start, + api.v1.control.addJobNameToQuery, + api.v1.jobs.get +); router.post('/stop', api.v1.control.stop); -router.post('/stop/:jobName', api.v1.control.stop); - -router.post('/run/:jobName', api.v1.control.run); +router.post( + '/stop/:jobName', + api.v1.control.stop, + api.v1.control.addJobNameToQuery, + api.v1.jobs.get +); + +router.post( + '/run/:jobName', + api.v1.control.run, + api.v1.control.addJobNameToQuery, + api.v1.jobs.get +); router.post('/restart', api.v1.control.restart); -router.post('/restart/:jobName', api.v1.control.restart); - -router.get('/sse/:token', api.v1.sse.connect); +router.post( + '/restart/:jobName', + api.v1.control.restart, + api.v1.control.addJobNameToQuery, + api.v1.jobs.get +); + +router.get('/sse', api.v1.sse.connect); +router.get( + '/sse/:token', + api.v1.sse.connect, + api.v1.control.addJobNameToQuery, + api.v1.jobs.get +); module.exports = router; diff --git a/test/api/v1/restart.js b/test/api/v1/restart.js index b45bc56..782aa4d 100644 --- a/test/api/v1/restart.js +++ b/test/api/v1/restart.js @@ -54,6 +54,8 @@ test.serial('successfully restart active job', async (t) => { const res = await api.post(`${rootUrl}/active`).send({}); t.is(res.status, 200); + t.is(res.body.length, 1); + t.like(res.body[0], { name: 'active' }); await delay(200); diff --git a/test/api/v1/sse.js b/test/api/v1/sse.js index dc96a67..b389e12 100644 --- a/test/api/v1/sse.js +++ b/test/api/v1/sse.js @@ -12,20 +12,10 @@ const rootUrl = '/v1/sse'; test.before(async (t) => { await utils.setupApiServer(t, { jobs: [ - { name: 'done', path: path.join(utils.root, 'basic.js') }, { name: 'delayed', path: path.join(utils.root, 'basic.js'), - timeout: 100 - }, - { - name: 'waiting', - path: path.join(utils.root, 'basic.js'), - interval: 100 - }, - { - name: 'active', - path: path.join(utils.root, 'long.js') + interval: 1000 } ] }); @@ -48,9 +38,10 @@ const eventsMacro = test.macro({ async exec(t, event) { const es = utils.setupEventSource(t, rootUrl); - await once(es, event); + const [res] = await once(es, event); - t.pass(); + t.is(res.type, event); + t.is(res.data, 'delayed'); }, title(_, event) { return `successfully listen to "${event}" messages`; diff --git a/test/api/v1/start.js b/test/api/v1/start.js index fbc309c..077896c 100644 --- a/test/api/v1/start.js +++ b/test/api/v1/start.js @@ -70,6 +70,8 @@ test.serial('successfully start named job', async (t) => { const res = await api.post(`${rootUrl}/timeout`).send({}); t.is(res.status, 200); + t.is(res.body.length, 1); + t.like(res.body[0], { name: 'timeout' }); await delay(200); diff --git a/test/api/v1/stop.js b/test/api/v1/stop.js index 092fa58..299514e 100644 --- a/test/api/v1/stop.js +++ b/test/api/v1/stop.js @@ -46,6 +46,8 @@ test.serial('successfully stop named job', async (t) => { const res = await api.post(`${rootUrl}/active`).send({}); t.is(res.status, 200); + t.is(res.body.length, 1); + t.like(res.body[0], { name: 'active' }); t.falsy(bree.workers.has('active')); });