UNPKG

@dugongjs/core

Version:

89 lines (88 loc) 4.05 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var _a, _b; import { Type } from "class-transformer"; import { v4 as uuid } from "uuid"; import { AbstractEventSourcedAggregateRoot } from "../abstract-event-sourced-aggregate-root/abstract-event-sourced-aggregate-root.js"; import { AggregateIdSetOutsideCreationContextError } from "./errors/aggregate-id-set-outside-creation-context.error.js"; import { MutateEventOutsideCommandContextError } from "./errors/mutate-event-outside-command-context.error.js"; export const IsInProcessContext = Symbol("IsInProcessContext"); export const IsInCreationContext = Symbol("IsInCreationContext"); export class AbstractAggregateRoot extends AbstractEventSourcedAggregateRoot { constructor() { super(...arguments); this[_a] = false; this[_b] = false; this.stagedEvents = new Map(); } /** * Gets the staged domain events. * @returns An array of staged domain events. */ getStagedDomainEvents() { return Array.from(this.stagedEvents.values()); } /** * Gets the staged domain events that have not been applied yet. * @returns An array of staged domain events that have not been applied yet. */ getStagedDomainEventsNotApplied() { return this.getStagedDomainEvents().filter((event) => event.getSequenceNumber() > this.getCurrentDomainEventSequenceNumber()); } createDomainEvent(domainEventClass, payload) { this.validateCommandContext(); if (!this.getId()) { this.validateCreationContext(); this.setId(uuid()); } const event = new domainEventClass(this.getId(), ...(payload !== undefined ? [payload] : [])); event.setId(uuid()).setTimestamp(new Date()); // Call the lifecycle method onCreate if it exists. event.onCreate?.(); return event; } /** * Stages one or more domain events. The events are given a sequence number based on the current event sequence number. * The sequence number is incremented for each event staged. * @param domainEvents The domain events to stage. */ stageDomainEvent(...domainEvents) { this.validateCommandContext(); const highestStagedEventSequenceNumber = Math.max(...Array.from(this.stagedEvents.keys()), 0); let sequenceNumber = Math.max(this.getCurrentDomainEventSequenceNumber(), highestStagedEventSequenceNumber); for (const domainEvent of domainEvents) { domainEvent.setSequenceNumber(++sequenceNumber); this.stagedEvents.set(sequenceNumber, domainEvent); // Call the lifecycle method onStage if it exists. domainEvent.onStage?.(); } } /** * Clears the staged domain events. */ clearStagedDomainEvents() { this.stagedEvents.clear(); } validateCommandContext() { if (!this[IsInProcessContext]) { throw new MutateEventOutsideCommandContextError(); } } validateCreationContext() { if (!this[IsInCreationContext]) { throw new AggregateIdSetOutsideCreationContextError(); } } } _a = IsInProcessContext, _b = IsInCreationContext; __decorate([ Type(() => Map), __metadata("design:type", Object) ], AbstractAggregateRoot.prototype, "stagedEvents", void 0);