BREAKING CHANGE: This upgrades the internally used Express framework from version 4 to 5, which may be a breaking change. If Parse Server is set up to be mounted on an Express application, we recommend to also use version 5 of the Express framework to avoid any compatibility issues. Note that even if there are no issues after upgrading, future releases of Parse Server may introduce issues if Parse Server internally relies on Express 5-specific features which are unsupported by the Express version on which it is mounted. See the Express [migration guide](https://expressjs.com/en/guide/migrating-5.html) and [release announcement](https://expressjs.com/2024/10/15/v5-release.html#breaking-changes) for more info.
124 lines
3.0 KiB
JavaScript
124 lines
3.0 KiB
JavaScript
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',
|
|
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 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,
|
|
req.info.context
|
|
);
|
|
}
|
|
|
|
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),
|
|
undefined,
|
|
req.info.context
|
|
)
|
|
.then(response => {
|
|
return {
|
|
response,
|
|
};
|
|
});
|
|
}
|
|
|
|
static deleteJob(req) {
|
|
const { objectId } = req.params;
|
|
return rest
|
|
.del(req.config, req.auth, '_JobSchedule', objectId, req.info.context)
|
|
.then(response => {
|
|
return {
|
|
response,
|
|
};
|
|
});
|
|
}
|
|
}
|