docbrown/app/controllers/stripe_active_cards_controller.rb
yheuhtozr c4778d832e
app/controllers & decorators i18n (#16126)
* app/controllers (& decorators) i18n etc

* tidy key names

* update keys

* delete ja.yml

* delete an involved ja.yml

* fix for PR review

* fix for spec

* delete ja.yml
2022-02-03 13:35:56 -05:00

108 lines
3.3 KiB
Ruby

class StripeActiveCardsController < ApplicationController
before_action :authenticate_user!
before_action :initialize_stripe
AUDIT_LOG_CATEGORY = "user.credit_card.edit".freeze
private_constant :AUDIT_LOG_CATEGORY
STRIPE_PERMITTED_PARAMS = %i[stripe_token].freeze
def create
authorize :stripe_active_card
customer = find_or_create_customer
if Payments::Customer.create_source(customer.id, stripe_params[:stripe_token])
flash[:settings_notice] = I18n.t("stripe_active_cards_controller.updated")
audit_log("add")
else
ForemStatsClient.increment("stripe.errors", tags: ["action:create_card", "user_id:#{current_user.id}"])
flash[:error] = I18n.t("stripe_active_cards_controller.cannot_update")
end
redirect_to user_settings_path(:billing)
rescue Payments::CardError, Payments::InvalidRequestError => e
ForemStatsClient.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)
flash[:settings_notice] = I18n.t("stripe_active_cards_controller.updated")
audit_log("update")
else
ForemStatsClient.increment("stripe.errors", tags: ["action:update_card", "user_id:#{current_user.id}"])
flash[:error] = I18n.t("stripe_active_cards_controller.cannot_update")
end
redirect_to user_settings_path(:billing)
rescue Payments::CardError, Payments::InvalidRequestError => e
ForemStatsClient.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] = I18n.t("stripe_active_cards_controller.cannot_remove")
else
source = Payments::Customer.get_source(customer, params[:id])
Payments::Customer.detach_source(customer.id, source.id)
Payments::Customer.save(customer)
flash[:settings_notice] = I18n.t("stripe_active_cards_controller.removed")
audit_log("remove")
end
redirect_to user_settings_path(:billing)
rescue Payments::InvalidRequestError => e
ForemStatsClient.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(STRIPE_PERMITTED_PARAMS)
end
def audit_log(user_action)
AuditLog.create(
category: AUDIT_LOG_CATEGORY,
user: current_user,
roles: current_user.roles_name,
slug: "credit_card_#{user_action}",
data: {
action: action_name,
controller: controller_name,
user_action: user_action
},
)
end
end