EctoCellar v0.4.0 has been released🎉Store changes to your models, for auditing or versioning.
Store changes to your models, for auditing or versioning. Inspired by paper_trail.
Links
News
- The number of stars has exceeded 50. This is a great honor 💚 💙 💜 💛 ❤️
- Functions have been added that wrap Ecto.Repo.
insert_store/3 | Ecto.Repo.insert + EctoCellar.store |
update_store/3 | Ecto.Repo.update + EctoCellar.store |
upsert_store/3 | Ecto.Repo.insert_or_update + EctoCellar.store |
delete_store/3 | Ecto.Repo.delete + EctoCellar.store |
- You can now get the primary key automatically.
See also CHANGELOG
Usage
1. Configuration.
Add ecto_cellar configure to your config.exs.
config :ecto_cellar, :default_repo, YourApp.Repo
2. Creates versions table.
You can generate migration file for EctoCeller.
Let’s type mix ecto_cellar.gen
.
And migrate by mix ecto.migrate
.
3. Stores changes to model.
Stores after a model is changed or created. These are stored as recoverable versions for the versions table.
By Repo.insert
+ EctoCellar.store/2
.
iex> with {:ok, post} <- %Post{title: "title", views: 0} |> @repo.insert(),
...> {:ok, _post} <- EctoCellar.store(post) do # or store!/2
...> # do something
...> end
or
There is also a function that wraps EctoRepo.insert
, update
, insert_or_update
and delete
.
By EctoCellar.insert_store/3
.
(Uses EctoCellar.update_store/3
when updated.)
iex> case EctoCellar.insert_store(post) do # or update_store/3, upsert_store/3, delete_store/3
...> {:ok, _post} -> # do_somesing
...> error -> error
...> end
4. Gets versions and can restore it.
Uses EctoCellar.all/2
and EctoCellar.one/3
, you can get past changes versions.
And use it, you can restore.
iex> post = Post.find(id)
%Post{id: 1, body: "body3"...etc}
iex> post_versions = EctoCellar.all(post) # Can get all versions.
[%Post{id: 1, body: "body3"...etc}, %Post{id: 1, body: "body2"...etc}, %Post{id: 1, body: "body1"...etc}]
iex> version_1_inserted_at = ~N[2022-12-12 12:00:12]
iex> post_version1 = EctoCellar.one(post, version_1_inserted_at)
%Post{id: 1, body: "body1", inserted_at: ~N[2022-12-12 12:00:12]...etc}
iex> post_version1
iex> |> Post.changeset([])
iex> |> Repo.update() # Restored!!!
Options
The last argument of each function accepts the following options.
- repo: You can select a repo other than the one specified in Config.
For contributers
You can test locally in these steps.
-
make setup
-
mix test
Bugs and Feature requests
Feel free to open an issues or a PR to contribute to the project.