@cashfarm/plow
Version:
Library for validating input data and parameters
31 lines (30 loc) • 1.2 kB
TypeScript
import { Guid, ConcreteType, Type } from '@cashfarm/lang';
import { AggregateRoot, IAggregateRoot, Identity, IDomainEvent } from '../domain';
import { EventEnvelope } from './eventEnvelope';
export interface IESAggregateRoot<TId extends Identity<any> | Guid> extends IAggregateRoot<TId> {
readonly version: number;
readonly uncommittedChanges: IDomainEvent[];
markChangesAsCommitted(): void;
}
/**
* Returns a symbol used to created methods that apply events to agrregates
*
* @export
* @param {(DomainEvent & Type)} e
* @returns {symbol}
*/
export declare function Apply(e: IDomainEvent & Type): symbol;
/**
* Base implementation for an event sourced aggregate root.
*
* Extend this class and implement `[Apply(EvtClass)]()` methods for
* each event of your aggregate.
*/
export declare class ESAggregateRoot<TId extends Identity<any> | Guid> extends AggregateRoot<TId> {
private _version;
static load<T extends ESAggregateRoot<any>>(constructor: ConcreteType<T>, events: EventEnvelope[]): T;
readonly version: number;
readonly uncommittedChanges: IDomainEvent[];
markChangesAsCommitted(): void;
protected applyChange(event: IDomainEvent): void;
}