Current section

Files

Jump to
annon_ktl lib annon_client plugin.ex
Raw

lib/annon_client/plugin.ex

defmodule Annon.Client.Plugin do
@moduledoc """
REST client to the Annon API Gateway Plugins.
"""
use Annon.Client.Base
alias Annon.Client.API
alias Annon.Client.Plugin
alias HTTPoison.Response
@derive [Poison.Encoder]
defstruct name: nil,
is_enabled: nil,
settings: nil
def list_plugins(%API{id: api_id}, opts) do
management_endpoint = Keyword.fetch!(opts, :management_endpoint)
reqest_uri = "#{management_endpoint}/apis/#{api_id}/plugins"
with {:ok, %Response{body: encoded_body, status_code: 200}} <- get(reqest_uri),
{:ok, %{"data" => plugins}} <- Poison.decode(encoded_body, as: %{"data" => [%Plugin{}]}) do
plugins
else
{:ok, %Response{status_code: status_code}} ->
throw "Error receiving Plugins: invalid response status code. " <>
"Expected: 200, got: #{to_string(status_code)}"
{:ok, data} ->
throw "Error receiving Plugins: invalid response structure. " <>
"Expected list of Plugins, got: #{inspect data}"
{:error, reason} ->
throw "Error receiving Plugins: #{inspect reason}."
end
end
def get_plugin(%API{id: api_id}, plugin_name, opts) do
management_endpoint = Keyword.fetch!(opts, :management_endpoint)
reqest_uri = "#{management_endpoint}/apis/#{api_id}/plugins/#{plugin_name}"
with {:ok, %Response{body: encoded_body, status_code: 200}} <- get(reqest_uri),
{:ok, %{"data" => plugin}} <- Poison.decode(encoded_body, as: %{"data" => %Plugin{}}) do
plugin
else
{:ok, %Response{status_code: status_code}} ->
throw "Error receiving Plugin: invalid response status code. " <>
"Expected: 200, got: #{to_string(status_code)}"
{:ok, data} ->
throw "Error receiving Plugin: invalid response structure. " <>
"Expected %Plugin{}, got: #{inspect data}"
{:error, reason} ->
throw "Error receiving Plugin: #{inspect reason}."
end
end
def delete_plugin(%API{id: api_id}, plugin_name, opts) do
management_endpoint = Keyword.fetch!(opts, :management_endpoint)
reqest_uri = "#{management_endpoint}/apis/#{api_id}/plugins/#{plugin_name}"
case delete(reqest_uri) do
{:ok, %HTTPoison.Response{status_code: 204}} -> :ok
{:error, reason} -> throw "Error deleting Plugin: #{inspect reason}."
end
end
def apply_plugin(%API{id: api_id}, %Plugin{name: plugin_name} = plugin, opts) do
management_endpoint = Keyword.fetch!(opts, :management_endpoint)
reqest_uri = "#{management_endpoint}/apis/#{api_id}/plugins/#{plugin_name}"
case put(reqest_uri, %{plugin: plugin}) do
{:ok, %Response{status_code: status_code}} when status_code in [200, 201] ->
if status_code == 200, do: {:ok, {:updated, plugin}}, else: {:ok, {:created, plugin}}
{:ok, %Response{status_code: status_code}} ->
throw "Error while creating or updating Plugin: invalid response status code. " <>
"Expected: 200, got: #{to_string(status_code)}"
{:error, reason} ->
throw "Error while creating or updating Plugin: #{inspect reason}."
end
end
end