diff --git a/lib/stripe.ex b/lib/stripe.ex index b5b699d..461c350 100644 --- a/lib/stripe.ex +++ b/lib/stripe.ex @@ -28,41 +28,50 @@ defmodule Stripe do STRIPE_SECRET_KEY=YOUR_SECRET_KEY """ - defp get_secret_key do + defp get_secret_key(opts) do + Keyword.get(opts, :secret_key) || System.get_env("STRIPE_SECRET_KEY") || Application.get_env(:stripe, :secret_key) || raise AuthenticationError, message: @missing_secret_key_error_message end - defp request_url(endpoint) do - Path.join(@api, endpoint) - end - defp request_url(endpoint, []) do Path.join(@api, endpoint) end - defp request_url(endpoint, data) do + defp request_url(endpoint, params) do base_url = request_url(endpoint) - query_params = Stripe.Utils.encode_data(data) + query_params = Stripe.Utils.encode_data(params) "#{base_url}?#{query_params}" end - defp create_headers(opts) do + defp create_headers(request_opts) do headers = - [{"Authorization", "Bearer #{get_secret_key()}"}, + [{"Authorization", "Bearer #{get_secret_key(opts)}"}, {"User-Agent", "Stripe/v1 stripe-elixir/#{@client_version}"}, {"Content-Type", "application/x-www-form-urlencoded"}] - case Keyword.get(opts, :stripe_account) do + case Keyword.get(request_opts, :stripe_account) do nil -> headers account_id -> [{"Stripe-Account", account_id} | headers] end end - def request(action, endpoint, data, opts) when action in [:get, :post, :delete] do - HTTPoison.request(action, request_url(endpoint, data), "", create_headers(opts)) - |> handle_response + def request(%Stripe.Request{method: method, endpoint: endpoint, params: params}, request_opts \\ []) do + HTTPoison.request( + method, + request_url(endpoint, params), + <<>>, + create_headers(request_opts) + ) + |> handle_response() + end + + def request!(%Stripe.Request{} = request_struct, opts \\ []) do + case request(request_struct, opts) do + {:ok, result} -> result + {:error, error} -> raise error + end end defp handle_response({:ok, %{body: body, status_code: 200}}) do diff --git a/lib/stripe/api.ex b/lib/stripe/api.ex index cc5289e..6b69adc 100644 --- a/lib/stripe/api.ex +++ b/lib/stripe/api.ex @@ -1,53 +1,8 @@ defmodule Stripe.API do - defmacro __using__(opts) do - quote do - if :create in unquote(opts) do - @doc """ - Create a(n) #{__MODULE__ |> to_string |> String.split(".") |> List.last} - """ - def create(data, opts \\ []) do - Stripe.request(:post, endpoint(), data, opts) - end - end - - if :retrieve in unquote(opts) do - @doc """ - Retrive a(n) #{__MODULE__ |> to_string |> String.split(".") |> List.last} by its ID - """ - def retrieve(id, opts \\ []) when is_bitstring(id) do - resource_url = Path.join(endpoint(), id) - Stripe.request(:get, resource_url, [], opts) - end - end - - if :update in unquote(opts) do - @doc """ - Update a(n) #{__MODULE__ |> to_string |> String.split(".") |> List.last} - """ - def update(id, data, opts \\ []) do - resource_url = Path.join(endpoint(), id) - Stripe.request(:post, resource_url, data, opts) - end - end - - if :list in unquote(opts) do - @doc """ - List all #{__MODULE__ |> to_string |> String.split(".") |> List.last}s - """ - def list(pagination_opts \\ [], opts \\ []) when is_list(pagination_opts) do - Stripe.request(:get, endpoint(), pagination_opts, opts) - end - end - - if :delete in unquote(opts) do - @doc """ - Delete a(n) #{__MODULE__ |> to_string |> String.split(".") |> List.last} - """ - def delete(id, data \\ [], opts \\ []) when is_bitstring(id) do - resource_url = Path.join(endpoint(), id) - Stripe.request(:delete, resource_url, data, opts) - end - end - end - end + @callback list(pagination_opts :: Enum.t) :: Stripe.Request.t + @callback retrieve(id :: binary) :: Stripe.Request.t + @callback create(Enum.t) :: Stripe.Request.t + @callback update(id :: binary, updates :: Enum.t) :: Stripe.Request.t + @callback delete(id :: binary, options :: Enum.t) :: Stripe.Request.t + @optional_callbacks list: 1, retrieve: 1, create: 1, update: 2, delete: 2 end diff --git a/lib/stripe/balance.ex b/lib/stripe/balance.ex index c3a4221..3cffc5e 100644 --- a/lib/stripe/balance.ex +++ b/lib/stripe/balance.ex @@ -1,11 +1,20 @@ defmodule Stripe.Balance do - use Stripe.API, [:list] + @moduledoc""" + Functions related to get balance information + """ + @behaviour Stripe.API + + @spec endpoint :: binary def endpoint do "balance" end + @spec retrieve() :: Stripe.Request.t def retrieve do - list + %Stripe.Request{ + method: :get, + endpoint: endpoint() + } end end diff --git a/lib/stripe/balance_transaction.ex b/lib/stripe/balance_transaction.ex index 5a70f04..7eab3f6 100644 --- a/lib/stripe/balance_transaction.ex +++ b/lib/stripe/balance_transaction.ex @@ -1,11 +1,29 @@ defmodule Stripe.BalanceTransaction do - use Stripe.API, [:retrieve, :list] + @moduledoc""" + Functions related for balance history + """ - def endpoint do - "balance/history" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(id \\ "") do + "balance/history/#{id}" + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(balance_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(balance_id) + } end - def all(opts \\ []) do - list([], opts) + @spec all(Enum.t) :: Stripe.Request.t + def all(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } end end diff --git a/lib/stripe/bitcoin_receiver.ex b/lib/stripe/bitcoin_receiver.ex index 746185f..b978c4c 100644 --- a/lib/stripe/bitcoin_receiver.ex +++ b/lib/stripe/bitcoin_receiver.ex @@ -1,6 +1,4 @@ defmodule Stripe.BitcoinReceiver do - use Stripe.API, [:create, :retrieve, :list] - def endpoint do "bitcoin/receivers" end diff --git a/lib/stripe/charge.ex b/lib/stripe/charge.ex index 0a6df6c..a814c27 100644 --- a/lib/stripe/charge.ex +++ b/lib/stripe/charge.ex @@ -1,15 +1,54 @@ defmodule Stripe.Charge do - use Stripe.API, [:list, :retrieve, :create, :update] + @moduledoc""" + Functions related to charges + """ + @behaviour Stripe.API - def endpoint do - "charges" + @spec endpoint(binary) :: binary + def endpoint(id \\ "") do + "charges/#{id}" end - def capture_endpoint(id) do - "#{endpoint()}/#{id}/capture" + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(charge_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(charge_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(charge_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(charge_id), + params: params + } end - def capture(id, opts \\ []) do - Stripe.request(:post, capture_endpoint(id), [], opts) + @spec capture(binary) :: Stripe.Request.t + def capture(charge_id) do + %Stripe.Request{ + method: :post, + endpoint: "#{endpoint()}/#{charge_id}/capture" + } end end diff --git a/lib/stripe/connect/account.ex b/lib/stripe/connect/account.ex index 4d23346..a9ad2c5 100644 --- a/lib/stripe/connect/account.ex +++ b/lib/stripe/connect/account.ex @@ -1,38 +1,114 @@ defmodule Stripe.Account do - use Stripe.API, [:create, :retrieve, :update, :list, :delete] + @moduledoc""" + Functions related to connect accounts + """ - def endpoint, do: "accounts" + @behaviour Stripe.API - def reject(account_id, [reason: reason], opts \\ []) do - Stripe.request(:post, "#{endpoint()}/#{account_id}/reject", [reason: reason], opts) + @spec endpoint(binary) :: binary + def endpoint(account_id \\ "") do + "accounts/#{account_id}" end + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(account_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(account_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(account_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(account_id), + params: params + } + end + + @spec delete(binary) :: Stripe.Request.t + def delete(account_id) do + %Stripe.Request{ + method: :delete, + endpoint: endpoint(account_id) + } + end + + @spec reject(binary, Enum.t) :: Stripe.Request.t + def reject(account_id, params) do + %Stripe.Request{ + method: :post, + endpoint: "#{endpoint(account_id)}/reject", + params: params + } + end + + # external accounts + + @spec external_account_endpoint(binary) :: binary def external_account_endpoint(account_id, external_account_id \\ "") do - "#{endpoint()}/#{account_id}/external_accounts/#{external_account_id}" + "#{endpoint(account_id)}/external_accounts/#{external_account_id}" end - def create_external_account(account_id, [external_account: token_id], opts \\ []) do - url = external_account_endpoint(account_id) - Stripe.request(:post, url, [external_account: token_id], opts) + @spec list_external_account(binary, Enum.t) :: Stripe.Request.t + def list_external_account(account_id, pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: external_account_endpoint(account_id), + params: pagination_opts + } end - def retrieve_external_account(account_id, external_account_id, opts \\ []) do - url = external_account_endpoint(account_id, external_account_id) - Stripe.request(:get, url, [], opts) + @spec retrieve_external_account(binary, binary) :: Stripe.Request.t + def retrieve_external_account(account_id, external_account_id) do + %Stripe.Request{ + method: :get, + endpoint: external_account_endpoint(account_id, external_account_id) + } end - def update_external_account(account_id, external_account_id, updates, opts \\ []) do - url = external_account_endpoint(account_id, external_account_id) - Stripe.request(:post, url, updates, opts) + @spec create_external_account(binary, Enum.t) :: Stripe.Request.t + def create_external_account(account_id, params) do + %Stripe.Request{ + method: :post, + endpoint: external_account_endpoint(account_id), + params: params + } end - def delete_external_account(account_id, external_account_id, opts \\ []) do - url = external_account_endpoint(account_id, external_account_id) - Stripe.request(:delete, url, [], opts) + @spec update_external_account(binary, binary, Enum.t) :: Stripe.Request.t + def update_external_account(account_id, external_account_id, params) do + %Stripe.Request{ + method: :post, + endpoint: external_account_endpoint(account_id, external_account_id), + params: params + } end - def list_external_account(account_id, pagination_opts \\ [], opts \\ []) do - url = external_account_endpoint(account_id) - Stripe.request(:get, url, pagination_opts, opts) + @spec delete_external_account(binary, binary) :: Stripe.Request.t + def delete_external_account(account_id, external_account_id) do + %Stripe.Request{ + method: :delete, + endpoint: external_account_endpoint(account_id, external_account_id) + } end end diff --git a/lib/stripe/connect/application_fee.ex b/lib/stripe/connect/application_fee.ex index 9b745ea..82e640d 100644 --- a/lib/stripe/connect/application_fee.ex +++ b/lib/stripe/connect/application_fee.ex @@ -1,15 +1,60 @@ defmodule Stripe.ApplicationFee do - use Stripe.API, [:create, :retrieve, :update, :list] + @behaviour Stripe.API - def endpoint do - "application_fees" + @spec endpoint(binary) :: binary + def endpoint(application_fee_id \\ "") do + "application_fees/#{application_fee_id}" end - def refund(fee_id, opts \\ []) do - Stripe.request(:post, "#{endpoint()}/#{fee_id}/refund", [], opts) + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(application_fee_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(application_fee_id) + } + end + + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(application_fee_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(application_fee_id), + params: params + } + end + + # refunds + + def refund(fee_id) do + %Stripe.Request{ + method: :post, + endpint: "#{endpoint(fee_id)}/refund" + } end def retrieve_refund(fee_id, refund_id, opts \\ []) do - Stripe.request(:get, "#{endpoint()}/#{fee_id}/refund/#{refund_id}", [], opts) + %Stripe.Request{ + method: :get, + endpint: "#{endpoint(fee_id)}/refund/#{refund_id}" + } end end diff --git a/lib/stripe/connect/country_spec.ex b/lib/stripe/connect/country_spec.ex index bc97c5d..9e2bb66 100644 --- a/lib/stripe/connect/country_spec.ex +++ b/lib/stripe/connect/country_spec.ex @@ -1,7 +1,29 @@ defmodule Stripe.CountrySpec do - use Stripe.API, [:retrieve, :list] + @moduledoc""" + Functions related to connect country specs. + """ - def endpoint do - "country_specs" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(country_spec_id) do + "country_specs/#{country_spec_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(country_spec_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(country_spec_id) + } end end diff --git a/lib/stripe/connect/recipient.ex b/lib/stripe/connect/recipient.ex index 972b939..c6f752e 100644 --- a/lib/stripe/connect/recipient.ex +++ b/lib/stripe/connect/recipient.ex @@ -1,7 +1,55 @@ defmodule Stripe.Recipient do - use Stripe.API, [:create, :retrieve, :update, :delete, :list] + @moduledoc""" + Functions related to recipents + """ - def endpoint do - "recipients" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(recipient_id \\ "") do + "recipients/#{recipient_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(recipient_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(recipient_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(recipient_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(recipient_id), + params: params + } + end + + @spec delete(binary) :: Stripe.Request.t + def delete(recipient_id) do + %Stripe.Request{ + method: :delete, + endpoint: endpoint(recipient_id) + } end end diff --git a/lib/stripe/customer.ex b/lib/stripe/customer.ex index f46647d..d04c9df 100644 --- a/lib/stripe/customer.ex +++ b/lib/stripe/customer.ex @@ -1,73 +1,145 @@ defmodule Stripe.Customer do - use Stripe.API, [:retrieve, :update, :create, :list, :delete] - - def endpoint do - "/customers" + @moduledoc""" + Functions related to a customer + """ + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(id \\ "") do + "/customers/#{id}" end - # discount - - def delete_discount(customer_id, opts \\ []) do - Stripe.request(:delete, "#{endpoint()}/#{customer_id}/discount", [], opts) + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } end - - # sources - - def retrieve_source(customer_id, source_id, opts \\ []) do - Stripe.request(:get, "#{endpoint()}/#{customer_id}/sources/#{source_id}", [], opts) + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(customer_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(customer_id) + } end - def update_source(customer_id, source_id, updates, opts \\ []) do - Stripe.request(:post, "#{endpoint()}/#{customer_id}/sources/#{source_id}", updates, opts) + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } end - def create_source(customer_id, data, opts \\ []) do - Stripe.request(:post, "#{endpoint()}/#{customer_id}/sources", data, opts) + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(customer_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(customer_id), + params: params + } end - def delete_source(customer_id, data, opts \\ []) do - Stripe.request(:delete, "#{endpoint()}/#{customer_id}/sources/#{data[:source]}", [], opts) + @spec delete(binary) :: Stripe.Request.t + def delete(customer_id) do + %Stripe.Request{ + method: :delete, + endpoint: endpoint(customer_id) + } end - # card + # discount - def create_card(customer_id, card_id, opts \\ []) do - create_source(customer_id, [source: card_id], opts) - end + @spec delete_discount(binary) :: Stripe.Request.t + def delete_discount(customer_id) do + %Stripe.Request{ + method: :delete, + endpoint: "#{endpoint(customer_id)}/discount" + } + end - def update_card(customer_id, card_id, updates) do - update_source(customer_id, card_id, updates) + # sources + + @spec list_sources(binary, Enum.t) :: Stripe.Request.t + def list_sources(customer_id, pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: "#{endpoint(customer_id)}/sources", + params: pagination_opts + } end - def delete_card(customer_id, card_id, opts \\ []) do - delete_source(customer_id, [source: card_id], opts) + @spec retrieve_source(binary, binary) :: Stripe.Request.t + def retrieve_source(customer_id, source_id) do + %Stripe.request{ + method: :get, + endpoint: "#{endpoint(customer_id)}/sources/#{source_id}" + } end - def list_cards(customer_id, pagination_opts \\ [], opts \\ []) do - pagination_opts = put_in(pagination_opts, [:object], "card") - Stripe.request(:get, "#{endpoint()}/#{customer_id}/sources", pagination_opts, opts) + @spec create_source(binary, params) :: Stripe.Request.t + def create_source(customer_id, params) do + %Stripe.Request{ + method: :post, + endpoint: "#{endpoint(customer_id)}/sources", + params: params + } end - # bank_account + @spec update_source(binary, binary, params) :: Stripe.Request.t + def update_source(customer_id, source_id, params) do + %Stripe.Request{ + method: :post, + endpoint: "#{endpoint(customer_id)}/sources/#{source_id}", + params: params + } + end - def create_bank_account(customer_id, bank_acct_id, opts \\ []) do - create_source(customer_id, [source: bank_acct_id], opts) + @spec delete_source(binary, binary) :: Stripe.Request.t + def delete_source(customer_id, source_id) do + %Stripe.Request{ + method: :delete, + endpoint: "#{endpoint(customer_id)}/sources/#{source_id}" + } end - def update_bank_account(customer_id, bank_acct_id, updates, opts \\ []) do - update_source(customer_id, bank_acct_id, updates, opts) + @spec list_cards(binary, Enum.t) :: Stripe.Request.t + def list_cards(customer_id, pagination_opts \\ []) do + list_sources(customer_id, pagination_opts) + |> put_in([:params, :object], "card") end - def delete_bank_account(customer_id, bank_acct_id, opts \\ []) do - delete_source(customer_id, [source: bank_acct_id], opts) + @spec create_card(customer_id, card_id) :: Stripe.Request.t + def create_card(customer_id, card_id) do + create_source(customer_id, [source: card_id]) end - def list_bank_accounts(customer_id, pagination_opts \\ [], opts \\ []) do - pagination_opts = put_in(pagination_opts, [:object], "bank_account") - Stripe.request(:get, "#{endpoint()}/#{customer_id}/sources", pagination_opts, opts) + @spec update_card(binary, binary, Enum.t) :: Stripe.Request.t + def update_card(customer_id, card_id, updates) do + update_source(customer_id, card_id, updates) end - def verify_bank_account(customer_id, bank_acct_id, amounts, opts \\ []) do - Stripe.request(:post, "#{endpoint()}/#{customer_id}/sources/#{bank_acct_id}/verify", [amounts: amounts], opts) + @doc """ + Verify a bank account using two small deposit amounts (in cents). + + Stripe.Customer.verify_bank_account("cus_DKdfmidqL", "bank_dWIKSdlwi", [19, 29]) + |> Stripe.request! + """ + @spec verify_bank_account(binary, binary, list :: Stripe.Request.t + def verify_bank_account(customer_id, bank_acct_id, amounts) do + %Stripe.Request{ + method: :post, + endpoint: "#{endpoint(customer_id)}/sources/#{bank_acct_id}/verify", + params: [amounts: amounts] + } + + @spec list_bank_accounts(binary, binary) :: Stripe.Request.t + def list_bank_accounts(customer_id, pagination_opts \\ []) do + list_sources(customer_id, pagination_opts) + |> put_in([:params, :object], "bank_account") end end diff --git a/lib/stripe/dispute.ex b/lib/stripe/dispute.ex index 747b671..2325cd4 100644 --- a/lib/stripe/dispute.ex +++ b/lib/stripe/dispute.ex @@ -1,15 +1,50 @@ defmodule Stripe.Dispute do - use Stripe.API, [:list, :create, :update] + @behaviour Stripe.API - def endpoint do - "disputes" + @spec endpoint(binary) :: binary + def endpoint(dispute_id \\ "") do + "disputes/#{dispute_id}" end - def close_dispute_endpoint(id) do - "#{endpoint()}/#{id}/close" + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(dispute_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(dispute_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(dispute_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(dispute_id), + params: params + } end - def close(id, opts \\ []) do - Stripe.request(:post, close_dispute_endpoint(id), [], opts) + def close(dispute_id) do + %Stripe.Request{ + method: :post, + endpoint: "#{endpoint(dispute_id)}/close" + } end end diff --git a/lib/stripe/event.ex b/lib/stripe/event.ex index 4bc1b4b..32d1a72 100644 --- a/lib/stripe/event.ex +++ b/lib/stripe/event.ex @@ -1,7 +1,29 @@ defmodule Stripe.Event do - use Stripe.API, [:retrieve, :list] + @moduledoc""" + Functions related to events + """ - def endpoint do - "events" + @behaviour Stripe.API + + @spec endpoint(binary, binary) :: Stripe.Request.t + def endpoint(event_id \\ "") do + "events/#{event_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(event_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(event_id) + } end end diff --git a/lib/stripe/file.ex b/lib/stripe/file.ex index c2fc1d6..c5b57d4 100644 --- a/lib/stripe/file.ex +++ b/lib/stripe/file.ex @@ -1,7 +1,34 @@ defmodule Stripe.File do - use Stripe.API, [:create, :retrieve, :list] + @behaviour Stripe.API - def endpoint do - "files" + @spec endpoint(binary) :: binary + def endpoint(file_id \\ "") do + "files/#{file_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(file_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(file_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } end end diff --git a/lib/stripe/refund.ex b/lib/stripe/refund.ex index 97a4ed6..359a08f 100644 --- a/lib/stripe/refund.ex +++ b/lib/stripe/refund.ex @@ -1,7 +1,47 @@ defmodule Stripe.Refund do - use Stripe.API, [:create, :retrieve, :update, :list] + @moduledoc""" + Functions related to refunds. + """ - def endpoint do - "refunds" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(refund_id \\ "") do + "refunds/#{refund_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(refund_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(refund_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(refund_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(refund_id), + params: params + } end end diff --git a/lib/stripe/request.ex b/lib/stripe/request.ex new file mode 100644 index 0000000..f499002 --- /dev/null +++ b/lib/stripe/request.ex @@ -0,0 +1,13 @@ +defmodule Stripe.Request do + defstruct [ + method: nil, + endpoint: nil, + params: [] + ] + + @type t :: %{ + method: :get | :post | :delete, + endpoint: binary, + params: list() | map() + } +end \ No newline at end of file diff --git a/lib/stripe/subscriptions/coupon.ex b/lib/stripe/subscriptions/coupon.ex index 1e46687..82c00e1 100644 --- a/lib/stripe/subscriptions/coupon.ex +++ b/lib/stripe/subscriptions/coupon.ex @@ -1,7 +1,55 @@ defmodule Stripe.Coupon do - use Stripe.API, [:create, :retrieve, :update, :delete, :list] + @moduledoc""" + Functions related to coupons + """ - def endpoint do - "coupons" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(coupon_id) do + "coupons/#{coupon_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(coupon_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(coupon_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(coupon_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(coupon_id), + params: params + } + end + + @spec delete(binary) :: Stripe.Request.t + def delete(coupon_id) do + %Stripe.Request{ + method: :delete, + endpoint: endpoint(coupon_id) + } end end diff --git a/lib/stripe/subscriptions/invoice.ex b/lib/stripe/subscriptions/invoice.ex index c892968..b36c224 100644 --- a/lib/stripe/subscriptions/invoice.ex +++ b/lib/stripe/subscriptions/invoice.ex @@ -1,23 +1,39 @@ defmodule Stripe.Invoice do - use Stripe.API, [:create, :retrieve, :update, :list] + @behaviour Stripe.API - def endpoint do - "invoices" + @spec endpoint(binary) :: binary + def endpoint(invoice_id \\ "") do + "invoices/#{invoice_id}" end + @spec line_items(Enum.t) :: Stripe.Request.t def line_items(%{"id" => invoice_id}) do line_items(invoice_id) end - - def line_items(invoice_id, pagination_opts \\ [], opts \\ []) do - Stripe.request(:get, "#{endpoint()}/#{invoice_id}/lines", pagination_opts, opts) + + @spec retrieve_line_items(binary, Enum.t) :: Stripe.Request.t + def line_items(invoice_id, pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: "#{endpoint(invoice_id)}/lines", + params: pagination_opts + } end - def upcoming(data, opts \\ []) do - Stripe.request(:get, "#{endpoint()}/upcoming", data, opts) + @spec upcoming(Enum.t) :: Stripe.Request.t + def upcoming(params) do + %Stripe.Request{ + method: :get, + endpoint: "#{endpoint()}/upcoming", + params: params + } end - def pay(invoice_id, opts \\ []) do - Stripe.request(:post, "#{endpoint()}/#{invoice_id}/pay", [], opts) + @spec pay(binary) :: Stripe.Request.t + def pay(invoice_id) do + %Stripe.Request{ + method: :post, + endpoint: "#{endpoint(invoice_id)}/pay" + } end end diff --git a/lib/stripe/subscriptions/invoice_item.ex b/lib/stripe/subscriptions/invoice_item.ex index bf8549d..d4ccb83 100644 --- a/lib/stripe/subscriptions/invoice_item.ex +++ b/lib/stripe/subscriptions/invoice_item.ex @@ -1,7 +1,55 @@ defmodule Stripe.InvoiceItem do - use Stripe.API, [:create, :retrieve, :update, :delete, :list] + @moduledoc""" + Functions related to invoice items + """ - def endpoint do - "invoiceitems" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(invoice_item_id \\ "") do + "invoiceitems/#{invoice_item_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(invoice_item_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(invoice_item_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(invoice_item_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(invoice_item_id), + params: params + } + end + + @spec delete(binary) :: Stripe.Request.t + def delete(invoice_item_id) do + %Stripe.Request{ + method: :delete, + endpoint: endpoint(invoice_item_id) + } end end diff --git a/lib/stripe/subscriptions/plan.ex b/lib/stripe/subscriptions/plan.ex index b696d3b..afbfd5d 100644 --- a/lib/stripe/subscriptions/plan.ex +++ b/lib/stripe/subscriptions/plan.ex @@ -1,7 +1,55 @@ defmodule Stripe.Plan do - use Stripe.API, [:create, :retrieve, :update, :delete, :list] + @moduledoc""" + Functions related to subscription plans. + """ - def endpoint do - "plans" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(plan_id) do + "plans/#{plan_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(plan_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(plan_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(plan_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(plan_id), + params: params + } + end + + @spec delete(binary) :: Stripe.Request.t + def delete(plan_id) do + %Stripe.Request{ + method: :delete, + endpoint: endpoint(plan_id) + } end end diff --git a/lib/stripe/subscriptions/subscription.ex b/lib/stripe/subscriptions/subscription.ex index 2814030..baab510 100644 --- a/lib/stripe/subscriptions/subscription.ex +++ b/lib/stripe/subscriptions/subscription.ex @@ -1,11 +1,63 @@ defmodule Stripe.Subscription do - use Stripe.API, [:create, :retrieve, :update, :delete, :list] + @moduledoc""" + Functions related to subscriptions + """ - def endpoint do - "subscriptions" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(subscription_id \\ "") do + "subscriptions/#{subscription_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(subscription_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(subscription_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } + end + + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(subscription_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(subscription_id), + params: params + } + end + + @spec delete(binary) :: Stripe.Request.t + def delete(subscription_id, options \\ []) do + %Stripe.Request{ + method: :delete, + endpoint: endpoint(subscription_id), + params: options + } end - def delete_discount(subscription_id, opts \\ []) do - Stripe.request(:delete, "#{endpoint()}/#{subscription_id}/discount", [], opts) + def delete_discount(subscription_id) do + %Stripe.Request{ + method: :delete, + endpoint: "#{endpoint(subscription_id)}/discount" + } end end diff --git a/lib/stripe/token.ex b/lib/stripe/token.ex index 155f56e..08d77c5 100644 --- a/lib/stripe/token.ex +++ b/lib/stripe/token.ex @@ -1,7 +1,38 @@ defmodule Stripe.Token do - use Stripe.API, [:create, :retrieve] + @moduledoc""" + Functions related to tokens + """ - def endpoint do - "tokens" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(token_id \\ "") do + "tokens/#{token_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(token_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(token_id) + } + end + + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(token_id), + params: params + } end end diff --git a/lib/stripe/transfer.ex b/lib/stripe/transfer.ex index cec70c7..ad2feca 100644 --- a/lib/stripe/transfer.ex +++ b/lib/stripe/transfer.ex @@ -1,27 +1,87 @@ defmodule Stripe.Transfer do - use Stripe.API, [:create, :retrieve, :update, :list] + @moduledoc""" + Functions related to transfers. + """ - def endpoint do - "transfers" + @behaviour Stripe.API + + @spec endpoint(binary) :: binary + def endpoint(transfer_id \\ "") do + "transfers/#{transfer_id}" + end + + @spec list(Enum.t) :: Stripe.Request.t + def list(pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(), + params: pagination_opts + } + end + + @spec retrieve(binary) :: Stripe.Request.t + def retrieve(transfer_id) do + %Stripe.Request{ + method: :get, + endpoint: endpoint(transfer_id) + } end - def transfer_reversal_endpoint(transfer_id, reversal_id \\ "") do - "#{endpoint()}/#{transfer_id}/reversals/#{reversal_id}" + @spec create(Enum.t) :: Stripe.Request.t + def create(params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(), + params: params + } end - def create_reversal(transfer_id, data \\ [], opts \\ []) do - Stripe.request(:post, transfer_reversal_endpoint(transfer_id), data, opts) + @spec update(binary, Enum.t) :: Stripe.Request.t + def update(transfer_id, params) do + %Stripe.Request{ + method: :post, + endpoint: endpoint(transfer_id), + params: params + } end - def retrieve_reversal(transfer_id, reversal_id, opts \\ []) do - Stripe.request(:get, transfer_reversal_endpoint(transfer_id, reversal_id), [], opts) + @spec reversal_endpoint(binary, binary) :: binary + def reversal_endpoint(transfer_id, reversal_id \\ "") do + "#{endpoint(transfer_id)}/reversals/#{reversal_id}" end - def update_reversal(transfer_id, reversal_id, data, opts \\ []) do - Stripe.request(:post, transfer_reversal_endpoint(transfer_id, reversal_id), data, opts) + @spec list_reversals(binary, Enum.t) :: Stripe.Request.t + def list_reversals(transfer_id, pagination_opts \\ []) do + %Stripe.Request{ + method: :get, + endpoint: reversal_endpoint(), + params: pagination_opts + } + end + + @spec create_reversals(binary, Enum.t) :: Stripe.Request.t + def create_reversal(transfer_id, params) do + %Stripe.Request{ + method: :post, + endpoint: reversal_endpoint(), + params: params + } + end + + @spec retrieve_reversals(binary, binary) :: Stripe.Request.t + def retrieve_reversal(transfer_id, reversal_id) do + %Stripe.Request{ + method: :get, + endpoint: reversal_endpoint(transfer_id, reversal_id) + } end - def list_reversals(transfer_id, pagination_opts, opts \\ []) do - Stripe.request(:get, transfer_reversal_endpoint(transfer_id), pagination_opts, opts) + @spec update_reversal(binary, binary, Enum.t) :: Stripe.Request.t + def update_reversal(transfer_id, reversal_id, params) do + %Stripe.Request{ + method: :get, + endpoint: reversal_endpoint(transfer_id, reversal_id), + params: params + } end end diff --git a/lib/stripe/utils.ex b/lib/stripe/utils.ex index 2e8e438..338c5e8 100644 --- a/lib/stripe/utils.ex +++ b/lib/stripe/utils.ex @@ -7,7 +7,7 @@ defmodule Stripe.Utils do Encodes the given map or list of tuples. Borrowed from "https://github.com/elixir-lang/plug/blob/master/lib/plug/conn/query.ex" """ - def encode_data(kv, encoder \\ &to_string/1) do + def encode_params(kv, encoder \\ &to_string/1) do IO.iodata_to_binary encode_pair("", kv, encoder) end