diff --git a/packages/server/modules/webhooks/domain/operations.ts b/packages/server/modules/webhooks/domain/operations.ts index a1f10be64..443dd3357 100644 --- a/packages/server/modules/webhooks/domain/operations.ts +++ b/packages/server/modules/webhooks/domain/operations.ts @@ -28,3 +28,7 @@ export type UpdateWebhook = ({ }) => Promise export type DeleteWebhook = ({ id }: Pick) => Promise + +export type GetStreamWebhooks = ({ + streamId +}: Pick) => Promise diff --git a/packages/server/modules/webhooks/graph/resolvers/webhooks-new.ts b/packages/server/modules/webhooks/graph/resolvers/webhooks-new.ts index 271167942..b6ba0f86b 100644 --- a/packages/server/modules/webhooks/graph/resolvers/webhooks-new.ts +++ b/packages/server/modules/webhooks/graph/resolvers/webhooks-new.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '@/modules/core/graph/generated/graphql' +import { Resolvers, Webhook } from '@/modules/core/graph/generated/graphql' import { authorizeResolver } from '@/modules/shared' import { createWebhook, @@ -10,13 +10,43 @@ import { countWebhooksByStreamIdFactory, createWebhookFactory, deleteWebhookFactory, + getStreamWebhooksFactory, getWebhookByIdFactory, updateWebhookFactory } from '@/modules/webhooks/repositories/webhooks' import { db } from '@/db/knex' import { ForbiddenError } from '@/modules/shared/errors' +import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types' + +const streamWebhooksResolver = async ( + parent: { id: string }, + args: { id?: string }, + context: { resourceAccessRules?: TokenResourceIdentifier[] | null; userId: string } +) => { + await authorizeResolver( + context.userId, + parent.id, + Roles.Stream.Owner, + context.resourceAccessRules + ) + + if (args.id) { + const wh = (await getWebhookByIdFactory({ db })({ id: args.id })) as Webhook | null + const items = wh ? [wh] : [] + return { items, totalCount: items.length } + } + + const items = await getStreamWebhooksFactory({ db })({ streamId: parent.id }) + return { items, totalCount: items.length } +} export = { + Stream: { + webhooks: streamWebhooksResolver + }, + Project: { + webhooks: streamWebhooksResolver + }, Mutation: { webhookCreate: async (_parent, args, context) => { await authorizeResolver( diff --git a/packages/server/modules/webhooks/graph/resolvers/webhooks.js b/packages/server/modules/webhooks/graph/resolvers/webhooks.js index fba6d6417..d6736a8ec 100644 --- a/packages/server/modules/webhooks/graph/resolvers/webhooks.js +++ b/packages/server/modules/webhooks/graph/resolvers/webhooks.js @@ -1,40 +1,9 @@ -const { authorizeResolver } = require('@/modules/shared') const { - getStreamWebhooks, getLastWebhookEvents, getWebhookEventsCount } = require('../../services/webhooks') -const { Roles } = require('@speckle/shared') -const { getWebhookByIdFactory } = require('../../repositories/webhooks') -const { db } = require('@/db/knex') - -const streamWebhooksResolver = async (parent, args, context) => { - await authorizeResolver( - context.userId, - parent.id, - Roles.Stream.Owner, - context.resourceAccessRules - ) - - if (args.id) { - const wh = await getWebhookByIdFactory({ db })({ id: args.id }) - const items = wh ? [wh] : [] - return { items, totalCount: items.length } - } - - const items = await getStreamWebhooks({ streamId: parent.id }) - return { items, totalCount: items.length } -} module.exports = { - Stream: { - webhooks: streamWebhooksResolver - }, - - Project: { - webhooks: streamWebhooksResolver - }, - Webhook: { projectId: (parent) => parent.streamId, hasSecret: (parent) => !!parent.secret?.length, diff --git a/packages/server/modules/webhooks/repositories/webhooks.ts b/packages/server/modules/webhooks/repositories/webhooks.ts index f9fbaff75..887d94719 100644 --- a/packages/server/modules/webhooks/repositories/webhooks.ts +++ b/packages/server/modules/webhooks/repositories/webhooks.ts @@ -4,6 +4,7 @@ import { CountWebhooksByStreamId, CreateWebhook, DeleteWebhook, + GetStreamWebhooks, GetWebhookById, UpdateWebhook } from '@/modules/webhooks/domain/operations' @@ -79,3 +80,17 @@ export const deleteWebhookFactory = async ({ id }) => { return await tables(db).webhooksConfigs.where({ id }).del() } + +export const getStreamWebhooksFactory = + ({ db }: { db: Knex }): GetStreamWebhooks => + async ({ streamId }) => { + const webhooks = await tables(db) + .webhooksConfigs.select('*') + .where({ streamId }) + .orderBy('updatedAt', 'desc') + + return webhooks.map((webhook) => ({ + ...webhook, + triggers: toTriggersArray(webhook.triggers) + })) + } diff --git a/packages/server/modules/webhooks/services/webhooks.js b/packages/server/modules/webhooks/services/webhooks.js index a1719bb7b..e9dd3c1e0 100644 --- a/packages/server/modules/webhooks/services/webhooks.js +++ b/packages/server/modules/webhooks/services/webhooks.js @@ -4,26 +4,12 @@ const knex = require('@/db/knex') const { getStream } = require('@/modules/core/repositories/streams') const crs = require('crypto-random-string') -const WebhooksConfig = () => knex('webhooks_config') const WebhooksEvents = () => knex('webhooks_events') const Users = () => knex('users') const { getServerInfo } = require('../../core/services/generic') module.exports = { - async getStreamWebhooks({ streamId }) { - const webhooks = await WebhooksConfig() - .select('*') - .where({ streamId }) - .orderBy('updatedAt', 'desc') - - for (const webhook of webhooks) { - webhook.triggers = Object.keys(webhook.triggers) - } - - return webhooks - }, - async dispatchStreamEvent({ streamId, event, eventPayload }, { trx } = {}) { // Add server info eventPayload.server = await getServerInfo() diff --git a/packages/server/modules/webhooks/tests/webhooks.spec.js b/packages/server/modules/webhooks/tests/webhooks.spec.js index 5c7044d6a..8319acfbf 100644 --- a/packages/server/modules/webhooks/tests/webhooks.spec.js +++ b/packages/server/modules/webhooks/tests/webhooks.spec.js @@ -9,11 +9,7 @@ const { } = require('@/test/hooks') const { noErrors } = require('@/test/helpers') const { createPersonalAccessToken } = require('../../core/services/tokens') -const { - getStreamWebhooks, - getLastWebhookEvents, - dispatchStreamEvent -} = require('../services/webhooks') +const { getLastWebhookEvents, dispatchStreamEvent } = require('../services/webhooks') const { createUser } = require('../../core/services/users') const { createStream, grantPermissionsStream } = require('../../core/services/streams') const { Scopes, Roles } = require('@speckle/shared') @@ -22,7 +18,8 @@ const { countWebhooksByStreamIdFactory, getWebhookByIdFactory, updateWebhookFactory, - deleteWebhookFactory + deleteWebhookFactory, + getStreamWebhooksFactory } = require('@/modules/webhooks/repositories/webhooks') const { db } = require('@/db/knex') const { @@ -35,6 +32,7 @@ const { Users, Streams } = require('@/modules/core/dbSchema') const updateWebhook = updateWebhookService({ updateWebhookConfig: updateWebhookFactory({ db }) }) +const getStreamWebhooks = getStreamWebhooksFactory({ db }) describe('Webhooks @webhooks', () => { const getWebhook = getWebhookByIdFactory({ db })