984a5dd4ce
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Jason Zimdars <jz@37signals.com>
39 lines
1.4 KiB
Ruby
39 lines
1.4 KiB
Ruby
class Account::SubscriptionsController < ApplicationController
|
|
before_action :ensure_admin
|
|
before_action :set_stripe_session, only: :show
|
|
|
|
def show
|
|
end
|
|
|
|
def create
|
|
session = Stripe::Checkout::Session.create \
|
|
customer: find_or_create_stripe_customer,
|
|
mode: "subscription",
|
|
line_items: [ { price: Plan.paid.stripe_price_id, quantity: 1 } ],
|
|
success_url: account_subscription_url + "?session_id={CHECKOUT_SESSION_ID}",
|
|
cancel_url: account_subscription_url,
|
|
metadata: { account_id: Current.account.id, plan_key: Plan.paid.key }
|
|
|
|
redirect_to session.url, allow_other_host: true
|
|
end
|
|
|
|
private
|
|
def set_stripe_session
|
|
@session = Stripe::Checkout::Session.retrieve(params[:session_id]) if params[:session_id]
|
|
end
|
|
|
|
def find_or_create_stripe_customer
|
|
find_stripe_customer || create_stripe_customer
|
|
end
|
|
|
|
def find_stripe_customer
|
|
Stripe::Customer.retrieve(Current.account.subscription.stripe_customer_id) if Current.account.subscription&.stripe_customer_id
|
|
end
|
|
|
|
def create_stripe_customer
|
|
Stripe::Customer.create(email: Current.user.identity.email_address, name: Current.account.name, metadata: { account_id: Current.account.id }).tap do |customer|
|
|
Current.account.create_subscription!(stripe_customer_id: customer.id, plan_key: Plan.paid.key, status: "incomplete")
|
|
end
|
|
end
|
|
end
|