docbrown/app/controllers/stripe_active_cards_controller.rb

90 lines
3.1 KiB
Ruby

class StripeActiveCardsController < ApplicationController
before_action :authenticate_user!
def create
authorize :stripe_active_card
customer = find_or_create_customer
if Payments::Customer.create_source(customer.id, stripe_params[:stripe_token])
Rails.logger.info("Stripe Add New Card Success - #{current_user.username}")
flash[:settings_notice] = "Your billing information has been updated"
else
DatadogStatsClient.increment("stripe.errors", tags: ["action:create_card", "user_id:#{current_user.id}"])
Rails.logger.error("Stripe Add New Card Failure - #{current_user.username}")
flash[:error] = "There was a problem updating your billing info."
end
redirect_to user_settings_path(:billing)
rescue Payments::CardError, Payments::InvalidRequestError => e
DatadogStatsClient.increment("stripe.errors", tags: ["action:create_card", "user_id:#{current_user.id}"])
redirect_to user_settings_path(:billing), flash: { error: e.message }
end
def update
authorize :stripe_active_card
# change the default card
customer = find_customer
card = Payments::Customer.get_source(customer, params[:id])
customer.default_source = card.id
if Payments::Customer.save(customer)
Rails.logger.info("Stripe Card Update Success - #{current_user.username}")
flash[:settings_notice] = "Your billing information has been updated"
else
DatadogStatsClient.increment("stripe.errors", tags: ["action:update_card", "user_id:#{current_user.id}"])
Rails.logger.error("Stripe Card Update Failure - #{current_user.username}")
flash[:error] = "There was a problem updating your billing info."
end
redirect_to user_settings_path(:billing)
rescue Payments::CardError, Payments::InvalidRequestError => e
DatadogStatsClient.increment("stripe.errors", tags: ["action:update_card", "user_id:#{current_user.id}"])
redirect_to user_settings_path(:billing), flash: { error: e.message }
end
def destroy
authorize :stripe_active_card
customer = find_customer
if customer.subscriptions.count.positive?
flash[:error] = "Can't remove card if you have an active membership. Please cancel your membership first."
else
source = Payments::Customer.get_source(customer, params[:id])
Payments::Customer.detach_source(customer.id, source.id)
Payments::Customer.save(customer)
flash[:settings_notice] = "Your card has been successfully removed."
end
redirect_to user_settings_path(:billing)
rescue Payments::InvalidRequestError => e
DatadogStatsClient.increment("stripe.errors")
redirect_to user_settings_path(:billing), flash: { error: e.message }
end
private
def find_customer
Payments::Customer.get(current_user.stripe_id_code)
end
def find_or_create_customer
if current_user.stripe_id_code.present?
find_customer
else
Payments::Customer.create(email: current_user.email).tap do |customer|
current_user.update(stripe_id_code: customer.id)
end
end
end
def stripe_params
params.permit(%i[stripe_token])
end
end