defmodule Elastix.Snapshot.Repository do @moduledoc """ Functions for working with repositories. A repository is required for taking and restoring snapshots of indices. [Elastic documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html) """ import Elastix.HTTP, only: [prepare_url: 2] alias Elastix.{HTTP, JSON} @doc """ Registers a repository. """ @spec register(String.t(), String.t(), Map.t(), [tuple()]) :: {:ok, %HTTPoison.Response{}} def register(elastic_url, repo_name, data, query_params \\ []) do elastic_url |> prepare_url(make_path(repo_name, query_params)) |> HTTP.put(JSON.encode!(data)) end @doc """ Verifies a registered but unverified repository. """ @spec verify(String.t(), String.t()) :: {:ok, %HTTPoison.Response{}} def verify(elastic_url, repo_name) do elastic_url |> prepare_url([make_path(repo_name), "_verify"]) |> HTTP.post("") end @doc """ If repo_name specified, will retrieve information about a registered repository. Otherwise, will retrieve information about all repositories. """ @spec get(String.t(), String.t()) :: {:ok, %HTTPoison.Response{}} def get(elastic_url, repo_name \\ "_all") do elastic_url |> prepare_url(make_path(repo_name)) |> HTTP.get() end @doc """ Removes the reference to the location where the snapshots are stored. """ @spec delete(String.t(), String.t()) :: {:ok, %HTTPoison.Response{}} def delete(elastic_url, repo_name) do elastic_url |> prepare_url(make_path(repo_name)) |> HTTP.delete() end @doc false @spec make_path(String.t(), [tuple()]) :: String.t() def make_path(repo_name, query_params \\ []) do path = _make_base_path(repo_name) case query_params do [] -> path _ -> _add_query_params(path, query_params) end end defp _make_base_path(nil), do: "/_snapshot" defp _make_base_path(repo_name), do: "/_snapshot/#{repo_name}" defp _add_query_params(path, query_params) do query_string = query_params |> Enum.map_join("&", fn param -> "#{elem(param, 0)}=#{elem(param, 1)}" end) "#{path}?#{query_string}" end end