defmodule SignificaUtils.EctoReleaseTasks do
@moduledoc """
Utility function to create release common tasks used in Ecto projects.
## Usage
```
defmodule SampleProject.ReleaseTasks do
use SignificaUtils.EctoReleaseTasks,
otp_app: :sample_app
end
Creates two public functions:
- `migrate/0`: migrates all the repos to the latest version.
- `rollback/2`: rolls back the repo to the specified version - `rollback(repo, version)`.
```
"""
defmacro __using__(opts) do
otp_app = Keyword.fetch!(opts, :otp_app)
quote do
def migrate do
load_app()
for repo <- get_repos() do
run_migrations(repo, :up, all: true)
end
end
def rollback(repo, version) do
load_app()
run_migrations(repo, :down, to: version)
end
defp get_repos do
Application.fetch_env!(unquote(otp_app), :ecto_repos)
end
defp load_app do
Application.load(unquote(otp_app))
end
defp run_migrations(repo, direction, opts \\ []) do
{:ok, _, _} =
Ecto.Migrator.with_repo(
repo,
&Ecto.Migrator.run(&1, direction, opts)
)
end
end
end
end