docbrown/app/controllers/credits_controller.rb
Ben Halpern 78138532c8
Classified Listings (#2545)
* Initial classified listings work

* More work on tags

* Additional work finalizing stripe and getting the listings page along

* Finalize-ish listings 🤞
2019-04-24 16:17:01 -04:00

92 lines
2.5 KiB
Ruby

class CreditsController < ApplicationController
before_action :authenticate_user!
def index
@credits = current_user.credits.where(spent: false)
@org_credits = current_user.organization.credits.where(spent: false) if current_user.org_admin
end
def new
@credit = Credit.new
@purchaser = params[:purchaser] == "organization" ? current_user.organization : current_user
@customer = Stripe::Customer.retrieve(current_user.stripe_id_code) if current_user.stripe_id_code
end
def create
@number_to_purchase = params[:credit][:number_to_purchase].to_i
make_payment
credit_objects = []
@number_to_purchase.times do
if params[:user_type] == "organization"
raise unless current_user.org_admin
credit_objects << Credit.new(organization_id: current_user.organization_id, cost: cost_per_credit / 100.0)
else
credit_objects << Credit.new(user_id: current_user.id, cost: cost_per_credit / 100.0)
end
end
Credit.import credit_objects
redirect_to "/credits", notice: "#{@number_to_purchase} new credits purchased!"
end
def make_payment
find_or_create_customer
find_or_create_card
update_user_stripe_info
create_charge
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to "/credits/new"
end
def find_or_create_customer
@customer = if current_user.stripe_id_code
Stripe::Customer.retrieve(current_user.stripe_id_code)
else
Stripe::Customer.create({
email: current_user.email
})
end
end
def find_or_create_card
if params[:stripe_token]
@card = Stripe::Customer.create_source(
@customer.id,
{
source: params[:stripe_token],
}
)
else
@card = @customer.sources.retrieve(params[:selected_card])
end
end
def update_user_stripe_info
current_user.update_column(:stripe_id_code, @customer.id) if current_user.stripe_id_code.nil?
end
def create_charge
@amount = generate_cost
Stripe::Charge.create({
customer: @customer.id,
source: @card || @customer.default_source,
amount: @amount,
description: "Purchase of #{@number_to_purchase} credits.",
currency: "usd"
})
end
def generate_cost
@number_to_purchase * cost_per_credit
end
def cost_per_credit
if @number_to_purchase < 50
1000
elsif @number_to_purchase < 500
750
else
500
end
end
end