lib/auth0/management/organizations.ex

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

  ## endpoint
  - /api/v2/organizations
  - /api/v2/organizations/{id}
  - /api/v2/organizations/name/{name}
  - /api/v2/organizations/{id}/enabled_connections
  - /api/v2/organizations/{id}/enabled_connections/{connectionId}
  - /api/v2/organizations/{id}/invitations
  - /api/v2/organizations/{id}/invitations/{invitation_id}
  - /api/v2/organizations/{id}/members
  """

  alias Auth0.Config
  alias Auth0.Entity
  alias Auth0.Management.Organizations.List
  alias Auth0.Management.Organizations.Create
  alias Auth0.Management.Organizations.Get
  alias Auth0.Management.Organizations.Delete
  alias Auth0.Management.Organizations.Patch
  alias Auth0.Management.Organizations.Name
  alias Auth0.Management.Organizations.EnabledConnections
  alias Auth0.Management.Organizations.Invitations
  alias Auth0.Management.Organizations.Members

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

  @endpoint "/api/v2/organizations"
  @endpoint_by_id "/api/v2/organizations/{id}"
  @endpoint_by_name "/api/v2/organizations/name/{name}"
  @endpoint_enabled_connections "/api/v2/organizations/{id}/enabled_connections"
  @endpoint_enabled_connections_by_id "/api/v2/organizations/{id}/enabled_connections/{connectionId}"
  @endpoint_invitations "/api/v2/organizations/{id}/invitations"
  @endpoint_invitations_by_id "/api/v2/organizations/{id}/invitations/{invitation_id}"
  @endpoint_members "/api/v2/organizations/{id}/members"
  @endpoint_roles "/api/v2/organizations/{id}/members/{user_id}/roles"

  @doc """
  Get organizations.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_organizations

  """
  @spec list(List.Params.t() | map, config) ::
          {:ok, Entity.Organizations.t(), response_body} | error
  def list(%{} = params, %Config{} = config) do
    List.execute(@endpoint, params, config)
  end

  @doc """
  Create an Organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/post_organizations

  """
  @spec create(Create.Params.t() | map, config) ::
          {:ok, Entity.Organization.t(), response_body} | error
  def create(%{} = params, %Config{} = config) do
    Create.execute(@endpoint, params, config)
  end

  @doc """
  Get organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_organizations_by_id

  """
  @spec get(id, config) :: {:ok, Entity.Organization.t(), response_body} | error
  def get(id, %Config{} = config) do
    Get.execute(@endpoint_by_id, id, config)
  end

  @doc """
  Delete organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/delete_organizations_by_id

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

  @doc """
  Modify an Organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/patch_organizations_by_id

  """
  @spec modify(id, Patch.Params.t() | map, config) ::
          {:ok, Entity.Organization.t(), response_body} | error
  def modify(id, %{} = params, %Config{} = config) do
    Patch.execute(@endpoint_by_id, id, params, config)
  end

  @doc """
  Get organization by name.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_name_by_name

  """
  @spec get_by_name(name, config) ::
          {:ok, Entity.Organization.t(), response_body} | error
  def get_by_name(name, %Config{} = config) do
    Name.Get.execute(@endpoint_by_name, name, config)
  end

  @doc """
  Get connections enabled for an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_enabled_connections

  """
  @spec list_connections(id, EnabledConnections.List.Params.t() | map, config) ::
          {:ok, Entity.EnabledConnections.t(), response_body} | error
  def list_connections(id, %{} = params, %Config{} = config) do
    EnabledConnections.List.execute(@endpoint_enabled_connections, id, params, config)
  end

  @doc """
  Add connections to an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/post_enabled_connections

  """
  @spec add_connection(id, EnabledConnections.Create.Params.t() | map, config) ::
          {:ok, Entity.EnabledConnection.t(), response_body} | error
  def add_connection(id, %{} = params, %Config{} = config) do
    EnabledConnections.Create.execute(@endpoint_enabled_connections, id, params, config)
  end

  @doc """
  Get an enabled connection for an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_enabled_connections_by_connectionId

  """
  @spec get_connection(id, connection_id, config) ::
          {:ok, Entity.EnabledConnection.t(), response_body} | error
  def get_connection(id, connection_id, %Config{} = config) do
    EnabledConnections.Get.execute(@endpoint_enabled_connections_by_id, id, connection_id, config)
  end

  @doc """
  Delete connections from an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/delete_enabled_connections_by_connectionId

  """
  @spec delete_connection(id, connection_id, config) :: {:ok, String.t(), response_body} | error
  def delete_connection(id, connection_id, %Config{} = config) do
    EnabledConnections.Delete.execute(
      @endpoint_enabled_connections_by_id,
      id,
      connection_id,
      config
    )
  end

  @doc """
  Modify an Organizations Connection.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/patch_enabled_connections_by_connectionId

  """
  @spec modify_connection(id, connection_id, EnabledConnections.Patch.Params.t() | map, config) ::
          {:ok, Entity.EnabledConnection.t(), response_body} | error
  def modify_connection(
        id,
        connection_id,
        %{} = params,
        %Config{} = config
      ) do
    EnabledConnections.Patch.execute(
      @endpoint_enabled_connections_by_id,
      id,
      connection_id,
      params,
      config
    )
  end

  @doc """
  Get invitations to organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_invitations

  """
  @spec list_invitations(id, Invitations.List.Params.t() | map, config) ::
          {:ok, Entity.Invitations.t(), response_body} | error
  def list_invitations(id, %{} = params, %Config{} = config) do
    Invitations.List.execute(@endpoint_invitations, id, params, config)
  end

  @doc """
  Create invitations to organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/post_invitations

  """
  @spec create_invitation(id, Invitations.Create.Params.t() | map, config) ::
          {:ok, Entity.Invitation.t(), response_body} | error
  def create_invitation(id, %{} = params, %Config{} = config) do
    Invitations.Create.execute(@endpoint_invitations, id, params, config)
  end

  @doc """
  Get an invitation to organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_invitations_by_invitation_id

  """
  @spec get_invitation(id, invitation_id, Invitations.Get.Params.t() | map, config) ::
          {:ok, Entity.Invitation.t(), response_body} | error
  def get_invitation(id, invitation_id, %{} = params, %Config{} = config) do
    Invitations.Get.execute(@endpoint_invitations_by_id, id, invitation_id, params, config)
  end

  @doc """
  Delete an invitation to organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/delete_invitations_by_invitation_id

  """
  @spec delete_invitation(id, invitation_id, config) :: {:ok, String.t(), response_body} | error
  def delete_invitation(id, invitation_id, %Config{} = config) do
    Invitations.Delete.execute(@endpoint_invitations_by_id, id, invitation_id, config)
  end

  @doc """
  Get members who belong to an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_members

  """
  @spec list_members(id, Members.List.Params.t() | map, config) ::
          {:ok, Entity.Members.t(), response_body} | error
  def list_members(id, %{} = params, %Config{} = config) do
    Members.List.execute(@endpoint_members, id, params, config)
  end

  @doc """
  Delete members from an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/delete_members

  """
  @spec delete_members(id, Members.Delete.Params.t() | map, config) ::
          {:ok, String.t(), response_body} | error
  def delete_members(id, %{} = params, %Config{} = config) do
    Members.Delete.execute(@endpoint_members, id, params, config)
  end

  @doc """
  Add members to an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/post_members

  """
  @spec add_members(id, Members.Add.Params.t() | map, config) ::
          {:ok, String.t(), response_body} | error
  def add_members(id, %{} = params, %Config{} = config) do
    Members.Add.execute(@endpoint_members, id, params, config)
  end

  @doc """
  Get the roles assigned to an organization member.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/get_organization_member_roles

  """
  @spec list_roles(id, user_id, Members.Roles.List.Params.t() | map, config) ::
          {:ok, Entity.Roles.t(), response_body} | error
  def list_roles(id, user_id, %{} = params, %Config{} = config) do
    Members.Roles.List.execute(@endpoint_roles, id, user_id, params, config)
  end

  @doc """
  Delete members from an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/delete_members

  """
  @spec delete_roles(id, user_id, Members.Roles.Delete.Params.t() | map, config) ::
          {:ok, String.t(), response_body} | error
  def delete_roles(id, user_id, %{} = params, %Config{} = config) do
    Members.Roles.Delete.execute(@endpoint_roles, id, user_id, params, config)
  end

  @doc """
  Add members to an organization.

  ## see
  https://auth0.com/docs/api/management/v2/#!/Organizations/post_members

  """
  @spec assign_roles(id, user_id, Members.Roles.Add.Params.t() | map, config) ::
          {:ok, String.t(), response_body} | error
  def assign_roles(id, user_id, %{} = params, %Config{} = config) do
    Members.Roles.Add.execute(@endpoint_roles, id, user_id, params, config)
  end
end