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,93 @@
1
+ module Spree
2
+ module Api
3
+ class TaxonsController < Spree::Api::BaseController
4
+ def index
5
+ if taxonomy
6
+ @taxons = taxonomy.root.children
7
+ else
8
+ if params[:ids]
9
+ @taxons = Spree::Taxon.accessible_by(current_ability, :read).where(id: params[:ids].split(','))
10
+ else
11
+ @taxons = Spree::Taxon.accessible_by(current_ability, :read).order(:taxonomy_id, :lft).ransack(params[:q]).result
12
+ end
13
+ end
14
+
15
+ @taxons = @taxons.page(params[:page]).per(params[:per_page])
16
+ respond_with(@taxons)
17
+ end
18
+
19
+ def show
20
+ @taxon = taxon
21
+ respond_with(@taxon)
22
+ end
23
+
24
+ def jstree
25
+ show
26
+ end
27
+
28
+ def create
29
+ authorize! :create, Taxon
30
+ @taxon = Spree::Taxon.new(taxon_params)
31
+ @taxon.taxonomy_id = params[:taxonomy_id]
32
+ taxonomy = Spree::Taxonomy.find_by(id: params[:taxonomy_id])
33
+
34
+ if taxonomy.nil?
35
+ @taxon.errors[:taxonomy_id] = I18n.t(:invalid_taxonomy_id, scope: 'spree.api')
36
+ invalid_resource!(@taxon) and return
37
+ end
38
+
39
+ @taxon.parent_id = taxonomy.root.id unless params[:taxon][:parent_id]
40
+
41
+ if @taxon.save
42
+ respond_with(@taxon, status: 201, default_template: :show)
43
+ else
44
+ invalid_resource!(@taxon)
45
+ end
46
+ end
47
+
48
+ def update
49
+ authorize! :update, taxon
50
+ if taxon.update_attributes(taxon_params)
51
+ respond_with(taxon, status: 200, default_template: :show)
52
+ else
53
+ invalid_resource!(taxon)
54
+ end
55
+ end
56
+
57
+ def destroy
58
+ authorize! :destroy, taxon
59
+ taxon.destroy
60
+ respond_with(taxon, status: 204)
61
+ end
62
+
63
+ def products
64
+ # Returns the products sorted by their position with the classification
65
+ # Products#index does not do the sorting.
66
+ taxon = Spree::Taxon.find(params[:id])
67
+ @products = taxon.products.ransack(params[:q]).result
68
+ @products = @products.page(params[:page]).per(params[:per_page] || 500)
69
+ render "spree/api/products/index"
70
+ end
71
+
72
+ private
73
+
74
+ def taxonomy
75
+ if params[:taxonomy_id].present?
76
+ @taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :read).find(params[:taxonomy_id])
77
+ end
78
+ end
79
+
80
+ def taxon
81
+ @taxon ||= taxonomy.taxons.accessible_by(current_ability, :read).find(params[:id])
82
+ end
83
+
84
+ def taxon_params
85
+ if params[:taxon] && !params[:taxon].empty?
86
+ params.require(:taxon).permit(permitted_taxon_attributes)
87
+ else
88
+ {}
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,42 @@
1
+ module Spree
2
+ module Api
3
+ class TransferItemsController < Spree::Api::BaseController
4
+ def create
5
+ authorize! :create, TransferItem
6
+ stock_transfer = StockTransfer.accessible_by(current_ability, :update).find_by(number: params[:stock_transfer_id])
7
+ @transfer_item = stock_transfer.transfer_items.build(transfer_item_params)
8
+ if @transfer_item.save
9
+ respond_with(@transfer_item, status: 201, default_template: :show)
10
+ else
11
+ invalid_resource!(@transfer_item)
12
+ end
13
+ end
14
+
15
+ def update
16
+ authorize! :update, TransferItem
17
+ @transfer_item = TransferItem.accessible_by(current_ability, :update).find(params[:id])
18
+ if @transfer_item.update_attributes(transfer_item_params)
19
+ respond_with(@transfer_item, status: 200, default_template: :show)
20
+ else
21
+ invalid_resource!(@transfer_item)
22
+ end
23
+ end
24
+
25
+ def destroy
26
+ authorize! :destroy, TransferItem
27
+ @transfer_item = TransferItem.accessible_by(current_ability, :destroy).find(params[:id])
28
+ if @transfer_item.destroy
29
+ respond_with(@transfer_item, status: 200, default_template: :show)
30
+ else
31
+ invalid_resource!(@transfer_item)
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def transfer_item_params
38
+ params.require(:transfer_item).permit(permitted_transfer_item_attributes)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,56 @@
1
+ module Spree
2
+ module Api
3
+ class UsersController < Spree::Api::BaseController
4
+
5
+ def index
6
+ @users = Spree.user_class.accessible_by(current_ability,:read).ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
7
+ respond_with(@users)
8
+ end
9
+
10
+ def show
11
+ respond_with(user)
12
+ end
13
+
14
+ def new
15
+ end
16
+
17
+ def create
18
+ authorize! :create, Spree.user_class
19
+ @user = Spree.user_class.new(user_params)
20
+ if @user.save
21
+ respond_with(@user, :status => 201, :default_template => :show)
22
+ else
23
+ invalid_resource!(@user)
24
+ end
25
+ end
26
+
27
+ def update
28
+ authorize! :update, user
29
+ if user.update_attributes(user_params)
30
+ respond_with(user, :status => 200, :default_template => :show)
31
+ else
32
+ invalid_resource!(user)
33
+ end
34
+ end
35
+
36
+ def destroy
37
+ authorize! :destroy, user
38
+ user.destroy
39
+ respond_with(user, :status => 204)
40
+ end
41
+
42
+ private
43
+
44
+ def user
45
+ @user ||= Spree.user_class.accessible_by(current_ability, :read).find(params[:id])
46
+ end
47
+
48
+ def user_params
49
+ params.require(:user).permit(permitted_user_attributes |
50
+ [bill_address_attributes: permitted_address_attributes,
51
+ ship_address_attributes: permitted_address_attributes])
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,75 @@
1
+ module Spree
2
+ module Api
3
+ class VariantsController < Spree::Api::BaseController
4
+ before_action :product
5
+
6
+ def create
7
+ authorize! :create, Variant
8
+ @variant = scope.new(variant_params)
9
+ if @variant.save
10
+ respond_with(@variant, status: 201, default_template: :show)
11
+ else
12
+ invalid_resource!(@variant)
13
+ end
14
+ end
15
+
16
+ def destroy
17
+ @variant = scope.accessible_by(current_ability, :destroy).find(params[:id])
18
+ @variant.destroy
19
+ respond_with(@variant, status: 204)
20
+ end
21
+
22
+ # The lazyloaded associations here are pretty much attached to which nodes
23
+ # we render on the view so we better update it any time a node is included
24
+ # or removed from the views.
25
+ def index
26
+ @variants = scope.includes({ option_values: :option_type }, :product, :default_price, :images, { stock_items: :stock_location })
27
+ .ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
28
+ respond_with(@variants)
29
+ end
30
+
31
+ def new
32
+ end
33
+
34
+ def show
35
+ @variant = scope.includes({ option_values: :option_type }, :option_values, :product, :default_price, :images, { stock_items: :stock_location })
36
+ .find(params[:id])
37
+ respond_with(@variant)
38
+ end
39
+
40
+ def update
41
+ @variant = scope.accessible_by(current_ability, :update).find(params[:id])
42
+ if @variant.update_attributes(variant_params)
43
+ respond_with(@variant, status: 200, default_template: :show)
44
+ else
45
+ invalid_resource!(@product)
46
+ end
47
+ end
48
+
49
+ private
50
+ def product
51
+ @product ||= Spree::Product.accessible_by(current_ability, :read).friendly.find(params[:product_id]) if params[:product_id]
52
+ end
53
+
54
+ def scope
55
+ if @product
56
+ variants = @product.variants_including_master
57
+ else
58
+ variants = Variant
59
+ end
60
+
61
+ if current_ability.can?(:manage, Variant) && params[:show_deleted]
62
+ variants = variants.with_deleted
63
+ end
64
+
65
+ variants = variants.accessible_by(current_ability, :read)
66
+ variants = variants.in_stock if params[:in_stock_only] || cannot?(:view_out_of_stock, Spree::Variant)
67
+ variants
68
+ end
69
+
70
+ def variant_params
71
+ params.require(:variant).permit(permitted_variant_attributes)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,50 @@
1
+ module Spree
2
+ module Api
3
+ class ZonesController < Spree::Api::BaseController
4
+
5
+ def create
6
+ authorize! :create, Zone
7
+ @zone = Zone.new(map_nested_attributes_keys(Spree::Zone, zone_params))
8
+ if @zone.save
9
+ respond_with(@zone, :status => 201, :default_template => :show)
10
+ else
11
+ invalid_resource!(@zone)
12
+ end
13
+ end
14
+
15
+ def destroy
16
+ authorize! :destroy, zone
17
+ zone.destroy
18
+ respond_with(zone, :status => 204)
19
+ end
20
+
21
+ def index
22
+ @zones = Zone.accessible_by(current_ability, :read).order('name ASC').ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
23
+ respond_with(@zones)
24
+ end
25
+
26
+ def show
27
+ respond_with(zone)
28
+ end
29
+
30
+ def update
31
+ authorize! :update, zone
32
+ if zone.update_attributes(map_nested_attributes_keys(Spree::Zone, zone_params))
33
+ respond_with(zone, :status => 200, :default_template => :show)
34
+ else
35
+ invalid_resource!(zone)
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def zone_params
42
+ params.require(:zone).permit!
43
+ end
44
+
45
+ def zone
46
+ @zone ||= Spree::Zone.accessible_by(current_ability, :read).find(params[:id])
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,190 @@
1
+ module Spree
2
+ module Api
3
+ module ApiHelpers
4
+ ATTRIBUTES = [
5
+ :product_attributes,
6
+ :product_property_attributes,
7
+ :variant_attributes,
8
+ :image_attributes,
9
+ :option_value_attributes,
10
+ :order_attributes,
11
+ :line_item_attributes,
12
+ :option_type_attributes,
13
+ :payment_attributes,
14
+ :payment_method_attributes,
15
+ :shipment_attributes,
16
+ :taxonomy_attributes,
17
+ :taxon_attributes,
18
+ :address_attributes,
19
+ :country_attributes,
20
+ :state_attributes,
21
+ :adjustment_attributes,
22
+ :inventory_unit_attributes,
23
+ :return_authorization_attributes,
24
+ :creditcard_attributes,
25
+ :payment_source_attributes,
26
+ :user_attributes,
27
+ :property_attributes,
28
+ :stock_location_attributes,
29
+ :stock_movement_attributes,
30
+ :stock_item_attributes,
31
+ :promotion_attributes,
32
+ :store_attributes,
33
+ :store_credit_history_attributes,
34
+ :stock_transfer_attributes,
35
+ :transfer_item_attributes,
36
+ :transfer_item_variant_attributes
37
+ ]
38
+
39
+ mattr_reader *ATTRIBUTES
40
+
41
+ def required_fields_for(model)
42
+ required_fields = model._validators.select do |field, validations|
43
+ validations.any? { |v| v.is_a?(ActiveModel::Validations::PresenceValidator) }
44
+ end.map(&:first) # get fields that are invalid
45
+ # Permalinks presence is validated, but are really automatically generated
46
+ # Therefore we shouldn't tell API clients that they MUST send one through
47
+ required_fields.map!(&:to_s).delete("permalink")
48
+ # Do not require slugs, either
49
+ required_fields.delete("slug")
50
+ required_fields
51
+ end
52
+
53
+ @@product_attributes = [
54
+ :id, :name, :description, :price, :display_price, :available_on,
55
+ :slug, :meta_description, :meta_keywords, :shipping_category_id,
56
+ :taxon_ids, :total_on_hand
57
+ ]
58
+
59
+ @@product_property_attributes = [
60
+ :id, :product_id, :property_id, :value, :property_name
61
+ ]
62
+
63
+ @@variant_attributes = [
64
+ :id, :name, :sku, :price, :weight, :height, :width, :depth, :is_master,
65
+ :slug, :description, :track_inventory
66
+ ]
67
+
68
+ @@image_attributes = [
69
+ :id, :position, :attachment_content_type, :attachment_file_name, :type,
70
+ :attachment_updated_at, :attachment_width, :attachment_height, :alt
71
+ ]
72
+
73
+ @@option_value_attributes = [
74
+ :id, :name, :presentation, :option_type_name, :option_type_id,
75
+ :option_type_presentation
76
+ ]
77
+
78
+ @@order_attributes = [
79
+ :id, :number, :item_total, :total, :ship_total, :state, :adjustment_total,
80
+ :user_id, :created_at, :updated_at, :completed_at, :payment_total,
81
+ :shipment_state, :payment_state, :email, :special_instructions, :channel,
82
+ :included_tax_total, :additional_tax_total, :display_included_tax_total,
83
+ :display_additional_tax_total, :tax_total, :currency,
84
+ :covered_by_store_credit, :display_total_applicable_store_credit,
85
+ :order_total_after_store_credit, :display_order_total_after_store_credit,
86
+ :total_applicable_store_credit, :display_total_available_store_credit, :display_store_credit_remaining_after_capture
87
+
88
+ ]
89
+
90
+ @@line_item_attributes = [:id, :quantity, :price, :variant_id]
91
+
92
+ @@option_type_attributes = [:id, :name, :presentation, :position]
93
+
94
+ @@payment_attributes = [
95
+ :id, :source_type, :source_id, :amount, :display_amount,
96
+ :payment_method_id, :response_code, :state, :avs_response, :created_at,
97
+ :updated_at
98
+ ]
99
+
100
+ @@payment_method_attributes = [:id, :name, :description]
101
+
102
+ @@shipment_attributes = [:id, :tracking, :number, :cost, :shipped_at, :state]
103
+
104
+ @@taxonomy_attributes = [:id, :name]
105
+
106
+ @@taxon_attributes = [
107
+ :id, :name, :pretty_name, :permalink, :parent_id,
108
+ :taxonomy_id
109
+ ]
110
+
111
+ @@inventory_unit_attributes = [
112
+ :id, :lock_version, :state, :variant_id, :shipment_id,
113
+ :return_authorization_id
114
+ ]
115
+
116
+ @@return_authorization_attributes = [
117
+ :id, :number, :state, :order_id, :memo, :created_at, :updated_at
118
+ ]
119
+
120
+ @@address_attributes = [
121
+ :id, :firstname, :lastname, :full_name, :address1, :address2, :city,
122
+ :zipcode, :phone, :company, :alternative_phone, :country_id, :state_id,
123
+ :state_name, :state_text
124
+ ]
125
+
126
+ @@country_attributes = [:id, :iso_name, :iso, :iso3, :name, :numcode]
127
+
128
+ @@state_attributes = [:id, :name, :abbr, :country_id]
129
+
130
+ @@adjustment_attributes = [
131
+ :id, :source_type, :source_id, :adjustable_type, :adjustable_id,
132
+ :originator_type, :originator_id, :amount, :label, :mandatory, :promotion_code,
133
+ :locked, :eligible, :created_at, :updated_at
134
+ ]
135
+
136
+ @@creditcard_attributes = [
137
+ :id, :month, :year, :cc_type, :last_digits, :name,
138
+ ]
139
+
140
+ @@payment_source_attributes = [
141
+ :id, :month, :year, :cc_type, :last_digits, :name
142
+ ]
143
+
144
+ @@user_attributes = [:id, :email, :created_at, :updated_at]
145
+
146
+ @@property_attributes = [:id, :name, :presentation]
147
+
148
+ @@stock_location_attributes = [
149
+ :id, :name, :address1, :address2, :city, :state_id, :state_name,
150
+ :country_id, :zipcode, :phone, :active
151
+ ]
152
+
153
+ @@stock_movement_attributes = [:id, :quantity, :stock_item_id]
154
+
155
+ @@stock_item_attributes = [
156
+ :id, :count_on_hand, :backorderable, :lock_version, :stock_location_id,
157
+ :variant_id
158
+ ]
159
+
160
+ @@promotion_attributes = [
161
+ :id, :name, :description, :expires_at, :starts_at, :type, :usage_limit,
162
+ :match_policy, :advertise, :path
163
+ ]
164
+
165
+ @@store_attributes = [
166
+ :id, :name, :url, :meta_description, :meta_keywords, :seo_title,
167
+ :mail_from_address, :default_currency, :code, :default
168
+ ]
169
+
170
+ @@store_credit_history_attributes = [
171
+ :display_amount, :display_user_total_amount, :display_action,
172
+ :display_event_date
173
+ ]
174
+
175
+ @@stock_transfer_attributes = [:id, :number]
176
+
177
+ @@transfer_item_attributes = [:id, :expected_quantity, :received_quantity]
178
+
179
+ @@transfer_item_variant_attributes = []
180
+
181
+ def variant_attributes
182
+ if @current_user_roles && @current_user_roles.include?("admin")
183
+ @@variant_attributes + [:cost_price]
184
+ else
185
+ @@variant_attributes
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,5 @@
1
+ module Spree
2
+ class ApiConfiguration < Preferences::Configuration
3
+ preference :requires_authentication, :boolean, :default => true
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ Spree::OptionValue.class_eval do
2
+ def option_type_name
3
+ option_type.name
4
+ end
5
+
6
+ def option_type_presentation
7
+ option_type.presentation
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ object @address
2
+ cache [I18n.locale, root_object]
3
+ attributes *address_attributes
4
+
5
+ child(:country) do |address|
6
+ attributes *country_attributes
7
+ end
8
+ child(:state) do |address|
9
+ attributes *state_attributes
10
+ end
@@ -0,0 +1,4 @@
1
+ object @adjustment
2
+ cache [I18n.locale, root_object]
3
+ attributes *adjustment_attributes
4
+ node(:display_amount) { |a| a.display_amount.to_s }
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:symbol) { ::Money.new(1, Spree::Config[:currency]).symbol }
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:default_country_id) { Spree::Config[:default_country_id] }
@@ -0,0 +1,7 @@
1
+ object false
2
+ child(@countries => :countries) do
3
+ attributes *country_attributes
4
+ end
5
+ node(:count) { @countries.count }
6
+ node(:current_page) { params[:page] || 1 }
7
+ node(:pages) { @countries.num_pages }
@@ -0,0 +1,5 @@
1
+ object @country
2
+ attributes *country_attributes
3
+ child :states => :states do
4
+ attributes :id, :name, :abbr, :country_id
5
+ end
@@ -0,0 +1,7 @@
1
+ object false
2
+ child(@credit_cards => :credit_cards) do
3
+ extends "spree/api/credit_cards/show"
4
+ end
5
+ node(:count) { @credit_cards.count }
6
+ node(:current_page) { params[:page] || 1 }
7
+ node(:pages) { @credit_cards.total_pages }
@@ -0,0 +1,3 @@
1
+ object @credit_card
2
+ cache [I18n.locale, root_object]
3
+ attributes *creditcard_attributes
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:error) { I18n.t(:gateway_error, scope: "spree.api", text: @error) }
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:error) { I18n.t(:invalid_api_key, :key => api_key, :scope => "spree.api") }
@@ -0,0 +1,3 @@
1
+ object false
2
+ node(:error) { I18n.t(:invalid_resource, :scope => "spree.api") }
3
+ node(:errors) { @resource.errors.to_hash }
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:error) { I18n.t(:must_specify_api_key, :scope => "spree.api") }
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:error) { I18n.t(:resource_not_found, :scope => "spree.api") }
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:error) { I18n.t(:unauthorized, :scope => "spree.api") }
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:error) { Spree.t(:item_not_in_stock_transfer) }
@@ -0,0 +1,4 @@
1
+ object false
2
+ child(@images => :images) do
3
+ extends "spree/api/images/show"
4
+ end
@@ -0,0 +1,6 @@
1
+ object @image
2
+ attributes *image_attributes
3
+ attributes :viewable_type, :viewable_id
4
+ Spree::Image.attachment_definitions[:attachment][:styles].each do |k,v|
5
+ node("#{k}_url") { |i| i.attachment.url(k) }
6
+ end
@@ -0,0 +1,2 @@
1
+ object @inventory_unit
2
+ attributes *inventory_unit_attributes
@@ -0,0 +1,3 @@
1
+ object false
2
+ node(:attributes) { [*line_item_attributes] - [:id] }
3
+ node(:required_attributes) { [:variant_id, :quantity] }
@@ -0,0 +1,15 @@
1
+ object @line_item
2
+ cache [I18n.locale, root_object]
3
+ attributes *line_item_attributes
4
+ node(:single_display_amount) { |li| li.single_display_amount.to_s }
5
+ node(:display_amount) { |li| li.display_amount.to_s }
6
+ node(:total) { |li| li.total }
7
+ child :variant do
8
+ extends "spree/api/variants/small"
9
+ attributes :product_id
10
+ child(:images => :images) { extends "spree/api/images/show" }
11
+ end
12
+
13
+ child :adjustments => :adjustments do
14
+ extends "spree/api/adjustments/show"
15
+ end
@@ -0,0 +1,3 @@
1
+ collection @option_types
2
+
3
+ extends "spree/api/option_types/show"
@@ -0,0 +1,5 @@
1
+ object @option_type
2
+ attributes *option_type_attributes
3
+ child :option_values => :option_values do
4
+ attributes *option_value_attributes
5
+ end
@@ -0,0 +1,3 @@
1
+ collection @option_values
2
+
3
+ extends "spree/api/option_values/show"
@@ -0,0 +1,2 @@
1
+ object @option_value
2
+ attributes *option_value_attributes
File without changes
File without changes
File without changes