beam-community / stripity-stripe

An Elixir Library for Stripe
Other
966 stars 346 forks source link

Removal of `Subscription.delete` #750

Closed xixa closed 1 year ago

xixa commented 2 years ago

Hi,

Subscription.delete was entirely removed from the module on 2.17, but Isn't it just its use with at_period_end that was deprecated as opposed to the entire method?

How can you achieve immediate subscription cancelation otherwise?

inooid commented 1 year ago

For anyone stumbling upon this, I've created a PR to bring back the delete method in: https://github.com/beam-community/stripity_stripe/pull/753.

As a workaround while we wait for the maintainers to get to it, you can either:

defmodule MyApp.Stripe do
  @spec delete_subscription(String.t()) :: {:ok, Stripe.Subscription.t()} | {:error, Stripe.Error.t()}
  def delete_subscription(id) do
    Stripe.Request.new_request()
    |> Stripe.Request.put_endpoint("subscriptions/#{Stripe.Request.get_id!(id)}")
    |> Stripe.Request.put_method(:delete)
    |> Stripe.Request.put_params(%{})
    |> Stripe.Request.make_request()
  end
end

MyApp.Stripe.delete_subscription("sub_12345")

If you need parameters:

defmodule MyApp.Stripe do
  @spec delete_subscription(String.t(), map) :: {:ok, Stripe.Subscription.t()} | {:error, Stripe.Error.t()}
  def delete_subscription(id, params \\ %{}) do
    Stripe.Request.new_request()
    |> Stripe.Request.put_endpoint("subscriptions/#{Stripe.Request.get_id!(id)}")
    |> Stripe.Request.put_method(:delete)
    |> Stripe.Request.put_params(params)
    |> Stripe.Request.make_request()
  end
end

MyApp.Stripe.delete_subscription("sub_12345", %{invoice_now: true})

If you want to be fully covered by what stripity_stripe does:

defmodule MyApp.Stripe do
  @doc """
  Delete a subscription.
  Takes the subscription `id` or a `Stripe.Subscription` struct.
  """
  @spec delete_subscription(Stripe.id() | Stripe.Subscription.t()) :: {:ok, Stripe.Subscription.t()} | {:error, Stripe.Error.t()}
  def delete_subscription(id), do: delete_subscription(id, %{}, [])

  @doc """
  Delete a subscription.
  Takes the subscription `id` or a `Stripe.Subscription` struct.
  Second argument can be a map of cancellation `params`, such as `invoice_now`,
  or a list of options, such as custom API key.
  """

  @spec delete_subscription(Stripe.id() | Stripe.Subscription.t(), Stripe.options()) :: {:ok, Stripe.Subscription.t()} | {:error, Stripe.Error.t()}
  def delete_subscription(id, opts) when is_list(opts) do
    delete_subscription(id, %{}, opts)
  end

  @spec delete_subscription(Stripe.id() | Stripe.Subscription.t(), params) :: {:ok, Stripe.Subscription.t()} | {:error, Stripe.Error.t()}
        when params: %{
               optional(:invoice_now) => boolean,
               optional(:prorate) => boolean
             }
  def delete_subscription(id, params) when is_map(params) do
    delete_subscription(id, params, [])
  end

  @doc """
  Delete a subscription.
  Takes the subscription `id` or a `Stripe.Subscription` struct.
  Second argument is a map of cancellation `params`, such as `invoice_now`.
  Third argument is a list of options, such as custom API key.
  """
  @spec delete_subscription(Stripe.id() | Stripe.Subscription.t(), params, Stripe.options()) ::
          {:ok, Stripe.Subscription.t()} | {:error, Stripe.Error.t()}
        when params: %{
               optional(:invoice_now) => boolean,
               optional(:prorate) => boolean
             }
  def delete_subscription(id, params, opts) do
    Stripe.Request.new_request(opts)
    |> Stripe.Request.put_endpoint("subscriptions/#{Stripe.Request.get_id!(id)}")
    |> Stripe.Request.put_method(:delete)
    |> Stripe.Request.put_params(params)
    |> Stripe.Request.make_request()
  end
end
snewcomer commented 1 year ago

Definitely fat fingered that one. Sorry about that. Will fix in 2.17.1