philomena/lib/philomena/versions.ex

80 lines
1.9 KiB
Elixir
Raw Normal View History

2019-08-28 18:41:03 -04:00
defmodule Philomena.Versions do
@moduledoc """
The Versions context.
"""
import Ecto.Query, warn: false
alias Philomena.Repo
alias Philomena.Versions.Version
2019-12-05 21:46:51 -05:00
alias Philomena.Users.User
def load_data_and_associations(versions, parent) do
user_ids =
versions
|> Enum.map(& &1.whodunnit)
|> Enum.reject(&is_nil/1)
users =
User
|> where([u], u.id in ^user_ids)
|> preload(awards: :badge)
|> Repo.all()
|> Map.new(&{to_string(&1.id), &1})
{versions, _last_body} =
versions
|> Enum.map_reduce(
{parent.body, parent.edit_reason},
fn version, {previous_body, previous_reason} ->
yaml = YamlElixir.read_from_string!(version.object || "")
body = yaml["body"] || ""
edit_reason = yaml["edit_reason"]
2019-12-05 21:46:51 -05:00
v = %{
version
| parent: parent,
user: users[version.whodunnit],
body: body,
edit_reason: previous_reason,
difference: difference(body, previous_body)
}
2019-12-05 21:46:51 -05:00
{v, {body, edit_reason}}
end
)
2019-12-05 21:46:51 -05:00
2019-12-05 22:05:21 -05:00
versions
2019-08-28 18:41:03 -04:00
end
2019-12-05 22:05:21 -05:00
defp difference(previous, nil), do: [eq: previous]
2019-12-05 21:46:51 -05:00
defp difference(previous, next), do: String.myers_difference(previous, next)
2019-08-28 18:41:03 -04:00
@doc """
Creates a version.
## Examples
iex> create_version(%{field: value})
{:ok, %Version{}}
iex> create_version(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
2019-12-06 08:58:34 -05:00
def create_version(item_type, item_id, whodunnit, attrs \\ %{}) do
2020-01-10 23:20:19 -05:00
%Version{
item_type: item_type,
item_id: item_id,
event: "update",
whodunnit: whodunnit(whodunnit)
}
2019-12-06 08:58:34 -05:00
|> Version.changeset(attrs, item_id)
2019-08-28 18:41:03 -04:00
|> Repo.insert()
end
2019-12-06 09:43:01 -05:00
# revolver ocelot
defp whodunnit(user_id) when is_integer(user_id), do: to_string(user_id)
defp whodunnit(nil), do: nil
2019-08-28 18:41:03 -04:00
end