Skip to content

Commit

Permalink
Add Api::CouponCodesController#destroy endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
aitbw committed Jan 24, 2019
1 parent bf47c4b commit 25e89a4
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 3 deletions.
18 changes: 16 additions & 2 deletions api/app/controllers/spree/api/coupon_codes_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
module Spree
module Api
class CouponCodesController < Spree::Api::BaseController
before_action :load_order, only: :create
around_action :lock_order, only: :create
before_action :load_order
around_action :lock_order

def create
authorize! :update, @order, order_token
Expand All @@ -20,6 +20,20 @@ def create
end
end

def destroy
authorize! :update, @order, order_token

@order.coupon_code = params[:id]
@handler = PromotionHandler::Coupon.new(@order).remove

if @handler.successful?
render 'spree/api/promotions/handler', status: 200
else
logger.error("remove_coupon_code_error=#{@handler.error.inspect}")
render 'spree/api/promotions/handler', status: 422
end
end

private

def load_order
Expand Down
2 changes: 1 addition & 1 deletion api/config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
put :apply_coupon_code
end

resources :coupon_codes, only: :create
resources :coupon_codes, only: [:create, :destroy]
end

resources :zones
Expand Down
45 changes: 45 additions & 0 deletions api/spec/requests/spree/api/coupon_codes_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,50 @@ module Spree
end
end
end

describe '#destroy' do
let(:promo) {
create(:promotion_with_item_adjustment,
code: 'tenoff',
per_code_usage_limit: 5,
adjustment_rate: 10)
}

let(:promo_code) { promo.codes.first }
let(:order) { create(:order_with_line_items, user: current_api_user) }

before do
post spree.api_order_coupon_codes_path(order), params: { coupon_code: promo_code.value }
delete spree.api_order_coupon_code_path(order, promo_code.value)
end

context 'when successful' do
it 'removes the coupon' do
expect(response.status).to eq(200)
expect(order.reload.promotions).to eq([])
expect(json_response).to eq({
"success" => I18n.t('spree.coupon_code_removed'),
"error" => nil,
"successful" => true,
"status_code" => "coupon_code_removed"
})
end
end

context 'when unsuccessful' do
it 'returns an error' do
delete spree.api_order_coupon_code_path(order, promo_code.value)

expect(response.status).to eq(422)
expect(order.reload.promotions).to eq([])
expect(json_response).to eq({
"success" => nil,
"error" => I18n.t('spree.coupon_code_not_present'),
"successful" => false,
"status_code" => "coupon_code_not_present"
})
end
end
end
end
end
15 changes: 15 additions & 0 deletions core/app/models/spree/promotion_handler/coupon.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,20 @@ def apply
self
end

def remove
if promotion.blank?
set_error_code :coupon_code_not_found
elsif !promotion_exists_on_order?(order, promotion)
set_error_code :coupon_code_not_present
else
promotion.remove_from(order)
order.recalculate
set_success_code :coupon_code_removed
end

self
end

def set_success_code(status_code)
@status_code = status_code
@success = I18n.t(status_code, scope: 'spree')
Expand Down Expand Up @@ -56,6 +70,7 @@ def promotion_code
def handle_present_promotion(promotion)
return promotion_usage_limit_exceeded if promotion.usage_limit_exceeded? || promotion_code.usage_limit_exceeded?
return promotion_applied if promotion_exists_on_order?(order, promotion)

unless promotion.eligible?(order, promotion_code: promotion_code)
self.error = promotion.eligibility_errors.full_messages.first unless promotion.eligibility_errors.blank?
return (error || ineligible_for_this_order)
Expand Down
3 changes: 3 additions & 0 deletions core/config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1177,6 +1177,9 @@ en:
coupon_code_max_usage: Coupon code usage limit exceeded
coupon_code_not_eligible: This coupon code is not eligible for this order
coupon_code_not_found: The coupon code you entered doesn't exist. Please try again.
coupon_code_not_present: The coupon code you are trying to remove is not present
on this order.
coupon_code_removed: The coupon code was successfully removed from this order.
coupon_code_unknown_error: This coupon code could not be applied to the cart at
this time.
create: Create
Expand Down

0 comments on commit 25e89a4

Please sign in to comment.