lib/management.ex

defmodule Dealcloud.Management do
  alias Dealcloud.Impl.Management

  @type user :: %Dealcloud.Management.User{}
  @type query :: %Dealcloud.Management.Query{}
  @type proxy :: %Dealcloud.Management.Proxy{}
  @type proxyQuery :: %Dealcloud.Management.ProxyQuery{}
  @type license :: %Dealcloud.Management.License{}
  @type activityQuery :: %Dealcloud.Management.ActivityQuery{}
  @moduledoc """
  Management contains all of the apis needed to work with users

  With these APIs you are able to:
  1. Get Users, ~> By email, By modified data, by Id
  2. Create Users
  3. Update users ~> change users names, active/inactive, change email addresses, change user permissions
  4. Delete users
  5. Get User groups
  6. Get user group details
  7. Get user activities
  8. Get proxy assignments
  9. Create proxy assignments
  """
  @doc """
  Takes a query containing either the user's email address or a dateTime, attempts to
  find the user or return all user modified since the dateTime provided

  ## Examples
      iex> Dealcloud.Management.get_user(%Dealcloud.Management.Query{email: "test@email.com"}, Dealcloud.Auth)
    or
      iex> Dealcloud.Management.get_user(%Dealcloud.Management.Query{ModifiedSince: "2019-07-15T15:53:00.050Z"}, Dealcloud.Auth)
  """
  @spec get_user(Dealcloud.Management.Query, Dealcloud.Auth) :: any
  defdelegate get_user(param, config), to: Management.User, as: :get

  @doc """
  Takes a integer representing the user's Id and returns the user

  ## Examples
      iex> Dealcloud.Management.user_get_by_id(1, Dealcloud.Auth)
  """
  @spec user_get_by_id(integer, Dealcloud.Auth) :: any
  defdelegate user_get_by_id(param, config), to: Management.User, as: :get_by_id

  @doc """
  Takes a list of integers representing the user's Id and returns the users

  ## Examples
      Dealcloud.Management.get_by_ids([1,2,3], Dealcloud.Auth)
  """
  @spec get_by_ids(list(integer), Dealcloud.Auth) :: any
  defdelegate get_by_ids(param, config), to: Management.User, as: :get_by_ids

  @doc """
  Takes a list of `Dealcloud.Management.user()` and creates them as new

  ## Examples
      Dealcloud.Management.create_users([%User{ firstName: "James", lastName: "King", email: "kingj@basketball.com"}], Dealcloud.Auth)
  """
  @spec create_users(list(User), Dealcloud.Auth) :: any
  defdelegate create_users(body, config), to: Management.User, as: :post

  @doc """
  Takes a list of `Dealcloud.Management.user()` and updates them

  ## Examples
      Dealcloud.Management.update_users([%User{ id: 1, firstName: "James", lastName: "King", email: "kingj@basketball.com"}], Dealcloud.Auth)
  """
  @spec update_user(integer, Dealcloud.Auth) :: any
  defdelegate update_user(body, config), to: Management.User, as: :put

  @doc """
  Takes a user id and deletes the associated user

  ## Examples
      Dealcloud.Management.delete_users(1, Dealcloud.Auth)
  """
  @spec delete_user(binary, Dealcloud.Auth) :: any
  defdelegate delete_user(userId, config), to: Management.User, as: :delete
  ################################################################
  @doc """
  These are the user group APIs
  ## Examples
      Dealcloud.Management.get_user_group(1, Dealcloud.Auth)
  """
  @spec get_user_group(integer, Dealcloud.Auth) :: any
  defdelegate get_user_group(groupId, config), to: Management.Group, as: :get

  @doc """
  These are the user group APIs

  ## Examples
      Dealcloud.Management.get_user_groups(Dealcloud.Auth)
  """
  @spec get_user_groups(Dealcloud.Auth) :: any
  defdelegate get_user_groups(config), to: Management.Group, as: :groups
  ################################################################
  @doc """
  These are the user proxy APIs

  There are two ways to query for proxies, you can search by user or by the proxy

  ## Examples
      Dealcloud.Management.get_user_proxy(%Dealcloud.Management.ProxyQuery{proxyQuery: "test@user.com"}, Dealcloud.Auth)
      Dealcloud.Management.get_user_proxy(%Dealcloud.Management.ProxyQuery{userQuery: "test@user.com"}, Dealcloud.Auth)
  """
  @spec get_user_proxy(Dealcloud.Management.ProxyQuery, Dealcloud.Auth) :: any
  defdelegate get_user_proxy(query, config), to: Management.Proxy, as: :get

  @doc """
  This creates new proxy assignments. There's no way to update an existing proxy assignments. Proxy assignments can be replaced

  ## Examples
      Dealcloud.Management.get_user_proxy(%Dealcloud.Management.Proxy{proxyUserId: 1, userIds: [2,3,4]}, Dealcloud.Auth)
  """
  @spec create_user_proxy(Dealcloud.Management.Proxy, Dealcloud.Auth) :: any
  defdelegate create_user_proxy(body, config), to: Management.Proxy, as: :post
  ################################################################
  @doc """
  These are the user license APIs
  ## Examples
      Dealcloud.Management.get_user_license(1, Dealcloud.Auth)
  """
  @spec get_user_license(integer, Dealcloud.Auth) :: any
  defdelegate get_user_license(userId, config), to: Management.License, as: :get

  @doc """
  Update licenses
  ## Examples
      Dealcloud.Management.update_user_license(%Dealcloud.Management.License{userId: 1, licenseType: 1}, Dealcloud.Auth)
  """
  @spec update_user_license(Dealcloud.Management.License, Dealcloud.Auth) :: :ok
  defdelegate update_user_license(license, config), to: Management.License, as: :put

  @doc """
  Get licenses for multiple users
  ## Examples
      Dealcloud.Management.get_users_license(%Dealcloud.Management.Query{isBillable: true}, Dealcloud.Auth)
  """
  @spec get_users_license(Dealcloud.Management.Query, Dealcloud.Auth) :: any
  defdelegate get_users_license(params, config), to: Management.License, as: :licenses

  @doc """
  Get all licenses
  ## Examples
      Dealcloud.Management.get_user_license(Dealcloud.Auth)
  """
  @spec get_users_license(Dealcloud.Auth) :: any
  defdelegate get_users_license(config), to: Management.License, as: :licenses
  ################################################################
  @doc """
  These are the user activity APIs
    ## Examples
      Dealcloud.Management.get_user_activity(%Dealcloud.Management.ActivityQuery{},%Dealcloud.Management.UserQuery{}, %Dealcloud.Auth{})
  """
  @spec get_user_activity(
          Dealcloud.Management.ActivityQuery,
          Dealcloud.Management.UserQuery,
          Dealcloud.Auth
        ) :: any
  defdelegate get_user_activity(body, query, config), to: Management.Activity, as: :post

  @doc """
  These are the user activity APIs
    ## Examples
      Dealcloud.Management.get_user_activity(%Dealcloud.Management.ActivityQuery{},%Dealcloud.Auth{})
  """
  @spec get_user_activity(
          Dealcloud.Management.ActivityQuery,
          Dealcloud.Auth
        ) :: any
  defdelegate get_user_activity(body, config), to: Management.Activity, as: :post
end