From 3801f9cfa08fb39f470543e2ac4ef04b5151784d Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Mon, 13 Nov 2023 10:24:24 +0000 Subject: [PATCH] feat: add shareConnection mutation --- .../backend/src/graphql/mutation-resolvers.ts | 2 + .../graphql/mutations/share-connection.ee.ts | 55 +++++++++++++++++++ packages/backend/src/graphql/schema.graphql | 6 ++ .../backend/src/models/shared-connection.ts | 2 +- 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/graphql/mutations/share-connection.ee.ts diff --git a/packages/backend/src/graphql/mutation-resolvers.ts b/packages/backend/src/graphql/mutation-resolvers.ts index 1dc619e5..c601fa6b 100644 --- a/packages/backend/src/graphql/mutation-resolvers.ts +++ b/packages/backend/src/graphql/mutation-resolvers.ts @@ -19,6 +19,7 @@ import login from './mutations/login'; import registerUser from './mutations/register-user.ee'; import resetConnection from './mutations/reset-connection'; import resetPassword from './mutations/reset-password.ee'; +import shareConnection from './mutations/share-connection.ee'; import updateAppAuthClient from './mutations/update-app-auth-client.ee'; import updateAppConfig from './mutations/update-app-config.ee'; import updateConfig from './mutations/update-config.ee'; @@ -55,6 +56,7 @@ const mutationResolvers = { registerUser, resetConnection, resetPassword, + shareConnection, updateAppAuthClient, updateAppConfig, updateConfig, diff --git a/packages/backend/src/graphql/mutations/share-connection.ee.ts b/packages/backend/src/graphql/mutations/share-connection.ee.ts new file mode 100644 index 00000000..67d62a96 --- /dev/null +++ b/packages/backend/src/graphql/mutations/share-connection.ee.ts @@ -0,0 +1,55 @@ +import Context from '../../types/express/context'; +import Connection from '../../models/connection'; +import SharedConnection from '../../models/shared-connection'; + +type Params = { + input: { + id: string; + roleIds: string[]; + }; +}; + +const shareConnection = async ( + _parent: unknown, + params: Params, + context: Context +) => { + const conditions = context.currentUser.can('update', 'Connection'); + + if (conditions.isCreator) return; + + const { + id, + roleIds, + } = params.input; + + const connection = await Connection + .query() + .findById(id) + .throwIfNotFound(); + + try { + const updatedConnection = await Connection.transaction(async (trx) => { + await connection.$relatedQuery('sharedConnections', trx).delete(); + + if (roleIds?.length) { + const sharedConnections = roleIds.map((roleId) => ({ + roleId, + connectionId: connection.id, + })); + + await SharedConnection.query().insert(sharedConnections); + } + + return await Connection + .query(trx) + .findById(id); + }); + + return updatedConnection; + } catch (err) { + throw new Error('The connection sharing preferences could not be updated!'); + } +}; + +export default shareConnection; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index 76fd909d..da4e14bb 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -84,6 +84,7 @@ type Mutation { registerUser(input: RegisterUserInput): User resetConnection(input: ResetConnectionInput): Connection resetPassword(input: ResetPasswordInput): Boolean + shareConnection(input: ShareConnectionInput): Connection updateAppAuthClient(input: UpdateAppAuthClientInput): AppAuthClient updateAppConfig(input: UpdateAppConfigInput): AppConfig updateConfig(input: JSONObject): JSONObject @@ -812,6 +813,11 @@ input ExecutionFiltersInput { status: String } +input ShareConnectionInput { + id: String! + roleIds: [String] +} + schema { query: Query mutation: Mutation diff --git a/packages/backend/src/models/shared-connection.ts b/packages/backend/src/models/shared-connection.ts index 5280ad03..a6b95b54 100644 --- a/packages/backend/src/models/shared-connection.ts +++ b/packages/backend/src/models/shared-connection.ts @@ -11,7 +11,7 @@ class SharedConnection extends Base { static jsonSchema = { type: 'object', - required: ['name', 'key'], + required: ['roleId', 'connectionId'], properties: { id: { type: 'string', format: 'uuid' },