Ghost/core/server/services/webhooks/trigger.js
Vikas Potluri 00c324fa4e
Moved core/server/lib/common/logging to core/shared/logging (#11857)
- Represents that logging is shared across all parts of Ghost at present
  * moved core/server/lib/common/logging to core/shared/logging
  * updated logging path for generic imports
  * updated migration and schema imports of logging
  * updated tests and index logging import
  * 🔥 removed logging from common module
  * fixed tests
2020-05-28 19:30:23 +01:00

94 lines
3.0 KiB
JavaScript

const _ = require('lodash');
const debug = require('ghost-ignition').debug('services:webhooks:trigger');
const logging = require('../../../shared/logging');
const request = require('../../lib/request');
const models = require('../../models');
const payload = require('./payload');
const webhooks = {
getAll(event) {
return models
.Webhook
.findAllByEvent(event, {context: {internal: true}});
},
update(webhook, data) {
models
.Webhook
.edit({
last_triggered_at: Date.now(),
last_triggered_status: data.statusCode,
last_triggered_error: data.error || null
}, {id: webhook.id})
.catch(() => {
logging.warn(`Unable to update "last_triggered" for webhook: ${webhook.id}`);
});
},
destroy(webhook) {
return models
.Webhook
.destroy({id: webhook.id}, {context: {internal: true}})
.catch(() => {
logging.warn(`Unable to destroy webhook ${webhook.id}.`);
});
}
};
const response = {
onSuccess(webhook) {
return (res) => {
webhooks.update(webhook, {
statusCode: res.statusCode
});
};
},
onError(webhook) {
return (err) => {
if (err.statusCode === 410) {
logging.info(`Webhook destroyed (410 response) for "${webhook.get('event')}" with url "${webhook.get('target_url')}".`);
return webhooks.destroy(webhook);
}
webhooks.update(webhook, {
statusCode: err.statusCode,
error: `Request failed: ${err.code || 'unknown'}`
});
logging.warn(`Request to ${webhook.get('target_url') || null} failed because of: ${err.code || ''}.`);
};
}
};
module.exports = (event, model) => {
webhooks.getAll(event)
.then((webhooks) => {
debug(`${webhooks.models.length} webhooks found for ${event}.`);
_.each(webhooks.models, (webhook) => {
payload(webhook.get('event'), model)
.then((payload) => {
const reqPayload = JSON.stringify(payload);
const url = webhook.get('target_url');
const opts = {
body: reqPayload,
headers: {
'Content-Length': Buffer.byteLength(reqPayload),
'Content-Type': 'application/json'
},
timeout: 2 * 1000,
retry: 5
};
logging.info(`Trigger Webhook for "${webhook.get('event')}" with url "${url}".`);
request(url, opts)
.then(response.onSuccess(webhook))
.catch(response.onError(webhook));
});
});
});
};