diff --git a/packages/twenty-server/src/workspace/messaging/listeners/messaging-person.listener.ts b/packages/twenty-server/src/workspace/messaging/listeners/messaging-person.listener.ts index ab909bc70..afb37a290 100644 --- a/packages/twenty-server/src/workspace/messaging/listeners/messaging-person.listener.ts +++ b/packages/twenty-server/src/workspace/messaging/listeners/messaging-person.listener.ts @@ -1,6 +1,13 @@ import { Inject, Injectable } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; + +import { + FeatureFlagEntity, + FeatureFlagKeys, +} from 'src/core/feature-flag/feature-flag.entity'; import { ObjectRecordCreateEvent } from 'src/integrations/event-emitter/types/object-record-create.event'; import { ObjectRecordUpdateEvent } from 'src/integrations/event-emitter/types/object-record-update.event'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/integrations/event-emitter/utils/object-record-changed-properties.util'; @@ -17,14 +24,28 @@ export class MessagingPersonListener { constructor( @Inject(MessageQueue.messagingQueue) private readonly messageQueueService: MessageQueueService, + @InjectRepository(FeatureFlagEntity, 'core') + private readonly featureFlagRepository: Repository, ) {} @OnEvent('person.created') - handleCreatedEvent(payload: ObjectRecordCreateEvent) { + async handleCreatedEvent( + payload: ObjectRecordCreateEvent, + ) { if (payload.createdRecord.email === null) { return; } + const messagingFeatureFlag = await this.featureFlagRepository.findOneBy({ + key: FeatureFlagKeys.IsMessagingEnabled, + value: true, + workspaceId: payload.workspaceId, + }); + + if (!messagingFeatureFlag || !messagingFeatureFlag.value) { + return; + } + this.messageQueueService.add( MatchMessageParticipantJob.name, { @@ -36,12 +57,24 @@ export class MessagingPersonListener { } @OnEvent('person.updated') - handleUpdatedEvent(payload: ObjectRecordUpdateEvent) { + async handleUpdatedEvent( + payload: ObjectRecordUpdateEvent, + ) { + const messagingFeatureFlag = await this.featureFlagRepository.findOneBy({ + key: FeatureFlagKeys.IsMessagingEnabled, + value: true, + workspaceId: payload.workspaceId, + }); + + const isMessagingEnabled = + messagingFeatureFlag && messagingFeatureFlag.value; + if ( objectRecordUpdateEventChangedProperties( payload.previousRecord, payload.updatedRecord, - ).includes('email') + ).includes('email') && + isMessagingEnabled ) { this.messageQueueService.add( MatchMessageParticipantJob.name, diff --git a/packages/twenty-server/src/workspace/messaging/listeners/messaging-workspace-member.listener.ts b/packages/twenty-server/src/workspace/messaging/listeners/messaging-workspace-member.listener.ts index 839da94b4..d8e8d3f83 100644 --- a/packages/twenty-server/src/workspace/messaging/listeners/messaging-workspace-member.listener.ts +++ b/packages/twenty-server/src/workspace/messaging/listeners/messaging-workspace-member.listener.ts @@ -1,6 +1,13 @@ import { Inject, Injectable } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; + +import { + FeatureFlagEntity, + FeatureFlagKeys, +} from 'src/core/feature-flag/feature-flag.entity'; import { ObjectRecordCreateEvent } from 'src/integrations/event-emitter/types/object-record-create.event'; import { ObjectRecordUpdateEvent } from 'src/integrations/event-emitter/types/object-record-update.event'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/integrations/event-emitter/utils/object-record-changed-properties.util'; @@ -17,16 +24,28 @@ export class MessagingWorkspaceMemberListener { constructor( @Inject(MessageQueue.messagingQueue) private readonly messageQueueService: MessageQueueService, + @InjectRepository(FeatureFlagEntity, 'core') + private readonly featureFlagRepository: Repository, ) {} @OnEvent('workspaceMember.created') - handleCreatedEvent( + async handleCreatedEvent( payload: ObjectRecordCreateEvent, ) { if (payload.createdRecord.userEmail === null) { return; } + const messagingFeatureFlag = await this.featureFlagRepository.findOneBy({ + key: FeatureFlagKeys.IsMessagingEnabled, + value: true, + workspaceId: payload.workspaceId, + }); + + if (!messagingFeatureFlag || !messagingFeatureFlag.value) { + return; + } + this.messageQueueService.add( MatchMessageParticipantJob.name, { @@ -38,14 +57,24 @@ export class MessagingWorkspaceMemberListener { } @OnEvent('workspaceMember.updated') - handleUpdatedEvent( + async handleUpdatedEvent( payload: ObjectRecordUpdateEvent, ) { + const messagingFeatureFlag = await this.featureFlagRepository.findOneBy({ + key: FeatureFlagKeys.IsMessagingEnabled, + value: true, + workspaceId: payload.workspaceId, + }); + + const isMessagingEnabled = + messagingFeatureFlag && messagingFeatureFlag.value; + if ( objectRecordUpdateEventChangedProperties( payload.previousRecord, payload.updatedRecord, - ).includes('userEmail') + ).includes('userEmail') && + isMessagingEnabled ) { this.messageQueueService.add( MatchMessageParticipantJob.name, diff --git a/packages/twenty-server/src/workspace/messaging/messaging.module.ts b/packages/twenty-server/src/workspace/messaging/messaging.module.ts index 080f761ab..e5f0a3969 100644 --- a/packages/twenty-server/src/workspace/messaging/messaging.module.ts +++ b/packages/twenty-server/src/workspace/messaging/messaging.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; import { ConnectedAccountModule } from 'src/workspace/messaging/repositories/connected-account/connected-account.module'; import { MessageChannelMessageAssociationModule } from 'src/workspace/messaging/repositories/message-channel-message-association/message-channel-message-assocation.module'; @@ -20,6 +21,7 @@ import { MessagingWorkspaceMemberListener } from 'src/workspace/messaging/listen import { MessagingMessageChannelListener } from 'src/workspace/messaging/listeners/messaging-message-channel.listener'; import { MessageService } from 'src/workspace/messaging/repositories/message/message.service'; import { WorkspaceMemberModule } from 'src/workspace/messaging/repositories/workspace-member/workspace-member.module'; +import { FeatureFlagEntity } from 'src/core/feature-flag/feature-flag.entity'; @Module({ imports: [ EnvironmentModule, @@ -31,6 +33,7 @@ import { WorkspaceMemberModule } from 'src/workspace/messaging/repositories/work MessageThreadModule, MessageParticipantModule, WorkspaceMemberModule, + TypeOrmModule.forFeature([FeatureFlagEntity], 'core'), ], providers: [ GmailFullSyncService, diff --git a/packages/twenty-server/src/workspace/workspace-query-runner/workspace-query-runner.service.ts b/packages/twenty-server/src/workspace/workspace-query-runner/workspace-query-runner.service.ts index 3bee63051..f7467e07f 100644 --- a/packages/twenty-server/src/workspace/workspace-query-runner/workspace-query-runner.service.ts +++ b/packages/twenty-server/src/workspace/workspace-query-runner/workspace-query-runner.service.ts @@ -311,6 +311,9 @@ export class WorkspaceQueryRunnerService { private removeNestedProperties( record: Record, ) { + if (!record) { + return; + } const sanitizedRecord = {}; for (const [key, value] of Object.entries(record)) {