From 3ff5277d5fee64022b68bd743bcdfc436bde909e Mon Sep 17 00:00:00 2001 From: Romain Thouvenin Date: Mon, 29 Apr 2024 16:01:55 +0200 Subject: [PATCH] Add update method to Ad entity --- src/modules/ad/core/domain/ad.entity.ts | 20 ++++++++++++++++ src/modules/ad/core/domain/ad.types.ts | 22 ++++-------------- .../ad/core/domain/events/ad.domain-event.ts | 23 +++++++++++++++++++ 3 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 src/modules/ad/core/domain/events/ad.domain-event.ts diff --git a/src/modules/ad/core/domain/ad.entity.ts b/src/modules/ad/core/domain/ad.entity.ts index b255263..5b045c1 100644 --- a/src/modules/ad/core/domain/ad.entity.ts +++ b/src/modules/ad/core/domain/ad.entity.ts @@ -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 { 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({ diff --git a/src/modules/ad/core/domain/ad.types.ts b/src/modules/ad/core/domain/ad.types.ts index 85bb2bc..d42115a 100644 --- a/src/modules/ad/core/domain/ad.types.ts +++ b/src/modules/ad/core/domain/ad.types.ts @@ -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', diff --git a/src/modules/ad/core/domain/events/ad.domain-event.ts b/src/modules/ad/core/domain/events/ad.domain-event.ts new file mode 100644 index 0000000..d67b8f5 --- /dev/null +++ b/src/modules/ad/core/domain/events/ad.domain-event.ts @@ -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); + } +}