Skip to content

Commit

Permalink
setter foreign_key initial design
Browse files Browse the repository at this point in the history
  • Loading branch information
izelnakri committed Mar 13, 2017
1 parent 303ab1f commit 762f7d5
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 7 deletions.
14 changes: 12 additions & 2 deletions README.md
Expand Up @@ -152,13 +152,23 @@ When you run PaperTrail.insert/1 transaction, insert_version_id and current_vers

When you update a model, current_version_id gets updated during the transaction. Example:

** remove wrong Elixir compiler errors
## Storing setter relationships
You could specify setter relationship to `paper_trail` versions. This is doable by specifying `:setter` keyword list for your application:

```elixir
config :paper_trail, setter: [name: :user, model: YourApp.User]
# For most application setter will be user, models can be updated/created/deleted by several users.
```


** explain the columns

## Storing version meta data
Your versions don't need a model lifecycle callbacks like before_create or before_update for any extra meta data, all your meta data could be stored in one object and that object could be passed as the second optional parameter to PaperTrail.insert || PaperTrail.update || PaperTrail.delete :

## Suggestions
- PaperTrail.Version(s) order matter,
- don't delete your paper_trail versions, instead you can merge them

## TODO
** remove wrong Elixir compiler errors
** explain the columns
8 changes: 5 additions & 3 deletions lib/mix/tasks/papertrail/install.ex
Expand Up @@ -22,22 +22,24 @@ defmodule Mix.Tasks.Papertrail.Install do
add :item_type, :string, null: false
add :item_id, :integer
add :item_changes, :map, null: false
#{created_by_field()}
add :setter_id, :integer
#{set_by_field()}
add :meta, :map
add :inserted_at, :utc_datetime, null: false
end
create index(:versions, [:setter_id])
create index(:versions, [:item_id, :item_type])
# Uncomment if you want to add the following indexes to speed up special queries:
# create index(:versions, [:item_id, :item_type])
# create index(:versions, [:event, :item_type])
# create index(:versions, [:item_type, :inserted_at])
end
end
"""
end

defp created_by_field do
defp set_by_field do
case @strict_mode do
true -> "add :set_by, :string, size: 50, null: false, default: 'unknown'"
_ -> "add :set_by, :string, size: 50"
Expand Down
1 change: 1 addition & 0 deletions lib/paper_trail/repo_client.ex
Expand Up @@ -4,5 +4,6 @@ defmodule PaperTrail.RepoClient do
Gets the configured repo module or defaults to Repo if none configured
"""
def repo, do: Application.get_env(:paper_trail, :repo) || Repo
def setter, do: Application.get_env(:paper_trail, :setter) || nil
def strict_mode, do: Application.get_env(:paper_trail, :strict_mode) || false
end
9 changes: 7 additions & 2 deletions lib/version.ex
Expand Up @@ -4,22 +4,27 @@ defmodule PaperTrail.Version do
import Ecto.Changeset
import Ecto.Query

@setter PaperTrail.OriginatorClient.setter

schema "versions" do
field :event, :string
field :item_type, :string
field :item_id, :integer
field :item_changes, :map
field :set_by, :string
field :meta, :map
field :setter_id, :integer

# belongs_to :setter
if @setter do
belongs_to @setter[:name], @setter[:model], foreign_key: :originator_id, define_field: false
end

timestamps(updated_at: false)
end

def changeset(model, params \\ :empty) do
model
|> cast(params, [:item_type, :item_id, :item_changes, :set_by, :meta])
|> cast(params, [:item_type, :item_id, :item_changes, :set_by, :setter_id, :meta])
|> validate_required([:event, :item_type, :item_id, :item_changes])
end

Expand Down

0 comments on commit 762f7d5

Please sign in to comment.