docbrown/app/controllers/stripe_active_cards_controller.rb
Andy Zhao beac877e44 Add stripe policies and specs (#529)
* Add stripe policies and specs, and some refactor

* Update moderation test to test for 404
2018-07-02 17:19:25 -04:00

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