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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/CHANGELOG.md +1 -0
- data/Gemfile +5 -0
- data/LICENSE +27 -0
- data/Rakefile +16 -0
- data/app/controllers/spree/api/addresses_controller.rb +43 -0
- data/app/controllers/spree/api/base_controller.rb +189 -0
- data/app/controllers/spree/api/checkouts_controller.rb +133 -0
- data/app/controllers/spree/api/classifications_controller.rb +18 -0
- data/app/controllers/spree/api/config_controller.rb +6 -0
- data/app/controllers/spree/api/countries_controller.rb +23 -0
- data/app/controllers/spree/api/credit_cards_controller.rb +25 -0
- data/app/controllers/spree/api/images_controller.rb +47 -0
- data/app/controllers/spree/api/inventory_units_controller.rb +52 -0
- data/app/controllers/spree/api/line_items_controller.rb +74 -0
- data/app/controllers/spree/api/option_types_controller.rb +49 -0
- data/app/controllers/spree/api/option_values_controller.rb +58 -0
- data/app/controllers/spree/api/orders_controller.rb +155 -0
- data/app/controllers/spree/api/payments_controller.rb +81 -0
- data/app/controllers/spree/api/product_properties_controller.rb +72 -0
- data/app/controllers/spree/api/products_controller.rb +129 -0
- data/app/controllers/spree/api/promotions_controller.rb +26 -0
- data/app/controllers/spree/api/properties_controller.rb +71 -0
- data/app/controllers/spree/api/return_authorizations_controller.rb +71 -0
- data/app/controllers/spree/api/shipments_controller.rb +172 -0
- data/app/controllers/spree/api/states_controller.rb +35 -0
- data/app/controllers/spree/api/stock_items_controller.rb +84 -0
- data/app/controllers/spree/api/stock_locations_controller.rb +50 -0
- data/app/controllers/spree/api/stock_movements_controller.rb +42 -0
- data/app/controllers/spree/api/stock_transfers_controller.rb +19 -0
- data/app/controllers/spree/api/store_credit_events_controller.rb +9 -0
- data/app/controllers/spree/api/stores_controller.rb +55 -0
- data/app/controllers/spree/api/taxonomies_controller.rb +64 -0
- data/app/controllers/spree/api/taxons_controller.rb +93 -0
- data/app/controllers/spree/api/transfer_items_controller.rb +42 -0
- data/app/controllers/spree/api/users_controller.rb +56 -0
- data/app/controllers/spree/api/variants_controller.rb +75 -0
- data/app/controllers/spree/api/zones_controller.rb +50 -0
- data/app/helpers/spree/api/api_helpers.rb +190 -0
- data/app/models/spree/api_configuration.rb +5 -0
- data/app/models/spree/option_value_decorator.rb +9 -0
- data/app/views/spree/api/addresses/show.v1.rabl +10 -0
- data/app/views/spree/api/adjustments/show.v1.rabl +4 -0
- data/app/views/spree/api/config/money.v1.rabl +2 -0
- data/app/views/spree/api/config/show.v1.rabl +2 -0
- data/app/views/spree/api/countries/index.v1.rabl +7 -0
- data/app/views/spree/api/countries/show.v1.rabl +5 -0
- data/app/views/spree/api/credit_cards/index.v1.rabl +7 -0
- data/app/views/spree/api/credit_cards/show.v1.rabl +3 -0
- data/app/views/spree/api/errors/gateway_error.v1.rabl +2 -0
- data/app/views/spree/api/errors/invalid_api_key.v1.rabl +2 -0
- data/app/views/spree/api/errors/invalid_resource.v1.rabl +3 -0
- data/app/views/spree/api/errors/must_specify_api_key.v1.rabl +2 -0
- data/app/views/spree/api/errors/not_found.v1.rabl +2 -0
- data/app/views/spree/api/errors/unauthorized.v1.rabl +2 -0
- data/app/views/spree/api/errors/variant_not_in_stock_transfer.v1.rabl +2 -0
- data/app/views/spree/api/images/index.v1.rabl +4 -0
- data/app/views/spree/api/images/show.v1.rabl +6 -0
- data/app/views/spree/api/inventory_units/show.rabl +2 -0
- data/app/views/spree/api/line_items/new.v1.rabl +3 -0
- data/app/views/spree/api/line_items/show.v1.rabl +15 -0
- data/app/views/spree/api/option_types/index.v1.rabl +3 -0
- data/app/views/spree/api/option_types/show.v1.rabl +5 -0
- data/app/views/spree/api/option_values/index.v1.rabl +3 -0
- data/app/views/spree/api/option_values/show.v1.rabl +2 -0
- data/app/views/spree/api/orders/address.v1.rabl +0 -0
- data/app/views/spree/api/orders/canceled.v1.rabl +0 -0
- data/app/views/spree/api/orders/cart.v1.rabl +0 -0
- data/app/views/spree/api/orders/complete.v1.rabl +0 -0
- data/app/views/spree/api/orders/could_not_apply_coupon.v1.rabl +2 -0
- data/app/views/spree/api/orders/could_not_transition.v1.rabl +3 -0
- data/app/views/spree/api/orders/expected_total_mismatch.v1.rabl +2 -0
- data/app/views/spree/api/orders/index.v1.rabl +7 -0
- data/app/views/spree/api/orders/invalid_shipping_method.v1.rabl +2 -0
- data/app/views/spree/api/orders/mine.v1.rabl +9 -0
- data/app/views/spree/api/orders/order.v1.rabl +9 -0
- data/app/views/spree/api/orders/payment.v1.rabl +3 -0
- data/app/views/spree/api/orders/show.v1.rabl +52 -0
- data/app/views/spree/api/payments/credit_over_limit.v1.rabl +2 -0
- data/app/views/spree/api/payments/index.v1.rabl +7 -0
- data/app/views/spree/api/payments/new.v1.rabl +5 -0
- data/app/views/spree/api/payments/show.v1.rabl +2 -0
- data/app/views/spree/api/payments/update_forbidden.v1.rabl +2 -0
- data/app/views/spree/api/product_properties/index.v1.rabl +7 -0
- data/app/views/spree/api/product_properties/new.v1.rabl +2 -0
- data/app/views/spree/api/product_properties/show.v1.rabl +2 -0
- data/app/views/spree/api/products/index.v1.rabl +9 -0
- data/app/views/spree/api/products/new.v1.rabl +3 -0
- data/app/views/spree/api/products/product.v1.rabl +1 -0
- data/app/views/spree/api/products/show.v1.rabl +31 -0
- data/app/views/spree/api/promotions/handler.v1.rabl +5 -0
- data/app/views/spree/api/promotions/show.v1.rabl +2 -0
- data/app/views/spree/api/properties/index.v1.rabl +7 -0
- data/app/views/spree/api/properties/new.v1.rabl +2 -0
- data/app/views/spree/api/properties/show.v1.rabl +2 -0
- data/app/views/spree/api/return_authorizations/index.v1.rabl +7 -0
- data/app/views/spree/api/return_authorizations/new.v1.rabl +3 -0
- data/app/views/spree/api/return_authorizations/show.v1.rabl +2 -0
- data/app/views/spree/api/shared/stock_location_required.v1.rabl +2 -0
- data/app/views/spree/api/shipments/big.v1.rabl +48 -0
- data/app/views/spree/api/shipments/cannot_ready_shipment.v1.rabl +2 -0
- data/app/views/spree/api/shipments/mine.v1.rabl +9 -0
- data/app/views/spree/api/shipments/show.v1.rabl +32 -0
- data/app/views/spree/api/shipments/small.v1.rabl +37 -0
- data/app/views/spree/api/shipping_rates/show.v1.rabl +2 -0
- data/app/views/spree/api/states/index.v1.rabl +14 -0
- data/app/views/spree/api/states/show.v1.rabl +2 -0
- data/app/views/spree/api/stock_items/index.v1.rabl +7 -0
- data/app/views/spree/api/stock_items/show.v1.rabl +5 -0
- data/app/views/spree/api/stock_locations/index.v1.rabl +7 -0
- data/app/views/spree/api/stock_locations/show.v1.rabl +8 -0
- data/app/views/spree/api/stock_movements/index.v1.rabl +7 -0
- data/app/views/spree/api/stock_movements/show.v1.rabl +5 -0
- data/app/views/spree/api/stock_transfers/receive.v1.rabl +5 -0
- data/app/views/spree/api/store_credit_events/mine.v1.rabl +10 -0
- data/app/views/spree/api/stores/index.v1.rabl +4 -0
- data/app/views/spree/api/stores/show.v1.rabl +2 -0
- data/app/views/spree/api/taxonomies/index.v1.rabl +7 -0
- data/app/views/spree/api/taxonomies/jstree.rabl +8 -0
- data/app/views/spree/api/taxonomies/nested.v1.rabl +11 -0
- data/app/views/spree/api/taxonomies/new.v1.rabl +3 -0
- data/app/views/spree/api/taxonomies/show.v1.rabl +15 -0
- data/app/views/spree/api/taxons/index.v1.rabl +12 -0
- data/app/views/spree/api/taxons/jstree.rabl +8 -0
- data/app/views/spree/api/taxons/new.v1.rabl +3 -0
- data/app/views/spree/api/taxons/show.v1.rabl +6 -0
- data/app/views/spree/api/taxons/taxons.v1.rabl +5 -0
- data/app/views/spree/api/transfer_items/show.v1.rabl +6 -0
- data/app/views/spree/api/users/index.v1.rabl +7 -0
- data/app/views/spree/api/users/new.v1.rabl +3 -0
- data/app/views/spree/api/users/show.v1.rabl +10 -0
- data/app/views/spree/api/variants/big.v1.rabl +17 -0
- data/app/views/spree/api/variants/index.v1.rabl +9 -0
- data/app/views/spree/api/variants/new.v1.rabl +2 -0
- data/app/views/spree/api/variants/show.v1.rabl +3 -0
- data/app/views/spree/api/variants/small.v1.rabl +17 -0
- data/app/views/spree/api/zones/index.v1.rabl +7 -0
- data/app/views/spree/api/zones/show.v1.rabl +6 -0
- data/config/initializers/metal_load_paths.rb +1 -0
- data/config/locales/en.yml +29 -0
- data/config/routes.rb +139 -0
- data/db/migrate/20100107141738_add_api_key_to_spree_users.rb +7 -0
- data/db/migrate/20120411123334_resize_api_key_field.rb +7 -0
- data/db/migrate/20120530054546_rename_api_key_to_spree_api_key.rb +7 -0
- data/db/migrate/20131017162334_add_index_to_user_spree_api_key.rb +7 -0
- data/lib/solidus_api.rb +1 -0
- data/lib/spree/api/engine.rb +38 -0
- data/lib/spree/api/responders/rabl_template.rb +31 -0
- data/lib/spree/api/responders.rb +11 -0
- data/lib/spree/api/testing_support/caching.rb +10 -0
- data/lib/spree/api/testing_support/helpers.rb +44 -0
- data/lib/spree/api/testing_support/setup.rb +16 -0
- data/lib/spree/api.rb +10 -0
- data/lib/spree_api.rb +3 -0
- data/script/rails +9 -0
- data/solidus_api.gemspec +21 -0
- data/spec/controllers/spree/api/addresses_controller_spec.rb +56 -0
- data/spec/controllers/spree/api/base_controller_spec.rb +164 -0
- data/spec/controllers/spree/api/checkouts_controller_spec.rb +386 -0
- data/spec/controllers/spree/api/classifications_controller_spec.rb +48 -0
- data/spec/controllers/spree/api/config_controller_spec.rb +23 -0
- data/spec/controllers/spree/api/countries_controller_spec.rb +48 -0
- data/spec/controllers/spree/api/credit_cards_controller_spec.rb +80 -0
- data/spec/controllers/spree/api/images_controller_spec.rb +93 -0
- data/spec/controllers/spree/api/inventory_units_controller_spec.rb +50 -0
- data/spec/controllers/spree/api/line_items_controller_spec.rb +186 -0
- data/spec/controllers/spree/api/option_types_controller_spec.rb +116 -0
- data/spec/controllers/spree/api/option_values_controller_spec.rb +135 -0
- data/spec/controllers/spree/api/orders_controller_spec.rb +759 -0
- data/spec/controllers/spree/api/payments_controller_spec.rb +254 -0
- data/spec/controllers/spree/api/product_properties_controller_spec.rb +116 -0
- data/spec/controllers/spree/api/products_controller_spec.rb +454 -0
- data/spec/controllers/spree/api/promotion_application_spec.rb +50 -0
- data/spec/controllers/spree/api/promotions_controller_spec.rb +64 -0
- data/spec/controllers/spree/api/properties_controller_spec.rb +102 -0
- data/spec/controllers/spree/api/return_authorizations_controller_spec.rb +173 -0
- data/spec/controllers/spree/api/shipments_controller_spec.rb +252 -0
- data/spec/controllers/spree/api/states_controller_spec.rb +82 -0
- data/spec/controllers/spree/api/stock_items_controller_spec.rb +307 -0
- data/spec/controllers/spree/api/stock_locations_controller_spec.rb +172 -0
- data/spec/controllers/spree/api/stock_movements_controller_spec.rb +84 -0
- data/spec/controllers/spree/api/stock_transfers_controller_spec.rb +83 -0
- data/spec/controllers/spree/api/store_credit_events_controller_spec.rb +68 -0
- data/spec/controllers/spree/api/stores_controller_spec.rb +133 -0
- data/spec/controllers/spree/api/taxonomies_controller_spec.rb +114 -0
- data/spec/controllers/spree/api/taxons_controller_spec.rb +177 -0
- data/spec/controllers/spree/api/transfer_items_controller_spec.rb +152 -0
- data/spec/controllers/spree/api/unauthenticated_products_controller_spec.rb +26 -0
- data/spec/controllers/spree/api/users_controller_spec.rb +153 -0
- data/spec/controllers/spree/api/variants_controller_spec.rb +235 -0
- data/spec/controllers/spree/api/zones_controller_spec.rb +115 -0
- data/spec/features/checkout_spec.rb +187 -0
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/models/spree/legacy_user_spec.rb +45 -0
- data/spec/requests/rabl_cache_spec.rb +32 -0
- data/spec/shared_examples/protect_product_actions.rb +17 -0
- data/spec/spec_helper.rb +60 -0
- data/spec/support/controller_hacks.rb +38 -0
- data/spec/support/database_cleaner.rb +14 -0
- data/spec/support/have_attributes_matcher.rb +13 -0
- metadata +334 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
object false
|
|
2
|
+
node(:count) { @variants.count }
|
|
3
|
+
node(:total_count) { @variants.total_count }
|
|
4
|
+
node(:current_page) { params[:page] ? params[:page].to_i : 1 }
|
|
5
|
+
node(:pages) { @variants.num_pages }
|
|
6
|
+
|
|
7
|
+
child(@variants => :variants) do
|
|
8
|
+
extends "spree/api/variants/big"
|
|
9
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
cache [I18n.locale, @current_user_roles.include?('admin'), 'small_variant', root_object]
|
|
2
|
+
|
|
3
|
+
attributes *variant_attributes
|
|
4
|
+
|
|
5
|
+
node(:display_price) { |p| p.display_price.to_s }
|
|
6
|
+
node(:options_text) { |v| v.options_text }
|
|
7
|
+
node(:track_inventory) { |v| v.should_track_inventory? }
|
|
8
|
+
node(:in_stock) { |v| v.in_stock? }
|
|
9
|
+
node(:is_backorderable) { |v| v.is_backorderable? }
|
|
10
|
+
node(:total_on_hand) { |v| v.total_on_hand }
|
|
11
|
+
node(:is_destroyed) { |v| v.destroyed? }
|
|
12
|
+
|
|
13
|
+
child :option_values => :option_values do
|
|
14
|
+
attributes *option_value_attributes
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
child(:images => :images) { extends "spree/api/images/show" }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Spree::Api::BaseController.append_view_path(ApplicationController.view_paths)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
en:
|
|
2
|
+
spree:
|
|
3
|
+
api:
|
|
4
|
+
must_specify_api_key: "You must specify an API key."
|
|
5
|
+
invalid_api_key: "Invalid API key (%{key}) specified."
|
|
6
|
+
unauthorized: "You are not authorized to perform that action."
|
|
7
|
+
invalid_resource: "Invalid resource. Please fix errors and try again."
|
|
8
|
+
resource_not_found: "The resource you were looking for could not be found."
|
|
9
|
+
gateway_error: "There was a problem with the payment gateway: %{text}"
|
|
10
|
+
access: "API Access"
|
|
11
|
+
key: "Key"
|
|
12
|
+
clear_key: "Clear key"
|
|
13
|
+
regenerate_key: "Regenerate Key"
|
|
14
|
+
no_key: "No key"
|
|
15
|
+
generate_key: "Generate API key"
|
|
16
|
+
key_generated: "Key generated"
|
|
17
|
+
key_cleared: "Key cleared"
|
|
18
|
+
order:
|
|
19
|
+
could_not_transition: "The order could not be transitioned. Please fix the errors and try again."
|
|
20
|
+
invalid_shipping_method: "Invalid shipping method specified."
|
|
21
|
+
expected_total_mismatch: "Expected total does not match actual total."
|
|
22
|
+
quantity_is_not_available: "Quantity is not available for items in your order"
|
|
23
|
+
payment:
|
|
24
|
+
credit_over_limit: "This payment can only be credited up to %{limit}. Please specify an amount less than or equal to this number."
|
|
25
|
+
update_forbidden: "This payment cannot be updated because it is %{state}."
|
|
26
|
+
shipment:
|
|
27
|
+
cannot_ready: "Cannot ready shipment."
|
|
28
|
+
stock_location_required: "A stock_location_id parameter must be provided in order to retrieve stock movements."
|
|
29
|
+
invalid_taxonomy_id: "Invalid taxonomy id."
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
Spree::Core::Engine.add_routes do
|
|
2
|
+
namespace :admin do
|
|
3
|
+
resources :users do
|
|
4
|
+
member do
|
|
5
|
+
put :generate_api_key
|
|
6
|
+
put :clear_api_key
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
namespace :api, defaults: { format: 'json' } do
|
|
12
|
+
resources :promotions, only: [:show]
|
|
13
|
+
|
|
14
|
+
resources :products do
|
|
15
|
+
resources :images
|
|
16
|
+
resources :variants
|
|
17
|
+
resources :product_properties
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
concern :order_routes do
|
|
21
|
+
member do
|
|
22
|
+
put :cancel
|
|
23
|
+
put :empty
|
|
24
|
+
put :apply_coupon_code
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
resources :line_items
|
|
28
|
+
resources :payments do
|
|
29
|
+
member do
|
|
30
|
+
put :authorize
|
|
31
|
+
put :capture
|
|
32
|
+
put :purchase
|
|
33
|
+
put :void
|
|
34
|
+
put :credit
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
resources :addresses, only: [:show, :update]
|
|
39
|
+
|
|
40
|
+
resources :return_authorizations do
|
|
41
|
+
member do
|
|
42
|
+
put :add
|
|
43
|
+
put :cancel
|
|
44
|
+
put :receive
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
resources :checkouts, only: [:update], concerns: :order_routes do
|
|
50
|
+
member do
|
|
51
|
+
put :next
|
|
52
|
+
put :advance
|
|
53
|
+
put :complete
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
resources :variants do
|
|
58
|
+
resources :images
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
resources :option_types do
|
|
62
|
+
resources :option_values
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
resources :option_values, only: :index
|
|
66
|
+
get '/orders/mine', to: 'orders#mine', as: 'my_orders'
|
|
67
|
+
get "/orders/current", to: "orders#current", as: "current_order"
|
|
68
|
+
|
|
69
|
+
resources :orders, concerns: :order_routes
|
|
70
|
+
|
|
71
|
+
resources :zones
|
|
72
|
+
resources :countries, only: [:index, :show] do
|
|
73
|
+
resources :states, only: [:index, :show]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
resources :shipments, only: [:create, :update] do
|
|
77
|
+
collection do
|
|
78
|
+
post 'transfer_to_location'
|
|
79
|
+
post 'transfer_to_shipment'
|
|
80
|
+
get :mine
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
member do
|
|
84
|
+
put :ready
|
|
85
|
+
put :ship
|
|
86
|
+
put :add
|
|
87
|
+
put :remove
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
resources :states, only: [:index, :show]
|
|
91
|
+
|
|
92
|
+
resources :taxonomies do
|
|
93
|
+
member do
|
|
94
|
+
get :jstree
|
|
95
|
+
end
|
|
96
|
+
resources :taxons do
|
|
97
|
+
member do
|
|
98
|
+
get :jstree
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
resources :taxons, only: [:index]
|
|
104
|
+
|
|
105
|
+
resources :inventory_units, only: [:show, :update]
|
|
106
|
+
|
|
107
|
+
resources :users do
|
|
108
|
+
resources :credit_cards, only: [:index]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
resources :properties
|
|
112
|
+
resources :stock_locations do
|
|
113
|
+
resources :stock_movements
|
|
114
|
+
resources :stock_items
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
resources :stock_items, only: [:index, :update, :destroy]
|
|
118
|
+
|
|
119
|
+
resources :stock_transfers, only: [] do
|
|
120
|
+
member do
|
|
121
|
+
post :receive
|
|
122
|
+
end
|
|
123
|
+
resources :transfer_items, only: [:create, :update, :destroy]
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
resources :stores
|
|
127
|
+
|
|
128
|
+
resources :store_credit_events, only: [] do
|
|
129
|
+
collection do
|
|
130
|
+
get :mine
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
get '/config/money', to: 'config#money'
|
|
135
|
+
get '/config', to: 'config#show'
|
|
136
|
+
put '/classifications', to: 'classifications#update', as: :classifications
|
|
137
|
+
get '/taxons/products', to: 'taxons#products', as: :taxon_products
|
|
138
|
+
end
|
|
139
|
+
end
|
data/lib/solidus_api.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'spree_api'
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'rails/engine'
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Api
|
|
5
|
+
class Engine < Rails::Engine
|
|
6
|
+
isolate_namespace Spree
|
|
7
|
+
engine_name 'spree_api'
|
|
8
|
+
|
|
9
|
+
Rabl.configure do |config|
|
|
10
|
+
config.include_json_root = false
|
|
11
|
+
config.include_child_root = false
|
|
12
|
+
|
|
13
|
+
# Motivation here it make it call as_json when rendering timestamps
|
|
14
|
+
# and therefore display miliseconds. Otherwise it would fall to
|
|
15
|
+
# JSON.dump which doesn't display the miliseconds
|
|
16
|
+
config.json_engine = ActiveSupport::JSON
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
config.view_versions = [1]
|
|
20
|
+
config.view_version_extraction_strategy = :http_header
|
|
21
|
+
|
|
22
|
+
initializer "spree.api.environment", :before => :load_config_initializers do |app|
|
|
23
|
+
Spree::Api::Config = Spree::ApiConfiguration.new
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.activate
|
|
27
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../../../app/**/*_decorator*.rb")) do |c|
|
|
28
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
config.to_prepare &method(:activate).to_proc
|
|
32
|
+
|
|
33
|
+
def self.root
|
|
34
|
+
@root ||= Pathname.new(File.expand_path('../../../../', __FILE__))
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module Responders
|
|
4
|
+
module RablTemplate
|
|
5
|
+
def to_format
|
|
6
|
+
if template
|
|
7
|
+
render template, :status => options[:status] || 200
|
|
8
|
+
else
|
|
9
|
+
super
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
rescue ActionView::MissingTemplate
|
|
13
|
+
api_behavior
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def template
|
|
17
|
+
request.headers['X-Spree-Template'] || controller.params[:template] || options[:default_template]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def api_behavior
|
|
21
|
+
if controller.params[:action] == "destroy"
|
|
22
|
+
# Render a blank template
|
|
23
|
+
super
|
|
24
|
+
else
|
|
25
|
+
# Do nothing and fallback to the default template
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module TestingSupport
|
|
4
|
+
module Helpers
|
|
5
|
+
def json_response
|
|
6
|
+
case body = JSON.parse(response.body)
|
|
7
|
+
when Hash
|
|
8
|
+
body.with_indifferent_access
|
|
9
|
+
when Array
|
|
10
|
+
body
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def assert_not_found!
|
|
15
|
+
expect(json_response).to eq({ "error" => "The resource you were looking for could not be found." })
|
|
16
|
+
expect(response.status).to eq 404
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def assert_unauthorized!
|
|
20
|
+
expect(json_response).to eq({ "error" => "You are not authorized to perform that action." })
|
|
21
|
+
expect(response.status).to eq 401
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def stub_authentication!
|
|
25
|
+
allow(Spree.user_class).to receive(:find_by).with(hash_including(:spree_api_key)) { current_api_user }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# This method can be overriden (with a let block) inside a context
|
|
29
|
+
# For instance, if you wanted to have an admin user instead.
|
|
30
|
+
def current_api_user
|
|
31
|
+
@current_api_user ||= stub_model(Spree::LegacyUser, email: "spree@example.com")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def image(filename)
|
|
35
|
+
File.open(Spree::Api::Engine.root + "spec/fixtures" + filename)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def upload_image(filename)
|
|
39
|
+
fixture_file_upload(image(filename).path, 'image/jpg')
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module TestingSupport
|
|
4
|
+
module Setup
|
|
5
|
+
def sign_in_as_admin!
|
|
6
|
+
let!(:current_api_user) do
|
|
7
|
+
user = stub_model(Spree::LegacyUser)
|
|
8
|
+
allow(user).to receive_message_chain(:spree_roles, :pluck).and_return(["admin"])
|
|
9
|
+
allow(user).to receive(:has_spree_role?).with("admin").and_return(true)
|
|
10
|
+
user
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
data/lib/spree/api.rb
ADDED
data/lib/spree_api.rb
ADDED
data/script/rails
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
|
3
|
+
|
|
4
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
|
5
|
+
ENGINE_PATH = File.expand_path('../../lib/spree/api/engine', __FILE__)
|
|
6
|
+
|
|
7
|
+
require 'rails/all'
|
|
8
|
+
require 'rails/engine/commands'
|
|
9
|
+
|
data/solidus_api.gemspec
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
version = File.read(File.expand_path("../../SOLIDUS_VERSION", __FILE__)).strip
|
|
3
|
+
|
|
4
|
+
Gem::Specification.new do |gem|
|
|
5
|
+
gem.author = 'Solidus Team'
|
|
6
|
+
gem.email = 'contact@solidus.io'
|
|
7
|
+
gem.description = %q{Spree's API}
|
|
8
|
+
gem.summary = %q{Spree's API}
|
|
9
|
+
gem.homepage = ""
|
|
10
|
+
|
|
11
|
+
gem.files = `git ls-files`.split($\)
|
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
14
|
+
gem.name = "solidus_api"
|
|
15
|
+
gem.require_paths = ["lib"]
|
|
16
|
+
gem.version = version
|
|
17
|
+
|
|
18
|
+
gem.add_dependency 'solidus_core', version
|
|
19
|
+
gem.add_dependency 'rabl', ['>= 0.9.4.pre1', '< 0.12.0']
|
|
20
|
+
gem.add_dependency 'versioncake', '~> 2.3.1'
|
|
21
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
describe Api::AddressesController, :type => :controller do
|
|
5
|
+
render_views
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
stub_authentication!
|
|
9
|
+
@address = create(:address)
|
|
10
|
+
@order = create(:order, :bill_address => @address)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context "with their own address" do
|
|
14
|
+
before do
|
|
15
|
+
allow_any_instance_of(Order).to receive_messages :user => current_api_user
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "gets an address" do
|
|
19
|
+
api_get :show, :id => @address.id, :order_id => @order.number
|
|
20
|
+
expect(json_response['address1']).to eq @address.address1
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "updates an address" do
|
|
24
|
+
api_put :update, :id => @address.id, :order_id => @order.number,
|
|
25
|
+
:address => { :address1 => "123 Test Lane" }
|
|
26
|
+
expect(json_response['address1']).to eq '123 Test Lane'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "receives the errors object if address is invalid" do
|
|
30
|
+
api_put :update, :id => @address.id, :order_id => @order.number,
|
|
31
|
+
:address => { :address1 => "" }
|
|
32
|
+
|
|
33
|
+
expect(json_response['error']).not_to be_nil
|
|
34
|
+
expect(json_response['errors']).not_to be_nil
|
|
35
|
+
expect(json_response['errors']['address1'].first).to eq "can't be blank"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context "on an address that does not belong to this order" do
|
|
40
|
+
before do
|
|
41
|
+
@order.bill_address_id = nil
|
|
42
|
+
@order.ship_address = nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "cannot retrieve address information" do
|
|
46
|
+
api_get :show, :id => @address.id, :order_id => @order.number
|
|
47
|
+
assert_unauthorized!
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "cannot update address information" do
|
|
51
|
+
api_get :update, :id => @address.id, :order_id => @order.number
|
|
52
|
+
assert_unauthorized!
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|