90 lines
3.1 KiB
Ruby
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
|