Current section
Files
Jump to
Current section
Files
lib/crumb.ex
defmodule Crumb do
alias Ecto.Multi
alias Crumb.Version
alias Crumb.VersionQueries
@repo Crumb.RepoClient.repo
def get_versions(model, id) do
VersionQueries.get_versions(model, id)
end
def get_versions(record) do
VersionQueries.get_versions(record)
end
def get_version(model, id) do
VersionQueries.get_version(model, id)
end
def get_version(record) do
VersionQueries.get_version(record)
end
def insert(changeset, user_id, meta \\ nil) do
Multi.new
|> Multi.insert(:model, changeset)
|> Multi.run(:version, fn %{model: model} ->
version = make_version_struct(%{event: "create"}, model, user_id, meta)
@repo.insert(version)
end)
|> @repo.transaction
end
def update(changeset, user_id, meta \\ nil) do
Multi.new
|> Multi.update(:model, changeset)
|> Multi.run(:version, fn %{model: _model} ->
version = make_version_struct(%{event: "update"}, changeset, user_id, meta)
@repo.insert(version)
end)
|> @repo.transaction
end
def delete(struct, user_id, meta \\ nil) do
Multi.new
|> Multi.delete(:model, struct)
|> Multi.run(:version, fn %{model: model} ->
version = make_version_struct(%{event: "destroy"}, model, user_id, meta)
@repo.insert(version)
end)
|> @repo.transaction
end
defp make_version_struct(%{event: "create"}, model, user_id, meta) do
%Version{
event: "create",
user_id: user_id,
item_type: model.__struct__ |> Module.split |> List.last,
item_id: model.id,
item_changes: filter_item_changes(model),
meta: meta
}
end
defp make_version_struct(%{event: "update"}, changeset, user_id, meta) do
%Version{
event: "update",
user_id: user_id,
item_type: changeset.data.__struct__ |> Module.split |> List.last,
item_id: changeset.data.id,
item_changes: changeset.changes,
meta: meta
}
end
defp make_version_struct(%{event: "destroy"}, model, user_id, meta) do
%Version{
event: "destroy",
user_id: user_id,
item_type: model.__struct__ |> Module.split |> List.last,
item_id: model.id,
item_changes: filter_item_changes(model),
meta: meta
}
end
defp filter_item_changes(model) do
relationships = model.__struct__.__schema__(:associations)
Map.drop(model, [:__struct__, :__meta__] ++ relationships)
end
end