Skip to content

Commit

Permalink
feat: add Usage
Browse files Browse the repository at this point in the history
  • Loading branch information
sam-levy committed Apr 23, 2024
1 parent b4069b0 commit 7897a5b
Show file tree
Hide file tree
Showing 8 changed files with 473 additions and 3 deletions.
15 changes: 15 additions & 0 deletions lib/chargebeex/action.ex
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,21 @@ defmodule Chargebeex.Action do
end
end

def nested_generic_action_without_id(
verb,
nested_to,
resource,
action,
params \\ %{},
opts \\ []
) do
with path <- nested_resource_path_generic_without_id(nested_to, action),
{:ok, _status_code, _headers, content} <- apply(Client, verb, [path, params, opts]),
builded <- Builder.build(content) do
{:ok, put_resources(builded, resource)}
end
end

defp put_resources(builded, resource) do
builded
|> Map.get(resource, %{})
Expand Down
5 changes: 4 additions & 1 deletion lib/chargebeex/builder.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ defmodule Chargebeex.Builder do
Item,
ItemPrice,
Quote,
QuotedSubscription
QuotedSubscription,
Usage
}

def build(%{"list" => resources, "next_offset" => next_offset}) do
Expand Down Expand Up @@ -45,6 +46,7 @@ defmodule Chargebeex.Builder do
def build_resource(%{"item_price" => params}), do: ItemPrice.build(params)
def build_resource(%{"quote" => params}), do: Quote.build(params)
def build_resource(%{"quoted_subscription" => params}), do: QuotedSubscription.build(params)
def build_resource(%{"usage" => params}), do: Usage.build(params)

def build_resource("subscription", params), do: Subscription.build(params)
def build_resource("customer", params), do: Customer.build(params)
Expand All @@ -60,6 +62,7 @@ defmodule Chargebeex.Builder do
def build_resource("item_price", params), do: ItemPrice.build(params)
def build_resource("quote", params), do: Quote.build(params)
def build_resource("quoted_subscription", params), do: QuotedSubscription.build(params)
def build_resource("usage", params), do: Usage.build(params)

def build_resource(_resource, params), do: params
end
5 changes: 4 additions & 1 deletion lib/chargebeex/resource.ex
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,10 @@ defmodule Chargebeex.Resource do
generic_action: 6,
generic_action_without_id: 3,
generic_action_without_id: 4,
generic_action_without_id: 5
generic_action_without_id: 5,
nested_generic_action_without_id: 4,
nested_generic_action_without_id: 5,
nested_generic_action_without_id: 6
]

if :retrieve in only do
Expand Down
89 changes: 89 additions & 0 deletions lib/chargebeex/usage/usage.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
defmodule Chargebeex.Usage do
use TypedStruct

@resource "usage"
use Chargebeex.Resource, resource: @resource, only: [:list]

@moduledoc """
Struct that represent a Chargebee's API usage resource.
"""

@typedoc """
"admin_console" | "api" | "bulk_operation"
"""
@type source :: String.t()

typedstruct do
field :id, String.t()
field :usage_date, String.t()
field :subscription_id, String.t()
field :item_price_id, String.t()
field :invoice_id, String.t()
field :line_item_id, String.t()
field :quantity, String.t()
field :source, source()
field :note, String.t()
field :resource_version, String.t()
field :updated_at, non_neg_integer()
field :created_at, non_neg_integer()
end

use ExConstructor, :build

@doc """
Allows to create a Usage
## Examples
iex> Chargebeex.Usage.create(%{item_price_id: "item_eur_monthly", quantity: 42, usage_date: 1599817250})
{:ok, %Chargebeex.Usage{}}
"""
def create(subscription_id, params, opts \\ []) do
nested_generic_action_without_id(
:post,
[subscription: subscription_id],
@resource,
"usages",
params,
opts
)
end

@doc """
Allows to retrieve a Usage
## Examples
iex> Chargebeex.Usage.retrieve("e49e39cf-a406-4cc9-b14a-85476b3c3ebf", %{id: "a065d78c-a5a8-458b-85b6-e9295118d3bf"})
{:ok, %Chargebeex.Usage{}}
"""
def retrieve(subscription_id, params, opts \\ []) do
nested_generic_action_without_id(
:get,
[subscription: subscription_id],
@resource,
"usages",
params,
opts
)
end

@doc """
Allows to delete a Usage
## Examples
iex> Chargebeex.Usage.delete("e49e39cf-a406-4cc9-b14a-85476b3c3ebf", %{id: "a065d78c-a5a8-458b-85b6-e9295118d3bf"})
{:ok, %Chargebeex.Usage{}}
"""
def delete(subscription_id, params, opts \\ []) do
nested_generic_action_without_id(
:post,
[subscription: subscription_id],
@resource,
"delete_usage",
params,
opts
)
end
end
3 changes: 2 additions & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ defmodule Chargebeex.MixProject do
Chargebeex.HostedPage,
Chargebeex.ItemPrice,
Chargebeex.PaymentSource,
Chargebeex.Item
Chargebeex.Item,
Chargebeex.Usage
]
]
]
Expand Down
40 changes: 40 additions & 0 deletions test/chargebeex/builder/usage_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
defmodule Chargebeex.Builder.UsageTest do
use ExUnit.Case, async: true

alias Chargebeex.Builder
alias Chargebeex.Fixtures.Usage, as: UsageFixture
alias Chargebeex.Usage

describe "build/1" do
test "should build an usage" do
builded =
UsageFixture.retrieve()
|> Jason.decode!()
|> Builder.build()

assert %{"usage" => %Usage{}} = builded
end

test "should have the usage params" do
usage =
UsageFixture.retrieve()
|> Jason.decode!()
|> Builder.build()
|> Map.get("usage")

params = UsageFixture.usage_params() |> Jason.decode!()

assert usage.id == Map.get(params, "id")
assert usage.updated_at == Map.get(params, "updated_at")
assert usage.usage_date == Map.get(params, "usage_date")
assert usage.subscription_id == Map.get(params, "subscription_id")
assert usage.item_price_id == Map.get(params, "item_price_id")
assert usage.invoice_id == Map.get(params, "invoice_id")
assert usage.line_item_id == Map.get(params, "line_item_id")
assert usage.quantity == Map.get(params, "quantity")
assert usage.source == Map.get(params, "source")
assert usage.resource_version == Map.get(params, "resource_version")
assert usage.created_at == Map.get(params, "created_at")
end
end
end
Loading

0 comments on commit 7897a5b

Please sign in to comment.