Skip to content

Commit

Permalink
Merge branch 'master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
izelnakri committed Feb 17, 2018
2 parents c6c1e7d + 794bace commit 3d98a76
Show file tree
Hide file tree
Showing 20 changed files with 2,086 additions and 1,456 deletions.
4 changes: 4 additions & 0 deletions .formatter.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Used by "mix format"
[
inputs: ["mix.exs", "{config,lib,test}/**/*.{ex,exs}"]
]
2 changes: 1 addition & 1 deletion config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ use Mix.Config
# here (which is why it is important to import them last).
#

import_config "#{Mix.env}.exs"
import_config "#{Mix.env()}.exs"
10 changes: 5 additions & 5 deletions lib/mix/tasks/papertrail/install.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ defmodule Mix.Tasks.Papertrail.Install do
import Mix.Generator

def run(_args) do
path = Path.relative_to("priv/repo/migrations", Mix.Project.app_path)
path = Path.relative_to("priv/repo/migrations", Mix.Project.app_path())
file = Path.join(path, "#{timestamp()}_#{underscore(AddVersions)}.exs")
create_directory path
create_directory(path)

create_file file, """
create_file(file, """
defmodule Repo.Migrations.AddVersions do
use Ecto.Migration
Expand All @@ -35,14 +35,14 @@ defmodule Mix.Tasks.Papertrail.Install do
# create index(:versions, [:item_type, :inserted_at])
end
end
"""
""")
end

defp timestamp do
{{y, m, d}, {hh, mm, ss}} = :calendar.universal_time()
"#{y}#{pad(m)}#{pad(d)}#{pad(hh)}#{pad(mm)}#{pad(ss)}"
end

defp pad(i) when i < 10, do: << ?0, ?0 + i >>
defp pad(i) when i < 10, do: <<?0, ?0 + i>>
defp pad(i), do: to_string(i)
end
11 changes: 7 additions & 4 deletions lib/paper_trail.ex
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ defmodule PaperTrail do
first_version_id: version_id,
current_version_id: version_id
})

initial_version = make_version_struct(%{event: "insert"}, changeset_data, options)
repo.insert(initial_version)
end)
Expand Down Expand Up @@ -280,7 +279,7 @@ defmodule PaperTrail do
%Version{
event: "insert",
item_type: model.__struct__ |> Module.split() |> List.last(),
item_id: model.id,
item_id: get_model_id(model),
item_changes: serialize(model),
originator_id:
case originator_ref do
Expand All @@ -300,7 +299,7 @@ defmodule PaperTrail do
%Version{
event: "update",
item_type: changeset.data.__struct__ |> Module.split() |> List.last(),
item_id: changeset.data.id,
item_id: get_model_id(changeset.data),
item_changes: changeset.changes,
originator_id:
case originator_ref do
Expand All @@ -320,7 +319,7 @@ defmodule PaperTrail do
%Version{
event: "delete",
item_type: model.__struct__ |> Module.split() |> List.last(),
item_id: model.id,
item_id: get_model_id(model),
item_changes: serialize(model),
originator_id:
case originator_ref do
Expand Down Expand Up @@ -356,4 +355,8 @@ defmodule PaperTrail do

defp add_prefix(changeset, nil), do: changeset
defp add_prefix(changeset, prefix), do: Ecto.put_meta(changeset, prefix: prefix)

def get_model_id(model) do
Map.get(model, List.first(model.__struct__.__schema__(:primary_key)))
end
end
43 changes: 24 additions & 19 deletions lib/paper_trail/version_queries.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@ defmodule PaperTrail.VersionQueries do
import Ecto.Query
alias PaperTrail.Version

@repo PaperTrail.RepoClient.repo
@repo PaperTrail.RepoClient.repo()

@doc """
Gets all the versions of a record.
"""
@spec get_versions(record :: Ecto.Schema.t) :: Ecto.Query.t
@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, [])
@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.
Expand All @@ -24,10 +27,10 @@ defmodule PaperTrail.VersionQueries do
iex(1)> PaperTrail.VersionQueries.get_versions(record, [prefix: "tenant_id"])
"""
@spec get_versions(record :: Ecto.Schema.t, options :: []) :: Ecto.Query.t
@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
item_type = record.__struct__ |> Module.split() |> List.last()
version_query(item_type, PaperTrail.get_model_id(record), options) |> @repo.all
end

@doc """
Expand All @@ -40,23 +43,24 @@ defmodule PaperTrail.VersionQueries do
iex(1)> PaperTrail.VersionQueries.get_versions(ModelName, id, [prefix: "tenant_id"])
"""
@spec get_versions(model :: module, id :: pos_integer, options :: []) :: Ecto.Query.t
@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
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
@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, [])
@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.
Expand All @@ -68,10 +72,10 @@ defmodule PaperTrail.VersionQueries do
iex(1)> PaperTrail.VersionQueries.get_version(record, [prefix: "tenant_id"])
"""
@spec get_version(record :: Ecto.Schema.t, options :: []) :: Ecto.Query.t
@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
item_type = record.__struct__ |> Module.split() |> List.last()
last(version_query(item_type, PaperTrail.get_model_id(record), options)) |> @repo.one
end

@doc """
Expand All @@ -84,22 +88,23 @@ defmodule PaperTrail.VersionQueries do
iex(1)> PaperTrail.VersionQueries.get_version(ModelName, id, [prefix: "tenant_id"])
"""
@spec get_version(model :: module, id :: pos_integer, options :: []) :: Ecto.Query.t
@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
item_type = model |> Module.split() |> List.last()
last(version_query(item_type, 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)
@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
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)
Expand Down
34 changes: 19 additions & 15 deletions lib/version.ex
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,22 @@ defmodule PaperTrail.Version do
# @originator_type Application.get_env(:paper_trail, :originator_type, :integer)

schema "versions" do

field :event, :string
field :item_type, :string
field :item_id, Application.get_env(:paper_trail, :item_type, :integer)
field :item_changes, :map
field :originator_id, Application.get_env(:paper_trail, :originator_type, :integer)
field :origin, :string, read_after_writes: true
field :meta, :map
field(:event, :string)
field(:item_type, :string)
field(:item_id, Application.get_env(:paper_trail, :item_type, :integer))
field(:item_changes, :map)
field(:originator_id, Application.get_env(:paper_trail, :originator_type, :integer))
field(:origin, :string, read_after_writes: true)
field(:meta, :map)

if PaperTrail.RepoClient.originator() do
belongs_to PaperTrail.RepoClient.originator()[:name],
belongs_to(
PaperTrail.RepoClient.originator()[:name],
PaperTrail.RepoClient.originator()[:model],
define_field: false,
foreign_key: :originator_id,
type: Application.get_env(:paper_trail, :originator_type, :integer)
)
end

timestamps(updated_at: false)
Expand All @@ -39,40 +40,43 @@ defmodule PaperTrail.Version do
Returns the count of all version records in the database
"""
def count do
from(version in __MODULE__, select: count(version.id)) |> PaperTrail.RepoClient.repo.one()
from(version in __MODULE__, select: count(version.id)) |> PaperTrail.RepoClient.repo().one()
end

def count(options) do
from(version in __MODULE__, select: count(version.id))
|> Ecto.Queryable.to_query()
|> Map.put(:prefix, options[:prefix])
|> PaperTrail.RepoClient.repo.one
|> PaperTrail.RepoClient.repo().one
end

@doc """
Returns the first version record in the database by :inserted_at
"""
def first do
from(record in __MODULE__, limit: 1, order_by: [asc: :inserted_at])
|> PaperTrail.RepoClient.repo.one
|> PaperTrail.RepoClient.repo().one
end

def first(options) do
from(record in __MODULE__, limit: 1, order_by: [asc: :inserted_at])
|> Ecto.Queryable.to_query()
|> Map.put(:prefix, options[:prefix])
|> PaperTrail.RepoClient.repo.one
|> PaperTrail.RepoClient.repo().one
end

@doc """
Returns the last version record in the database by :inserted_at
"""
def last do
from(record in __MODULE__, limit: 1, order_by: [desc: :inserted_at])
|> PaperTrail.RepoClient.repo.one
|> PaperTrail.RepoClient.repo().one
end

def last(options) do
from(record in __MODULE__, limit: 1, order_by: [desc: :inserted_at])
|> Ecto.Queryable.to_query()
|> Map.put(:prefix, options[:prefix])
|> PaperTrail.RepoClient.repo.one
|> PaperTrail.RepoClient.repo().one
end
end
17 changes: 9 additions & 8 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ defmodule PaperTrail.Mixfile do
def project do
[
app: :paper_trail,
version: "0.7.7",
elixir: "~> 1.4",
version: "0.7.8",
elixir: "~> 1.6",
description: description(),
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
elixirc_paths: elixirc_paths(Mix.env),
build_embedded: Mix.env() == :prod,
start_permanent: Mix.env() == :prod,
elixirc_paths: elixirc_paths(Mix.env()),
package: package(),
deps: deps()
]
Expand All @@ -34,9 +34,9 @@ defmodule PaperTrail.Mixfile do
end

defp description do
"""
Track and record all the changes in your database. Revert back to anytime in history.
"""
"""
Track and record all the changes in your database. Revert back to anytime in history.
"""
end

defp package do
Expand All @@ -51,6 +51,7 @@ defmodule PaperTrail.Mixfile do
}
]
end

defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
end
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,12 @@ defmodule PaperTrail.UUIDRepo.Migrations.CreateUuidProducts do

timestamps()
end

create table(:items, primary_key: false) do
add :item_id, :binary_id, primary_key: true
add :title, :string, null: false

timestamps()
end
end
end
Loading

0 comments on commit 3d98a76

Please sign in to comment.