lib/connection/commands/get_topology.ex

defmodule Ravix.Connection.Commands.GetTopology do
  @moduledoc """
  Command to fetch the topology data from RavenDB

  ## Fields
  - database_name: The name of the database
  - force_url: Forces the informed url to the new topology
  """
  use Ravix.Documents.Commands.RavenCommand,
    database_name: nil,
    force_url: nil

  import Ravix.Helpers.UrlBuilder
  import Ravix.Documents.Commands.RavenCommand

  alias Ravix.Connection.Commands.GetTopology
  alias Ravix.Connection.ServerNode
  alias Ravix.Documents.Protocols.CreateRequest

  command_type(%{
    database_name: String.t(),
    force_url: String.t() | nil
  })

  defimpl CreateRequest, for: GetTopology do
    @spec create_request(GetTopology.t(), ServerNode.t()) :: GetTopology.t()
    def create_request(%GetTopology{} = command, _) do
      %GetTopology{
        command
        | url:
            "/topology?"
            |> append_param("name", command.database_name)
            |> append_param("url", command.force_url),
          method: :get,
          is_read_request: true
      }
    end
  end
end