defmodule Yousign.Request do @moduledoc """ A module for handling the internal requests to the Yousign API """ alias Yousign.Config @doc """ Makes a request to the Yousign API ## Examples iex> Yousign.Request.make_request(:get, "signature_requests") {:ok, %{"data" => [], "meta" => %{"pagination" => %{"total" => 0}}}} iex> Yousign.Request.make_request(:get, "signature_requests/123") {:ok, %{"data" => %{"id" => "123", "name" => "test"}}} iex> Yousign.Request.make_request(:get, "signature_requests/invalid") {:error, 404} """ @spec make_request(atom(), String.t(), non_neg_integer()) :: {:error, any()} | {:ok, any()} def make_request(method, endpoint, success_status_code \\ 200) when is_integer(success_status_code) do url = "#{base_url()}/#{endpoint}" {:ok, res} = method |> Finch.build(url, [{"Authorization", "Bearer #{Config.resolve(:api_key)}"}]) |> Finch.request(Yousign.API) case res do %{status: ^success_status_code} -> {:ok, Jason.decode!(Map.get(res, :body), keys: :atoms)} _ -> {:error, {res.status, Jason.decode!(Map.get(res, :body), keys: :atoms)}} end end def make_request_with_body(method, endpoint, body, success_status_code \\ 200) do url = "#{base_url()}/#{endpoint}" {:ok, res} = method |> Finch.build( url, [ {"Authorization", "Bearer #{Config.resolve(:api_key)}"}, {"Content-Type", "application/json"} ], Jason.encode!(body) ) |> Finch.request(Yousign.API) case res do %{status: ^success_status_code} -> {:ok, Jason.decode!(Map.get(res, :body), keys: :atoms)} _ -> {:error, {res.status, Jason.decode!(Map.get(res, :body), keys: :atoms)}} end end def make_multipart_request(:post, endpoint, body, success_status_code \\ 200) do url = "#{base_url()}/#{endpoint}" body_stream = Multipart.body_stream(body) content_length = Multipart.content_length(body) content_type = Multipart.content_type(body, "multipart/form-data") headers = [ {"Content-Type", content_type}, {"Content-Length", to_string(content_length)}, {"Authorization", "Bearer #{Config.resolve(:api_key)}"} ] {:ok, res} = :post |> Finch.build( url, headers, {:stream, body_stream} ) |> Finch.request(Yousign.API) case res do %{status: ^success_status_code} -> {:ok, Jason.decode!(Map.get(res, :body), keys: :atoms)} _ -> {:error, res.status} end end @doc """ Returns the base URL for the Yousign API based on the current envorinment """ def base_url(sandbox \\ Config.resolve(:use_sandbox, false)) def base_url(true), do: "https://api-sandbox.yousign.app/v3" def base_url(false), do: "https://api.yousign.app/v3" @doc """ Returns the base URL for the Yousign webapp based on the current envorinment """ def web_url(sandbox \\ Config.resolve(:use_sandbox, false)) def web_url(true), do: "https://staging-webapp.yousign.com" def web_url(false), do: "https://webapp.yousign.com" end