defmodule Mix.Tasks.Couchx.MangoIndex.Down do use Mix.Task import Mix.Ecto import Couchx.Support.ApplicationHelper @moduledoc """ Deletes an index or list of indexes provided from the Repo DB. The Repo passed as `-r` or `--r` will define the DB to lookup for the index document. There is also a parameter set as `-n` or `--names` which will need to match the `ddoc` and the index `name`. ## Examples $ mix couchx.mango_index.down -r MyApp.Repo -n my-index-ddoc The Repo have to match one in the `config.exs` file. Also couchx will need knowledge of the main OTP app supervising the repos. ## Examples ``` confix :couchx, otp_app: :my_app config :my_app, ecto_repos: [MyApp.Repo, Custom.Repo] ``` """ @shortdoc "Delete indexes with names provided" @directory "index" @impl true def run(args) do Mix.Task.run("app.config") [repo] = parse_repo(args) otp_app = Application.get_env(:couchx, :otp_app) Application.ensure_all_started(otp_app) ensure_repo(repo, args) Couchx.Migrator.run( repo, :down, fetch_migrations(args, repo) ) :ok end defp fetch_migrations(["-n"|t], repo) do build_migration_modules(repo, t) end defp fetch_migrations(["--names"|t], repo) do build_migration_modules(repo, t) end defp fetch_migrations([_|t], repo) do fetch_migrations(t, repo) end defp fetch_migrations([], _repo) do raise "Missing migrations to be removed." end defp build_migration_modules(repo, list) do List.first(list) |> String.split(",") |> Enum.map(&build_module_path(&1, repo)) end defp build_module_path(module, repo) do module |> prepend("#{base_repo_path(repo, @directory)}/") |> Kernel.<>(".exs") end def prepend(string, suffix) do suffix <> string end end