Packages
paper_trail
0.7.7
1.1.2
1.1.1
1.1.0
1.0.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.3
0.5.2
0.5.0
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
Track and record all the changes in your database. Revert back to anytime in history.
Current section
Files
Jump to
Current section
Files
lib/paper_trail/version_queries.ex
defmodule PaperTrail.VersionQueries do
import Ecto.Query
alias PaperTrail.Version
@repo PaperTrail.RepoClient.repo
@doc """
Gets all the versions of a record.
"""
@spec get_versions(record :: Ecto.Schema.t) :: Ecto.Query.t
def get_versions(record), do: get_versions(record, [])
@doc """
Gets all the versions of a record given a module and its id
"""
@spec get_versions(model :: module, id :: pos_integer) :: Ecto.Query.t
def get_versions(model, id) when is_atom(model) and is_integer(id), do: get_versions(model, id, [])
@doc """
Gets all the versions of a record.
A list of options is optional, so you can set for example the :prefix of the query,
wich allows you to change between different tenants.
# Usage example:
iex(1)> PaperTrail.VersionQueries.get_versions(record, [prefix: "tenant_id"])
"""
@spec get_versions(record :: Ecto.Schema.t, options :: []) :: Ecto.Query.t
def get_versions(record, options) when is_map(record) do
item_type = record.__struct__ |> Module.split |> List.last
version_query(item_type, record.id, options) |> @repo.all
end
@doc """
Gets all the versions of a record given a module and its id.
A list of options is optional, so you can set for example the :prefix of the query,
wich allows you to change between different tenants.
# Usage example:
iex(1)> PaperTrail.VersionQueries.get_versions(ModelName, id, [prefix: "tenant_id"])
"""
@spec get_versions(model :: module, id :: pos_integer, options :: []) :: Ecto.Query.t
def get_versions(model, id, options) do
item_type = model |> Module.split |> List.last
version_query(item_type, id, options) |> @repo.all
end
@doc """
Gets the last version of a record.
"""
@spec get_version(record :: Ecto.Schema.t) :: Ecto.Query.t
def get_version(record), do: get_version(record, [])
@doc """
Gets the last version of a record given its module reference and its id.
"""
@spec get_version(model :: module, id :: pos_integer) :: Ecto.Query.t
def get_version(model, id) when is_atom(model) and is_integer(id), do: get_version(model, id, [])
@doc """
Gets the last version of a record given its module reference and its id.
A list of options is optional, so you can set for example the :prefix of the query,
wich allows you to change between different tenants.
# Usage example:
iex(1)> PaperTrail.VersionQueries.get_version(ModelName, id, [prefix: "tenant_id"])
"""
@spec get_version(model :: module, id :: pos_integer, options :: []) :: Ecto.Query.t
def get_version(model, id, options) do
item_type = model |> Module.split |> List.last
last(version_query(item_type, id, options)) |> @repo.one
end
@doc """
Gets the last version of a record.
A list of options is optional, so you can set for example the :prefix of the query,
wich allows you to change between different tenants.
# Usage example:
iex(1)> PaperTrail.VersionQueries.get_version(record, [prefix: "tenant_id"])
"""
@spec get_version(record :: Ecto.Schema.t, options :: []) :: Ecto.Query.t
def get_version(record, options) when is_map(record) do
item_type = record.__struct__ |> Module.split |> List.last
last(version_query(item_type, record.id, options)) |> @repo.one
end
@doc """
Gets the current model record/struct of a version
"""
def get_current_model(version) do
@repo.get("Elixir." <> version.item_type |> String.to_existing_atom, version.item_id)
end
defp version_query(item_type, id) do
from v in Version, where: v.item_type == ^item_type and v.item_id == ^id
end
defp version_query(item_type, id, options) do
with opts <- Enum.into(options, %{}) do
version_query(item_type, id)
|> Ecto.Queryable.to_query()
|> Map.merge(opts)
end
end
end