Emit the AdUpdated domain event from the service instead of the repository

This is to avoid storing the event in the entity, which prevents serializing it into JSON
(because it has a circular dependency to AdEntity)
This commit is contained in:
Romain Thouvenin 2024-05-02 14:45:26 +02:00
parent 659c1baea8
commit f6c3204708
2 changed files with 7 additions and 2 deletions

View File

@ -2,8 +2,10 @@ import {
AD_REPOSITORY, AD_REPOSITORY,
INPUT_DATETIME_TRANSFORMER, INPUT_DATETIME_TRANSFORMER,
} from '@modules/ad/ad.di-tokens'; } from '@modules/ad/ad.di-tokens';
import { AdUpdatedDomainEvent } from '@modules/ad/core/domain/events/ad.domain-event';
import { Inject } from '@nestjs/common'; import { Inject } from '@nestjs/common';
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { AdRepositoryPort } from '../../ports/ad.repository.port'; import { AdRepositoryPort } from '../../ports/ad.repository.port';
import { DateTimeTransformerPort } from '../../ports/datetime-transformer.port'; import { DateTimeTransformerPort } from '../../ports/datetime-transformer.port';
import { createPropsFromCommand } from '../create-ad/create-ad.service'; import { createPropsFromCommand } from '../create-ad/create-ad.service';
@ -16,6 +18,7 @@ export class UpdateAdService implements ICommandHandler {
private readonly repository: AdRepositoryPort, private readonly repository: AdRepositoryPort,
@Inject(INPUT_DATETIME_TRANSFORMER) @Inject(INPUT_DATETIME_TRANSFORMER)
private readonly datetimeTransformer: DateTimeTransformerPort, private readonly datetimeTransformer: DateTimeTransformerPort,
private readonly eventEmitter: EventEmitter2,
) {} ) {}
async execute(command: UpdateAdCommand): Promise<void> { async execute(command: UpdateAdCommand): Promise<void> {
@ -25,5 +28,9 @@ export class UpdateAdService implements ICommandHandler {
}); });
ad.update(createPropsFromCommand(command, this.datetimeTransformer)); ad.update(createPropsFromCommand(command, this.datetimeTransformer));
await this.repository.update(ad.id, ad); await this.repository.update(ad.id, ad);
this.eventEmitter.emitAsync(
AdUpdatedDomainEvent.name,
new AdUpdatedDomainEvent(ad),
);
} }
} }

View File

@ -6,7 +6,6 @@ import { AdDeletedDomainEvent } from './events/ad-delete.domain-event';
import { AdInvalidatedDomainEvent } from './events/ad-invalidated.domain-event'; import { AdInvalidatedDomainEvent } from './events/ad-invalidated.domain-event';
import { AdSuspendedDomainEvent } from './events/ad-suspended.domain-event'; import { AdSuspendedDomainEvent } from './events/ad-suspended.domain-event';
import { AdValidatedDomainEvent } from './events/ad-validated.domain-event'; import { AdValidatedDomainEvent } from './events/ad-validated.domain-event';
import { AdUpdatedDomainEvent } from './events/ad.domain-event';
import { ScheduleItemProps } from './value-objects/schedule-item.value-object'; import { ScheduleItemProps } from './value-objects/schedule-item.value-object';
import { WaypointProps } from './value-objects/waypoint.value-object'; import { WaypointProps } from './value-objects/waypoint.value-object';
@ -111,7 +110,6 @@ export class AdEntity extends AggregateRoot<AdProps> {
this.props.waypoints = newProps.waypoints.map((wp) => ({ ...wp })); this.props.waypoints = newProps.waypoints.map((wp) => ({ ...wp }));
//The ad goes back to pending status until it is validated again //The ad goes back to pending status until it is validated again
this.props.status = Status.PENDING; this.props.status = Status.PENDING;
this.addEvent(new AdUpdatedDomainEvent(this));
this.validate(); this.validate();
return this; return this;
}; };