solidus_api 1.0.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/CHANGELOG.md +1 -0
  4. data/Gemfile +5 -0
  5. data/LICENSE +27 -0
  6. data/Rakefile +16 -0
  7. data/app/controllers/spree/api/addresses_controller.rb +43 -0
  8. data/app/controllers/spree/api/base_controller.rb +189 -0
  9. data/app/controllers/spree/api/checkouts_controller.rb +133 -0
  10. data/app/controllers/spree/api/classifications_controller.rb +18 -0
  11. data/app/controllers/spree/api/config_controller.rb +6 -0
  12. data/app/controllers/spree/api/countries_controller.rb +23 -0
  13. data/app/controllers/spree/api/credit_cards_controller.rb +25 -0
  14. data/app/controllers/spree/api/images_controller.rb +47 -0
  15. data/app/controllers/spree/api/inventory_units_controller.rb +52 -0
  16. data/app/controllers/spree/api/line_items_controller.rb +74 -0
  17. data/app/controllers/spree/api/option_types_controller.rb +49 -0
  18. data/app/controllers/spree/api/option_values_controller.rb +58 -0
  19. data/app/controllers/spree/api/orders_controller.rb +155 -0
  20. data/app/controllers/spree/api/payments_controller.rb +81 -0
  21. data/app/controllers/spree/api/product_properties_controller.rb +72 -0
  22. data/app/controllers/spree/api/products_controller.rb +129 -0
  23. data/app/controllers/spree/api/promotions_controller.rb +26 -0
  24. data/app/controllers/spree/api/properties_controller.rb +71 -0
  25. data/app/controllers/spree/api/return_authorizations_controller.rb +71 -0
  26. data/app/controllers/spree/api/shipments_controller.rb +172 -0
  27. data/app/controllers/spree/api/states_controller.rb +35 -0
  28. data/app/controllers/spree/api/stock_items_controller.rb +84 -0
  29. data/app/controllers/spree/api/stock_locations_controller.rb +50 -0
  30. data/app/controllers/spree/api/stock_movements_controller.rb +42 -0
  31. data/app/controllers/spree/api/stock_transfers_controller.rb +19 -0
  32. data/app/controllers/spree/api/store_credit_events_controller.rb +9 -0
  33. data/app/controllers/spree/api/stores_controller.rb +55 -0
  34. data/app/controllers/spree/api/taxonomies_controller.rb +64 -0
  35. data/app/controllers/spree/api/taxons_controller.rb +93 -0
  36. data/app/controllers/spree/api/transfer_items_controller.rb +42 -0
  37. data/app/controllers/spree/api/users_controller.rb +56 -0
  38. data/app/controllers/spree/api/variants_controller.rb +75 -0
  39. data/app/controllers/spree/api/zones_controller.rb +50 -0
  40. data/app/helpers/spree/api/api_helpers.rb +190 -0
  41. data/app/models/spree/api_configuration.rb +5 -0
  42. data/app/models/spree/option_value_decorator.rb +9 -0
  43. data/app/views/spree/api/addresses/show.v1.rabl +10 -0
  44. data/app/views/spree/api/adjustments/show.v1.rabl +4 -0
  45. data/app/views/spree/api/config/money.v1.rabl +2 -0
  46. data/app/views/spree/api/config/show.v1.rabl +2 -0
  47. data/app/views/spree/api/countries/index.v1.rabl +7 -0
  48. data/app/views/spree/api/countries/show.v1.rabl +5 -0
  49. data/app/views/spree/api/credit_cards/index.v1.rabl +7 -0
  50. data/app/views/spree/api/credit_cards/show.v1.rabl +3 -0
  51. data/app/views/spree/api/errors/gateway_error.v1.rabl +2 -0
  52. data/app/views/spree/api/errors/invalid_api_key.v1.rabl +2 -0
  53. data/app/views/spree/api/errors/invalid_resource.v1.rabl +3 -0
  54. data/app/views/spree/api/errors/must_specify_api_key.v1.rabl +2 -0
  55. data/app/views/spree/api/errors/not_found.v1.rabl +2 -0
  56. data/app/views/spree/api/errors/unauthorized.v1.rabl +2 -0
  57. data/app/views/spree/api/errors/variant_not_in_stock_transfer.v1.rabl +2 -0
  58. data/app/views/spree/api/images/index.v1.rabl +4 -0
  59. data/app/views/spree/api/images/show.v1.rabl +6 -0
  60. data/app/views/spree/api/inventory_units/show.rabl +2 -0
  61. data/app/views/spree/api/line_items/new.v1.rabl +3 -0
  62. data/app/views/spree/api/line_items/show.v1.rabl +15 -0
  63. data/app/views/spree/api/option_types/index.v1.rabl +3 -0
  64. data/app/views/spree/api/option_types/show.v1.rabl +5 -0
  65. data/app/views/spree/api/option_values/index.v1.rabl +3 -0
  66. data/app/views/spree/api/option_values/show.v1.rabl +2 -0
  67. data/app/views/spree/api/orders/address.v1.rabl +0 -0
  68. data/app/views/spree/api/orders/canceled.v1.rabl +0 -0
  69. data/app/views/spree/api/orders/cart.v1.rabl +0 -0
  70. data/app/views/spree/api/orders/complete.v1.rabl +0 -0
  71. data/app/views/spree/api/orders/could_not_apply_coupon.v1.rabl +2 -0
  72. data/app/views/spree/api/orders/could_not_transition.v1.rabl +3 -0
  73. data/app/views/spree/api/orders/expected_total_mismatch.v1.rabl +2 -0
  74. data/app/views/spree/api/orders/index.v1.rabl +7 -0
  75. data/app/views/spree/api/orders/invalid_shipping_method.v1.rabl +2 -0
  76. data/app/views/spree/api/orders/mine.v1.rabl +9 -0
  77. data/app/views/spree/api/orders/order.v1.rabl +9 -0
  78. data/app/views/spree/api/orders/payment.v1.rabl +3 -0
  79. data/app/views/spree/api/orders/show.v1.rabl +52 -0
  80. data/app/views/spree/api/payments/credit_over_limit.v1.rabl +2 -0
  81. data/app/views/spree/api/payments/index.v1.rabl +7 -0
  82. data/app/views/spree/api/payments/new.v1.rabl +5 -0
  83. data/app/views/spree/api/payments/show.v1.rabl +2 -0
  84. data/app/views/spree/api/payments/update_forbidden.v1.rabl +2 -0
  85. data/app/views/spree/api/product_properties/index.v1.rabl +7 -0
  86. data/app/views/spree/api/product_properties/new.v1.rabl +2 -0
  87. data/app/views/spree/api/product_properties/show.v1.rabl +2 -0
  88. data/app/views/spree/api/products/index.v1.rabl +9 -0
  89. data/app/views/spree/api/products/new.v1.rabl +3 -0
  90. data/app/views/spree/api/products/product.v1.rabl +1 -0
  91. data/app/views/spree/api/products/show.v1.rabl +31 -0
  92. data/app/views/spree/api/promotions/handler.v1.rabl +5 -0
  93. data/app/views/spree/api/promotions/show.v1.rabl +2 -0
  94. data/app/views/spree/api/properties/index.v1.rabl +7 -0
  95. data/app/views/spree/api/properties/new.v1.rabl +2 -0
  96. data/app/views/spree/api/properties/show.v1.rabl +2 -0
  97. data/app/views/spree/api/return_authorizations/index.v1.rabl +7 -0
  98. data/app/views/spree/api/return_authorizations/new.v1.rabl +3 -0
  99. data/app/views/spree/api/return_authorizations/show.v1.rabl +2 -0
  100. data/app/views/spree/api/shared/stock_location_required.v1.rabl +2 -0
  101. data/app/views/spree/api/shipments/big.v1.rabl +48 -0
  102. data/app/views/spree/api/shipments/cannot_ready_shipment.v1.rabl +2 -0
  103. data/app/views/spree/api/shipments/mine.v1.rabl +9 -0
  104. data/app/views/spree/api/shipments/show.v1.rabl +32 -0
  105. data/app/views/spree/api/shipments/small.v1.rabl +37 -0
  106. data/app/views/spree/api/shipping_rates/show.v1.rabl +2 -0
  107. data/app/views/spree/api/states/index.v1.rabl +14 -0
  108. data/app/views/spree/api/states/show.v1.rabl +2 -0
  109. data/app/views/spree/api/stock_items/index.v1.rabl +7 -0
  110. data/app/views/spree/api/stock_items/show.v1.rabl +5 -0
  111. data/app/views/spree/api/stock_locations/index.v1.rabl +7 -0
  112. data/app/views/spree/api/stock_locations/show.v1.rabl +8 -0
  113. data/app/views/spree/api/stock_movements/index.v1.rabl +7 -0
  114. data/app/views/spree/api/stock_movements/show.v1.rabl +5 -0
  115. data/app/views/spree/api/stock_transfers/receive.v1.rabl +5 -0
  116. data/app/views/spree/api/store_credit_events/mine.v1.rabl +10 -0
  117. data/app/views/spree/api/stores/index.v1.rabl +4 -0
  118. data/app/views/spree/api/stores/show.v1.rabl +2 -0
  119. data/app/views/spree/api/taxonomies/index.v1.rabl +7 -0
  120. data/app/views/spree/api/taxonomies/jstree.rabl +8 -0
  121. data/app/views/spree/api/taxonomies/nested.v1.rabl +11 -0
  122. data/app/views/spree/api/taxonomies/new.v1.rabl +3 -0
  123. data/app/views/spree/api/taxonomies/show.v1.rabl +15 -0
  124. data/app/views/spree/api/taxons/index.v1.rabl +12 -0
  125. data/app/views/spree/api/taxons/jstree.rabl +8 -0
  126. data/app/views/spree/api/taxons/new.v1.rabl +3 -0
  127. data/app/views/spree/api/taxons/show.v1.rabl +6 -0
  128. data/app/views/spree/api/taxons/taxons.v1.rabl +5 -0
  129. data/app/views/spree/api/transfer_items/show.v1.rabl +6 -0
  130. data/app/views/spree/api/users/index.v1.rabl +7 -0
  131. data/app/views/spree/api/users/new.v1.rabl +3 -0
  132. data/app/views/spree/api/users/show.v1.rabl +10 -0
  133. data/app/views/spree/api/variants/big.v1.rabl +17 -0
  134. data/app/views/spree/api/variants/index.v1.rabl +9 -0
  135. data/app/views/spree/api/variants/new.v1.rabl +2 -0
  136. data/app/views/spree/api/variants/show.v1.rabl +3 -0
  137. data/app/views/spree/api/variants/small.v1.rabl +17 -0
  138. data/app/views/spree/api/zones/index.v1.rabl +7 -0
  139. data/app/views/spree/api/zones/show.v1.rabl +6 -0
  140. data/config/initializers/metal_load_paths.rb +1 -0
  141. data/config/locales/en.yml +29 -0
  142. data/config/routes.rb +139 -0
  143. data/db/migrate/20100107141738_add_api_key_to_spree_users.rb +7 -0
  144. data/db/migrate/20120411123334_resize_api_key_field.rb +7 -0
  145. data/db/migrate/20120530054546_rename_api_key_to_spree_api_key.rb +7 -0
  146. data/db/migrate/20131017162334_add_index_to_user_spree_api_key.rb +7 -0
  147. data/lib/solidus_api.rb +1 -0
  148. data/lib/spree/api/engine.rb +38 -0
  149. data/lib/spree/api/responders/rabl_template.rb +31 -0
  150. data/lib/spree/api/responders.rb +11 -0
  151. data/lib/spree/api/testing_support/caching.rb +10 -0
  152. data/lib/spree/api/testing_support/helpers.rb +44 -0
  153. data/lib/spree/api/testing_support/setup.rb +16 -0
  154. data/lib/spree/api.rb +10 -0
  155. data/lib/spree_api.rb +3 -0
  156. data/script/rails +9 -0
  157. data/solidus_api.gemspec +21 -0
  158. data/spec/controllers/spree/api/addresses_controller_spec.rb +56 -0
  159. data/spec/controllers/spree/api/base_controller_spec.rb +164 -0
  160. data/spec/controllers/spree/api/checkouts_controller_spec.rb +386 -0
  161. data/spec/controllers/spree/api/classifications_controller_spec.rb +48 -0
  162. data/spec/controllers/spree/api/config_controller_spec.rb +23 -0
  163. data/spec/controllers/spree/api/countries_controller_spec.rb +48 -0
  164. data/spec/controllers/spree/api/credit_cards_controller_spec.rb +80 -0
  165. data/spec/controllers/spree/api/images_controller_spec.rb +93 -0
  166. data/spec/controllers/spree/api/inventory_units_controller_spec.rb +50 -0
  167. data/spec/controllers/spree/api/line_items_controller_spec.rb +186 -0
  168. data/spec/controllers/spree/api/option_types_controller_spec.rb +116 -0
  169. data/spec/controllers/spree/api/option_values_controller_spec.rb +135 -0
  170. data/spec/controllers/spree/api/orders_controller_spec.rb +759 -0
  171. data/spec/controllers/spree/api/payments_controller_spec.rb +254 -0
  172. data/spec/controllers/spree/api/product_properties_controller_spec.rb +116 -0
  173. data/spec/controllers/spree/api/products_controller_spec.rb +454 -0
  174. data/spec/controllers/spree/api/promotion_application_spec.rb +50 -0
  175. data/spec/controllers/spree/api/promotions_controller_spec.rb +64 -0
  176. data/spec/controllers/spree/api/properties_controller_spec.rb +102 -0
  177. data/spec/controllers/spree/api/return_authorizations_controller_spec.rb +173 -0
  178. data/spec/controllers/spree/api/shipments_controller_spec.rb +252 -0
  179. data/spec/controllers/spree/api/states_controller_spec.rb +82 -0
  180. data/spec/controllers/spree/api/stock_items_controller_spec.rb +307 -0
  181. data/spec/controllers/spree/api/stock_locations_controller_spec.rb +172 -0
  182. data/spec/controllers/spree/api/stock_movements_controller_spec.rb +84 -0
  183. data/spec/controllers/spree/api/stock_transfers_controller_spec.rb +83 -0
  184. data/spec/controllers/spree/api/store_credit_events_controller_spec.rb +68 -0
  185. data/spec/controllers/spree/api/stores_controller_spec.rb +133 -0
  186. data/spec/controllers/spree/api/taxonomies_controller_spec.rb +114 -0
  187. data/spec/controllers/spree/api/taxons_controller_spec.rb +177 -0
  188. data/spec/controllers/spree/api/transfer_items_controller_spec.rb +152 -0
  189. data/spec/controllers/spree/api/unauthenticated_products_controller_spec.rb +26 -0
  190. data/spec/controllers/spree/api/users_controller_spec.rb +153 -0
  191. data/spec/controllers/spree/api/variants_controller_spec.rb +235 -0
  192. data/spec/controllers/spree/api/zones_controller_spec.rb +115 -0
  193. data/spec/features/checkout_spec.rb +187 -0
  194. data/spec/fixtures/thinking-cat.jpg +0 -0
  195. data/spec/models/spree/legacy_user_spec.rb +45 -0
  196. data/spec/requests/rabl_cache_spec.rb +32 -0
  197. data/spec/shared_examples/protect_product_actions.rb +17 -0
  198. data/spec/spec_helper.rb +60 -0
  199. data/spec/support/controller_hacks.rb +38 -0
  200. data/spec/support/database_cleaner.rb +14 -0
  201. data/spec/support/have_attributes_matcher.rb +13 -0
  202. metadata +334 -0
@@ -0,0 +1,71 @@
1
+ module Spree
2
+ module Api
3
+ class PropertiesController < Spree::Api::BaseController
4
+
5
+ before_action :find_property, only: [:show, :update, :destroy]
6
+
7
+ def index
8
+ @properties = Spree::Property.accessible_by(current_ability, :read)
9
+
10
+ if params[:ids]
11
+ ids = params[:ids].split(",").flatten
12
+ @properties = @properties.where(:id => ids)
13
+ else
14
+ @properties = @properties.ransack(params[:q]).result
15
+ end
16
+
17
+ @properties = @properties.page(params[:page]).per(params[:per_page])
18
+ respond_with(@properties)
19
+ end
20
+
21
+ def show
22
+ respond_with(@property)
23
+ end
24
+
25
+ def new
26
+ end
27
+
28
+ def create
29
+ authorize! :create, Property
30
+ @property = Spree::Property.new(property_params)
31
+ if @property.save
32
+ respond_with(@property, status: 201, default_template: :show)
33
+ else
34
+ invalid_resource!(@property)
35
+ end
36
+ end
37
+
38
+ def update
39
+ if @property
40
+ authorize! :update, @property
41
+ @property.update_attributes(property_params)
42
+ respond_with(@property, status: 200, default_template: :show)
43
+ else
44
+ invalid_resource!(@property)
45
+ end
46
+ end
47
+
48
+ def destroy
49
+ if @property
50
+ authorize! :destroy, @property
51
+ @property.destroy
52
+ respond_with(@property, status: 204)
53
+ else
54
+ invalid_resource!(@property)
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def find_property
61
+ @property = Spree::Property.accessible_by(current_ability, :read).find(params[:id])
62
+ rescue ActiveRecord::RecordNotFound
63
+ @property = Spree::Property.accessible_by(current_ability, :read).find_by!(name: params[:id])
64
+ end
65
+
66
+ def property_params
67
+ params.require(:property).permit(permitted_property_attributes)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,71 @@
1
+ module Spree
2
+ module Api
3
+ class ReturnAuthorizationsController < Spree::Api::BaseController
4
+ before_filter :load_order
5
+ around_filter :lock_order, only: [:create, :update, :destroy, :add, :receive, :cancel]
6
+
7
+ def create
8
+ authorize! :create, ReturnAuthorization
9
+ @return_authorization = @order.return_authorizations.build(return_authorization_params)
10
+ if @return_authorization.save
11
+ respond_with(@return_authorization, status: 201, default_template: :show)
12
+ else
13
+ invalid_resource!(@return_authorization)
14
+ end
15
+ end
16
+
17
+ def destroy
18
+ @return_authorization = @order.return_authorizations.accessible_by(current_ability, :destroy).find(params[:id])
19
+ @return_authorization.destroy
20
+ respond_with(@return_authorization, status: 204)
21
+ end
22
+
23
+ def index
24
+ authorize! :admin, ReturnAuthorization
25
+ @return_authorizations = @order.return_authorizations.accessible_by(current_ability, :read).
26
+ ransack(params[:q]).result.
27
+ page(params[:page]).per(params[:per_page])
28
+ respond_with(@return_authorizations)
29
+ end
30
+
31
+ def new
32
+ authorize! :admin, ReturnAuthorization
33
+ end
34
+
35
+ def show
36
+ authorize! :admin, ReturnAuthorization
37
+ @return_authorization = @order.return_authorizations.accessible_by(current_ability, :read).find(params[:id])
38
+ respond_with(@return_authorization)
39
+ end
40
+
41
+ def update
42
+ @return_authorization = @order.return_authorizations.accessible_by(current_ability, :update).find(params[:id])
43
+ if @return_authorization.update_attributes(return_authorization_params)
44
+ respond_with(@return_authorization, default_template: :show)
45
+ else
46
+ invalid_resource!(@return_authorization)
47
+ end
48
+ end
49
+
50
+ def cancel
51
+ @return_authorization = @order.return_authorizations.accessible_by(current_ability, :update).find(params[:id])
52
+ if @return_authorization.cancel
53
+ respond_with @return_authorization, default_template: :show
54
+ else
55
+ invalid_resource!(@return_authorization)
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def load_order
62
+ @order ||= Spree::Order.find_by!(number: order_id)
63
+ authorize! :read, @order
64
+ end
65
+
66
+ def return_authorization_params
67
+ params.require(:return_authorization).permit(permitted_return_authorization_attributes)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,172 @@
1
+ module Spree
2
+ module Api
3
+ class ShipmentsController < Spree::Api::BaseController
4
+ before_filter :find_order_on_create, only: :create
5
+ before_filter :find_shipment, only: [:update, :ship, :ready, :add, :remove]
6
+ before_action :load_transfer_params, only: [:transfer_to_location, :transfer_to_shipment]
7
+ around_filter :lock_order, except: [:mine]
8
+ before_filter :update_shipment, only: [:ship, :ready, :add, :remove]
9
+
10
+ def mine
11
+ if current_api_user
12
+ @shipments = Spree::Shipment
13
+ .reverse_chronological
14
+ .joins(:order)
15
+ .where(spree_orders: {user_id: current_api_user.id})
16
+ .includes(mine_includes)
17
+ .ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
18
+ else
19
+ render "spree/api/errors/unauthorized", status: :unauthorized
20
+ end
21
+ end
22
+
23
+ def create
24
+ # TODO Can remove conditional here once deprecated #find_order is removed.
25
+ unless @order.present?
26
+ @order = Spree::Order.find_by!(number: params[:shipment][:order_id])
27
+ authorize! :read, @order
28
+ end
29
+ authorize! :create, Shipment
30
+ quantity = params[:quantity].to_i
31
+ @shipment = @order.shipments.create(stock_location_id: params.fetch(:stock_location_id))
32
+ @order.contents.add(variant, quantity, {shipment: @shipment})
33
+
34
+ @shipment.save!
35
+
36
+ respond_with(@shipment.reload, default_template: :show)
37
+ end
38
+
39
+ def update
40
+ @shipment.update_attributes_and_order(shipment_params)
41
+
42
+ respond_with(@shipment.reload, default_template: :show)
43
+ end
44
+
45
+ def ready
46
+ unless @shipment.ready?
47
+ if @shipment.can_ready?
48
+ @shipment.ready!
49
+ else
50
+ render 'spree/api/shipments/cannot_ready_shipment', status: 422 and return
51
+ end
52
+ end
53
+ respond_with(@shipment, default_template: :show)
54
+ end
55
+
56
+ def ship
57
+ authorize! :ship, @shipment
58
+ unless @shipment.shipped?
59
+ @shipment.suppress_mailer = (params[:send_mailer] == 'false')
60
+ @shipment.ship!
61
+ end
62
+ respond_with(@shipment, default_template: :show)
63
+ end
64
+
65
+ def add
66
+ quantity = params[:quantity].to_i
67
+
68
+ @shipment.order.contents.add(variant, quantity, {shipment: @shipment})
69
+
70
+ respond_with(@shipment, default_template: :show)
71
+ end
72
+
73
+ def remove
74
+ quantity = params[:quantity].to_i
75
+
76
+ @shipment.order.contents.remove(variant, quantity, {shipment: @shipment})
77
+ @shipment.reload if @shipment.persisted?
78
+ respond_with(@shipment, default_template: :show)
79
+ end
80
+
81
+ def transfer_to_location
82
+ @stock_location = Spree::StockLocation.find(params[:stock_location_id])
83
+ @original_shipment.transfer_to_location(@variant, @quantity, @stock_location)
84
+ render json: {success: true, message: Spree.t(:shipment_transfer_success)}, status: 201
85
+ end
86
+
87
+ def transfer_to_shipment
88
+ @target_shipment = Spree::Shipment.find_by!(number: params[:target_shipment_number])
89
+ @original_shipment.transfer_to_shipment(@variant, @quantity, @target_shipment)
90
+ render json: {success: true, message: Spree.t(:shipment_transfer_success)}, status: 201
91
+ end
92
+
93
+ private
94
+
95
+ def load_transfer_params
96
+ @original_shipment = Spree::Shipment.where(number: params[:original_shipment_number]).first
97
+ @order = @original_shipment.order
98
+ @variant = Spree::Variant.find(params[:variant_id])
99
+ @quantity = params[:quantity].to_i
100
+ authorize! :read, @original_shipment
101
+ authorize! :create, Shipment
102
+ end
103
+
104
+ def find_order_on_create
105
+ # TODO Can remove conditional here once deprecated #find_order is removed.
106
+ unless @order.present?
107
+ @order = Spree::Order.find_by!(number: params[:shipment][:order_id])
108
+ authorize! :read, @order
109
+ end
110
+ end
111
+
112
+ def find_shipment
113
+ if @order.present?
114
+ @shipment = @order.shipments.accessible_by(current_ability, :update).find_by!(number: params[:id])
115
+ else
116
+ @shipment = Spree::Shipment.accessible_by(current_ability, :update).readonly(false).find_by!(number: params[:id])
117
+ @order = @shipment.order
118
+ end
119
+ end
120
+
121
+ def update_shipment
122
+ @shipment.update_attributes(shipment_params)
123
+ @shipment.reload
124
+ end
125
+
126
+ def shipment_params
127
+ if params[:shipment] && !params[:shipment].empty?
128
+ params.require(:shipment).permit(permitted_shipment_attributes)
129
+ else
130
+ {}
131
+ end
132
+ end
133
+
134
+ def variant
135
+ @variant ||= Spree::Variant.unscoped.find(params.fetch(:variant_id))
136
+ end
137
+
138
+ def mine_includes
139
+ {
140
+ order: {
141
+ bill_address: {
142
+ state: {},
143
+ country: {},
144
+ },
145
+ ship_address: {
146
+ state: {},
147
+ country: {},
148
+ },
149
+ adjustments: {},
150
+ payments: {
151
+ order: {},
152
+ payment_method: {},
153
+ },
154
+ },
155
+ inventory_units: {
156
+ line_item: {
157
+ product: {},
158
+ variant: {},
159
+ },
160
+ variant: {
161
+ product: {},
162
+ default_price: {},
163
+ option_values: {
164
+ option_type: {},
165
+ },
166
+ },
167
+ },
168
+ }
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Api
3
+ class StatesController < Spree::Api::BaseController
4
+ skip_before_action :set_expiry
5
+ skip_before_action :check_for_user_or_api_key
6
+ skip_before_action :authenticate_user
7
+
8
+ def index
9
+ @states = scope.ransack(params[:q]).result.
10
+ includes(:country).order('name ASC')
11
+
12
+ if params[:page] || params[:per_page]
13
+ @states = @states.page(params[:page]).per(params[:per_page])
14
+ end
15
+
16
+ respond_with(@states)
17
+ end
18
+
19
+ def show
20
+ @state = scope.find(params[:id])
21
+ respond_with(@state)
22
+ end
23
+
24
+ private
25
+ def scope
26
+ if params[:country_id]
27
+ @country = Country.accessible_by(current_ability, :read).find(params[:country_id])
28
+ return @country.states.accessible_by(current_ability, :read)
29
+ else
30
+ return State.accessible_by(current_ability, :read)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,84 @@
1
+ module Spree
2
+ module Api
3
+ class StockItemsController < Spree::Api::BaseController
4
+ before_filter :load_stock_location, only: [:index, :show, :create]
5
+
6
+ def index
7
+ @stock_items = scope.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
8
+ respond_with(@stock_items)
9
+ end
10
+
11
+ def show
12
+ @stock_item = scope.find(params[:id])
13
+ respond_with(@stock_item)
14
+ end
15
+
16
+ def create
17
+ authorize! :create, StockItem
18
+
19
+ @stock_item = scope.new(stock_item_params)
20
+
21
+ Spree::StockItem.transaction do
22
+ if @stock_item.save
23
+ adjust_stock_item_count_on_hand(count_on_hand_adjustment)
24
+ respond_with(@stock_item, status: 201, default_template: :show)
25
+ else
26
+ invalid_resource!(@stock_item)
27
+ end
28
+ end
29
+ end
30
+
31
+ def update
32
+ @stock_item = StockItem.accessible_by(current_ability, :update).find(params[:id])
33
+ @stock_location = @stock_item.stock_location
34
+
35
+ adjustment = count_on_hand_adjustment
36
+ params[:stock_item].delete(:count_on_hand)
37
+ adjustment -= @stock_item.count_on_hand if params[:stock_item][:force]
38
+
39
+ Spree::StockItem.transaction do
40
+ if @stock_item.update_attributes(stock_item_params)
41
+ adjust_stock_item_count_on_hand(adjustment)
42
+ respond_with(@stock_item, status: 200, default_template: :show)
43
+ else
44
+ invalid_resource!(@stock_item)
45
+ end
46
+ end
47
+ end
48
+
49
+ def destroy
50
+ @stock_item = StockItem.accessible_by(current_ability, :destroy).find(params[:id])
51
+ @stock_item.destroy
52
+ respond_with(@stock_item, status: 204)
53
+ end
54
+
55
+ private
56
+
57
+ def load_stock_location
58
+ render 'spree/api/shared/stock_location_required', status: 422 and return unless params[:stock_location_id]
59
+ @stock_location ||= StockLocation.accessible_by(current_ability, action_name.to_sym).find(params[:stock_location_id])
60
+ end
61
+
62
+ def scope
63
+ includes = {:variant => [{ :option_values => :option_type }, :product] }
64
+ @stock_location.stock_items.accessible_by(current_ability, :read).includes(includes)
65
+ end
66
+
67
+ def stock_item_params
68
+ params.require(:stock_item).permit(permitted_stock_item_attributes)
69
+ end
70
+
71
+ def count_on_hand_adjustment
72
+ params[:stock_item][:count_on_hand].to_i
73
+ end
74
+
75
+ def adjust_stock_item_count_on_hand(count_on_hand_adjustment)
76
+ if @stock_item.count_on_hand + count_on_hand_adjustment < 0
77
+ raise StockLocation::InvalidMovementError.new(Spree.t(:stock_not_below_zero))
78
+ end
79
+ @stock_movement = @stock_location.move(@stock_item.variant, count_on_hand_adjustment, current_api_user)
80
+ @stock_item = @stock_movement.stock_item
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,50 @@
1
+ module Spree
2
+ module Api
3
+ class StockLocationsController < Spree::Api::BaseController
4
+ def index
5
+ authorize! :read, StockLocation
6
+ @stock_locations = StockLocation.accessible_by(current_ability, :read).order('name ASC').ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
7
+ respond_with(@stock_locations)
8
+ end
9
+
10
+ def show
11
+ respond_with(stock_location)
12
+ end
13
+
14
+ def create
15
+ authorize! :create, StockLocation
16
+ @stock_location = StockLocation.new(stock_location_params)
17
+ if @stock_location.save
18
+ respond_with(@stock_location, status: 201, default_template: :show)
19
+ else
20
+ invalid_resource!(@stock_location)
21
+ end
22
+ end
23
+
24
+ def update
25
+ authorize! :update, stock_location
26
+ if stock_location.update_attributes(stock_location_params)
27
+ respond_with(stock_location, status: 200, default_template: :show)
28
+ else
29
+ invalid_resource!(stock_location)
30
+ end
31
+ end
32
+
33
+ def destroy
34
+ authorize! :destroy, stock_location
35
+ stock_location.destroy
36
+ respond_with(stock_location, :status => 204)
37
+ end
38
+
39
+ private
40
+
41
+ def stock_location
42
+ @stock_location ||= StockLocation.accessible_by(current_ability, :read).find(params[:id])
43
+ end
44
+
45
+ def stock_location_params
46
+ params.require(:stock_location).permit(permitted_stock_location_attributes)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,42 @@
1
+ module Spree
2
+ module Api
3
+ class StockMovementsController < Spree::Api::BaseController
4
+ before_action :stock_location, except: [:update, :destroy]
5
+
6
+ def index
7
+ authorize! :read, StockMovement
8
+ @stock_movements = scope.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
9
+ respond_with(@stock_movements)
10
+ end
11
+
12
+ def show
13
+ @stock_movement = scope.find(params[:id])
14
+ respond_with(@stock_movement)
15
+ end
16
+
17
+ def create
18
+ authorize! :create, StockMovement
19
+ @stock_movement = scope.new(stock_movement_params)
20
+ if @stock_movement.save
21
+ respond_with(@stock_movement, status: 201, default_template: :show)
22
+ else
23
+ invalid_resource!(@stock_movement)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def stock_location
30
+ @stock_location ||= StockLocation.accessible_by(current_ability, :read).find(params[:stock_location_id])
31
+ end
32
+
33
+ def scope
34
+ @stock_location.stock_movements.accessible_by(current_ability, :read)
35
+ end
36
+
37
+ def stock_movement_params
38
+ params.require(:stock_movement).permit(permitted_stock_movement_attributes)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Api
3
+ class StockTransfersController < Spree::Api::BaseController
4
+ def receive
5
+ authorize! :update, TransferItem
6
+ @stock_transfer = Spree::StockTransfer.accessible_by(current_ability, :update).find_by!(number: params[:id])
7
+ variant = Spree::Variant.accessible_by(current_ability, :show).find(params[:variant_id])
8
+ @transfer_item = @stock_transfer.transfer_items.find_by(variant: variant)
9
+ if @transfer_item.nil?
10
+ render "spree/api/errors/variant_not_in_stock_transfer", status: 422
11
+ elsif @transfer_item.update_attributes(received_quantity: @transfer_item.received_quantity + 1)
12
+ render 'spree/api/stock_transfers/receive', status: 200
13
+ else
14
+ invalid_resource!(@transfer_item)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ class Spree::Api::StoreCreditEventsController < Spree::Api::BaseController
2
+ def mine
3
+ if current_api_user
4
+ @store_credit_events = current_api_user.store_credit_events.exposed_events.page(params[:page]).per(params[:per_page]).reverse_chronological
5
+ else
6
+ render "spree/api/errors/unauthorized", status: :unauthorized
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,55 @@
1
+ module Spree
2
+ module Api
3
+ class StoresController < Spree::Api::BaseController
4
+
5
+ before_filter :get_store, except: [:index, :create]
6
+
7
+ def index
8
+ authorize! :read, Store
9
+ @stores = Store.accessible_by(current_ability, :read).all
10
+ respond_with(@stores)
11
+ end
12
+
13
+ def create
14
+ authorize! :create, Store
15
+ @store = Store.new(store_params)
16
+ @store.code = params[:store][:code]
17
+ if @store.save
18
+ respond_with(@store, status: 201, default_template: :show)
19
+ else
20
+ invalid_resource!(@store)
21
+ end
22
+ end
23
+
24
+ def update
25
+ authorize! :update, @store
26
+ if @store.update_attributes(store_params)
27
+ respond_with(@store, status: 200, default_template: :show)
28
+ else
29
+ invalid_resource!(@store)
30
+ end
31
+ end
32
+
33
+ def show
34
+ authorize! :read, @store
35
+ respond_with(@store)
36
+ end
37
+
38
+ def destroy
39
+ authorize! :destroy, @store
40
+ @store.destroy
41
+ respond_with(@store, status: 204)
42
+ end
43
+
44
+ private
45
+
46
+ def get_store
47
+ @store = Store.find(params[:id])
48
+ end
49
+
50
+ def store_params
51
+ params.require(:store).permit(permitted_store_attributes)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,64 @@
1
+ module Spree
2
+ module Api
3
+ class TaxonomiesController < Spree::Api::BaseController
4
+
5
+ def index
6
+ respond_with(taxonomies)
7
+ end
8
+
9
+ def show
10
+ respond_with(taxonomy)
11
+ end
12
+
13
+ # Because JSTree wants parameters in a *slightly* different format
14
+ def jstree
15
+ show
16
+ end
17
+
18
+ def create
19
+ authorize! :create, Taxonomy
20
+ @taxonomy = Taxonomy.new(taxonomy_params)
21
+ if @taxonomy.save
22
+ respond_with(@taxonomy, :status => 201, :default_template => :show)
23
+ else
24
+ invalid_resource!(@taxonomy)
25
+ end
26
+ end
27
+
28
+ def update
29
+ authorize! :update, taxonomy
30
+ if taxonomy.update_attributes(taxonomy_params)
31
+ respond_with(taxonomy, :status => 200, :default_template => :show)
32
+ else
33
+ invalid_resource!(taxonomy)
34
+ end
35
+ end
36
+
37
+ def destroy
38
+ authorize! :destroy, taxonomy
39
+ taxonomy.destroy
40
+ respond_with(taxonomy, :status => 204)
41
+ end
42
+
43
+ private
44
+
45
+ def taxonomies
46
+ @taxonomies = Taxonomy.accessible_by(current_ability, :read).order('name').includes(:root => :children).
47
+ ransack(params[:q]).result.
48
+ page(params[:page]).per(params[:per_page])
49
+ end
50
+
51
+ def taxonomy
52
+ @taxonomy ||= Taxonomy.accessible_by(current_ability, :read).find(params[:id])
53
+ end
54
+
55
+ def taxonomy_params
56
+ if params[:taxonomy] && !params[:taxonomy].empty?
57
+ params.require(:taxonomy).permit(permitted_taxonomy_attributes)
58
+ else
59
+ {}
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end