Fix missing feature flag on messaging listeners (#3952)

* Fix missing feature flag on messaging listeners

* Update workspace-query-runner.service.ts
This commit is contained in:
Weiko
2024-02-13 20:23:09 +01:00
committed by GitHub
parent 8ce7020b12
commit 1afe8aecd0
4 changed files with 74 additions and 6 deletions

View File

@ -1,6 +1,13 @@
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter'; 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 { ObjectRecordCreateEvent } from 'src/integrations/event-emitter/types/object-record-create.event';
import { ObjectRecordUpdateEvent } from 'src/integrations/event-emitter/types/object-record-update.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'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/integrations/event-emitter/utils/object-record-changed-properties.util';
@ -17,14 +24,28 @@ export class MessagingPersonListener {
constructor( constructor(
@Inject(MessageQueue.messagingQueue) @Inject(MessageQueue.messagingQueue)
private readonly messageQueueService: MessageQueueService, private readonly messageQueueService: MessageQueueService,
@InjectRepository(FeatureFlagEntity, 'core')
private readonly featureFlagRepository: Repository<FeatureFlagEntity>,
) {} ) {}
@OnEvent('person.created') @OnEvent('person.created')
handleCreatedEvent(payload: ObjectRecordCreateEvent<PersonObjectMetadata>) { async handleCreatedEvent(
payload: ObjectRecordCreateEvent<PersonObjectMetadata>,
) {
if (payload.createdRecord.email === null) { if (payload.createdRecord.email === null) {
return; return;
} }
const messagingFeatureFlag = await this.featureFlagRepository.findOneBy({
key: FeatureFlagKeys.IsMessagingEnabled,
value: true,
workspaceId: payload.workspaceId,
});
if (!messagingFeatureFlag || !messagingFeatureFlag.value) {
return;
}
this.messageQueueService.add<MatchMessageParticipantsJobData>( this.messageQueueService.add<MatchMessageParticipantsJobData>(
MatchMessageParticipantJob.name, MatchMessageParticipantJob.name,
{ {
@ -36,12 +57,24 @@ export class MessagingPersonListener {
} }
@OnEvent('person.updated') @OnEvent('person.updated')
handleUpdatedEvent(payload: ObjectRecordUpdateEvent<PersonObjectMetadata>) { async handleUpdatedEvent(
payload: ObjectRecordUpdateEvent<PersonObjectMetadata>,
) {
const messagingFeatureFlag = await this.featureFlagRepository.findOneBy({
key: FeatureFlagKeys.IsMessagingEnabled,
value: true,
workspaceId: payload.workspaceId,
});
const isMessagingEnabled =
messagingFeatureFlag && messagingFeatureFlag.value;
if ( if (
objectRecordUpdateEventChangedProperties( objectRecordUpdateEventChangedProperties(
payload.previousRecord, payload.previousRecord,
payload.updatedRecord, payload.updatedRecord,
).includes('email') ).includes('email') &&
isMessagingEnabled
) { ) {
this.messageQueueService.add<MatchMessageParticipantsJobData>( this.messageQueueService.add<MatchMessageParticipantsJobData>(
MatchMessageParticipantJob.name, MatchMessageParticipantJob.name,

View File

@ -1,6 +1,13 @@
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter'; 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 { ObjectRecordCreateEvent } from 'src/integrations/event-emitter/types/object-record-create.event';
import { ObjectRecordUpdateEvent } from 'src/integrations/event-emitter/types/object-record-update.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'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/integrations/event-emitter/utils/object-record-changed-properties.util';
@ -17,16 +24,28 @@ export class MessagingWorkspaceMemberListener {
constructor( constructor(
@Inject(MessageQueue.messagingQueue) @Inject(MessageQueue.messagingQueue)
private readonly messageQueueService: MessageQueueService, private readonly messageQueueService: MessageQueueService,
@InjectRepository(FeatureFlagEntity, 'core')
private readonly featureFlagRepository: Repository<FeatureFlagEntity>,
) {} ) {}
@OnEvent('workspaceMember.created') @OnEvent('workspaceMember.created')
handleCreatedEvent( async handleCreatedEvent(
payload: ObjectRecordCreateEvent<WorkspaceMemberObjectMetadata>, payload: ObjectRecordCreateEvent<WorkspaceMemberObjectMetadata>,
) { ) {
if (payload.createdRecord.userEmail === null) { if (payload.createdRecord.userEmail === null) {
return; return;
} }
const messagingFeatureFlag = await this.featureFlagRepository.findOneBy({
key: FeatureFlagKeys.IsMessagingEnabled,
value: true,
workspaceId: payload.workspaceId,
});
if (!messagingFeatureFlag || !messagingFeatureFlag.value) {
return;
}
this.messageQueueService.add<MatchMessageParticipantsJobData>( this.messageQueueService.add<MatchMessageParticipantsJobData>(
MatchMessageParticipantJob.name, MatchMessageParticipantJob.name,
{ {
@ -38,14 +57,24 @@ export class MessagingWorkspaceMemberListener {
} }
@OnEvent('workspaceMember.updated') @OnEvent('workspaceMember.updated')
handleUpdatedEvent( async handleUpdatedEvent(
payload: ObjectRecordUpdateEvent<WorkspaceMemberObjectMetadata>, payload: ObjectRecordUpdateEvent<WorkspaceMemberObjectMetadata>,
) { ) {
const messagingFeatureFlag = await this.featureFlagRepository.findOneBy({
key: FeatureFlagKeys.IsMessagingEnabled,
value: true,
workspaceId: payload.workspaceId,
});
const isMessagingEnabled =
messagingFeatureFlag && messagingFeatureFlag.value;
if ( if (
objectRecordUpdateEventChangedProperties( objectRecordUpdateEventChangedProperties(
payload.previousRecord, payload.previousRecord,
payload.updatedRecord, payload.updatedRecord,
).includes('userEmail') ).includes('userEmail') &&
isMessagingEnabled
) { ) {
this.messageQueueService.add<MatchMessageParticipantsJobData>( this.messageQueueService.add<MatchMessageParticipantsJobData>(
MatchMessageParticipantJob.name, MatchMessageParticipantJob.name,

View File

@ -1,4 +1,5 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConnectedAccountModule } from 'src/workspace/messaging/repositories/connected-account/connected-account.module'; 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'; 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 { MessagingMessageChannelListener } from 'src/workspace/messaging/listeners/messaging-message-channel.listener';
import { MessageService } from 'src/workspace/messaging/repositories/message/message.service'; import { MessageService } from 'src/workspace/messaging/repositories/message/message.service';
import { WorkspaceMemberModule } from 'src/workspace/messaging/repositories/workspace-member/workspace-member.module'; import { WorkspaceMemberModule } from 'src/workspace/messaging/repositories/workspace-member/workspace-member.module';
import { FeatureFlagEntity } from 'src/core/feature-flag/feature-flag.entity';
@Module({ @Module({
imports: [ imports: [
EnvironmentModule, EnvironmentModule,
@ -31,6 +33,7 @@ import { WorkspaceMemberModule } from 'src/workspace/messaging/repositories/work
MessageThreadModule, MessageThreadModule,
MessageParticipantModule, MessageParticipantModule,
WorkspaceMemberModule, WorkspaceMemberModule,
TypeOrmModule.forFeature([FeatureFlagEntity], 'core'),
], ],
providers: [ providers: [
GmailFullSyncService, GmailFullSyncService,

View File

@ -311,6 +311,9 @@ export class WorkspaceQueryRunnerService {
private removeNestedProperties<Record extends IRecord = IRecord>( private removeNestedProperties<Record extends IRecord = IRecord>(
record: Record, record: Record,
) { ) {
if (!record) {
return;
}
const sanitizedRecord = {}; const sanitizedRecord = {};
for (const [key, value] of Object.entries(record)) { for (const [key, value] of Object.entries(record)) {