Module: BetterAuth::Stripe::Routes::SubscriptionSuccess

Defined in:
lib/better_auth/stripe/routes/subscription_success.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/better_auth/stripe/routes/subscription_success.rb', line 9

def endpoint(config)
  BetterAuth::Endpoint.new(path: "/subscription/success", method: "GET") do |ctx|
    query = BetterAuth::Plugins.normalize_hash(ctx.query)
    callback = query[:callback_url] || "/"
    checkout_session_id = query[:checkout_session_id]
    subscription_id = query[:subscription_id]
    if checkout_session_id
      callback = callback.to_s.gsub("{CHECKOUT_SESSION_ID}", checkout_session_id.to_s)
      checkout_session = begin
        BetterAuth::Plugins.stripe_client(config || {}).checkout.sessions.retrieve(checkout_session_id)
      rescue
        nil
      end
      raise ctx.redirect(BetterAuth::Plugins.stripe_url(ctx, callback)) unless checkout_session

       = BetterAuth::Plugins.normalize_hash(BetterAuth::Plugins.stripe_fetch(checkout_session || {}, "metadata") || {})
      subscription_id = [:subscription_id]
    end

    unless 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: subscription_id}])
    raise ctx.redirect(BetterAuth::Plugins.stripe_url(ctx, callback)) unless subscription
    raise ctx.redirect(BetterAuth::Plugins.stripe_url(ctx, callback)) if BetterAuth::Plugins.stripe_active_or_trialing?(subscription)

    customer_id = subscription["stripeCustomerId"] || session.fetch(:user)["stripeCustomerId"]
    raise ctx.redirect(BetterAuth::Plugins.stripe_url(ctx, callback)) unless customer_id

    stripe_subscription = BetterAuth::Plugins.stripe_active_subscriptions(config || {}, customer_id).first
    if stripe_subscription
      resolved = BetterAuth::Plugins.stripe_resolve_plan_item(config || {}, stripe_subscription)
      item = resolved&.fetch(:item, nil)
      plan = resolved&.fetch(:plan, nil)
      if item && plan
        ctx.context.adapter.update(
          model: "subscription",
          where: [{field: "id", value: subscription.fetch("id")}],
          update: BetterAuth::Plugins.stripe_subscription_state(stripe_subscription, include_status: true, compact: false).merge(
            plan: plan[:name].to_s.downcase,
            seats: BetterAuth::Plugins.stripe_resolve_quantity(stripe_subscription, item, plan),
            stripeSubscriptionId: BetterAuth::Plugins.stripe_fetch(stripe_subscription, "id")
          )
        )
      end
    end
    raise ctx.redirect(BetterAuth::Plugins.stripe_url(ctx, callback))
  end
end