#scheduleStarted
Event
When a Schedule your Addon has created starts, the Schedule System will fire a scheduleStarted
Event. You should respond as soon as you recieve the Event (this is done automatically when using the static-cms-addon
Helper Package).
After receiving and acknowleding this Event, you can run whatever functionality you wish based on the Schedule's eventName
and body
which are sent within the Event. Once your custom functionality completes successfully or fails, you must make a call to MercuryCMS indicating whether the function succeeded or failed. If you fail to make the status call within the Schedule's configured timeout period, the Schedule System will mark it as a failure and ignore any further calls about that Run.
Here's an example using static-cms-addon
:
import cms from 'static-cms-addon'
import importStoreItems from './importStoreItems.js' // hypothetical user-defined import script
let app = cms.createServer()
app.on('scheduleStarted:importStoreItems', async e => {
try {
let log = await importStoreItems({category: e.body.category})
e.log(log)
await e.success()
} catch (err) {
e.log(err)
await e.error()
}
})
app.listenToEvents('/api/events')
app.listen(cms.getPort())
This is the same functionality but using express
without static-cms-addon
:
import axios from 'axios'
import express from 'express'
import formidable from 'express-formidable'
import importStoreItems from './importStoreItems.js' // hypothetical user-defined import script
let cmsPort = process.argv[process.argv.indexOf('--cms-port') + 1]
let addonId = process.argv[process.argv.indexOf('--addon-id') + 1]
let addonPort = process.argv[process.argv.indexOf('--ports') + 1].split(',')[0]
let app = express()
app.use(formidable())
app.post('/api/events', async (req, res) => {
// handle scheduleStarted event
if (req.fields.event.type == 'scheduleStarted') {
res.send() // respond immediately
if (req.fields.event.eventName == 'importStoreItems') {
try {
let log = await importStoreItems({category: req.fields.event.body.category})
await axios.post(`http://localhost:${cmsPort}/api/addon/${addonId}/schedule/${req.fields.event.scheduleId}/complete`, {runId: req.fields.event.runId, log})
} catch (err) {
await axios.post(`http://localhost:${cmsPort}/api/addon/${addonId}/schedule/${req.fields.event.scheduleId}/complete`, {runId: req.fields.event.runId, status: 'error', log: err})
}
}
return
}
// return a simple 200 status code if the event is unrecognized
res.send()
})
app.listen(addonPort)
In the above examples, the Addon has created multiple Schedules with the same "importStoreItems"
eventName
but different body
values.
There are a few special rules for scheduleStarted
Events when using static-cms-addon
:
- You do not need to call
e.send()
as this is automatically done for you before your Event Handler is run - The provided Event object contains a special
e.log()
function that works likeconsole.log()
to add lines to a log that will be automatically sent when you calle.success()
ore.error()
- The provided Event object contains special
e.success()
ande.error()
functions used to make the status call to MercuryCMS - You can either use
app.on('scheduleStarted', handler)
to listen to alleventNames
or useapp.on('scheduleStarted:importStoreItems', handler)
to listen to that specificeventName
In the express
example, remember that you must include the scheduleId
in the route and runId
in the response body to /api/addon/<addonId>/schedule/<scheduleId>/complete
.