solidus_api 2.9.6 → 2.10.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +35 -2
- data/app/controllers/spree/api/addresses_controller.rb +1 -1
- data/app/controllers/spree/api/base_controller.rb +10 -10
- data/app/controllers/spree/api/checkouts_controller.rb +4 -4
- data/app/controllers/spree/api/credit_cards_controller.rb +1 -1
- data/app/controllers/spree/api/images_controller.rb +1 -1
- data/app/controllers/spree/api/inventory_units_controller.rb +1 -1
- data/app/controllers/spree/api/option_types_controller.rb +1 -1
- data/app/controllers/spree/api/option_values_controller.rb +1 -1
- data/app/controllers/spree/api/orders_controller.rb +10 -5
- data/app/controllers/spree/api/payments_controller.rb +1 -1
- data/app/controllers/spree/api/product_properties_controller.rb +1 -1
- data/app/controllers/spree/api/properties_controller.rb +1 -1
- data/app/controllers/spree/api/resource_controller.rb +1 -1
- data/app/controllers/spree/api/return_authorizations_controller.rb +1 -1
- data/app/controllers/spree/api/shipments_controller.rb +1 -1
- data/app/controllers/spree/api/stock_items_controller.rb +1 -1
- data/app/controllers/spree/api/stock_locations_controller.rb +1 -1
- data/app/controllers/spree/api/stores_controller.rb +1 -1
- data/app/controllers/spree/api/taxonomies_controller.rb +4 -2
- data/app/controllers/spree/api/taxons_controller.rb +1 -1
- data/app/controllers/spree/api/variants_controller.rb +1 -1
- data/app/controllers/spree/api/zones_controller.rb +1 -1
- data/app/helpers/spree/api/api_helpers.rb +2 -2
- data/app/views/spree/api/images/_image.json.jbuilder +2 -2
- data/app/views/spree/api/orders/_order.json.jbuilder +1 -1
- data/app/views/spree/api/shared/_pagination.json.jbuilder +1 -1
- data/lib/spree/api.rb +0 -7
- data/lib/spree/api/config.rb +9 -0
- data/lib/spree/api/engine.rb +4 -4
- data/lib/spree/api/responders.rb +3 -2
- data/lib/spree/api/responders/{rabl_template.rb → jbuilder_template.rb} +3 -1
- data/{app/models → lib}/spree/api_configuration.rb +0 -0
- data/openapi/.stoplight.yml +7 -0
- data/openapi/api.oas2.yml +6108 -0
- data/openapi/authentication.md +25 -0
- data/openapi/checkout-flow.md +50 -0
- data/openapi/errors.md +3 -0
- data/openapi/lint.yml +1 -0
- data/openapi/main.hub.yml +65 -0
- data/openapi/pagination.md +7 -0
- data/openapi/theme.css +0 -0
- data/solidus_api.gemspec +1 -1
- data/spec/controllers/spree/api/resource_controller_spec.rb +4 -4
- data/spec/lib/spree_api_responders_spec.rb +10 -0
- data/spec/requests/api/address_books_spec.rb +2 -2
- data/spec/requests/{rabl_cache_spec.rb → jbuilder_cache_spec.rb} +2 -2
- data/spec/requests/spree/api/checkouts_controller_spec.rb +2 -2
- data/spec/requests/spree/api/classifications_controller_spec.rb +1 -1
- data/spec/requests/spree/api/option_types_controller_spec.rb +2 -2
- data/spec/requests/spree/api/option_values_controller_spec.rb +2 -2
- data/spec/requests/spree/api/orders_controller_spec.rb +15 -15
- data/spec/requests/spree/api/payments_controller_spec.rb +3 -3
- data/spec/requests/spree/api/products_controller_spec.rb +6 -6
- data/spec/requests/spree/api/stock_items_controller_spec.rb +5 -5
- data/spec/requests/spree/api/stock_locations_controller_spec.rb +4 -4
- data/spec/requests/spree/api/taxons_controller_spec.rb +2 -2
- metadata +25 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c84c03d908227e7072721b7a0a268e296c85606bd4b8f08dc538e052e6d8393
|
4
|
+
data.tar.gz: 3d4dcc56d49982aa91a6f73d86ac9ed6db4689c4e9b8a5e3fdfe846b91f94c57
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 820e2d062e1ef2799bb70d5e67a25913ea0bfd0369a7934e6d22fe986a92a769b9a9b647f44f29842d34dec0f75988cf4172cf2ea5f41e30e2c866998718f45c
|
7
|
+
data.tar.gz: d53e4197d27d38b015146a71566a42b2e916134647fc4017ebdd123144bfd721b09897f40e67816d643d1f5fc2d1db2c1c074a35576a32d061fb3998c92aede1
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# solidus_api
|
2
2
|
|
3
|
-
API contains the controllers and
|
3
|
+
API contains the controllers and Jbuilder views implementing the REST API of
|
4
|
+
Solidus.
|
4
5
|
|
5
6
|
## Testing
|
6
7
|
|
@@ -9,3 +10,35 @@ Run the API tests:
|
|
9
10
|
```bash
|
10
11
|
bundle exec rspec
|
11
12
|
```
|
13
|
+
|
14
|
+
## Documentation
|
15
|
+
|
16
|
+
The API documentation is in the [openapi][docs-dir] directory. It follows the
|
17
|
+
OpenAPI specification and it is hosted on [Stoplight Docs][live-docs].
|
18
|
+
|
19
|
+
If you want to contribute, you can use [Stoplight Studio][studio]. Simply
|
20
|
+
follow these steps:
|
21
|
+
|
22
|
+
1. Create a new Stoplight Studio project
|
23
|
+
2. Copy-paste the content of `openapi/api.oas2.yml` into your project
|
24
|
+
3. Edit the endpoints and models as needed
|
25
|
+
4. Copy-paste the result back into `openapi/api.oas2.yml`
|
26
|
+
5. Open a PR!
|
27
|
+
|
28
|
+
**Note: Only use embedded models in Stoplight Studio, as Stoplight Docs is
|
29
|
+
not compatible with externally-defined models!**
|
30
|
+
|
31
|
+
CircleCI automatically syncs our Git repo with Stoplight Docs when a PR is
|
32
|
+
merged, and automatically publishes a new version on Docs when a new Solidus
|
33
|
+
version is released.
|
34
|
+
|
35
|
+
## Related projects
|
36
|
+
|
37
|
+
- [solidus-sdk](https://gitlab.com/deseretbook/packages/solidus-sdk): created
|
38
|
+
by Joel Saupe at [Deseret Book](https://deseretbook.com/), this is a JS SDK
|
39
|
+
that allows you to use the Solidus API. It even supports plug-ins, so you can
|
40
|
+
easily extend it with the endpoints provided by your Solidus extensions!
|
41
|
+
|
42
|
+
[docs-dir]: https://github.com/solidusio/solidus/tree/master/api/openapi
|
43
|
+
[live-docs]: https://solidus.docs.stoplight.io
|
44
|
+
[studio]: https://stoplight.io/p/studio
|
@@ -15,7 +15,7 @@ module Spree
|
|
15
15
|
authorize! :update, @order, order_token
|
16
16
|
find_address
|
17
17
|
|
18
|
-
if @order.
|
18
|
+
if @order.update({ "#{@order_source}_attributes" => address_params })
|
19
19
|
@address = @order.send(@order_source)
|
20
20
|
respond_with(@address, default_template: :show)
|
21
21
|
else
|
@@ -49,9 +49,9 @@ module Spree
|
|
49
49
|
def authenticate_user
|
50
50
|
unless @current_api_user
|
51
51
|
if requires_authentication? && api_key.blank? && order_token.blank?
|
52
|
-
render "spree/api/errors/must_specify_api_key", status:
|
52
|
+
render "spree/api/errors/must_specify_api_key", status: :unauthorized
|
53
53
|
elsif order_token.blank? && (requires_authentication? || api_key.present?)
|
54
|
-
render "spree/api/errors/invalid_api_key", status:
|
54
|
+
render "spree/api/errors/invalid_api_key", status: :unauthorized
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -65,7 +65,7 @@ module Spree
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def unauthorized
|
68
|
-
render "spree/api/errors/unauthorized", status:
|
68
|
+
render "spree/api/errors/unauthorized", status: :unauthorized
|
69
69
|
end
|
70
70
|
|
71
71
|
def gateway_error(exception)
|
@@ -78,7 +78,7 @@ module Spree
|
|
78
78
|
exception: exception.message,
|
79
79
|
error: exception.message,
|
80
80
|
missing_param: exception.param
|
81
|
-
}, status:
|
81
|
+
}, status: :unprocessable_entity
|
82
82
|
end
|
83
83
|
|
84
84
|
def requires_authentication?
|
@@ -86,7 +86,7 @@ module Spree
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def not_found
|
89
|
-
render "spree/api/errors/not_found", status:
|
89
|
+
render "spree/api/errors/not_found", status: :not_found
|
90
90
|
end
|
91
91
|
|
92
92
|
def current_ability
|
@@ -96,7 +96,7 @@ module Spree
|
|
96
96
|
def invalid_resource!(resource)
|
97
97
|
Rails.logger.error "invalid_resouce_errors=#{resource.errors.full_messages}"
|
98
98
|
@resource = resource
|
99
|
-
render "spree/api/errors/invalid_resource", status:
|
99
|
+
render "spree/api/errors/invalid_resource", status: :unprocessable_entity
|
100
100
|
end
|
101
101
|
|
102
102
|
def api_key
|
@@ -112,7 +112,7 @@ module Spree
|
|
112
112
|
|
113
113
|
def spree_token
|
114
114
|
token = request.headers["X-Spree-Token"]
|
115
|
-
return
|
115
|
+
return if token.blank?
|
116
116
|
|
117
117
|
Spree::Deprecation.warn(
|
118
118
|
'The custom X-Spree-Token request header is deprecated and will be removed in the next release.' \
|
@@ -164,8 +164,8 @@ module Spree
|
|
164
164
|
|
165
165
|
def lock_order
|
166
166
|
OrderMutex.with_lock!(@order) { yield }
|
167
|
-
rescue Spree::OrderMutex::LockFailed =>
|
168
|
-
render plain:
|
167
|
+
rescue Spree::OrderMutex::LockFailed => error
|
168
|
+
render plain: error.message, status: :conflict
|
169
169
|
end
|
170
170
|
|
171
171
|
def insufficient_stock_error(exception)
|
@@ -175,7 +175,7 @@ module Spree
|
|
175
175
|
errors: [I18n.t(:quantity_is_not_available, scope: "spree.api.order")],
|
176
176
|
type: 'insufficient_stock'
|
177
177
|
},
|
178
|
-
status:
|
178
|
+
status: :unprocessable_entity
|
179
179
|
)
|
180
180
|
end
|
181
181
|
|
@@ -23,8 +23,8 @@ module Spree
|
|
23
23
|
authorize! :update, @order, order_token
|
24
24
|
@order.next!
|
25
25
|
respond_with(@order, default_template: 'spree/api/orders/show', status: 200)
|
26
|
-
rescue StateMachines::InvalidTransition =>
|
27
|
-
logger.error("invalid_transition #{
|
26
|
+
rescue StateMachines::InvalidTransition => error
|
27
|
+
logger.error("invalid_transition #{error.event} from #{error.from} for #{error.object.class.name}. Error: #{error.inspect}")
|
28
28
|
respond_with(@order, default_template: 'spree/api/orders/could_not_transition', status: 422)
|
29
29
|
end
|
30
30
|
|
@@ -42,8 +42,8 @@ module Spree
|
|
42
42
|
@order.complete!
|
43
43
|
respond_with(@order, default_template: 'spree/api/orders/show', status: 200)
|
44
44
|
end
|
45
|
-
rescue StateMachines::InvalidTransition =>
|
46
|
-
logger.error("invalid_transition #{
|
45
|
+
rescue StateMachines::InvalidTransition => error
|
46
|
+
logger.error("invalid_transition #{error.event} from #{error.from} for #{error.object.class.name}. Error: #{error.inspect}")
|
47
47
|
respond_with(@order, default_template: 'spree/api/orders/could_not_transition', status: 422)
|
48
48
|
end
|
49
49
|
|
@@ -29,7 +29,7 @@ module Spree
|
|
29
29
|
|
30
30
|
def update
|
31
31
|
@option_type = Spree::OptionType.accessible_by(current_ability, :update).find(params[:id])
|
32
|
-
if @option_type.
|
32
|
+
if @option_type.update(option_type_params)
|
33
33
|
render :show
|
34
34
|
else
|
35
35
|
invalid_resource!(@option_type)
|
@@ -29,7 +29,7 @@ module Spree
|
|
29
29
|
|
30
30
|
def update
|
31
31
|
@option_value = scope.accessible_by(current_ability, :update).find(params[:id])
|
32
|
-
if @option_value.
|
32
|
+
if @option_value.update(option_value_params)
|
33
33
|
render :show
|
34
34
|
else
|
35
35
|
invalid_resource!(@option_value)
|
@@ -55,10 +55,9 @@ module Spree
|
|
55
55
|
def index
|
56
56
|
authorize! :index, Order
|
57
57
|
orders_includes = [
|
58
|
-
:
|
59
|
-
:
|
60
|
-
:
|
61
|
-
:line_items
|
58
|
+
{ user: :store_credits },
|
59
|
+
:line_items,
|
60
|
+
:valid_store_credit_payments
|
62
61
|
]
|
63
62
|
@orders = paginate(
|
64
63
|
Spree::Order
|
@@ -174,7 +173,13 @@ module Spree
|
|
174
173
|
end
|
175
174
|
|
176
175
|
def find_order(_lock = false)
|
177
|
-
@order = Spree::Order.
|
176
|
+
@order = Spree::Order.
|
177
|
+
includes(line_items: [:adjustments, { variant: :images }],
|
178
|
+
payments: :payment_method,
|
179
|
+
shipments: {
|
180
|
+
shipping_rates: { shipping_method: :zones, taxes: :tax_rate }
|
181
|
+
}).
|
182
|
+
find_by!(number: params[:id])
|
178
183
|
end
|
179
184
|
|
180
185
|
def order_id
|
@@ -31,7 +31,7 @@ module Spree
|
|
31
31
|
authorize! params[:action], @payment
|
32
32
|
if !@payment.pending?
|
33
33
|
render 'update_forbidden', status: 403
|
34
|
-
elsif @payment.
|
34
|
+
elsif @payment.update(payment_params)
|
35
35
|
respond_with(@payment, default_template: :show)
|
36
36
|
else
|
37
37
|
invalid_resource!(@payment)
|
@@ -38,7 +38,7 @@ module Spree
|
|
38
38
|
def update
|
39
39
|
if @product_property
|
40
40
|
authorize! :update, @product_property
|
41
|
-
@product_property.
|
41
|
+
@product_property.update(product_property_params)
|
42
42
|
respond_with(@product_property, status: 200, default_template: :show)
|
43
43
|
else
|
44
44
|
invalid_resource!(@product_property)
|
@@ -39,7 +39,7 @@ module Spree
|
|
39
39
|
def update
|
40
40
|
if @property
|
41
41
|
authorize! :update, @property
|
42
|
-
@property.
|
42
|
+
@property.update(property_params)
|
43
43
|
respond_with(@property, status: 200, default_template: :show)
|
44
44
|
else
|
45
45
|
invalid_resource!(@property)
|
@@ -43,7 +43,7 @@ class Spree::Api::ResourceController < Spree::Api::BaseController
|
|
43
43
|
def update
|
44
44
|
authorize! :update, @object
|
45
45
|
|
46
|
-
if @object.
|
46
|
+
if @object.update(permitted_resource_params)
|
47
47
|
respond_with(@object, status: 200, default_template: :show)
|
48
48
|
else
|
49
49
|
invalid_resource!(@object)
|
@@ -50,7 +50,7 @@ module Spree
|
|
50
50
|
|
51
51
|
def update
|
52
52
|
@return_authorization = @order.return_authorizations.accessible_by(current_ability, :update).find(params[:id])
|
53
|
-
if @return_authorization.
|
53
|
+
if @return_authorization.update(return_authorization_params)
|
54
54
|
respond_with(@return_authorization, default_template: :show)
|
55
55
|
else
|
56
56
|
invalid_resource!(@return_authorization)
|
@@ -40,7 +40,7 @@ module Spree
|
|
40
40
|
adjustment -= @stock_item.count_on_hand if params[:stock_item][:force]
|
41
41
|
|
42
42
|
Spree::StockItem.transaction do
|
43
|
-
if @stock_item.
|
43
|
+
if @stock_item.update(stock_item_params)
|
44
44
|
adjust_stock_item_count_on_hand(adjustment)
|
45
45
|
respond_with(@stock_item, status: 200, default_template: :show)
|
46
46
|
else
|
@@ -33,7 +33,7 @@ module Spree
|
|
33
33
|
|
34
34
|
def update
|
35
35
|
authorize! :update, stock_location
|
36
|
-
if stock_location.
|
36
|
+
if stock_location.update(stock_location_params)
|
37
37
|
respond_with(stock_location, status: 200, default_template: :show)
|
38
38
|
else
|
39
39
|
invalid_resource!(stock_location)
|
@@ -33,7 +33,7 @@ module Spree
|
|
33
33
|
|
34
34
|
def update
|
35
35
|
authorize! :update, taxonomy
|
36
|
-
if taxonomy.
|
36
|
+
if taxonomy.update(taxonomy_params)
|
37
37
|
respond_with(taxonomy, status: 200, default_template: :show)
|
38
38
|
else
|
39
39
|
invalid_resource!(taxonomy)
|
@@ -58,7 +58,9 @@ module Spree
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def taxonomy
|
61
|
-
@taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :read).
|
61
|
+
@taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :read).
|
62
|
+
includes(root: :children).
|
63
|
+
find(params[:id])
|
62
64
|
end
|
63
65
|
|
64
66
|
def taxonomy_params
|
@@ -43,7 +43,7 @@ module Spree
|
|
43
43
|
|
44
44
|
def update
|
45
45
|
@variant = scope.accessible_by(current_ability, :update).find(params[:id])
|
46
|
-
if @variant.
|
46
|
+
if @variant.update(variant_params)
|
47
47
|
respond_with(@variant, status: 200, default_template: :show)
|
48
48
|
else
|
49
49
|
invalid_resource!(@product)
|
@@ -40,7 +40,7 @@ module Spree
|
|
40
40
|
|
41
41
|
def required_fields_for(model)
|
42
42
|
required_fields = model._validators.select do |_field, validations|
|
43
|
-
validations.any? { |
|
43
|
+
validations.any? { |validation| validation.is_a?(ActiveModel::Validations::PresenceValidator) }
|
44
44
|
end.map(&:first) # get fields that are invalid
|
45
45
|
# Permalinks presence is validated, but are really automatically generated
|
46
46
|
# Therefore we shouldn't tell API clients that they MUST send one through
|
@@ -177,7 +177,7 @@ module Spree
|
|
177
177
|
]
|
178
178
|
|
179
179
|
def variant_attributes
|
180
|
-
if @current_user_roles
|
180
|
+
if @current_user_roles&.include?("admin")
|
181
181
|
@@variant_attributes + [:cost_price]
|
182
182
|
else
|
183
183
|
@@variant_attributes
|
@@ -2,6 +2,6 @@
|
|
2
2
|
|
3
3
|
json.(image, *image_attributes)
|
4
4
|
json.(image, :viewable_type, :viewable_id)
|
5
|
-
Spree::Image.attachment_definitions[:attachment][:styles].each do |
|
6
|
-
json.set! "#{
|
5
|
+
Spree::Image.attachment_definitions[:attachment][:styles].each do |key, _value|
|
6
|
+
json.set! "#{key}_url", image.attachment.url(key)
|
7
7
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
json.cache! [I18n.locale, order] do
|
4
4
|
json.(order, *order_attributes)
|
5
5
|
json.display_item_total(order.display_item_total.to_s)
|
6
|
-
json.total_quantity(order.line_items.sum(
|
6
|
+
json.total_quantity(order.line_items.to_a.sum(&:quantity))
|
7
7
|
json.display_total(order.display_total.to_s)
|
8
8
|
json.display_ship_total(order.display_ship_total)
|
9
9
|
json.display_tax_total(order.display_tax_total)
|
data/lib/spree/api.rb
CHANGED