0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-27 22:49:56 -05:00
ghost/core/server/services/posts/post-scheduling-service.js
Hannah Wolfe a4a9ba7940
🔥 Removed versioned APIs
refs: https://github.com/TryGhost/Toolbox/issues/229

- we are getting rid of the concept of having multiple api versions in a single ghost install
- removed all the code for multiple api versions & left canary wired up, but without the version in the URL
- TODO: reorganise the folders so there's no canary folder when we're closer to shipping
        we need to minimise the pain of merging changes across from main for now
2022-04-28 15:37:09 +01:00

88 lines
3.3 KiB
JavaScript

const _ = require('lodash');
const errors = require('@tryghost/errors');
const moment = require('moment');
const config = require('../../../shared/config');
const urlUtils = require('../../../shared/url-utils');
const api = require('../../api').endpoints;
const messages = {
jobNotFound: 'Job not found.',
jobPublishInThePast: 'Use the force flag to publish a post in the past.'
};
class PostSchedulingService {
/**
* Publishes scheduled resource (a post or a page at the moment of writing)
*
* @param {String} resourceType one of 'post' or 'page' resources
* @param {String} id resource id
* @param {Boolean} force force publish flag
* @param {Object} options api query options
* @returns {Promise<Object, Object>}
*/
async publish(resourceType, id, force, options) {
const publishAPostBySchedulerToleranceInMinutes = config.get('times').publishAPostBySchedulerToleranceInMinutes;
const result = await api[resourceType].read({id}, options);
const preScheduledResource = result[resourceType][0];
const publishedAtMoment = moment(preScheduledResource.published_at);
if (publishedAtMoment.diff(moment(), 'minutes') > publishAPostBySchedulerToleranceInMinutes) {
return Promise.reject(new errors.NotFoundError({message: messages.jobNotFound}));
}
if (publishedAtMoment.diff(moment(), 'minutes') < publishAPostBySchedulerToleranceInMinutes * -1 && force !== true) {
return Promise.reject(new errors.NotFoundError({message: messages.jobPublishInThePast}));
}
const editedResource = {};
editedResource[resourceType] = [{
status: 'published',
updated_at: moment(preScheduledResource.updated_at).toISOString(true)
}];
const editResult = await api[resourceType].edit(
editedResource,
_.pick(options, ['context', 'id', 'transacting', 'forUpdate'])
);
const scheduledResource = editResult[resourceType][0];
return {scheduledResource, preScheduledResource};
}
/**
*
* @param {Object} scheduledResource post or page resource object
* @param {Object} preScheduledResource post or page resource object in state before publishing
* @returns {Boolean|Object}
*/
handleCacheInvalidation(scheduledResource, preScheduledResource) {
if (
(scheduledResource.status === 'published' && preScheduledResource.status !== 'published') ||
(scheduledResource.status === 'draft' && preScheduledResource.status === 'published')
) {
return true;
} else if (
(scheduledResource.status === 'draft' && preScheduledResource.status !== 'published') ||
(scheduledResource.status === 'scheduled' && preScheduledResource.status !== 'scheduled')
) {
return {
value: urlUtils.urlFor({
relativeUrl: urlUtils.urlJoin('/p', scheduledResource.uuid, '/')
})
};
} else {
return false;
}
}
}
/**
* @returns {PostSchedulingService} instance of the PostsService
*/
const getPostSchedulingServiceInstance = () => {
return new PostSchedulingService();
};
module.exports = getPostSchedulingServiceInstance;