mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-18 16:01:40 +03:00
Migrated schedules v2/v3 APIs to match refactor in canary
refs https://github.com/TryGhost/Team/issues/694 - The canary schedules controller was refactored to use newly introduced post-scheduling service in a previous commit. This is a follow up to match v2/v3 controllers as they had identical code to the canary one.
This commit is contained in:
parent
7b53a61b73
commit
db2ef7dbca
@ -1,11 +1,6 @@
|
||||
const _ = require('lodash');
|
||||
const moment = require('moment');
|
||||
const config = require('../../../shared/config');
|
||||
const models = require('../../models');
|
||||
const urlUtils = require('../../../shared/url-utils');
|
||||
const i18n = require('../../../shared/i18n');
|
||||
const errors = require('@tryghost/errors');
|
||||
const api = require('./index');
|
||||
|
||||
const postSchedulingService = require('../../services/posts/post-scheduling-service')('canary');
|
||||
|
||||
module.exports = {
|
||||
docName: 'schedules',
|
||||
@ -32,11 +27,8 @@ module.exports = {
|
||||
permissions: {
|
||||
docName: 'posts'
|
||||
},
|
||||
query(frame) {
|
||||
let resource;
|
||||
async query(frame) {
|
||||
const resourceType = frame.options.resource;
|
||||
const publishAPostBySchedulerToleranceInMinutes = config.get('times').publishAPostBySchedulerToleranceInMinutes;
|
||||
|
||||
const options = {
|
||||
status: 'scheduled',
|
||||
id: frame.options.id,
|
||||
@ -45,53 +37,13 @@ module.exports = {
|
||||
}
|
||||
};
|
||||
|
||||
return api[resourceType].read({id: frame.options.id}, options)
|
||||
.then((result) => {
|
||||
resource = result[resourceType][0];
|
||||
const publishedAtMoment = moment(resource.published_at);
|
||||
const {scheduledResource, preScheduledResource} = await postSchedulingService.publish(resourceType, frame.options.id, frame.data.force, options);
|
||||
const cacheInvalidate = postSchedulingService.handleCacheInvalidation(scheduledResource, preScheduledResource);
|
||||
this.headers.cacheInvalidate = cacheInvalidate;
|
||||
|
||||
if (publishedAtMoment.diff(moment(), 'minutes') > publishAPostBySchedulerToleranceInMinutes) {
|
||||
return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.api.job.notFound')}));
|
||||
}
|
||||
|
||||
if (publishedAtMoment.diff(moment(), 'minutes') < publishAPostBySchedulerToleranceInMinutes * -1 && frame.data.force !== true) {
|
||||
return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.api.job.publishInThePast')}));
|
||||
}
|
||||
|
||||
const editedResource = {};
|
||||
editedResource[resourceType] = [{
|
||||
status: 'published',
|
||||
updated_at: moment(resource.updated_at).toISOString(true)
|
||||
}];
|
||||
|
||||
return api[resourceType].edit(
|
||||
editedResource,
|
||||
_.pick(options, ['context', 'id', 'transacting', 'forUpdate'])
|
||||
);
|
||||
})
|
||||
.then((result) => {
|
||||
const scheduledResource = result[resourceType][0];
|
||||
|
||||
if (
|
||||
(scheduledResource.status === 'published' && resource.status !== 'published') ||
|
||||
(scheduledResource.status === 'draft' && resource.status === 'published')
|
||||
) {
|
||||
this.headers.cacheInvalidate = true;
|
||||
} else if (
|
||||
(scheduledResource.status === 'draft' && resource.status !== 'published') ||
|
||||
(scheduledResource.status === 'scheduled' && resource.status !== 'scheduled')
|
||||
) {
|
||||
this.headers.cacheInvalidate = {
|
||||
value: urlUtils.urlFor({
|
||||
relativeUrl: urlUtils.urlJoin('/p', scheduledResource.uuid, '/')
|
||||
})
|
||||
};
|
||||
} else {
|
||||
this.headers.cacheInvalidate = false;
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
const response = {};
|
||||
response[resourceType] = [scheduledResource];
|
||||
return response;
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -1,11 +1,6 @@
|
||||
const _ = require('lodash');
|
||||
const moment = require('moment');
|
||||
const config = require('../../../shared/config');
|
||||
const models = require('../../models');
|
||||
const urlUtils = require('../../../shared/url-utils');
|
||||
const i18n = require('../../../shared/i18n');
|
||||
const errors = require('@tryghost/errors');
|
||||
const api = require('./index');
|
||||
|
||||
const postSchedulingService = require('../../services/posts/post-scheduling-service')('v3');
|
||||
|
||||
module.exports = {
|
||||
docName: 'schedules',
|
||||
@ -32,11 +27,8 @@ module.exports = {
|
||||
permissions: {
|
||||
docName: 'posts'
|
||||
},
|
||||
query(frame) {
|
||||
let resource;
|
||||
async query(frame) {
|
||||
const resourceType = frame.options.resource;
|
||||
const publishAPostBySchedulerToleranceInMinutes = config.get('times').publishAPostBySchedulerToleranceInMinutes;
|
||||
|
||||
const options = {
|
||||
status: 'scheduled',
|
||||
id: frame.options.id,
|
||||
@ -45,53 +37,13 @@ module.exports = {
|
||||
}
|
||||
};
|
||||
|
||||
return api[resourceType].read({id: frame.options.id}, options)
|
||||
.then((result) => {
|
||||
resource = result[resourceType][0];
|
||||
const publishedAtMoment = moment(resource.published_at);
|
||||
const {scheduledResource, preScheduledResource} = await postSchedulingService.publish(resourceType, frame.options.id, frame.data.force, options);
|
||||
const cacheInvalidate = postSchedulingService.handleCacheInvalidation(scheduledResource, preScheduledResource);
|
||||
this.headers.cacheInvalidate = cacheInvalidate;
|
||||
|
||||
if (publishedAtMoment.diff(moment(), 'minutes') > publishAPostBySchedulerToleranceInMinutes) {
|
||||
return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.api.job.notFound')}));
|
||||
}
|
||||
|
||||
if (publishedAtMoment.diff(moment(), 'minutes') < publishAPostBySchedulerToleranceInMinutes * -1 && frame.data.force !== true) {
|
||||
return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.api.job.publishInThePast')}));
|
||||
}
|
||||
|
||||
const editedResource = {};
|
||||
editedResource[resourceType] = [{
|
||||
status: 'published',
|
||||
updated_at: moment(resource.updated_at).toISOString(true)
|
||||
}];
|
||||
|
||||
return api[resourceType].edit(
|
||||
editedResource,
|
||||
_.pick(options, ['context', 'id', 'transacting', 'forUpdate'])
|
||||
);
|
||||
})
|
||||
.then((result) => {
|
||||
const scheduledResource = result[resourceType][0];
|
||||
|
||||
if (
|
||||
(scheduledResource.status === 'published' && resource.status !== 'published') ||
|
||||
(scheduledResource.status === 'draft' && resource.status === 'published')
|
||||
) {
|
||||
this.headers.cacheInvalidate = true;
|
||||
} else if (
|
||||
(scheduledResource.status === 'draft' && resource.status !== 'published') ||
|
||||
(scheduledResource.status === 'scheduled' && resource.status !== 'scheduled')
|
||||
) {
|
||||
this.headers.cacheInvalidate = {
|
||||
value: urlUtils.urlFor({
|
||||
relativeUrl: urlUtils.urlJoin('/p', scheduledResource.uuid, '/')
|
||||
})
|
||||
};
|
||||
} else {
|
||||
this.headers.cacheInvalidate = false;
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
const response = {};
|
||||
response[resourceType] = [scheduledResource];
|
||||
return response;
|
||||
}
|
||||
},
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user