Module: BetterAuth::Stripe::Routes::RestoreSubscription

Defined in:
lib/better_auth/stripe/routes/restore_subscription.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
# File 'lib/better_auth/stripe/routes/restore_subscription.rb', line 9

def endpoint(config)
  BetterAuth::Endpoint.new(path: "/subscription/restore", method: "POST") do |ctx|
    session = BetterAuth::Routes.current_session(ctx)
    body = BetterAuth::Plugins.normalize_hash(ctx.body)
    customer_type = BetterAuth::Plugins.stripe_customer_type!(body)
    reference_id = BetterAuth::Plugins.stripe_reference_id!(ctx, session, customer_type, body[:reference_id], config)
    BetterAuth::Plugins.stripe_authorize_reference!(ctx, session, reference_id, "restore-subscription", customer_type, BetterAuth::Plugins.stripe_subscription_options(config), explicit: body.key?(:reference_id))
    subscription = BetterAuth::Plugins.stripe_find_subscription_for_action(ctx, reference_id, body[:subscription_id], active_only: false)
    raise BetterAuth::APIError.new("BAD_REQUEST", message: BetterAuth::Stripe::ERROR_CODES.fetch("SUBSCRIPTION_NOT_FOUND")) unless subscription && subscription["stripeCustomerId"]
    raise BetterAuth::APIError.new("BAD_REQUEST", message: BetterAuth::Stripe::ERROR_CODES.fetch("SUBSCRIPTION_NOT_ACTIVE")) unless BetterAuth::Plugins.stripe_active_or_trialing?(subscription)

    if subscription["stripeScheduleId"]
      schedule = BetterAuth::Plugins.stripe_client(config).subscription_schedules.retrieve(subscription["stripeScheduleId"])
      if BetterAuth::Plugins.stripe_fetch(schedule, "status") == "active"
        schedule = BetterAuth::Plugins.stripe_client(config).subscription_schedules.release(subscription["stripeScheduleId"])
      end
      ctx.context.adapter.update(model: "subscription", where: [{field: "id", value: subscription.fetch("id")}], update: {stripeScheduleId: nil})
      next ctx.json(BetterAuth::Plugins.stripe_stringify_keys(schedule))
    end

    raise BetterAuth::APIError.new("BAD_REQUEST", message: BetterAuth::Stripe::ERROR_CODES.fetch("SUBSCRIPTION_NOT_SCHEDULED_FOR_CANCELLATION")) unless BetterAuth::Plugins.stripe_pending_cancel?(subscription)

    active = BetterAuth::Plugins.stripe_active_subscriptions(config, subscription["stripeCustomerId"]).first
    raise BetterAuth::APIError.new("BAD_REQUEST", message: BetterAuth::Stripe::ERROR_CODES.fetch("SUBSCRIPTION_NOT_FOUND")) unless active

    update_params = if BetterAuth::Plugins.stripe_fetch(active, "cancel_at")
      {cancel_at: ""}
    elsif BetterAuth::Plugins.stripe_fetch(active, "cancel_at_period_end")
      {cancel_at_period_end: false}
    else
      {}
    end
    restored = BetterAuth::Plugins.stripe_client(config).subscriptions.update(BetterAuth::Plugins.stripe_fetch(active, "id"), update_params)
    ctx.context.adapter.update(model: "subscription", where: [{field: "id", value: subscription.fetch("id")}], update: {cancelAtPeriodEnd: false, cancelAt: nil, canceledAt: nil})
    ctx.json(BetterAuth::Plugins.stripe_stringify_keys(restored))
  end
end