diff --git a/core/server/web/api/testmode/index.js b/core/server/web/api/testmode/index.js index 02742912ae..ae671fdfa5 100644 --- a/core/server/web/api/testmode/index.js +++ b/core/server/web/api/testmode/index.js @@ -1,3 +1,4 @@ +const path = require('path'); const logging = require('../../../../shared/logging'); const express = require('../../../../shared/express'); const jobService = require('../../../services/jobs'); @@ -40,24 +41,29 @@ module.exports = function testRoutes() { res.sendStatus(202); }); - router.get('/schedule/:schedule', (req, res) => { + router.get('/schedule/:schedule/:name*?', (req, res) => { if (!req.params.schedule) { return res.sendStatus(400, 'schedule parameter cannot be mepty'); } const schedule = req.params.schedule; - logging.info('Achedule a Job with schedule of:', schedule); + logging.info('Achedule a Job with schedule of:', schedule, req.params.name); - jobService.scheduleJob(() => { - return new Promise((resolve) => { - logging.info('Start scheduled Job'); + if (req.params.name) { + const jobPath = path.resolve(__dirname, 'jobs', req.params.name); + jobService.scheduleJob(schedule, jobPath); + } else { + jobService.scheduleJob(schedule, () => { + return new Promise((resolve) => { + logging.info('Start scheduled Job'); - setTimeout(() => { - logging.info('End scheduled Job run', schedule); - resolve(); - }, 20 * 1000); - }); - }, {}, schedule); + setTimeout(() => { + logging.info('End scheduled Job run', schedule); + resolve(); + }, 20 * 1000); + }); + }, {}); + } res.sendStatus(202); }); diff --git a/core/server/web/api/testmode/jobs/say-hello.js b/core/server/web/api/testmode/jobs/say-hello.js new file mode 100644 index 0000000000..3ac194677b --- /dev/null +++ b/core/server/web/api/testmode/jobs/say-hello.js @@ -0,0 +1,17 @@ +const logging = require('../../../../../shared/logging'); + +const helloJob = () => { + logging.info('Starting hello job'); + + logging.info('Gonna say "hi" in 5 seconds'); + + return new Promise((resolve) => { + setTimeout(() => { + logging.info('hi!'); + logging.info('Ending hello job run.'); + resolve(); + }, 5 * 1000); + }); +}; + +module.exports = helloJob; diff --git a/package.json b/package.json index 23510588ce..96752f067b 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@tryghost/errors": "0.2.5", "@tryghost/helpers": "1.1.34", "@tryghost/image-transform": "1.0.3", - "@tryghost/job-manager": "0.1.2", + "@tryghost/job-manager": "0.2.0", "@tryghost/kg-card-factory": "2.1.4", "@tryghost/kg-default-atoms": "2.0.2", "@tryghost/kg-default-cards": "3.0.1", diff --git a/yarn.lock b/yarn.lock index 2cb7c1295b..10230eccf9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,13 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/runtime@^7.10.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + "@breejs/later@4.0.2": version "4.0.2" resolved "https://registry.yarnpkg.com/@breejs/later/-/later-4.0.2.tgz#38c85cc98b717c7a196f87238090adaea01f8c9e" @@ -442,13 +449,13 @@ optionalDependencies: sharp "0.25.4" -"@tryghost/job-manager@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@tryghost/job-manager/-/job-manager-0.1.2.tgz#f22c1a574423567cf028c45ea2fdf29613a073ab" - integrity sha512-P3NI7mEA6zDy5FVR9woW10HNmdQbi5SmNM0gG04jwupNmA5RaTGwzBEVPMdws73gCv8psjsnRcEDcOQ1fuPOaw== +"@tryghost/job-manager@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@tryghost/job-manager/-/job-manager-0.2.0.tgz#5c6949c89966b712a12b38e95ffaa076281a9471" + integrity sha512-Tylxoy0SLrnN/iuN/uBc5EB67lhsB3IFDzh0ug5HlES559OW0byYKMwXBxuVA/Tkb8j1eF6nE81GjEqhdi6+FA== dependencies: "@breejs/later" "4.0.2" - cron-parser "2.17.0" + cron-validate "1.4.0" fastq "1.9.0" p-wait-for "3.1.0" @@ -2193,13 +2200,12 @@ create-error@~0.3.1: resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23" integrity sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM= -cron-parser@2.17.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.17.0.tgz#5707421a7e0a73ee74675d1c032a2f14123f2cf8" - integrity sha512-oTmzVEwlurRe51HqTm4afshVr8Rkxy9kFiWxh5e6SmrY2o9NDYU4S6SduanBZYXLgkLy0skA98y7/tztW/DmjQ== +cron-validate@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cron-validate/-/cron-validate-1.4.0.tgz#aaf5c789db5226ad82b8168ec7654023984c27b3" + integrity sha512-z4Mik62Wdvgn1WC9OCGdwxTYO6TCjasTw3SAYsVq0tfArYh6Zg7bbgGVVNBiNAcnnxXsdnBj4AatkYunntaT9A== dependencies: - is-nan "^1.3.0" - moment-timezone "^0.5.31" + yup "0.29.3" cross-spawn@^5.0.1: version "5.1.0" @@ -3615,6 +3621,11 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +fn-name@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-3.0.0.tgz#0596707f635929634d791f452309ab41558e3c5c" + integrity sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA== + follow-redirects@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-0.0.3.tgz#6ce67a24db1fe13f226c1171a72a7ef2b17b8f65" @@ -4926,13 +4937,6 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== -is-nan@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.0.tgz#85d1f5482f7051c2019f5673ccebdb06f3b0db03" - integrity sha512-z7bbREymOqt2CCaZVly8aC4ML3Xhfi0ekuOnjO2L8vKdl+CttdVoGZQhd4adMFAsxQ5VeRVwORs4tU8RH+HFtQ== - dependencies: - define-properties "^1.1.3" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6278,7 +6282,7 @@ module-not-found-error@^1.0.1: resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= -moment-timezone@0.5.23, moment-timezone@0.5.28, moment-timezone@0.5.31, moment-timezone@^0.5.31: +moment-timezone@0.5.23, moment-timezone@0.5.28, moment-timezone@0.5.31: version "0.5.23" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== @@ -7546,6 +7550,11 @@ propagate@^2.0.0: resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== +property-expr@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.4.tgz#37b925478e58965031bb612ec5b3260f8241e910" + integrity sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg== + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -7782,6 +7791,11 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -8838,6 +8852,11 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +synchronous-promise@^2.0.13: + version "2.0.15" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.15.tgz#07ca1822b9de0001f5ff73595f3d08c4f720eb8e" + integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg== + sywac@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/sywac/-/sywac-1.3.0.tgz#324789bdb8bd7d0d66625c9144fce81ab5ba6f99" @@ -9043,6 +9062,11 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + tough-cookie@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -9806,6 +9830,19 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +yup@0.29.3: + version "0.29.3" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.29.3.tgz#69a30fd3f1c19f5d9e31b1cf1c2b851ce8045fea" + integrity sha512-RNUGiZ/sQ37CkhzKFoedkeMfJM0vNQyaz+wRZJzxdKE7VfDeVKH8bb4rr7XhRLbHJz5hSjoDNwMEIaKhuMZ8gQ== + dependencies: + "@babel/runtime" "^7.10.5" + fn-name "~3.0.0" + lodash "^4.17.15" + lodash-es "^4.17.11" + property-expr "^2.0.2" + synchronous-promise "^2.0.13" + toposort "^2.0.2" + zip-stream@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"