feat: Job Scheduling (#3927)

* Adds back _JobSchedule as volatile class

* wip

* Restores jobs endpoints for creation, update and deletion

* Adds tests

* Fixes postgres tests

* Enforce jobName exists before creating a schedule
This commit is contained in:
Florent Vilmart
2017-06-14 13:07:00 -04:00
committed by GitHub
parent 9256b2d7e6
commit f0949a1310
5 changed files with 284 additions and 15 deletions

View File

@@ -1,20 +1,76 @@
import PromiseRouter from '../PromiseRouter';
const triggers = require('../triggers');
import PromiseRouter from '../PromiseRouter';
import Parse from 'parse/node';
import rest from '../rest';
const triggers = require('../triggers');
const middleware = require('../middlewares');
function formatJobSchedule(job_schedule) {
if (typeof job_schedule.startAfter === 'undefined') {
job_schedule.startAfter = new Date().toISOString();
}
return job_schedule;
}
function validateJobSchedule(config, job_schedule) {
const jobs = triggers.getJobs(config.applicationId) || {};
if (job_schedule.jobName && !jobs[job_schedule.jobName]) {
throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Cannot Schedule a job that is not deployed');
}
}
export class CloudCodeRouter extends PromiseRouter {
mountRoutes() {
this.route('GET',`/cloud_code/jobs`, CloudCodeRouter.getJobs);
this.route('GET', '/cloud_code/jobs', middleware.promiseEnforceMasterKeyAccess, CloudCodeRouter.getJobs);
this.route('GET', '/cloud_code/jobs/data', middleware.promiseEnforceMasterKeyAccess, CloudCodeRouter.getJobsData);
this.route('POST', '/cloud_code/jobs', middleware.promiseEnforceMasterKeyAccess, CloudCodeRouter.createJob);
this.route('PUT', '/cloud_code/jobs/:objectId', middleware.promiseEnforceMasterKeyAccess, CloudCodeRouter.editJob);
this.route('DELETE', '/cloud_code/jobs/:objectId', middleware.promiseEnforceMasterKeyAccess, CloudCodeRouter.deleteJob);
}
static getJobs(req) {
return rest.find(req.config, req.auth, '_JobSchedule', {}, {}).then((scheduledJobs) => {
return {
response: scheduledJobs.results
}
});
}
static getJobsData(req) {
const config = req.config;
const jobs = triggers.getJobs(config.applicationId) || {};
return Promise.resolve({
response: Object.keys(jobs).map((jobName) => {
return {
jobName,
return rest.find(req.config, req.auth, '_JobSchedule', {}, {}).then((scheduledJobs) => {
return {
response: {
in_use: scheduledJobs.results.map((job) => job.jobName),
jobs: Object.keys(jobs),
}
})
};
});
}
static createJob(req) {
const { job_schedule } = req.body;
validateJobSchedule(req.config, job_schedule);
return rest.create(req.config, req.auth, '_JobSchedule', formatJobSchedule(job_schedule), req.client);
}
static editJob(req) {
const { objectId } = req.params;
const { job_schedule } = req.body;
validateJobSchedule(req.config, job_schedule);
return rest.update(req.config, req.auth, '_JobSchedule', { objectId }, formatJobSchedule(job_schedule)).then((response) => {
return {
response
}
});
}
static deleteJob(req) {
const { objectId } = req.params;
return rest.del(req.config, req.auth, '_JobSchedule', objectId).then((response) => {
return {
response
}
});
}
}