diff --git a/packages/server/modules/webhooks/graph/resolvers/webhooks.js b/packages/server/modules/webhooks/graph/resolvers/webhooks.js new file mode 100644 index 000000000..95735b402 --- /dev/null +++ b/packages/server/modules/webhooks/graph/resolvers/webhooks.js @@ -0,0 +1,34 @@ +const { createWebhook, getWebhook, updateWebhook, deleteWebhook, getStreamWebhooks, getLastWebhookEvents } = require( '../../services/webhooks' ) + + +module.exports = { + Stream: { + async webhooks( parent, args, context, info ) { + 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 } + } + }, + + Mutation: { + async webhookCreate( parent, args, context, info ) { + 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, events: args.webhook.events } ) + + return id + }, + async webhookUpdate( parent, args, context, info ) { + 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, events: args.webhook.events } ) + + return !!updated + }, + async webhookDelete( parent, args, context, info ) { + let deleted = await deleteWebhook( { id: args.id } ) + return !!deleted + } + } +} diff --git a/packages/server/modules/webhooks/graph/schemas/webhooks.graphql b/packages/server/modules/webhooks/graph/schemas/webhooks.graphql new file mode 100644 index 000000000..8b63d57f7 --- /dev/null +++ b/packages/server/modules/webhooks/graph/schemas/webhooks.graphql @@ -0,0 +1,62 @@ +extend type Stream { + webhooks(id: String): WebhookCollection + @hasRole(role: "stream:owner") + @hasScope(scope: "streams:write") +} + +extend type Mutation { + """ + Creates a new webhook on a stream + """ + webhookCreate(webhook: WebhookCreateInput!): String! + @hasRole(role: "stream:owner") + @hasScope(scope: "streams:write") + + """ + Updates an existing webhook + """ + webhookUpdate(webhook: WebhookUpdateInput!): String! + @hasRole(role: "stream:owner") + @hasScope(scope: "streams:write") + + """ + Deletes an existing webhook + """ + webhookDelete(id: String!): String! + @hasRole(role: "stream:owner") + @hasScope(scope: "streams:write") +} + +type WebhookCollection { + totalCount: Int + cursor: String + items: [Webhook] +} + +type Webhook { + id: String! + streamId: String! + url: String! + description: String + events: JSONObject! + secret: String + enabled: Boolean +} + +input WebhookCreateInput { + streamId: String! + url: String! + description: String + events: JSONObject! + secret: String + enabled: Boolean +} + +input WebhookUpdateInput { + id: String! + url: String + description: String + secret: String + enabled: Boolean + events: JSONObject +} diff --git a/packages/server/modules/webhooks/services/webhooks.js b/packages/server/modules/webhooks/services/webhooks.js index 4f8d82323..5f9eb7d65 100644 --- a/packages/server/modules/webhooks/services/webhooks.js +++ b/packages/server/modules/webhooks/services/webhooks.js @@ -11,7 +11,7 @@ module.exports = { async createWebhook( { streamId, url, description, secret, enabled, events } ) { // TODO: limit max number of webhooks for a stream to 100 (github has a 20 limit per event) - + let [ id ] = await WebhooksConfig( ).returning( 'id' ).insert( { id: crs( { length: 10 } ), streamId, @@ -23,7 +23,7 @@ module.exports = { } ) return id }, - + async getWebhook( { id } ) { // TODO: get webhook object + summary of event history (last event status, etc) return await WebhooksConfig().select( '*' ).where( { id } ).first() @@ -61,6 +61,7 @@ module.exports = { if ( !limit ) { limit = 100 } + return await WebhooksEvents( ).select( '*' ).where( { webhookId } ).orderBy( 'lastUpdate', 'desc' ).limit( limit ) }, }