* Add stripe policies and specs, and some refactor * Update moderation test to test for 404
69 lines
2.3 KiB
Ruby
69 lines
2.3 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}")
|
|
redirect_to "/settings/billing", flash: { error:
|
|
"There was a problem updating your billing info." }
|
|
end
|
|
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
|
|
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
|