Skip to content

Commit

Permalink
Merge pull request novuhq#729 from novuhq/NV-556-Subscriber-with-same…
Browse files Browse the repository at this point in the history
…-subscriberId-are-not-updated-with-new-properties-on-trigger-events

feat: update subscriber via trigger
  • Loading branch information
djabarovgeorge authored Jun 28, 2022
2 parents f94b175 + b4e4d14 commit d9c713f
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 8 deletions.
42 changes: 42 additions & 0 deletions apps/api/src/app/events/e2e/process-subscriber.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { UserSession, SubscribersService } from '@novu/testing';
import { expect } from 'chai';
import axios from 'axios';
import { ChannelTypeEnum } from '@novu/shared';
import { ISubscribersDefine } from '@novu/node';
import { SubscriberRepository } from '@novu/dal';

const axiosInstance = axios.create();

Expand All @@ -11,6 +13,7 @@ describe('Trigger event - process subscriber /v1/events/trigger (POST)', functio
let template: NotificationTemplateEntity;
let subscriber: SubscriberEntity;
let subscriberService: SubscribersService;
const subscriberRepository = new SubscriberRepository();
const messageRepository = new MessageRepository();

beforeEach(async () => {
Expand Down Expand Up @@ -69,4 +72,43 @@ describe('Trigger event - process subscriber /v1/events/trigger (POST)', functio

expect(message.length).to.equal(2);
});

it('should update a subscriber based on event', async function () {
const payload: ISubscribersDefine = {
subscriberId: subscriber.subscriberId,
firstName: 'New Test Name',
lastName: 'New Last of name',
email: '[email protected]',
};

try {
await axiosInstance.post(
`${session.serverUrl}/v1/events/trigger`,
{
name: template.triggers[0].identifier,
to: {
...payload,
},
payload: {},
},
{
headers: {
authorization: `ApiKey ${session.apiKey}`,
},
}
);
} catch (e) {
// eslint-disable-next-line no-console
console.log(e);
}

const createdSubscriber = await subscriberRepository.findBySubscriberId(
session.environment._id,
subscriber.subscriberId
);

expect(createdSubscriber.firstName).to.equal(payload.firstName);
expect(createdSubscriber.lastName).to.equal(payload.lastName);
expect(createdSubscriber.email).to.equal(payload.email);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { CreateLog } from '../../../logs/usecases/create-log/create-log.usecase'
import { CreateLogCommand } from '../../../logs/usecases/create-log/create-log.command';
import { ProcessSubscriberCommand } from './process-subscriber.command';
import { matchMessageWithFilters } from '../trigger-event/message-filter.matcher';
import { ISubscribersDefine } from '@novu/node';

@Injectable()
export class ProcessSubscriber {
Expand All @@ -27,7 +28,7 @@ export class ProcessSubscriber {
public async execute(command: ProcessSubscriberCommand): Promise<JobEntity[]> {
const template = await this.notificationTemplateRepository.findById(command.templateId, command.organizationId);

const subscriber: SubscriberEntity = await this.getSubscriber(command, template._id);
const subscriber: SubscriberEntity = await this.getSubscriber(command);
if (subscriber === null) {
return [];
}
Expand Down Expand Up @@ -70,30 +71,45 @@ export class ProcessSubscriber {
});
}

private async getSubscriber(command: ProcessSubscriberCommand, templateId: string): Promise<SubscriberEntity> {
private async getSubscriber(command: ProcessSubscriberCommand): Promise<SubscriberEntity> {
const subscriberPayload = command.to;
const subscriber = await this.subscriberRepository.findOne({
_environmentId: command.environmentId,
subscriberId: subscriberPayload.subscriberId,
});

if (subscriber) {
if (subscriber && !this.subscriberNeedUpdate(subscriber, subscriberPayload)) {
return subscriber;
}

return await this.createOrUpdateSubscriber(command, subscriberPayload);
}

private async createOrUpdateSubscriber(command: ProcessSubscriberCommand, subscriberPayload) {
return await this.createSubscriberUsecase.execute(
CreateSubscriberCommand.create({
environmentId: command.environmentId,
organizationId: command.organizationId,
subscriberId: subscriberPayload.subscriberId,
email: subscriberPayload.email,
firstName: subscriberPayload.firstName,
lastName: subscriberPayload.lastName,
phone: subscriberPayload.phone,
subscriberId: subscriberPayload?.subscriberId,
email: subscriberPayload?.email,
firstName: subscriberPayload?.firstName,
lastName: subscriberPayload?.lastName,
phone: subscriberPayload?.phone,
avatar: subscriberPayload?.avatar,
})
);
}

private subscriberNeedUpdate(subscriber: SubscriberEntity, subscriberPayload: ISubscribersDefine): boolean {
return (
(subscriberPayload?.email && subscriber?.email !== subscriberPayload?.email) ||
(subscriberPayload?.firstName && subscriber?.firstName !== subscriberPayload?.firstName) ||
(subscriberPayload?.lastName && subscriber?.lastName !== subscriberPayload?.lastName) ||
(subscriberPayload?.phone && subscriber?.phone !== subscriberPayload?.phone) ||
(subscriberPayload?.avatar && subscriber?.avatar !== subscriberPayload?.avatar)
);
}

private async createNotification(
command: ProcessSubscriberCommand,
templateId: string,
Expand Down

0 comments on commit d9c713f

Please sign in to comment.