Packages
ex_sorcery
0.1.0
A toolkit for building event-driven applications in Elixir with event sourcing and CQRS patterns
Current section
Files
Jump to
Current section
Files
lib/sorcery/event_converter.ex
defmodule Sorcery.EventConverter do
def event_store_to_domain(event) do
# Convert string keys to atoms in event data
event_data = for {key, val} <- event.data, into: %{} do
{String.to_existing_atom(key), val}
end
struct(event_module(event), event_data)
end
def domain_to_event_store(event, domain_module, id) do
event_data = event
|> Map.from_struct()
|> Enum.map(fn {k, v} -> {Atom.to_string(k), v} end)
|> Map.new()
# Build metadata based on whether this is a singleton or ID-based domain
Sorcery.Event.new(%{
type: event_type(event),
data: event_data,
domain: domain_module |> to_string,
instance_id: id,
})
end
def event_module(event) do
Module.concat([
event.metadata.domain,
"Events",
Macro.camelize(event.type)
])
end
defp event_type(event) do
event.__struct__
|> Module.split()
|> List.last()
|> Macro.underscore()
end
end