Skip to content

Commit

Permalink
Merge pull request #719 from fraktalio/feature/event-metadata-and-ver…
Browse files Browse the repository at this point in the history
…sion-provider

Include `event metadata` as param in the version provider
  • Loading branch information
idugalic authored Apr 11, 2024
2 parents 6ccc7fd + cf95e82 commit e6a439b
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 11 deletions.
5 changes: 5 additions & 0 deletions jsr.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "@fraktalio/fmodel-ts",
"version": "2.0.1",
"exports": "./src/index.ts"
}
11 changes: 8 additions & 3 deletions src/lib/application/eventsourcing-aggregate.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,23 +241,28 @@ class EventRepositoryImpl
async save(
eList: readonly Evt[],
commandMetadata: CmdMetadata,
versionProvider: (e: Evt) => Promise<Version | null>
versionProvider: (e: Evt & EvtMetadata) => Promise<Version | null>
): Promise<readonly (Evt & Version & EvtMetadata)[]> {
//mapping the Commands metadata into Events metadata !!!
const savedEvents: readonly (Evt & Version & EvtMetadata)[] =
await Promise.all(
eList.map(async (e: Evt, index) => ({
kind: e.kind,
value: e.value,
version: ((await versionProvider(e))?.version ?? 0) + index + 1,
version:
((
await versionProvider({ ...e, traceId: commandMetadata.traceId })
)?.version ?? 0) +
index +
1,
traceId: commandMetadata.traceId,
}))
);
storage.concat(savedEvents);
return savedEvents;
}

async versionProvider(_e: Evt): Promise<Version | null> {
async versionProvider(_e: Evt & EvtMetadata): Promise<Version | null> {
return storage[storage.length - 1];
}
}
Expand Down
16 changes: 8 additions & 8 deletions src/lib/application/eventsourcing-aggregate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,24 +40,24 @@ export interface IEventRepository<C, E, V, CM, EM> {
/**
* Get the latest event stream version / sequence
*
* @param event - Event of type `E`
* @param event - Event of type `E & EM`
*
* @return the latest version / sequence of the event stream that this event belongs to.
*/
readonly versionProvider: (event: E) => Promise<V | null>;
readonly versionProvider: (event: E & EM) => Promise<V | null>;

/**
* Save events
*
* @param events - list of Events
* @param commandMetadata - Command Metadata of the command that initiated `events`
* @param versionProvider - A provider for the Latest Event in this stream and its Version/Sequence
* @param versionProvider - A provider for the stream Version/Sequence
* @return a list of newly saved Event(s) of type `E` with Version of type `V` and with Event Metadata of type `EM`
*/
readonly save: (
events: readonly E[],
commandMetadata: CM,
versionProvider: (e: E) => Promise<V | null>
versionProvider: (e: E & EM) => Promise<V | null>
) => Promise<readonly (E & V & EM)[]>;
}

Expand Down Expand Up @@ -228,14 +228,14 @@ export class EventSourcingAggregate<C, S, E, V, CM, EM>
return this.eventRepository.fetch(command);
}

async versionProvider(event: E): Promise<V | null> {
async versionProvider(event: E & EM): Promise<V | null> {
return this.eventRepository.versionProvider(event);
}

async save(
events: readonly E[],
commandMetadata: CM,
versionProvider: (e: E) => Promise<V | null>
versionProvider: (e: E & EM) => Promise<V | null>
): Promise<readonly (E & V & EM)[]> {
return this.eventRepository.save(events, commandMetadata, versionProvider);
}
Expand Down Expand Up @@ -284,14 +284,14 @@ export class EventSourcingOrchestratingAggregate<C, S, E, V, CM, EM>
return this.eventRepository.fetch(command);
}

async versionProvider(event: E): Promise<V | null> {
async versionProvider(event: E & EM): Promise<V | null> {
return this.eventRepository.versionProvider(event);
}

async save(
events: readonly E[],
commandMetadata: CM,
versionProvider: (e: E) => Promise<V | null>
versionProvider: (e: E & EM) => Promise<V | null>
): Promise<readonly (E & V & EM)[]> {
return this.eventRepository.save(events, commandMetadata, versionProvider);
}
Expand Down

0 comments on commit e6a439b

Please sign in to comment.