PageRenderTime 1310ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://github.com/tomz/spree
Ruby | 137 lines | 116 code | 20 blank | 1 comment | 16 complexity | 98499b8ca2e805b9fbf85c30610ccee8 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. module Spree
  2. module Api
  3. class OrdersController < Spree::Api::BaseController
  4. skip_before_filter :check_for_user_or_api_key, only: :apply_coupon_code
  5. skip_before_filter :authenticate_user, only: :apply_coupon_code
  6. before_filter :find_order, except: [:create, :mine, :index, :update]
  7. # Dynamically defines our stores checkout steps to ensure we check authorization on each step.
  8. Order.checkout_steps.keys.each do |step|
  9. define_method step do
  10. find_order
  11. authorize! :update, @order, params[:token]
  12. end
  13. end
  14. def cancel
  15. authorize! :update, @order, params[:token]
  16. @order.cancel!
  17. render :show
  18. end
  19. def create
  20. authorize! :create, Order
  21. order_user = if current_api_user.has_spree_role?('admin') && order_params[:user_id]
  22. Spree.user_class.find(order_params[:user_id])
  23. else
  24. current_api_user
  25. end
  26. @order = Spree::Core::Importer::Order.import(order_user, order_params)
  27. respond_with(@order, default_template: :show, status: 201)
  28. end
  29. def empty
  30. authorize! :update, @order, order_token
  31. @order.empty!
  32. render text: nil, status: 200
  33. end
  34. def index
  35. authorize! :index, Order
  36. @orders = Order.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
  37. respond_with(@orders)
  38. end
  39. def show
  40. authorize! :show, @order, order_token
  41. method = "before_#{@order.state}"
  42. send(method) if respond_to?(method, true)
  43. respond_with(@order)
  44. end
  45. def update
  46. find_order(true)
  47. authorize! :update, @order, order_token
  48. if @order.contents.update_cart(order_params)
  49. user_id = params[:order][:user_id]
  50. if current_api_user.has_spree_role?('admin') && user_id
  51. @order.associate_user!(Spree.user_class.find(user_id))
  52. end
  53. respond_with(@order, default_template: :show)
  54. else
  55. invalid_resource!(@order)
  56. end
  57. end
  58. def mine
  59. if current_api_user.persisted?
  60. @orders = current_api_user.orders.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
  61. else
  62. render "spree/api/errors/unauthorized", status: :unauthorized
  63. end
  64. end
  65. def apply_coupon_code
  66. find_order
  67. authorize! :update, @order, order_token
  68. @order.coupon_code = params[:coupon_code]
  69. @handler = PromotionHandler::Coupon.new(@order).apply
  70. status = @handler.successful? ? 200 : 422
  71. render "spree/api/promotions/handler", :status => status
  72. end
  73. private
  74. def order_params
  75. if params[:order]
  76. params[:order][:payments_attributes] = params[:order][:payments] if params[:order][:payments]
  77. params[:order][:shipments_attributes] = params[:order][:shipments] if params[:order][:shipments]
  78. params[:order][:line_items_attributes] = params[:order][:line_items] if params[:order][:line_items]
  79. params[:order][:ship_address_attributes] = params[:order][:ship_address] if params[:order][:ship_address]
  80. params[:order][:bill_address_attributes] = params[:order][:bill_address] if params[:order][:bill_address]
  81. params.require(:order).permit(permitted_order_attributes)
  82. else
  83. {}
  84. end
  85. end
  86. def permitted_order_attributes
  87. if current_api_user.has_spree_role? "admin"
  88. super << admin_order_attributes
  89. else
  90. super
  91. end
  92. end
  93. def permitted_shipment_attributes
  94. if current_api_user.has_spree_role? "admin"
  95. super << admin_shipment_attributes
  96. else
  97. super
  98. end
  99. end
  100. def admin_shipment_attributes
  101. [:shipping_method, :stock_location, :inventory_units => [:variant_id, :sku]]
  102. end
  103. def admin_order_attributes
  104. [:import, :number, :completed_at, :locked_at, :channel, :user_id]
  105. end
  106. def find_order(lock = false)
  107. @order = Spree::Order.lock(lock).find_by!(number: params[:id])
  108. end
  109. def before_delivery
  110. @order.create_proposed_shipments
  111. end
  112. def order_id
  113. super || params[:id]
  114. end
  115. end
  116. end
  117. end