Current section

Files

Jump to
eventsourcing src eventsourcing.erl
Raw

src/eventsourcing.erl

-module(eventsourcing).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/5, with_snapshots/2, add_query/2, load_events/2, get_latest_snapshot/2, execute_with_metadata/4, execute/3, load_aggregate/2]).
-export_type([aggregate/4, snapshot/1, snapshot_config/0, event_envelop/1, event_sourcing_error/1, event_sourcing/5, event_store/5]).
-type aggregate(QYC, QYD, QYE, QYF) :: {aggregate, binary(), QYC, integer()} |
{gleam_phantom, QYD, QYE, QYF}.
-type snapshot(QYG) :: {snapshot, binary(), QYG, integer(), integer()}.
-type snapshot_config() :: {snapshot_config, integer()}.
-type event_envelop(QYH) :: {memory_store_event_envelop,
binary(),
integer(),
QYH,
list({binary(), binary()})} |
{serialized_event_envelop,
binary(),
integer(),
QYH,
list({binary(), binary()}),
binary(),
binary(),
binary()}.
-type event_sourcing_error(QYI) :: {domain_error, QYI} |
{event_store_error, binary()} |
entity_not_found.
-opaque event_sourcing(QYJ, QYK, QYL, QYM, QYN) :: {event_sourcing,
event_store(QYJ, QYK, QYL, QYM, QYN),
list(fun((binary(), list(event_envelop(QYM))) -> nil)),
fun((QYK, QYL) -> {ok, list(QYM)} | {error, QYN}),
fun((QYK, QYM) -> QYK),
QYK,
gleam@option:option(snapshot_config())}.
-type event_store(QYO, QYP, QYQ, QYR, QYS) :: {event_store,
QYO,
fun((QYO, binary(), integer()) -> {ok, list(event_envelop(QYR))} |
{error, event_sourcing_error(QYS)}),
fun((QYO, aggregate(QYP, QYQ, QYR, QYS), list(QYR), list({binary(),
binary()})) -> {ok, {list(event_envelop(QYR)), integer()}} |
{error, event_sourcing_error(QYS)}),
fun((QYO, snapshot(QYP)) -> nil),
fun((QYO, binary()) -> {ok, gleam@option:option(snapshot(QYP))} |
{error, event_sourcing_error(QYS)})}.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 147).
-spec new(
event_store(QZF, QZG, QZH, QZI, QZJ),
list(fun((binary(), list(event_envelop(QZI))) -> nil)),
fun((QZG, QZH) -> {ok, list(QZI)} | {error, QZJ}),
fun((QZG, QZI) -> QZG),
QZG
) -> event_sourcing(QZF, QZG, QZH, QZI, QZJ).
new(Event_store, Queries, Handle, Apply, Empty_state) ->
{event_sourcing, Event_store, Queries, Handle, Apply, Empty_state, none}.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 172).
-spec with_snapshots(event_sourcing(QZY, QZZ, RAA, RAB, RAC), snapshot_config()) -> event_sourcing(QZY, QZZ, RAA, RAB, RAC).
with_snapshots(Event_sourcing, Config) ->
_record = Event_sourcing,
{event_sourcing,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
{some, Config}}.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 314).
-spec add_query(
event_sourcing(RCF, RCG, RCH, RCI, RCJ),
fun((binary(), list(event_envelop(RCI))) -> nil)
) -> event_sourcing(RCF, RCG, RCH, RCI, RCJ).
add_query(Eventsourcing, Query) ->
_record = Eventsourcing,
{event_sourcing,
erlang:element(2, _record),
[Query | erlang:element(3, Eventsourcing)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record)}.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 347).
-spec load_events(event_sourcing(any(), any(), any(), RCU, RCV), binary()) -> {ok,
list(event_envelop(RCU))} |
{error, event_sourcing_error(RCV)}.
load_events(Eventsourcing, Aggregate_id) ->
(erlang:element(3, erlang:element(2, Eventsourcing)))(
erlang:element(2, erlang:element(2, Eventsourcing)),
Aggregate_id,
0
).
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 388).
-spec get_latest_snapshot(
event_sourcing(any(), RDH, any(), any(), RDK),
binary()
) -> {ok, gleam@option:option(snapshot(RDH))} |
{error, event_sourcing_error(RDK)}.
get_latest_snapshot(Eventsourcing, Aggregate_id) ->
case erlang:element(7, Eventsourcing) of
none ->
{ok, none};
{some, _} ->
(erlang:element(6, erlang:element(2, Eventsourcing)))(
erlang:element(2, erlang:element(2, Eventsourcing)),
Aggregate_id
)
end.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 411).
-spec load_aggregate_or_emtpy_aggregate(
event_sourcing(any(), RDW, RDX, RDY, RDZ),
binary()
) -> {ok, aggregate(RDW, RDX, RDY, RDZ)} | {error, event_sourcing_error(RDZ)}.
load_aggregate_or_emtpy_aggregate(Eventsourcing, Aggregate_id) ->
gleam@result:'try'(
(erlang:element(6, erlang:element(2, Eventsourcing)))(
erlang:element(2, erlang:element(2, Eventsourcing)),
Aggregate_id
),
fun(Maybe_snapshot) ->
Start_from = case Maybe_snapshot of
{some, Snapshot} ->
erlang:element(4, Snapshot);
none ->
0
end,
gleam@result:map(
(erlang:element(3, erlang:element(2, Eventsourcing)))(
erlang:element(2, erlang:element(2, Eventsourcing)),
Aggregate_id,
Start_from
),
fun(Events) ->
{Starting_state, Starting_sequence} = case Maybe_snapshot of
none ->
{erlang:element(6, Eventsourcing), 0};
{some, Snapshot@1} ->
{erlang:element(3, Snapshot@1),
erlang:element(4, Snapshot@1)}
end,
{Instance, Sequence@1} = begin
_pipe = Events,
gleam@list:fold(
_pipe,
{Starting_state, Starting_sequence},
fun(Aggregate_and_sequence, Event_envelop) ->
{Aggregate, Sequence} = Aggregate_and_sequence,
{(erlang:element(5, Eventsourcing))(
Aggregate,
erlang:element(4, Event_envelop)
),
Sequence + 1}
end
)
end,
{aggregate, Aggregate_id, Instance, Sequence@1}
end
)
end
).
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 212).
-spec execute_with_metadata(
event_sourcing(any(), any(), RBC, any(), RBE),
binary(),
RBC,
list({binary(), binary()})
) -> {ok, nil} | {error, event_sourcing_error(RBE)}.
execute_with_metadata(Eventsourcing, Aggregate_id, Command, Metadata) ->
gleam@result:'try'(
load_aggregate_or_emtpy_aggregate(Eventsourcing, Aggregate_id),
fun(Aggregate) ->
Entity = erlang:element(3, Aggregate),
gleam@result:'try'(
begin
_pipe = (erlang:element(4, Eventsourcing))(Entity, Command),
gleam@result:map_error(
_pipe,
fun(Error) -> {domain_error, Error} end
)
end,
fun(Events) ->
Post_command_aggregate = begin
_record = Aggregate,
{aggregate,
erlang:element(2, _record),
begin
_pipe@1 = Events,
gleam@list:fold(
_pipe@1,
erlang:element(3, Aggregate),
fun(Event, Entity@1) ->
(erlang:element(5, Eventsourcing))(
Event,
Entity@1
)
end
)
end,
erlang:element(4, _record)}
end,
gleam@result:'try'(
(erlang:element(4, erlang:element(2, Eventsourcing)))(
erlang:element(2, erlang:element(2, Eventsourcing)),
Post_command_aggregate,
Events,
Metadata
),
fun(_use0) ->
{Commited_events, Sequence} = _use0,
case erlang:element(7, Eventsourcing) of
{some, Config} ->
case ((case erlang:element(2, Config) of
0 -> 0;
Gleam@denominator -> Sequence rem Gleam@denominator
end) =:= 0) andalso (erlang:element(
2,
Config
)
/= 0) of
true ->
Snapshot = {snapshot,
erlang:element(2, Aggregate),
erlang:element(
3,
Post_command_aggregate
),
Sequence,
birl:to_unix(birl:now())},
(erlang:element(
5,
erlang:element(2, Eventsourcing)
))(
erlang:element(
2,
erlang:element(
2,
Eventsourcing
)
),
Snapshot
);
false ->
nil
end;
none ->
nil
end,
_pipe@2 = erlang:element(3, Eventsourcing),
gleam@list:map(
_pipe@2,
fun(Query) ->
Query(
erlang:element(2, Aggregate),
Commited_events
)
end
),
{ok, nil}
end
)
end
)
end
).
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 188).
-spec execute(event_sourcing(any(), any(), RAP, any(), RAR), binary(), RAP) -> {ok,
nil} |
{error, event_sourcing_error(RAR)}.
execute(Eventsourcing, Aggregate_id, Command) ->
execute_with_metadata(Eventsourcing, Aggregate_id, Command, []).
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 291).
-spec load_aggregate(event_sourcing(any(), RBP, RBQ, RBR, RBS), binary()) -> {ok,
aggregate(RBP, RBQ, RBR, RBS)} |
{error, event_sourcing_error(RBS)}.
load_aggregate(Eventsourcing, Aggregate_id) ->
_pipe = load_aggregate_or_emtpy_aggregate(Eventsourcing, Aggregate_id),
gleam@result:'try'(
_pipe,
fun(Aggregate) ->
case erlang:element(3, Aggregate) =:= erlang:element(
6,
Eventsourcing
) of
true ->
{error, entity_not_found};
false ->
{ok, Aggregate}
end
end
).