app/controllers/spree/api/orders_controller.rb in spree_api-2.1.4 vs app/controllers/spree/api/orders_controller.rb in spree_api-2.1.5

- old
+ new

@@ -1,9 +1,12 @@ module Spree module Api class OrdersController < Spree::Api::BaseController + skip_before_filter :check_for_user_or_api_key, only: :apply_coupon_code + skip_before_filter :authenticate_user, only: :apply_coupon_code + # Dynamically defines our stores checkout steps to ensure we check authorization on each step. Order.checkout_steps.keys.each do |step| define_method step do find_order authorize! :update, @order, params[:token] @@ -42,11 +45,11 @@ send(method) if respond_to?(method, true) respond_with(@order) end def update - find_order + find_order(true) # Parsing line items through as an update_attributes call in the API will result in # many line items for the same variant_id being created. We must be smarter about this, # hence the use of the update_line_items method, defined within order_decorator.rb. order_params.delete("line_items_attributes") if @order.update_attributes(order_params) @@ -67,10 +70,42 @@ else render "spree/api/errors/unauthorized", status: :unauthorized end end + ## + # Applies a promotion code to the user's most recent order + # This is a temporary API method until we move to next Spree release which has this logic already in this commit. + # + # https://github.com/spree/spree/commit/72a5b74c47af975fc3492580415a4cdc2dc02c0c + # + # Source references: + # + # https://github.com/spree/spree/blob/master/frontend/app/controllers/spree/store_controller.rb#L13 + # https://github.com/spree/spree/blob/2-1-stable/frontend/app/controllers/spree/orders_controller.rb#L100 + def apply_coupon_code + find_order + @order.coupon_code = params[:coupon_code] + @order.save + + # https://github.com/spree/spree/blob/2-1-stable/core/lib/spree/promo/coupon_applicator.rb + result = Spree::Promo::CouponApplicator.new(@order).apply + + result[:coupon_applied?] ||= false + + # Move flash.notice fields into success if applied + # An error message is in result[:error] + if result[:coupon_applied?] && result[:notice] + result[:success] = result[:notice] + end + + # Need to turn hash result into object for RABL + # https://github.com/nesquena/rabl/wiki/Rendering-hash-objects-in-rabl + @coupon_result = OpenStruct.new(result) + render status: @coupon_result.coupon_applied? ? 200 : 422 + end + private def deal_with_line_items line_item_attributes = params[:order][:line_items] line_item_attributes.each_key do |key| # need to call .to_hash to make sure Rails 4's strong parameters don't bite @@ -123,11 +158,11 @@ else render :could_not_transition, status: 422 end end - def find_order - @order = Spree::Order.find_by!(number: params[:id]) + def find_order(lock = false) + @order = Spree::Order.lock(lock).find_by!(number: params[:id]) authorize! :update, @order, order_token end def before_delivery @order.create_proposed_shipments