Module: BetterAuth::Stripe::Routes::CancelSubscriptionCallback

Defined in:
lib/better_auth/stripe/routes/cancel_subscription_callback.rb

Class Method Summary collapse

Class Method Details

.endpoint(config) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/better_auth/stripe/routes/cancel_subscription_callback.rb', line 9

def endpoint(config)
  BetterAuth::Endpoint.new(path: "/subscription/cancel/callback", method: "GET") do |ctx|
    query = BetterAuth::Plugins.normalize_hash(ctx.query)
    callback = query[:callback_url] || "/"
    unless query[:subscription_id]
      raise ctx.redirect(BetterAuth::Plugins.stripe_url(ctx, callback))
    end
    session = BetterAuth::Routes.current_session(ctx, allow_nil: true)
    raise ctx.redirect(BetterAuth::Plugins.stripe_url(ctx, callback)) unless session

    subscription = ctx.context.adapter.find_one(model: "subscription", where: [{field: "id", value: query[:subscription_id]}])
    if subscription && !BetterAuth::Plugins.stripe_pending_cancel?(subscription) && subscription["stripeCustomerId"]
      current = BetterAuth::Plugins.stripe_active_subscriptions(config || {}, subscription["stripeCustomerId"]).find { |entry| BetterAuth::Plugins.stripe_fetch(entry, "id") == subscription["stripeSubscriptionId"] }
      if current && BetterAuth::Plugins.stripe_stripe_pending_cancel?(current)
        ctx.context.adapter.update(model: "subscription", where: [{field: "id", value: subscription.fetch("id")}], update: BetterAuth::Plugins.stripe_subscription_state(current, include_status: true))
        BetterAuth::Plugins.stripe_subscription_options(config || {})[:on_subscription_cancel]&.call({subscription: subscription, stripeSubscription: current, stripe_subscription: current, cancellationDetails: BetterAuth::Plugins.stripe_fetch(current, "cancellation_details"), cancellation_details: BetterAuth::Plugins.stripe_fetch(current, "cancellation_details"), event: nil})
      end
    end
    raise ctx.redirect(BetterAuth::Plugins.stripe_url(ctx, callback))
  end
end