docbrown/app/controllers/stripe_active_cards_controller.rb

75 lines
2.6 KiB
Ruby

class StripeActiveCardsController < ApplicationController
before_action :authenticate_user!
before_action :touch_current_user
def create
authorize :stripe_active_card
customer = find_or_create_customer
if customer.sources.create(source: stripe_params[:stripe_token])
logger.info("Stripe Add New Card Success - #{current_user.username}")
redirect_to "/settings/billing", notice:
"Your billing information has been updated"
else
logger.info("Stripe Add New Card Failure - #{current_user.username}")
DataDogStatsClient.increment("stripe.errors")
redirect_to "/settings/billing", flash: { error:
"There was a problem updating your billing info." }
end
rescue Stripe::InvalidRequestError
DataDogStatsClient.increment("stripe.errors")
redirect_to "/settings/billing", flash: { error:
"There was a problem updating your billing info." }
end
def update
authorize :stripe_active_card
customer = Stripe::Customer.retrieve(current_user.stripe_id_code)
card = customer.sources.retrieve(params[:id])
customer.default_source = card.id
if customer.save
logger.info("Stripe Card Update Success - #{current_user.username}")
redirect_to "/settings/billing", notice:
"Your billing information has been updated"
else
logger.error("Stripe Card Update Failure - #{current_user.username}")
redirect_to "/settings/billing", flash: { error:
"There was a problem updating your billing info." }
end
rescue Stripe::CardError => e
DataDogStatsClient.increment("stripe.errors")
flash[:error] = e.message
redirect_to "/settings/billing"
end
def destroy
authorize :stripe_active_card
customer = Stripe::Customer.retrieve(current_user.stripe_id_code)
if customer.subscriptions.count.zero? || customer.sources.all(object: "card").count > 1
customer.sources.retrieve(params[:id]).delete
customer.save
redirect_to "/settings/billing",
notice: "Your card has been successfully removed."
else
redirect_to "/settings/billing", flash: { error:
"Can't remove card if you have an active membership. Please cancel your membership first." }
end
end
def find_or_create_customer
if current_user.stripe_id_code.present?
Stripe::Customer.retrieve(current_user.stripe_id_code)
else
customer = Stripe::Customer.create(
email: current_user.email,
source: params[:stripe_token],
)
current_user.update(stripe_id_code: customer.id)
customer
end
end
def stripe_params
accessible = %i[id stripe_token]
params.permit(accessible)
end
end