Current section

Files

Jump to
starkbank lib webhook webhook.ex
Raw

lib/webhook/webhook.ex

defmodule StarkBank.Webhook do
alias __MODULE__, as: Webhook
alias StarkBank.Utils.Rest
alias StarkBank.Utils.Check
alias StarkBank.User.Project
alias StarkBank.User.Organization
alias StarkBank.Error
@moduledoc """
Groups Webhook related functions
"""
@doc """
A Webhook is used to subscribe to notification events on a user-selected endpoint.
Currently available services for subscription are transfer, invoice, deposit, brcode-payment,
boleto, boleto-holmes, boleto-payment and utility-payment.
## Parameters (required):
- `:url` [string]: Url that will be notified when an event occurs.
- `:subscriptions` [list of strings]: list of any non-empty combination of the available services. ex: ["transfer", "invoice", "deposit"]
## Attributes:
- `:id` [string, default nil]: unique id returned when the webhook is created. ex: "5656565656565656"
"""
@enforce_keys [:url, :subscriptions]
defstruct [:id, :url, :subscriptions]
@type t() :: %__MODULE__{}
@doc """
Send a single Webhook subscription for creation in the Stark Bank API
## Parameters (required):
- `:url` [string]: url to which notification events will be sent to. ex: "https://webhook.site/60e9c18e-4b5c-4369-bda1-ab5fcd8e1b29"
- `:subscriptions` [list of strings]: list of any non-empty combination of the available services. ex: ["transfer", "boleto-payment"]
## Parameters (optional):
- `:user` [Organization/Project]: Organization or Project struct returned from StarkBank.project(). Only necessary if default project or organization has not been set in configs.
## Return:
- Webhook struct with updated attributes
"""
@spec create(user: Project.t() | Organization.t() | nil, url: binary, subscriptions: [binary]) ::
{:ok, Webhook.t()} | {:error, [Error.t()]}
def create(parameters \\ []) do
%{user: user, url: url, subscriptions: subscriptions} =
Enum.into(
parameters |> Check.enforced_keys([:url, :subscriptions]),
%{user: nil}
)
Rest.post_single(
resource(),
%Webhook{url: url, subscriptions: subscriptions},
%{user: user}
)
end
@doc """
Same as create(), but it will unwrap the error tuple and raise in case of errors.
"""
@spec create!(user: Project.t() | Organization.t() | nil, url: binary, subscriptions: [binary]) :: any
def create!(parameters \\ []) do
%{user: user, url: url, subscriptions: subscriptions} =
Enum.into(
parameters |> Check.enforced_keys([:url, :subscriptions]),
%{user: nil, url: nil, subscriptions: nil}
)
Rest.post_single!(
resource(),
%Webhook{url: url, subscriptions: subscriptions},
%{user: user}
)
end
@doc """
Receive a single Webhook subscription struct previously created in the Stark Bank API by passing its id
## Parameters (required):
- `id` [string]: struct unique id. ex: "5656565656565656"
## Options:
- `:user` [Organization/Project]: Organization or Project struct returned from StarkBank.project(). Only necessary if default project or organization has not been set in configs.
## Return:
- Webhook struct with updated attributes
"""
@spec get(binary, user: Project.t() | Organization.t() | nil) :: {:ok, Webhook.t()} | {:error, [%Error{}]}
def get(id, options \\ []) do
Rest.get_id(resource(), id, options)
end
@doc """
Same as get(), but it will unwrap the error tuple and raise in case of errors.
"""
@spec get!(binary, user: Project.t() | Organization.t() | nil) :: Webhook.t()
def get!(id, options \\ []) do
Rest.get_id!(resource(), id, options)
end
@doc """
Receive a stream of Webhook subcription structs previously created in the Stark Bank API
## Options:
- `:limit` [integer, default nil]: maximum number of structs to be retrieved. Unlimited if nil. ex: 35
- `:user` [Organization/Project]: Organization or Project struct returned from StarkBank.project(). Only necessary if default project or organization has not been set in configs.
## Return:
- stream of Webhook structs with updated attributes
"""
@spec query(
limit: integer,
user: Project.t() | Organization.t()
) ::
({:cont, {:ok, [Webhook.t()]}}
| {:error, [Error.t()]}
| {:halt, any}
| {:suspend, any},
any ->
any)
def query(options \\ []) do
Rest.get_list(resource(), options)
end
@doc """
Same as query(), but it will unwrap the error tuple and raise in case of errors.
"""
@spec query!(
limit: integer,
user: Project.t() | Organization.t()
) ::
({:cont, [Webhook.t()]} | {:halt, any} | {:suspend, any}, any -> any)
def query!(options \\ []) do
Rest.get_list!(resource(), options)
end
@doc """
Delete a Webhook subscription entity previously created in the Stark Bank API
## Parameters (required):
- `id` [string]: Webhook unique id. ex: "5656565656565656"
## Options:
- `:user` [Organization/Project]: Organization or Project struct returned from StarkBank.project(). Only necessary if default project or organization has not been set in configs.
## Return:
- deleted Webhook struct
"""
@spec delete(binary, user: Project.t() | Organization.t() | nil) :: {:ok, Webhook.t()} | {:error, [%Error{}]}
def delete(id, options \\ []) do
Rest.delete_id(resource(), id, options)
end
@doc """
Same as delete(), but it will unwrap the error tuple and raise in case of errors.
"""
@spec delete!(binary, user: Project.t() | Organization.t() | nil) :: Webhook.t()
def delete!(id, options \\ []) do
Rest.delete_id!(resource(), id, options)
end
@doc false
def resource() do
{
"Webhook",
&resource_maker/1
}
end
@doc false
def resource_maker(json) do
%Webhook{
id: json[:id],
url: json[:url],
subscriptions: json[:subscriptions]
}
end
end