172 lines
3.5 KiB
JavaScript
Raw Normal View History

2019-12-13 17:59:07 +01:00
'use strict';
2019-12-24 14:49:44 +01:00
const _ = require('lodash');
const { yup, formatYupErrors } = require('strapi-utils');
const ALLOWED_EVENTS = [
'entry.create',
'entry.update',
'entry.delete',
'media.create',
'media.delete',
];
const webhookValidator = yup
.object({
name: yup.string().required(),
url: yup.string().required(),
headers: yup.lazy(data => {
if (typeof data !== 'object') {
return yup.object().required();
}
return yup
.object(
_.mapValues(data, () => {
yup
.string()
.min(1)
.required();
})
)
.required();
}),
events: yup
.array()
.of(
yup
.string()
.oneOf(ALLOWED_EVENTS)
.required()
)
.min(1)
.required(),
})
.noUnknown();
const updateWebhookValidator = webhookValidator.shape({
isEnabled: yup.boolean(),
});
2019-12-13 17:59:07 +01:00
module.exports = {
async listWebhooks(ctx) {
2019-12-17 11:24:14 +01:00
const webhooks = await strapi.webhookStore.findWebhooks();
2019-12-18 10:36:50 +01:00
ctx.send({ data: webhooks });
2019-12-13 17:59:07 +01:00
},
async getWebhook(ctx) {
const { id } = ctx.params;
2019-12-17 11:24:14 +01:00
const webhook = await strapi.webhookStore.findWebhook(id);
2019-12-13 17:59:07 +01:00
if (!webhook) {
return ctx.notFound('webhook.notFound');
}
2019-12-18 10:36:50 +01:00
ctx.send({ data: webhook });
2019-12-13 17:59:07 +01:00
},
2019-12-24 14:49:44 +01:00
async createWebhook(ctx) {
const { body } = ctx.request;
try {
await webhookValidator.validate(body, {
strict: true,
abortEarly: false,
});
} catch (error) {
return ctx.badRequest('ValidationError', {
errors: formatYupErrors(error),
});
2019-12-24 14:49:44 +01:00
}
const webhook = await strapi.webhookStore.createWebhook(body);
strapi.webhookRunner.add(webhook);
ctx.created({ data: webhook });
},
2019-12-13 17:59:07 +01:00
async updateWebhook(ctx) {
const { id } = ctx.params;
const { body } = ctx.request;
2019-12-13 17:59:07 +01:00
2019-12-24 14:49:44 +01:00
try {
await updateWebhookValidator.validate(body, {
strict: true,
abortEarly: false,
});
} catch (error) {
return ctx.badRequest('ValidationError', {
errors: formatYupErrors(error),
});
2019-12-24 14:49:44 +01:00
}
2019-12-13 17:59:07 +01:00
2019-12-24 14:49:44 +01:00
const webhook = await strapi.webhookStore.findWebhook(id);
2019-12-13 17:59:07 +01:00
if (!webhook) {
2019-12-24 14:49:44 +01:00
return ctx.notFound('webhook.notFound');
2019-12-13 17:59:07 +01:00
}
2019-12-24 14:49:44 +01:00
const updatedWebhook = await strapi.webhookStore.updateWebhook(id, {
...webhook,
...body,
2019-12-24 14:49:44 +01:00
});
2019-12-24 14:49:44 +01:00
if (!updatedWebhook) {
return ctx.notFound('webhook.notFound');
}
2019-12-24 14:49:44 +01:00
strapi.webhookRunner.update(updatedWebhook);
2019-12-13 17:59:07 +01:00
2019-12-18 10:36:50 +01:00
ctx.send({ data: updatedWebhook });
2019-12-13 17:59:07 +01:00
},
async deleteWebhook(ctx) {
const { id } = ctx.params;
2019-12-17 11:24:14 +01:00
const webhook = await strapi.webhookStore.findWebhook(id);
2019-12-13 17:59:07 +01:00
if (!webhook) {
2019-12-24 14:49:44 +01:00
return ctx.notFound('webhook.notFound');
2019-12-13 17:59:07 +01:00
}
2019-12-17 11:24:14 +01:00
await strapi.webhookStore.deleteWebhook(id);
strapi.webhookRunner.remove(webhook);
2019-12-13 17:59:07 +01:00
ctx.body = { data: webhook };
},
2019-12-18 10:36:50 +01:00
async deleteWebhooks(ctx) {
2019-12-18 14:31:49 +01:00
const { ids } = ctx.request.body;
2019-12-18 10:36:50 +01:00
if (!Array.isArray(ids) || ids.length === 0) {
return ctx.badRequest('ids must be an array of id');
}
2019-12-18 13:46:39 +01:00
for (const id of ids) {
const webhook = await strapi.webhookStore.findWebhook(id);
if (!webhook) continue;
2019-12-18 13:46:39 +01:00
await strapi.webhookStore.deleteWebhook(id);
strapi.webhookRunner.remove(webhook);
2019-12-18 13:46:39 +01:00
}
2019-12-18 10:36:50 +01:00
ctx.send({ data: ids });
},
async triggerWebhook(ctx) {
const { id } = ctx.params;
const webhook = await strapi.webhookStore.findWebhook(id);
const response = await strapi.webhookRunner.run(
webhook,
'trigger-test',
{}
);
ctx.body = { data: response };
2019-12-13 17:59:07 +01:00
},
};