defmodule EventStore.RecordedEvent do @moduledoc """ `EventStore.RecordedEvent` contains the persisted data and metadata for a single event. Events are immutable once recorded. ## Recorded event fields - `event_id` - a globally unique, monotonically incrementing and gapless integer - `stream_uuid` - the stream identity for the event - `stream_version` - the version of the stream for the event - `correlation_id` - an optional identifier used to correlate related messages - `causation_id` - an optional identifier used to identify which message you are responding to - `data` - the serialized event as binary data - `metadata` - the serialized event metadata as binary data - `created_at` - the date/time, in UTC, indicating when the event was created """ alias EventStore.RecordedEvent @type t :: %RecordedEvent{ event_id: non_neg_integer, stream_uuid: String.t, stream_version: non_neg_integer, correlation_id: String.t, causation_id: String.t, event_type: String.t, data: binary, metadata: binary, created_at: NaiveDateTime.t, } defstruct [ event_id: nil, stream_uuid: nil, stream_version: nil, correlation_id: nil, causation_id: nil, event_type: nil, data: nil, metadata: nil, created_at: nil, ] def deserialize(%RecordedEvent{data: data, metadata: metadata, event_type: event_type} = recorded_event, serializer) do %RecordedEvent{recorded_event | data: serializer.deserialize(data, type: event_type), metadata: serializer.deserialize(metadata, []) } end def fetch(map, key) when is_map(map) do Map.fetch(map, key) end def get_and_update(map, key, fun) when is_map(map) do Map.get_and_update(map, key, fun) end end