const appRoot = require('app-root-path') const { ForbiddenError } = require('apollo-server-express') const { authorizeResolver } = require(`${appRoot}/modules/shared`) const { createWebhook, getWebhook, updateWebhook, deleteWebhook, getStreamWebhooks, getLastWebhookEvents, getWebhookEventsCount } = require('../../services/webhooks') module.exports = { Stream: { async webhooks(parent, args, context, info) { await authorizeResolver(context.userId, parent.id, 'stream:owner') if (args.id) { let wh = await getWebhook({ id: args.id }) let items = wh ? [wh] : [] return { items, totalCount: items.length } } let items = await getStreamWebhooks({ streamId: parent.id }) return { items, totalCount: items.length } } }, Webhook: { async history(parent, args, context, info) { let items = await getLastWebhookEvents({ webhookId: parent.id, limit: args.limit }) let totalCount = await getWebhookEventsCount({ webhookId: parent.id }) return { items, totalCount } } }, Mutation: { async webhookCreate(parent, args, context, info) { await authorizeResolver(context.userId, args.webhook.streamId, 'stream:owner') let id = await createWebhook({ streamId: args.webhook.streamId, url: args.webhook.url, description: args.webhook.description, secret: args.webhook.secret, enabled: args.webhook.enabled !== false, triggers: args.webhook.triggers }) return id }, async webhookUpdate(parent, args, context, info) { await authorizeResolver(context.userId, args.webhook.streamId, 'stream:owner') let wh = await getWebhook({ id: args.webhook.id }) if (args.webhook.streamId !== wh.streamId) throw new ForbiddenError( 'The webhook id and stream id do not match. Please check your inputs.' ) let updated = await updateWebhook({ id: args.webhook.id, url: args.webhook.url, description: args.webhook.description, secret: args.webhook.secret, enabled: args.webhook.enabled !== false, triggers: args.webhook.triggers }) return !!updated }, async webhookDelete(parent, args, context, info) { await authorizeResolver(context.userId, args.webhook.streamId, 'stream:owner') let wh = await getWebhook({ id: args.webhook.id }) if (args.webhook.streamId !== wh.streamId) throw new ForbiddenError( 'The webhook id and stream id do not match. Please check your inputs.' ) let deleted = await deleteWebhook({ id: args.webhook.id }) return !!deleted } } }