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:
		
							parent
							
								
									659c1baea8
								
							
						
					
					
						commit
						f6c3204708
					
				| 
						 | 
				
			
			@ -2,8 +2,10 @@ import {
 | 
			
		|||
  AD_REPOSITORY,
 | 
			
		||||
  INPUT_DATETIME_TRANSFORMER,
 | 
			
		||||
} from '@modules/ad/ad.di-tokens';
 | 
			
		||||
import { AdUpdatedDomainEvent } from '@modules/ad/core/domain/events/ad.domain-event';
 | 
			
		||||
import { Inject } from '@nestjs/common';
 | 
			
		||||
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
 | 
			
		||||
import { EventEmitter2 } from '@nestjs/event-emitter';
 | 
			
		||||
import { AdRepositoryPort } from '../../ports/ad.repository.port';
 | 
			
		||||
import { DateTimeTransformerPort } from '../../ports/datetime-transformer.port';
 | 
			
		||||
import { createPropsFromCommand } from '../create-ad/create-ad.service';
 | 
			
		||||
| 
						 | 
				
			
			@ -16,6 +18,7 @@ export class UpdateAdService implements ICommandHandler {
 | 
			
		|||
    private readonly repository: AdRepositoryPort,
 | 
			
		||||
    @Inject(INPUT_DATETIME_TRANSFORMER)
 | 
			
		||||
    private readonly datetimeTransformer: DateTimeTransformerPort,
 | 
			
		||||
    private readonly eventEmitter: EventEmitter2,
 | 
			
		||||
  ) {}
 | 
			
		||||
 | 
			
		||||
  async execute(command: UpdateAdCommand): Promise<void> {
 | 
			
		||||
| 
						 | 
				
			
			@ -25,5 +28,9 @@ export class UpdateAdService implements ICommandHandler {
 | 
			
		|||
    });
 | 
			
		||||
    ad.update(createPropsFromCommand(command, this.datetimeTransformer));
 | 
			
		||||
    await this.repository.update(ad.id, ad);
 | 
			
		||||
    this.eventEmitter.emitAsync(
 | 
			
		||||
      AdUpdatedDomainEvent.name,
 | 
			
		||||
      new AdUpdatedDomainEvent(ad),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,6 @@ import { AdDeletedDomainEvent } from './events/ad-delete.domain-event';
 | 
			
		|||
import { AdInvalidatedDomainEvent } from './events/ad-invalidated.domain-event';
 | 
			
		||||
import { AdSuspendedDomainEvent } from './events/ad-suspended.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 { 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 }));
 | 
			
		||||
    //The ad goes back to pending status until it is validated again
 | 
			
		||||
    this.props.status = Status.PENDING;
 | 
			
		||||
    this.addEvent(new AdUpdatedDomainEvent(this));
 | 
			
		||||
    this.validate();
 | 
			
		||||
    return this;
 | 
			
		||||
  };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue