PageRenderTime 1201ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/api/app/controllers/spree/api/orders_controller.rb

http://github.com/spree/spree
Ruby | 106 lines | 88 code | 14 blank | 4 comment | 8 complexity | 75d65adbdcdc92a93d1df6f3f08a4b88 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. module Spree
  2. module Api
  3. class OrdersController < Spree::Api::BaseController
  4. # Dynamically defines our stores checkout steps to ensure we check authorization on each step.
  5. Order.checkout_steps.keys.each do |step|
  6. define_method step do
  7. find_order
  8. authorize! :update, @order, params[:token]
  9. end
  10. end
  11. def cancel
  12. find_order
  13. authorize! :update, @order, params[:token]
  14. @order.cancel!
  15. render :show
  16. end
  17. def create
  18. authorize! :create, Order
  19. @order = Order.build_from_api(current_api_user, order_params)
  20. respond_with(@order, default_template: :show, status: 201)
  21. end
  22. def empty
  23. find_order
  24. @order.empty!
  25. @order.update!
  26. render text: nil, status: 200
  27. end
  28. def index
  29. authorize! :index, Order
  30. @orders = Order.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
  31. respond_with(@orders)
  32. end
  33. def show
  34. find_order
  35. method = "before_#{@order.state}"
  36. send(method) if respond_to?(method, true)
  37. respond_with(@order)
  38. end
  39. def update
  40. find_order
  41. # Parsing line items through as an update_attributes call in the API will result in
  42. # many line items for the same variant_id being created. We must be smarter about this,
  43. # hence the use of the update_line_items method, defined within order_decorator.rb.
  44. order_params.delete("line_items_attributes")
  45. if @order.update_attributes(order_params)
  46. line_item_attributes = params[:order][:line_items].map do |id, attributes|
  47. [id, attributes.slice(*permitted_line_item_attributes)]
  48. end
  49. line_item_attributes = Hash[line_item_attributes].delete_if { |k,v| v.empty? }
  50. @order.update_line_items(line_item_attributes)
  51. @order.line_items.reload
  52. @order.update!
  53. respond_with(@order, default_template: :show)
  54. else
  55. invalid_resource!(@order)
  56. end
  57. end
  58. def apply_coupon_code
  59. find_order
  60. @order.coupon_code = params[:coupon_code]
  61. @handler = PromotionHandler::Coupon.new(@order).apply
  62. status = @handler.successful? ? 200 : 422
  63. render "spree/api/promotions/handler", :status => status
  64. end
  65. private
  66. def order_params
  67. if params[:order]
  68. params[:order][:line_items_attributes] = params[:order][:line_items]
  69. params[:order][:ship_address_attributes] = params[:order][:ship_address] if params[:order][:ship_address]
  70. params[:order][:bill_address_attributes] = params[:order][:bill_address] if params[:order][:bill_address]
  71. params.require(:order).permit(permitted_order_attributes)
  72. else
  73. {}
  74. end
  75. end
  76. def next!(options={})
  77. if @order.valid? && @order.next
  78. render :show, status: options[:status] || 200
  79. else
  80. render :could_not_transition, status: 422
  81. end
  82. end
  83. def find_order
  84. @order = Spree::Order.find_by!(number: params[:id])
  85. authorize! :update, @order, params[:order_token]
  86. end
  87. def before_delivery
  88. @order.create_proposed_shipments
  89. end
  90. end
  91. end
  92. end