From 15814d465ae861ed069867e2cbb177486788d49f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Fri, 24 Jan 2025 11:10:42 +0100 Subject: [PATCH] Fix missing events during account connection (#9825) Fix #8765 --- .../engine/core-modules/auth/auth.module.ts | 2 + .../auth/services/google-apis.service.ts | 126 +++++++++++++++++- .../auth/services/microsoft-apis.service.ts | 126 +++++++++++++++++- .../user-workspace/user-workspace.service.ts | 1 + .../user/services/user.service.ts | 2 +- .../calendar-event-participant.listener.ts | 2 +- ...ected-account-delete-one.pre-query.hook.ts | 5 +- .../workflow-create-many.post-query.hook.ts | 3 +- .../workflow-create-one.post-query.hook.ts | 3 +- .../workflow-trigger.workspace-service.ts | 9 +- 10 files changed, 257 insertions(+), 22 deletions(-) diff --git a/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts b/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts index 929da2ac3..0515c9580 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts @@ -41,6 +41,7 @@ import { WorkspaceInvitationModule } from 'src/engine/core-modules/workspace-inv import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceModule } from 'src/engine/core-modules/workspace/workspace.module'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { WorkspaceDataSourceModule } from 'src/engine/workspace-datasource/workspace-datasource.module'; import { WorkspaceManagerModule } from 'src/engine/workspace-manager/workspace-manager.module'; import { ConnectedAccountModule } from 'src/modules/connected-account/connected-account.module'; @@ -72,6 +73,7 @@ import { JwtAuthStrategy } from './strategies/jwt.auth.strategy'; ], 'core', ), + TypeOrmModule.forFeature([ObjectMetadataEntity], 'metadata'), HttpModule, UserWorkspaceModule, WorkspaceModule, diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts index 2512918f7..b64e01e74 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts @@ -1,14 +1,18 @@ import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; -import { EntityManager } from 'typeorm'; +import { EntityManager, Repository } from 'typeorm'; import { v4 } from 'uuid'; +import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { getGoogleApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter'; import { CalendarEventListFetchJob, CalendarEventListFetchJobData, @@ -45,6 +49,9 @@ export class GoogleAPIsService { private readonly calendarQueueService: MessageQueueService, private readonly environmentService: EnvironmentService, private readonly accountsToReconnectService: AccountsToReconnectService, + private readonly workspaceEventEmitter: WorkspaceEventEmitter, + @InjectRepository(ObjectMetadataEntity, 'metadata') + private readonly objectMetadataRepository: Repository, ) {} async refreshGoogleRefreshToken(input: { @@ -100,7 +107,7 @@ export class GoogleAPIsService { await workspaceDataSource.transaction(async (manager: EntityManager) => { if (!existingAccountId) { - await connectedAccountRepository.save( + const newConnectedAccount = await connectedAccountRepository.save( { id: newOrExistingConnectedAccountId, handle, @@ -114,7 +121,27 @@ export class GoogleAPIsService { manager, ); - await messageChannelRepository.save( + const connectedAccountMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'connectedAccount', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'connectedAccount', + action: DatabaseEventAction.CREATED, + events: [ + { + recordId: newConnectedAccount.id, + objectMetadata: connectedAccountMetadata, + properties: { + after: newConnectedAccount, + }, + }, + ], + workspaceId, + }); + + const newMessageChannel = await messageChannelRepository.save( { id: v4(), connectedAccountId: newOrExistingConnectedAccountId, @@ -128,8 +155,28 @@ export class GoogleAPIsService { manager, ); + const messageChannelMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'messageChannel', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'messageChannel', + action: DatabaseEventAction.CREATED, + events: [ + { + recordId: newMessageChannel.id, + objectMetadata: messageChannelMetadata, + properties: { + after: newMessageChannel, + }, + }, + ], + workspaceId, + }); + if (isCalendarEnabled) { - await calendarChannelRepository.save( + const newCalendarChannel = await calendarChannelRepository.save( { id: v4(), connectedAccountId: newOrExistingConnectedAccountId, @@ -141,9 +188,29 @@ export class GoogleAPIsService { {}, manager, ); + + const calendarChannelMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'calendarChannel', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'calendarChannel', + action: DatabaseEventAction.CREATED, + events: [ + { + recordId: newCalendarChannel.id, + objectMetadata: calendarChannelMetadata, + properties: { + after: newCalendarChannel, + }, + }, + ], + workspaceId, + }); } } else { - await connectedAccountRepository.update( + const updatedConnectedAccount = await connectedAccountRepository.update( { id: newOrExistingConnectedAccountId, }, @@ -155,6 +222,30 @@ export class GoogleAPIsService { manager, ); + const connectedAccountMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'connectedAccount', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'connectedAccount', + action: DatabaseEventAction.UPDATED, + events: [ + { + recordId: newOrExistingConnectedAccountId, + objectMetadata: connectedAccountMetadata, + properties: { + before: connectedAccount, + after: { + ...connectedAccount, + ...updatedConnectedAccount.raw[0], + }, + }, + }, + ], + workspaceId, + }); + const workspaceMemberRepository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( workspaceId, @@ -173,7 +264,11 @@ export class GoogleAPIsService { newOrExistingConnectedAccountId, ); - await messageChannelRepository.update( + const messageChannels = await messageChannelRepository.find({ + where: { connectedAccountId: newOrExistingConnectedAccountId }, + }); + + const messageChannelUpdates = await messageChannelRepository.update( { connectedAccountId: newOrExistingConnectedAccountId, }, @@ -185,6 +280,25 @@ export class GoogleAPIsService { }, manager, ); + + const messageChannelMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'messageChannel', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'messageChannel', + action: DatabaseEventAction.UPDATED, + events: messageChannels.map((messageChannel) => ({ + recordId: messageChannel.id, + objectMetadata: messageChannelMetadata, + properties: { + before: messageChannel, + after: { ...messageChannel, ...messageChannelUpdates.raw[0] }, + }, + })), + workspaceId, + }); } }); diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts index c25cf99d0..3b67410b4 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts @@ -1,13 +1,17 @@ import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; -import { EntityManager } from 'typeorm'; +import { EntityManager, Repository } from 'typeorm'; import { v4 } from 'uuid'; +import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { getMicrosoftApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter'; import { CalendarEventListFetchJob, CalendarEventListFetchJobData, @@ -43,6 +47,9 @@ export class MicrosoftAPIsService { @InjectMessageQueue(MessageQueue.calendarQueue) private readonly calendarQueueService: MessageQueueService, private readonly accountsToReconnectService: AccountsToReconnectService, + private readonly workspaceEventEmitter: WorkspaceEventEmitter, + @InjectRepository(ObjectMetadataEntity, 'metadata') + private readonly objectMetadataRepository: Repository, ) {} async refreshMicrosoftRefreshToken(input: { @@ -94,7 +101,7 @@ export class MicrosoftAPIsService { await workspaceDataSource.transaction(async (manager: EntityManager) => { if (!existingAccountId) { - await connectedAccountRepository.save( + const newConnectedAccount = await connectedAccountRepository.save( { id: newOrExistingConnectedAccountId, handle, @@ -108,7 +115,27 @@ export class MicrosoftAPIsService { manager, ); - await messageChannelRepository.save( + const connectedAccountMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'connectedAccount', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'connectedAccount', + action: DatabaseEventAction.CREATED, + events: [ + { + recordId: newConnectedAccount.id, + objectMetadata: connectedAccountMetadata, + properties: { + after: newConnectedAccount, + }, + }, + ], + workspaceId, + }); + + const newMessageChannel = await messageChannelRepository.save( { id: v4(), connectedAccountId: newOrExistingConnectedAccountId, @@ -122,7 +149,27 @@ export class MicrosoftAPIsService { manager, ); - await calendarChannelRepository.save( + const messageChannelMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'messageChannel', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'messageChannel', + action: DatabaseEventAction.CREATED, + events: [ + { + recordId: newMessageChannel.id, + objectMetadata: messageChannelMetadata, + properties: { + after: newMessageChannel, + }, + }, + ], + workspaceId, + }); + + const newCalendarChannel = await calendarChannelRepository.save( { id: v4(), connectedAccountId: newOrExistingConnectedAccountId, @@ -133,8 +180,28 @@ export class MicrosoftAPIsService { {}, manager, ); + + const calendarChannelMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'calendarChannel', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'calendarChannel', + action: DatabaseEventAction.CREATED, + events: [ + { + recordId: newCalendarChannel.id, + objectMetadata: calendarChannelMetadata, + properties: { + after: newCalendarChannel, + }, + }, + ], + workspaceId, + }); } else { - await connectedAccountRepository.update( + const updatedConnectedAccount = await connectedAccountRepository.update( { id: newOrExistingConnectedAccountId, }, @@ -146,6 +213,30 @@ export class MicrosoftAPIsService { manager, ); + const connectedAccountMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'connectedAccount', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'connectedAccount', + action: DatabaseEventAction.UPDATED, + events: [ + { + recordId: newOrExistingConnectedAccountId, + objectMetadata: connectedAccountMetadata, + properties: { + before: connectedAccount, + after: { + ...connectedAccount, + ...updatedConnectedAccount.raw[0], + }, + }, + }, + ], + workspaceId, + }); + const workspaceMemberRepository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( workspaceId, @@ -164,7 +255,11 @@ export class MicrosoftAPIsService { newOrExistingConnectedAccountId, ); - await messageChannelRepository.update( + const messageChannels = await messageChannelRepository.find({ + where: { connectedAccountId: newOrExistingConnectedAccountId }, + }); + + const messageChannelUpdates = await messageChannelRepository.update( { connectedAccountId: newOrExistingConnectedAccountId, }, @@ -176,6 +271,25 @@ export class MicrosoftAPIsService { }, manager, ); + + const messageChannelMetadata = + await this.objectMetadataRepository.findOneOrFail({ + where: { nameSingular: 'messageChannel', workspaceId }, + }); + + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'messageChannel', + action: DatabaseEventAction.UPDATED, + events: messageChannels.map((messageChannel) => ({ + recordId: messageChannel.id, + objectMetadata: messageChannelMetadata, + properties: { + before: messageChannel, + after: { ...messageChannel, ...messageChannelUpdates.raw[0] }, + }, + })), + workspaceId, + }); } }); diff --git a/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.service.ts b/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.service.ts index 9bc54f7df..2193e0296 100644 --- a/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.service.ts +++ b/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.service.ts @@ -85,6 +85,7 @@ export class UserWorkspaceService extends TypeOrmQueryService { const objectMetadata = await this.objectMetadataRepository.findOneOrFail({ where: { nameSingular: 'workspaceMember', + workspaceId, }, }); diff --git a/packages/twenty-server/src/engine/core-modules/user/services/user.service.ts b/packages/twenty-server/src/engine/core-modules/user/services/user.service.ts index 3b298b307..ac4226702 100644 --- a/packages/twenty-server/src/engine/core-modules/user/services/user.service.ts +++ b/packages/twenty-server/src/engine/core-modules/user/services/user.service.ts @@ -101,7 +101,7 @@ export class UserService extends TypeOrmQueryService { const objectMetadata = await this.objectMetadataRepository.findOneOrFail({ where: { nameSingular: 'workspaceMember', - workspaceId: workspaceId, + workspaceId, }, }); diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant.listener.ts b/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant.listener.ts index 4997804b0..bfcf0f9cb 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant.listener.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant.listener.ts @@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { OnCustomBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-custom-batch-event.decorator'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; @@ -10,7 +11,6 @@ import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/wo import { CalendarEventParticipantWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity'; import { TimelineActivityRepository } from 'src/modules/timeline/repositiories/timeline-activity.repository'; import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-objects/timeline-activity.workspace-entity'; -import { OnCustomBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-custom-batch-event.decorator'; @Injectable() export class CalendarEventParticipantListener { diff --git a/packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-delete-one.pre-query.hook.ts b/packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-delete-one.pre-query.hook.ts index a2a6fefc8..b438c4b64 100644 --- a/packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-delete-one.pre-query.hook.ts +++ b/packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-delete-one.pre-query.hook.ts @@ -5,13 +5,13 @@ import { Repository } from 'typeorm'; import { WorkspaceQueryHookInstance } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/interfaces/workspace-query-hook.interface'; import { DeleteOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator'; import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter'; import { MessageChannelWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; -import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; @WorkspaceQueryHook(`connectedAccount.destroyOne`) export class ConnectedAccountDeleteOnePreQueryHook @@ -43,6 +43,7 @@ export class ConnectedAccountDeleteOnePreQueryHook const objectMetadata = await this.objectMetadataRepository.findOneOrFail({ where: { nameSingular: 'messageChannel', + workspaceId: authContext.workspace.id, }, }); diff --git a/packages/twenty-server/src/modules/workflow/common/query-hooks/workflow-create-many.post-query.hook.ts b/packages/twenty-server/src/modules/workflow/common/query-hooks/workflow-create-many.post-query.hook.ts index 461d9088c..7334f00a4 100644 --- a/packages/twenty-server/src/modules/workflow/common/query-hooks/workflow-create-many.post-query.hook.ts +++ b/packages/twenty-server/src/modules/workflow/common/query-hooks/workflow-create-many.post-query.hook.ts @@ -4,6 +4,7 @@ import { Repository } from 'typeorm'; import { WorkspaceQueryPostHookInstance } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/interfaces/workspace-query-hook.interface'; +import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator'; import { WorkspaceQueryHookType } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/types/workspace-query-hook.type'; import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type'; @@ -15,7 +16,6 @@ import { WorkflowVersionWorkspaceEntity, } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity'; import { WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity'; -import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; @WorkspaceQueryHook({ key: `workflow.createMany`, @@ -58,6 +58,7 @@ export class WorkflowCreateManyPostQueryHook const objectMetadata = await this.objectMetadataRepository.findOneOrFail({ where: { nameSingular: 'workflowVersion', + workspaceId: authContext.workspace.id, }, }); diff --git a/packages/twenty-server/src/modules/workflow/common/query-hooks/workflow-create-one.post-query.hook.ts b/packages/twenty-server/src/modules/workflow/common/query-hooks/workflow-create-one.post-query.hook.ts index 052148d04..e8009ee39 100644 --- a/packages/twenty-server/src/modules/workflow/common/query-hooks/workflow-create-one.post-query.hook.ts +++ b/packages/twenty-server/src/modules/workflow/common/query-hooks/workflow-create-one.post-query.hook.ts @@ -4,6 +4,7 @@ import { Repository } from 'typeorm'; import { WorkspaceQueryPostHookInstance } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/interfaces/workspace-query-hook.interface'; +import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator'; import { WorkspaceQueryHookType } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/types/workspace-query-hook.type'; import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type'; @@ -15,7 +16,6 @@ import { WorkflowVersionWorkspaceEntity, } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity'; import { WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity'; -import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; @WorkspaceQueryHook({ key: `workflow.createOne`, @@ -54,6 +54,7 @@ export class WorkflowCreateOnePostQueryHook const objectMetadata = await this.objectMetadataRepository.findOneOrFail({ where: { nameSingular: 'workflowVersion', + workspaceId: authContext.workspace.id, }, }); diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/workspace-services/workflow-trigger.workspace-service.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/workspace-services/workflow-trigger.workspace-service.ts index 41ef133b9..070a690b2 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/workspace-services/workflow-trigger.workspace-service.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/workspace-services/workflow-trigger.workspace-service.ts @@ -3,8 +3,10 @@ import { InjectRepository } from '@nestjs/typeorm'; import { EntityManager, Repository } from 'typeorm'; +import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { buildCreatedByFromWorkspaceMember } from 'src/engine/core-modules/actor/utils/build-created-by-from-workspace-member.util'; import { User } from 'src/engine/core-modules/user/user.entity'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { ScopedWorkspaceContextFactory } from 'src/engine/twenty-orm/factories/scoped-workspace-context.factory'; import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; @@ -17,6 +19,8 @@ import { WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-ob import { assertWorkflowVersionTriggerIsDefined } from 'src/modules/workflow/common/utils/assert-workflow-version-trigger-is-defined.util'; import { WorkflowCommonWorkspaceService } from 'src/modules/workflow/common/workspace-services/workflow-common.workspace-service'; import { WorkflowRunnerWorkspaceService } from 'src/modules/workflow/workflow-runner/workspace-services/workflow-runner.workspace-service'; +import { WORKFLOW_VERSION_STATUS_UPDATED } from 'src/modules/workflow/workflow-status/constants/workflow-version-status-updated.constants'; +import { WorkflowVersionStatusUpdate } from 'src/modules/workflow/workflow-status/jobs/workflow-statuses-update.job'; import { DatabaseEventTriggerService } from 'src/modules/workflow/workflow-trigger/database-event-trigger/database-event-trigger.service'; import { WorkflowTriggerException, @@ -25,10 +29,6 @@ import { import { WorkflowTriggerType } from 'src/modules/workflow/workflow-trigger/types/workflow-trigger.type'; import { assertVersionCanBeActivated } from 'src/modules/workflow/workflow-trigger/utils/assert-version-can-be-activated.util'; import { assertNever } from 'src/utils/assert'; -import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { WORKFLOW_VERSION_STATUS_UPDATED } from 'src/modules/workflow/workflow-status/constants/workflow-version-status-updated.constants'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { WorkflowVersionStatusUpdate } from 'src/modules/workflow/workflow-status/jobs/workflow-statuses-update.job'; @Injectable() export class WorkflowTriggerWorkspaceService { @@ -365,6 +365,7 @@ export class WorkflowTriggerWorkspaceService { const objectMetadata = await this.objectMetadataRepository.findOneOrFail({ where: { nameSingular: 'workflowVersion', + workspaceId, }, });