# Aggregate

The write side of the domain: a schema of events, a projection that folds them into state, and commands that inspect that state and decide on new events.

An aggregate is plain data. [AggregateService](https://effect-cqrs.dambox.ch/reference/api/aggregateservice/) gives it a store to run against, and `Fixture` runs it in tests.

## Classes

### Historical

Defined in: [src/Aggregate.ts:176](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L176)

An event as it was stored in the past, in an older version of its schema. Construct one directly to replay JSON taken from a database.

#### Constructors

##### Constructor

> **new Historical**(`options`): [`Historical`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#historical)

Defined in: [src/Aggregate.ts:180](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L180)

###### Parameters

###### options

###### payload

`Json`

###### schemaVersion

`number`

###### type

`string`

###### Returns

[`Historical`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#historical)

#### Properties

##### payload

> `readonly` **payload**: `Json`

Defined in: [src/Aggregate.ts:179](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L179)

##### schemaVersion

> `readonly` **schemaVersion**: `number`

Defined in: [src/Aggregate.ts:178](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L178)

##### type

> `readonly` **type**: `string`

Defined in: [src/Aggregate.ts:177](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L177)

## Interfaces

### Aggregate

Defined in: [src/Aggregate.ts:86](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L86)

#### Type Parameters

##### Name

`Name` *extends* `string`

##### State

`State`

##### Events

`Events` *extends* [`EventSchema`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#eventschema)<`any`>

##### Commands

`Commands` *extends* `Record`<`string`, [`AnyCommand`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#anycommand)>

##### V

`V` *extends* [`Versions`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#versions-1)<`Events`\[`"Type"`]> = { }

#### Properties

##### commands

> `readonly` **commands**: `Commands`

Defined in: [src/Aggregate.ts:97](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L97)

##### events

> `readonly` **events**: `Events`

Defined in: [src/Aggregate.ts:94](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L94)

##### initial

> `readonly` **initial**: `State`

Defined in: [src/Aggregate.ts:95](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L95)

##### name

> `readonly` **name**: `Name`

Defined in: [src/Aggregate.ts:93](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L93)

##### projection

> `readonly` **projection**: [`Projection`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#projection-1)<`State`, `Events`\[`"Type"`]>

Defined in: [src/Aggregate.ts:96](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L96)

##### versions

> `readonly` **versions**: `V`

Defined in: [src/Aggregate.ts:98](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L98)

#### Methods

##### command()

> **command**<`CommandName`, `Payload`, `E`, `R`>(`name`, `options`): [`Aggregate`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#aggregate)<`Name`, `State`, `Events`, `Commands` & `Record`<`CommandName`, [`Command`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#command-1)<`Payload`, `State`, `Events`\[`"Type"`], `E`, `R`>>, `V`>

Defined in: [src/Aggregate.ts:100](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L100)

Returns a new aggregate that also accepts this command.

###### Type Parameters

###### CommandName

`CommandName` *extends* `string`

###### Payload

`Payload` *extends* [`PayloadSchema`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#payloadschema)

###### E

`E` = `never`

###### R

`R` = `never`

###### Parameters

###### name

`CommandName`

###### options

###### handler

[`CommandHandler`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandhandler-1)<`State`, `Payload`\[`"Type"`], `Events`\[`"Type"`], `E`, `R`>

###### payload

`Payload`

###### Returns

[`Aggregate`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#aggregate)<`Name`, `State`, `Events`, `Commands` & `Record`<`CommandName`, [`Command`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#command-1)<`Payload`, `State`, `Events`\[`"Type"`], `E`, `R`>>, `V`>

***

### AnyCommand

Defined in: [src/Aggregate.ts:73](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L73)

#### Properties

##### handler

> `readonly` **handler**: [`CommandHandler`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandhandler-1)<`any`, `any`, `any`, `any`, `any`>

Defined in: [src/Aggregate.ts:75](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L75)

##### payload

> `readonly` **payload**: [`PayloadSchema`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#payloadschema)

Defined in: [src/Aggregate.ts:74](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L74)

***

### Command

Defined in: [src/Aggregate.ts:68](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L68)

#### Type Parameters

##### Payload

`Payload` *extends* [`PayloadSchema`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#payloadschema)

##### State

`State`

##### Event

`Event`

##### E

`E`

##### R

`R`

#### Properties

##### handler

> `readonly` **handler**: [`CommandHandler`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandhandler-1)<`State`, `Payload`\[`"Type"`], `Event`, `E`, `R`>

Defined in: [src/Aggregate.ts:70](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L70)

##### payload

> `readonly` **payload**: `Payload`

Defined in: [src/Aggregate.ts:69](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L69)

***

### CommandContext

Defined in: [src/Aggregate.ts:43](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L43)

#### Properties

##### aggregateId

> `readonly` **aggregateId**: `string`

Defined in: [src/Aggregate.ts:44](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L44)

##### version

> `readonly` **version**: `number`

Defined in: [src/Aggregate.ts:45](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L45)

***

### EventMeta

Defined in: [src/Aggregate.ts:29](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L29)

Where an event sits in its stream and in the store.

#### Properties

##### aggregateId

> `readonly` **aggregateId**: `string`

Defined in: [src/Aggregate.ts:31](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L31)

##### aggregateName

> `readonly` **aggregateName**: `string`

Defined in: [src/Aggregate.ts:30](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L30)

##### causationId

> `readonly` **causationId**: `string` | `null`

Defined in: [src/Aggregate.ts:38](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L38)

What directly caused the command that recorded the event.

##### correlationId

> `readonly` **correlationId**: `string` | `null`

Defined in: [src/Aggregate.ts:36](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L36)

Shared by everything that follows from one original request, see `Causation`.

##### metadata

> `readonly` **metadata**: `JsonObject`

Defined in: [src/Aggregate.ts:40](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L40)

What the command carried beside its payload, such as the software version, see `Metadata`.

##### position

> `readonly` **position**: `number`

Defined in: [src/Aggregate.ts:33](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L33)

##### timestamp

> `readonly` **timestamp**: `Utc`

Defined in: [src/Aggregate.ts:34](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L34)

##### version

> `readonly` **version**: `number`

Defined in: [src/Aggregate.ts:32](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L32)

***

### Tagged

Defined in: [src/Aggregate.ts:13](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L13)

#### Properties

##### \_tag

> `readonly` **\_tag**: `string`

Defined in: [src/Aggregate.ts:14](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L14)

## Type Aliases

### Any

> **Any** = [`Aggregate`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#aggregate)<`string`, `any`, [`EventSchema`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#eventschema)<`any`>, `Record`<`string`, [`AnyCommand`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#anycommand)>, `any`>

Defined in: [src/Aggregate.ts:109](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L109)

***

### CommandError

> **CommandError**<`A`, `K`> = `A`\[`"commands"`]\[`K`] *extends* [`Command`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#command-1)<`any`, `any`, `any`, infer E, `any`> ? `E` : `never`

Defined in: [src/Aggregate.ts:117](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L117)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

##### K

`K` *extends* [`CommandName`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandname-1)<`A`> = [`CommandName`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandname-1)<`A`>

***

### CommandHandler

> **CommandHandler**<`State`, `Payload`, `Event`, `E`, `R`> = (`state`, `payload`, `context`) => `Effect.Effect`<`Event` | `ReadonlyArray`<`Event`>, `E`, `R`>

Defined in: [src/Aggregate.ts:62](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L62)

Decides on the events a command produces. It may run several times when concurrent writers collide, so it should only decide and leave side effects to view models. Returning an empty array records nothing.

#### Type Parameters

##### State

`State`

##### Payload

`Payload`

##### Event

`Event`

##### E

`E`

##### R

`R`

#### Parameters

##### state

`State`

##### payload

`Payload`

##### context

[`CommandContext`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandcontext)

#### Returns

`Effect.Effect`<`Event` | `ReadonlyArray`<`Event`>, `E`, `R`>

***

### CommandName

> **CommandName**<`A`> = keyof `A`\[`"commands"`] & `string`

Defined in: [src/Aggregate.ts:115](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L115)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

***

### Commands

> **Commands**<`A`> = `A`\[`"commands"`]

Defined in: [src/Aggregate.ts:114](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L114)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

***

### Context

> **Context**<`A`> = `A`\[`"commands"`]\[[`CommandName`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandname-1)<`A`>] *extends* [`Command`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#command-1)<`any`, `any`, `any`, `any`, infer R> ? `R` : `never`

Defined in: [src/Aggregate.ts:119](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L119)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

***

### Event

> **Event**<`A`> = `A`\[`"events"`]\[`"Type"`]

Defined in: [src/Aggregate.ts:113](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L113)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

***

### EventSchema

> **EventSchema**<`Event`> = `Schema.Top` & `object`

Defined in: [src/Aggregate.ts:17](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L17)

#### Type Parameters

##### Event

`Event` *extends* [`Tagged`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#tagged) = [`Tagged`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#tagged)

#### Type Declaration

##### DecodingServices

> `readonly` **DecodingServices**: `never`

##### EncodingServices

> `readonly` **EncodingServices**: `never`

##### Type

> `readonly` **Type**: `Event`

***

### Name

> **Name**<`A`> = `A`\[`"name"`]

Defined in: [src/Aggregate.ts:111](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L111)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

***

### Payload

> **Payload**<`A`, `K`> = `A`\[`"commands"`]\[`K`]\[`"payload"`]\[`"Type"`]

Defined in: [src/Aggregate.ts:116](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L116)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

##### K

`K` *extends* [`CommandName`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#commandname-1)<`A`>

***

### PayloadSchema

> **PayloadSchema** = `Schema.Top` & `object`

Defined in: [src/Aggregate.ts:23](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L23)

#### Type Declaration

##### DecodingServices

> `readonly` **DecodingServices**: `never`

##### EncodingServices

> `readonly` **EncodingServices**: `never`

***

### Projection

> **Projection**<`State`, `Event`> = `{ readonly [Tag in Event["_tag"]]: (state: State, event: Extract<Event, { _tag: Tag }>, meta: EventMeta) => State }`

Defined in: [src/Aggregate.ts:49](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L49)

Exhaustive by event tag, so adding an event to the schema without folding it does not compile.

#### Type Parameters

##### State

`State`

##### Event

`Event` *extends* [`Tagged`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#tagged)

***

### State

> **State**<`A`> = `A`\[`"initial"`]

Defined in: [src/Aggregate.ts:112](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L112)

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

***

### Versions

> **Versions**<`Event`> = `{ readonly [Tag in Event["_tag"]]?: Any<Extract<Event, { _tag: Tag }>> }`

Defined in: [src/Aggregate.ts:82](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L82)

The older shapes of some events, keyed by tag. Each history has to end in the event’s current shape.

#### Type Parameters

##### Event

`Event` *extends* [`Tagged`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#tagged)

## Functions

### evolve()

> **evolve**<`A`>(`aggregate`, `state`, `event`, `meta`): [`State`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#state-4)<`A`>

Defined in: [src/Aggregate.ts:159](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L159)

Folds one event into the state.

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

#### Parameters

##### aggregate

`A`

##### state

[`State`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#state-4)<`A`>

##### event

[`Event`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#event-2)<`A`>

##### meta

[`EventMeta`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#eventmeta)

#### Returns

[`State`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#state-4)<`A`>

***

### historical()

> **historical**<`A`, `Tag`, `Version`>(`aggregate`, `tag`, `version`, `value`): [`Historical`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#historical)

Defined in: [src/Aggregate.ts:192](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L192)

Encodes an event in an older version of its schema, as code from that time would have stored it. The value is checked against that version, so a test can’t seed a shape that never existed.

#### Type Parameters

##### A

`A` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

##### Tag

`Tag` *extends* `string`

##### Version

`Version` *extends* `number`

#### Parameters

##### aggregate

`A`

##### tag

`Tag`

##### version

`Version`

##### value

[`SchemaAt`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#schemaat)<`NonNullable`<`A`\[`"versions"`]\[`Tag`]>, `Version`>\[`"Type"`]

#### Returns

[`Historical`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#historical)

***

### make()

> **make**<`State`>(): <`Name`, `Events`, `V`>(`options`) => [`Aggregate`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#aggregate)<`Name`, `State`, `Events`, { }, `V`>

Defined in: [src/Aggregate.ts:147](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L147)

The state is given explicitly, `Aggregate.make<State>()({ ... })`, so that the projection’s return values are checked against it rather than widened.

#### Type Parameters

##### State

`State`

#### Returns

<`Name`, `Events`, `V`>(`options`) => [`Aggregate`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#aggregate)<`Name`, `State`, `Events`, { }, `V`>

***

### schemaVersion()

> **schemaVersion**(`aggregate`, `tag`): `number`

Defined in: [src/Aggregate.ts:169](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/Aggregate.ts#L169)

The schema version new events with this tag are written with.

#### Parameters

##### aggregate

[`Any`](https://effect-cqrs.dambox.ch/reference/api/aggregate/#any)

##### tag

`string`

#### Returns

`number`
