Current section
Files
Jump to
Current section
Files
lib/mongodb.ex
defmodule Eidetic.EventStore.MongoDB do
@moduledoc """
Documentation for MongoDB.
"""
@doc """
Inserts an event into the event-store
"""
def record(event = %Eidetic.Event{}) do
event
|> transform_in
|> insert
end
@doc """
Fetch event stream from the event-store
"""
def fetch(identifier) do
identifier
|> select
|> transform_out
end
@doc false
defp insert(document) do
Mongo.insert_one(:mongo, "events", document, pool: DBConnection.Poolboy)
end
@doc false
defp select(identifier) do
Mongo.find(:mongo, "events", %{"$query": %{identifier: identifier}}, pool: DBConnection.Poolboy)
|> Enum.to_list()
end
@doc false
defp transform_in(event = %Eidetic.Event{}) do
%{event | datetime: DateTime.to_iso8601(event.datetime)}
end
@doc false
defp transform_out(events) when is_list(events) do
Enum.reduce(events, [], fn(event, list) ->
list ++ [transform_to_eidetic_event(event)]
end)
end
@doc false
defp transform_to_eidetic_event(event) when is_map(event) do
{:ok, datetime, seconds} = DateTime.from_iso8601(event["datetime"])
%Eidetic.Event{}
|> Map.merge(Map.new(event, fn {k, v} -> {String.to_atom(k), v} end))
|> Map.delete(:_id)
|> Map.put(:datetime, datetime)
end
end