Add update method to Ad entity
This commit is contained in:
		
							parent
							
								
									62e5fd56d9
								
							
						
					
					
						commit
						3ff5277d5f
					
				| 
						 | 
				
			
			@ -6,6 +6,7 @@ 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';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -96,6 +97,25 @@ export class AdEntity extends AggregateRoot<AdProps> {
 | 
			
		|||
    return this;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  update = (newProps: CreateAdProps): AdEntity => {
 | 
			
		||||
    this.props.driver = newProps.driver;
 | 
			
		||||
    this.props.passenger = newProps.passenger;
 | 
			
		||||
    this.props.frequency = newProps.frequency;
 | 
			
		||||
    this.props.fromDate = newProps.fromDate;
 | 
			
		||||
    this.props.toDate = newProps.toDate;
 | 
			
		||||
    this.props.seatsProposed = newProps.seatsProposed;
 | 
			
		||||
    this.props.seatsRequested = newProps.seatsRequested;
 | 
			
		||||
    this.props.strict = newProps.strict;
 | 
			
		||||
    this.props.comment = newProps.comment;
 | 
			
		||||
    this.props.schedule = newProps.schedule.map((item) => ({ ...item }));
 | 
			
		||||
    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;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  delete(): void {
 | 
			
		||||
    this.addEvent(
 | 
			
		||||
      new AdDeletedDomainEvent({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,23 +1,6 @@
 | 
			
		|||
import { ScheduleItemProps } from './value-objects/schedule-item.value-object';
 | 
			
		||||
import { WaypointProps } from './value-objects/waypoint.value-object';
 | 
			
		||||
 | 
			
		||||
// All properties that an Ad has
 | 
			
		||||
export interface AdProps {
 | 
			
		||||
  userId: string;
 | 
			
		||||
  driver: boolean;
 | 
			
		||||
  status: Status;
 | 
			
		||||
  passenger: boolean;
 | 
			
		||||
  frequency: Frequency;
 | 
			
		||||
  fromDate: string;
 | 
			
		||||
  toDate: string;
 | 
			
		||||
  schedule: ScheduleItemProps[];
 | 
			
		||||
  seatsProposed: number;
 | 
			
		||||
  seatsRequested: number;
 | 
			
		||||
  strict: boolean;
 | 
			
		||||
  waypoints: WaypointProps[];
 | 
			
		||||
  comment?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Properties that are needed for an Ad creation
 | 
			
		||||
export interface CreateAdProps {
 | 
			
		||||
  userId: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +17,11 @@ export interface CreateAdProps {
 | 
			
		|||
  comment?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// All properties that an Ad has
 | 
			
		||||
export interface AdProps extends CreateAdProps {
 | 
			
		||||
  status: Status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export enum Frequency {
 | 
			
		||||
  PUNCTUAL = 'PUNCTUAL',
 | 
			
		||||
  RECURRENT = 'RECURRENT',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
import { DomainEvent } from '@mobicoop/ddd-library';
 | 
			
		||||
import { AdEntity } from '../ad.entity';
 | 
			
		||||
 | 
			
		||||
export abstract class AdDomainEvent extends DomainEvent {
 | 
			
		||||
  readonly ad: AdEntity;
 | 
			
		||||
 | 
			
		||||
  constructor(ad: AdEntity) {
 | 
			
		||||
    super({
 | 
			
		||||
      metadata: {
 | 
			
		||||
        correlationId: ad.id,
 | 
			
		||||
        timestamp: Date.now(),
 | 
			
		||||
      },
 | 
			
		||||
      aggregateId: ad.id,
 | 
			
		||||
    });
 | 
			
		||||
    this.ad = ad;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class AdUpdatedDomainEvent extends AdDomainEvent {
 | 
			
		||||
  constructor(ad: AdEntity) {
 | 
			
		||||
    super(ad);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue