Arie/serveme

View on GitHub
app/controllers/orders_controller.rb

Summary

Maintainability
A
35 mins
Test Coverage
# frozen_string_literal: true

class OrdersController < ApplicationController
  def new
    @products = Product.active.ordered
    @order = Order.new(gift: params[:gift], product: Product.find_by_name('1 year'))
  end

  def create
    respond_to do |format|
      format.html do
        order_params = params.require(:order).permit(%i[product_id gift])
        paypal_order.product_id = order_params[:product_id].to_i
        paypal_order.gift       = order_params[:gift]
        if paypal_order.save && paypal_order.prepare
          redirect_to paypal_order.checkout_url, allow_other_host: true
        else
          flash[:alert] = 'Something went wrong creating your order, please try again'
          render :new, status: :unprocessable_entity
        end
      end
    end
  end

  def redirect
    if order.charge(params[:PayerID])
      if order.gift?
        flash[:notice] = "Your payment has been received and we've given you a premium code that you can give away"
        redirect_to settings_path('#your-vouchers')
      else
        flash[:notice] = 'Your payment has been received and your donator perks are now activated, thanks! <3'
        redirect_to root_path
      end
    else
      flash[:alert] = 'Something went wrong while trying to activate your donator status, please check if you have sufficient funds in your PayPal account'
      redirect_to root_path
    end
  end

  def stripe
    $lock.synchronize("stripe-charge-#{current_user.id}") do
      if params[:stripe_token] && params[:product_id] && params[:gift]
        order = current_user.stripe_orders.build
        order.payer_id = params[:stripe_token]
        order.product = Product.active.find(params[:product_id].to_i)
        order.gift = (params[:gift] == 'true')
        order.save!
        charge = order.charge
        if charge == 'succeeded'
          render plain: { charge_status: charge, product_name: order.product_name, gift: order.gift, voucher: order.voucher.try(:code) }.to_json
        else
          render plain: { charge_status: charge }.to_json, status: 402
        end
      end
    end
  end

  def order
    current_user.paypal_orders.find(params[:order_id].to_i)
  end

  def paypal_order
    @paypal_order ||= current_user.paypal_orders.build
  end
end