lib/auth0/management/guardian.ex

defmodule Auth0.Management.Guardian do
  @moduledoc """
  Documentation for Auth0 Management API of Guardian.

  ## endpoint
  - /api/v2/guardian/factors
  - /api/v2/guardian/policies
  - /api/v2/guardian/enrollments/{id}
  - /api/v2/guardian/factors/phone/message-types
  - /api/v2/guardian/factors/phone/selected-provider
  - /api/v2/guardian/factors/phone/templates
  - /api/v2/guardian/factors/sms/selected-provider
  - /api/v2/guardian/factors/sms/templates
  - /api/v2/guardian/factors/phone/providers/twilio
  - /api/v2/guardian/factors/push-notification/providers/sns
  - /api/v2/guardian/factors/sms/providers/twilio
  - /api/v2/guardian/enrollments/ticket
  - /api/v2/guardian/factors/{name}
  """

  alias Auth0.Config
  alias Auth0.Entity
  alias Auth0.Management.Guardian.Factors
  alias Auth0.Management.Guardian.Policies
  alias Auth0.Management.Guardian.Enrollments
  alias Auth0.Management.Guardian.Phone
  alias Auth0.Management.Guardian.Sms
  alias Auth0.Management.Guardian.Twilio
  alias Auth0.Management.Guardian.AwsSns

  @type id :: String.t()
  @type name :: String.t()
  @type config :: Config.t()
  @type response_body :: String.t()
  @type error :: {:error, integer, term} | {:error, term}

  @endpoint_factors "/api/v2/guardian/factors"
  @endpoint_factors_by_name "/api/v2/guardian/factors/{name}"
  @endpoint_policies "/api/v2/guardian/policies"
  @endpoint_enrollment_by_id "/api/v2/guardian/enrollments/{id}"
  @endpoint_phone_factor "/api/v2/guardian/factors/phone/message-types"
  @endpoint_phone_configuration "/api/v2/guardian/factors/phone/selected-provider"
  @endpoint_phone_template "/api/v2/guardian/factors/phone/templates"
  @endpoint_sms_configuration "/api/v2/guardian/factors/sms/selected-provider"
  @endpoint_sms_template "/api/v2/guardian/factors/sms/templates"
  @endpoint_twilio_phone_configuration "/api/v2/guardian/factors/phone/providers/twilio"
  @endpoint_twilio_sms_configuration "/api/v2/guardian/factors/sms/providers/twilio"
  @endpoint_aws_sns_configuration "/api/v2/guardian/factors/push-notification/providers/sns"
  @endpoint_enrollment_ticket "/api/v2/guardian/enrollments/ticket"

  @doc """
  Retrieve Factors and their Status.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_factors

  """
  @spec list_factors(config) ::
          {:ok, Entity.GuardianFactors.t(), response_body} | error
  def list_factors(%Config{} = config) do
    Factors.List.execute(@endpoint_factors, config)
  end

  @doc """
  Update a Multi-factor Authentication Factor.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_factors_by_name

  """
  @spec update_factor(name, Factors.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianFactor.t(), response_body} | error
  def update_factor(name, %{} = params, %Config{} = config) do
    Factors.Put.execute(@endpoint_factors_by_name, name, params, config)
  end

  @doc """
  Get the Multi-factor Authentication policies.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_policies

  """
  @spec list_policies(config) :: {:ok, list(map), response_body} | error
  def list_policies(%Config{} = config) do
    Policies.List.execute(@endpoint_policies, config)
  end

  @doc """
  Set the Multi-factor Authentication policies.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_policies

  """
  @spec set_policies(map, config) :: {:ok, list(map), response_body} | error
  def set_policies(params, %Config{} = config) do
    Policies.Put.execute(@endpoint_policies, params, config)
  end

  @doc """
  Retrieve a multi-factor authentication enrollment.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_enrollments_by_id

  """
  @spec get_enrollment(id, config) ::
          {:ok, Entity.GuardianEnrollment.t(), response_body} | error
  def get_enrollment(id, %Config{} = config) do
    Enrollments.Get.execute(@endpoint_enrollment_by_id, id, config)
  end

  @doc """
  Delete a multi-factor authentication enrollment.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/delete_enrollments_by_id

  """
  @spec delete_enrollment(id, config) :: {:ok, String.t(), response_body} | error
  def delete_enrollment(id, %Config{} = config) do
    Enrollments.Delete.execute(@endpoint_enrollment_by_id, id, config)
  end

  @doc """
  Create a multi-factor authentication enrollment ticket.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/post_ticket

  """
  @spec create_enrollment_ticket(Enrollments.Ticket.Params.t() | map, config) ::
          {:ok, Entity.GuardianEnrollmentTicket.t(), response_body} | error
  def create_enrollment_ticket(%{} = params, %Config{} = config) do
    Enrollments.Ticket.execute(@endpoint_enrollment_ticket, params, config)
  end

  @doc """
  Retrieve the Enabled Phone Factors.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_message_types

  """
  @spec get_phone_factor(config) ::
          {:ok, Entity.GuardianPhoneFactor.t(), response_body} | error
  def get_phone_factor(%Config{} = config) do
    Phone.Factor.Get.execute(@endpoint_phone_factor, config)
  end

  @doc """
  Update the Enabled Phone Factors.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_message_types

  """
  @spec update_phone_factor(Phone.Factor.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianPhoneFactor.t(), response_body} | error
  def update_phone_factor(%{} = params, %Config{} = config) do
    Phone.Factor.Put.execute(@endpoint_phone_factor, params, config)
  end

  @doc """
  Retrieve phone configuration (one of auth0|twilio|phone-message-hook).

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_selected_provider

  """
  @spec get_phone_configuration(config) ::
          {:ok, Entity.GuardianPhoneConfiguration.t(), response_body} | error
  def get_phone_configuration(%Config{} = config) do
    Phone.Configuration.Get.execute(@endpoint_phone_configuration, config)
  end

  @doc """
  Update phone configuration (one of auth0|twilio|phone-message-hook).

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_selected_provider

  """
  @spec update_phone_configuration(Phone.Configuration.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianPhoneConfiguration.t(), response_body} | error
  def update_phone_configuration(%{} = params, %Config{} = config) do
    Phone.Configuration.Put.execute(@endpoint_phone_configuration, params, config)
  end

  @doc """
  Retrieve Enrollment and Verification Phone Templates.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_templates

  """
  @spec get_phone_template(config) ::
          {:ok, Entity.GuardianPhoneTemplate.t(), response_body} | error
  def get_phone_template(%Config{} = config) do
    Phone.Template.Get.execute(@endpoint_phone_template, config)
  end

  @doc """
  Update Enrollment and Verification Phone Templates.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_templates

  """
  @spec update_phone_template(Phone.Template.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianPhoneTemplate.t(), response_body} | error
  def update_phone_template(%{} = params, %Config{} = config) do
    Phone.Template.Put.execute(@endpoint_phone_template, params, config)
  end

  @doc """
  Retrieve SMS configuration (one of auth0|twilio|phone-message-hook).

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_selected_provider_0

  """
  @spec get_sms_configuration(config) ::
          {:ok, Entity.GuardianSmsConfiguration.t(), response_body} | error
  def get_sms_configuration(%Config{} = config) do
    Sms.Configuration.Get.execute(@endpoint_sms_configuration, config)
  end

  @doc """
  Update SMS configuration (one of auth0|twilio|phone-message-hook).

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_selected_provider_0

  """
  @spec update_sms_configuration(Sms.Configuration.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianSmsConfiguration.t(), response_body} | error
  def update_sms_configuration(%{} = params, %Config{} = config) do
    Sms.Configuration.Put.execute(@endpoint_sms_configuration, params, config)
  end

  @doc """
  Retrieve SMS Enrollment and Verification Templates.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_templates_0

  """
  @spec get_sms_template(config) ::
          {:ok, Entity.GuardianSmsTemplate.t(), response_body} | error
  def get_sms_template(%Config{} = config) do
    Sms.Template.Get.execute(@endpoint_sms_template, config)
  end

  @doc """
  Update SMS Enrollment and Verification Templates.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_templates_0

  """
  @spec update_sms_template(Sms.Template.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianSmsTemplate.t(), response_body} | error
  def update_sms_template(%{} = params, %Config{} = config) do
    Sms.Template.Put.execute(@endpoint_sms_template, params, config)
  end

  @doc """
  Retrieve Twilio phone configuration.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_twilio

  """
  @spec get_twilio_phone_configuration(config) ::
          {:ok, Entity.GuardianTwilioConfiguration.t(), response_body} | error
  def get_twilio_phone_configuration(%Config{} = config) do
    Twilio.Phone.Configuration.Get.execute(@endpoint_twilio_phone_configuration, config)
  end

  @doc """
  Update Twilio phone configuration.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_twilio

  """
  @spec update_twilio_phone_configuration(Twilio.Phone.Configuration.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianTwilioConfiguration.t(), response_body} | error
  def update_twilio_phone_configuration(
        %{} = params,
        %Config{} = config
      ) do
    Twilio.Phone.Configuration.Put.execute(@endpoint_twilio_phone_configuration, params, config)
  end

  @doc """
  Retrieve Twilio SMS configuration.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_twilio_0

  """
  @spec get_twilio_sms_configuration(config) ::
          {:ok, Entity.GuardianTwilioConfiguration.t(), response_body} | error
  def get_twilio_sms_configuration(%Config{} = config) do
    Twilio.Sms.Configuration.Get.execute(@endpoint_twilio_sms_configuration, config)
  end

  @doc """
  Update Twilio SMS configuration.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_twilio_0

  """
  @spec update_twilio_sms_configuration(Twilio.Sms.Configuration.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianTwilioConfiguration.t(), response_body} | error
  def update_twilio_sms_configuration(
        %{} = params,
        %Config{} = config
      ) do
    Twilio.Sms.Configuration.Put.execute(@endpoint_twilio_sms_configuration, params, config)
  end

  @doc """
  Retrieve AWS SNS push notification configuration.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/get_sns

  """
  @spec get_aws_sns_configuration(config) ::
          {:ok, Entity.GuardianAwsSnsConfiguration.t(), response_body} | error
  def get_aws_sns_configuration(%Config{} = config) do
    AwsSns.Configuration.Get.execute(@endpoint_aws_sns_configuration, config)
  end

  @doc """
  Update SNS configuration for push notifications.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/patch_sns

  """
  @spec patch_aws_sns_configuration(AwsSns.Configuration.Patch.Params.t() | map, config) ::
          {:ok, Entity.GuardianAwsSnsConfiguration.t(), response_body} | error
  def patch_aws_sns_configuration(
        %{} = params,
        %Config{} = config
      ) do
    AwsSns.Configuration.Patch.execute(@endpoint_aws_sns_configuration, params, config)
  end

  @doc """
  Update AWS SNS push notification configuration.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Guardian/put_sns

  """
  @spec update_aws_sns_configuration(AwsSns.Configuration.Put.Params.t() | map, config) ::
          {:ok, Entity.GuardianAwsSnsConfiguration.t(), response_body} | error
  def update_aws_sns_configuration(
        %{} = params,
        %Config{} = config
      ) do
    AwsSns.Configuration.Put.execute(@endpoint_aws_sns_configuration, params, config)
  end
end