Ghost/core/server/services/webhooks/webhooks-service.js

56 lines
1.8 KiB
JavaScript
Raw Normal View History

const {ValidationError} = require('@tryghost/errors');
const tpl = require('@tryghost/tpl');
const messages = {
webhookAlreadyExists: 'Target URL has already been used for this event.',
nonExistingIntegrationIdProvided: {
message: `Validation failed for '{key}'.`,
context: `'integration_id' value does not match any existing integration.`,
help: `Provide the 'integration_id' of an existing integration.`
}
};
class WebhooksService {
constructor({WebhookModel}) {
this.WebhookModel = WebhookModel;
}
async add(data, options) {
const webhook = await this.WebhookModel.getByEventAndTarget(
data.webhooks[0].event,
data.webhooks[0].target_url,
options
);
if (webhook) {
throw new ValidationError({
message: messages.webhookAlreadyExists
});
}
try {
const newWebhook = await this.WebhookModel.add(data.webhooks[0], options);
return newWebhook;
} catch (error) {
if (error.errno === 1452 || (error.code === 'SQLITE_CONSTRAINT' && /SQLITE_CONSTRAINT: FOREIGN KEY constraint failed/.test(error.message))) {
throw new ValidationError({
message: tpl(messages.nonExistingIntegrationIdProvided.message, {
key: 'integration_id'
}),
context: messages.nonExistingIntegrationIdProvided.context,
help: messages.nonExistingIntegrationIdProvided.help
});
}
}
}
}
/**
* @returns {WebhooksService} instance of the PostsService
*/
const getWebhooksServiceInstance = ({WebhookModel}) => {
return new WebhooksService({WebhookModel});
};
module.exports = getWebhooksServiceInstance;