solidus_api 2.10.5 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/controllers/spree/api/addresses_controller.rb +1 -1
  4. data/app/controllers/spree/api/base_controller.rb +11 -3
  5. data/app/controllers/spree/api/checkouts_controller.rb +1 -11
  6. data/app/controllers/spree/api/countries_controller.rb +2 -2
  7. data/app/controllers/spree/api/credit_cards_controller.rb +2 -2
  8. data/app/controllers/spree/api/customer_returns_controller.rb +67 -0
  9. data/app/controllers/spree/api/images_controller.rb +4 -4
  10. data/app/controllers/spree/api/inventory_units_controller.rb +1 -1
  11. data/app/controllers/spree/api/option_types_controller.rb +3 -3
  12. data/app/controllers/spree/api/option_values_controller.rb +2 -2
  13. data/app/controllers/spree/api/orders_controller.rb +1 -1
  14. data/app/controllers/spree/api/payments_controller.rb +1 -1
  15. data/app/controllers/spree/api/product_properties_controller.rb +9 -14
  16. data/app/controllers/spree/api/promotions_controller.rb +3 -12
  17. data/app/controllers/spree/api/properties_controller.rb +3 -3
  18. data/app/controllers/spree/api/resource_controller.rb +2 -2
  19. data/app/controllers/spree/api/return_authorizations_controller.rb +3 -3
  20. data/app/controllers/spree/api/shipments_controller.rb +1 -1
  21. data/app/controllers/spree/api/states_controller.rb +3 -3
  22. data/app/controllers/spree/api/stock_items_controller.rb +2 -2
  23. data/app/controllers/spree/api/stock_locations_controller.rb +3 -3
  24. data/app/controllers/spree/api/stock_movements_controller.rb +3 -3
  25. data/app/controllers/spree/api/stores_controller.rb +3 -3
  26. data/app/controllers/spree/api/taxonomies_controller.rb +2 -2
  27. data/app/controllers/spree/api/taxons_controller.rb +4 -4
  28. data/app/controllers/spree/api/users_controller.rb +13 -0
  29. data/app/controllers/spree/api/variants_controller.rb +3 -3
  30. data/app/controllers/spree/api/zones_controller.rb +2 -2
  31. data/app/helpers/spree/api/api_helpers.rb +18 -5
  32. data/app/views/spree/api/customer_returns/index.json.jbuilder +6 -0
  33. data/app/views/spree/api/customer_returns/new.json.jbuilder +4 -0
  34. data/app/views/spree/api/customer_returns/show.json.jbuilder +3 -0
  35. data/app/views/spree/api/errors/could_not_transition.json.jbuilder +4 -0
  36. data/app/views/spree/api/orders/could_not_transition.json.jbuilder +5 -0
  37. data/config/locales/en.yml +2 -0
  38. data/config/routes.rb +6 -3
  39. data/lib/spree/api/testing_support/helpers.rb +1 -1
  40. data/openapi/authentication.md +9 -1
  41. data/openapi/checkout-flow.md +17 -4
  42. data/openapi/main.hub.yml +1 -1
  43. data/openapi/solidus-api.oas.yml +6753 -0
  44. data/solidus_api.gemspec +19 -19
  45. metadata +14 -114
  46. data/openapi/api.oas2.yml +0 -6108
  47. data/script/rails +0 -10
  48. data/spec/controllers/spree/api/base_controller_spec.rb +0 -118
  49. data/spec/controllers/spree/api/resource_controller_spec.rb +0 -190
  50. data/spec/features/checkout_spec.rb +0 -192
  51. data/spec/fixtures/thinking-cat.jpg +0 -0
  52. data/spec/lib/spree_api_responders_spec.rb +0 -10
  53. data/spec/models/spree/legacy_user_spec.rb +0 -103
  54. data/spec/requests/api/address_books_spec.rb +0 -240
  55. data/spec/requests/jbuilder_cache_spec.rb +0 -34
  56. data/spec/requests/ransackable_attributes_spec.rb +0 -79
  57. data/spec/requests/spree/api/addresses_controller_spec.rb +0 -57
  58. data/spec/requests/spree/api/checkouts_controller_spec.rb +0 -484
  59. data/spec/requests/spree/api/classifications_controller_spec.rb +0 -50
  60. data/spec/requests/spree/api/config_controller_spec.rb +0 -26
  61. data/spec/requests/spree/api/countries_controller_spec.rb +0 -48
  62. data/spec/requests/spree/api/coupon_codes_controller_spec.rb +0 -105
  63. data/spec/requests/spree/api/credit_cards_controller_spec.rb +0 -105
  64. data/spec/requests/spree/api/images_controller_spec.rb +0 -99
  65. data/spec/requests/spree/api/inventory_units_controller_spec.rb +0 -55
  66. data/spec/requests/spree/api/line_items_controller_spec.rb +0 -213
  67. data/spec/requests/spree/api/option_types_controller_spec.rb +0 -116
  68. data/spec/requests/spree/api/option_values_controller_spec.rb +0 -138
  69. data/spec/requests/spree/api/orders_controller_spec.rb +0 -954
  70. data/spec/requests/spree/api/payments_controller_spec.rb +0 -259
  71. data/spec/requests/spree/api/product_properties_controller_spec.rb +0 -114
  72. data/spec/requests/spree/api/products_controller_spec.rb +0 -422
  73. data/spec/requests/spree/api/promotion_application_spec.rb +0 -50
  74. data/spec/requests/spree/api/promotions_controller_spec.rb +0 -67
  75. data/spec/requests/spree/api/properties_controller_spec.rb +0 -102
  76. data/spec/requests/spree/api/return_authorizations_controller_spec.rb +0 -180
  77. data/spec/requests/spree/api/shipments_controller_spec.rb +0 -532
  78. data/spec/requests/spree/api/states_controller_spec.rb +0 -69
  79. data/spec/requests/spree/api/stock_items_controller_spec.rb +0 -311
  80. data/spec/requests/spree/api/stock_locations_controller_spec.rb +0 -170
  81. data/spec/requests/spree/api/stock_movements_controller_spec.rb +0 -81
  82. data/spec/requests/spree/api/store_credit_events_controller_spec.rb +0 -59
  83. data/spec/requests/spree/api/stores_controller_spec.rb +0 -134
  84. data/spec/requests/spree/api/taxonomies_controller_spec.rb +0 -114
  85. data/spec/requests/spree/api/taxons_controller_spec.rb +0 -217
  86. data/spec/requests/spree/api/unauthenticated_products_controller_spec.rb +0 -27
  87. data/spec/requests/spree/api/users_controller_spec.rb +0 -151
  88. data/spec/requests/spree/api/variants_controller_spec.rb +0 -340
  89. data/spec/requests/spree/api/zones_controller_spec.rb +0 -89
  90. data/spec/shared_examples/protect_product_actions.rb +0 -18
  91. data/spec/spec_helper.rb +0 -73
  92. data/spec/support/be_paginated_matcher.rb +0 -9
  93. data/spec/support/controller_hacks.rb +0 -43
  94. data/spec/support/database_cleaner.rb +0 -16
  95. data/spec/support/have_attributes_matcher.rb +0 -11
  96. data/spec/test_views/spree/api/widgets/_widget.json.jbuilder +0 -3
  97. data/spec/test_views/spree/api/widgets/index.json.jbuilder +0 -9
  98. data/spec/test_views/spree/api/widgets/new.json.jbuilder +0 -3
  99. data/spec/test_views/spree/api/widgets/show.json.jbuilder +0 -3
@@ -29,7 +29,7 @@ module Spree
29
29
 
30
30
  @return_authorizations = @order.
31
31
  return_authorizations.
32
- accessible_by(current_ability, :read).
32
+ accessible_by(current_ability).
33
33
  ransack(params[:q]).
34
34
  result
35
35
 
@@ -44,7 +44,7 @@ module Spree
44
44
 
45
45
  def show
46
46
  authorize! :admin, ReturnAuthorization
47
- @return_authorization = @order.return_authorizations.accessible_by(current_ability, :read).find(params[:id])
47
+ @return_authorization = @order.return_authorizations.accessible_by(current_ability, :show).find(params[:id])
48
48
  respond_with(@return_authorization)
49
49
  end
50
50
 
@@ -70,7 +70,7 @@ module Spree
70
70
 
71
71
  def load_order
72
72
  @order ||= Spree::Order.find_by!(number: order_id)
73
- authorize! :read, @order
73
+ authorize! :show, @order
74
74
  end
75
75
 
76
76
  def return_authorization_params
@@ -132,7 +132,7 @@ module Spree
132
132
 
133
133
  def find_order_on_create
134
134
  @order = Spree::Order.find_by!(number: params[:shipment][:order_id])
135
- authorize! :read, @order
135
+ authorize! :show, @order
136
136
  end
137
137
 
138
138
  def find_shipment
@@ -25,10 +25,10 @@ module Spree
25
25
 
26
26
  def scope
27
27
  if params[:country_id]
28
- @country = Spree::Country.accessible_by(current_ability, :read).find(params[:country_id])
29
- @country.states.accessible_by(current_ability, :read)
28
+ @country = Spree::Country.accessible_by(current_ability, :show).find(params[:country_id])
29
+ @country.states.accessible_by(current_ability)
30
30
  else
31
- Spree::State.accessible_by(current_ability, :read)
31
+ Spree::State.accessible_by(current_ability)
32
32
  end
33
33
  end
34
34
  end
@@ -58,12 +58,12 @@ module Spree
58
58
  private
59
59
 
60
60
  def load_stock_location
61
- @stock_location ||= Spree::StockLocation.accessible_by(current_ability).find(params.fetch(:stock_location_id))
61
+ @stock_location ||= Spree::StockLocation.accessible_by(current_ability, :show).find(params.fetch(:stock_location_id))
62
62
  end
63
63
 
64
64
  def scope
65
65
  includes = { variant: [{ option_values: :option_type }, :product] }
66
- @stock_location.stock_items.accessible_by(current_ability, :read).includes(includes)
66
+ @stock_location.stock_items.accessible_by(current_ability).includes(includes)
67
67
  end
68
68
 
69
69
  def stock_item_params
@@ -4,10 +4,10 @@ module Spree
4
4
  module Api
5
5
  class StockLocationsController < Spree::Api::BaseController
6
6
  def index
7
- authorize! :read, StockLocation
7
+ authorize! :index, StockLocation
8
8
 
9
9
  @stock_locations = StockLocation.
10
- accessible_by(current_ability, :read).
10
+ accessible_by(current_ability).
11
11
  order('name ASC').
12
12
  ransack(params[:q]).
13
13
  result
@@ -49,7 +49,7 @@ module Spree
49
49
  private
50
50
 
51
51
  def stock_location
52
- @stock_location ||= Spree::StockLocation.accessible_by(current_ability, :read).find(params[:id])
52
+ @stock_location ||= Spree::StockLocation.accessible_by(current_ability, :show).find(params[:id])
53
53
  end
54
54
 
55
55
  def stock_location_params
@@ -6,7 +6,7 @@ module Spree
6
6
  before_action :stock_location, except: [:update, :destroy]
7
7
 
8
8
  def index
9
- authorize! :read, StockMovement
9
+ authorize! :index, StockMovement
10
10
  @stock_movements = paginate(scope.ransack(params[:q]).result)
11
11
  respond_with(@stock_movements)
12
12
  end
@@ -29,11 +29,11 @@ module Spree
29
29
  private
30
30
 
31
31
  def stock_location
32
- @stock_location ||= Spree::StockLocation.accessible_by(current_ability, :read).find(params[:stock_location_id])
32
+ @stock_location ||= Spree::StockLocation.accessible_by(current_ability, :show).find(params[:stock_location_id])
33
33
  end
34
34
 
35
35
  def scope
36
- @stock_location.stock_movements.accessible_by(current_ability, :read)
36
+ @stock_location.stock_movements.accessible_by(current_ability)
37
37
  end
38
38
 
39
39
  def stock_movement_params
@@ -6,8 +6,8 @@ module Spree
6
6
  before_action :get_store, except: [:index, :create]
7
7
 
8
8
  def index
9
- authorize! :read, Store
10
- @stores = Spree::Store.accessible_by(current_ability, :read).all
9
+ authorize! :index, Store
10
+ @stores = Spree::Store.accessible_by(current_ability).all
11
11
  respond_with(@stores)
12
12
  end
13
13
 
@@ -32,7 +32,7 @@ module Spree
32
32
  end
33
33
 
34
34
  def show
35
- authorize! :read, @store
35
+ authorize! :show, @store
36
36
  respond_with(@store)
37
37
  end
38
38
 
@@ -50,7 +50,7 @@ module Spree
50
50
 
51
51
  def taxonomies
52
52
  @taxonomies = Taxonomy.
53
- accessible_by(current_ability, :read).
53
+ accessible_by(current_ability).
54
54
  order('name').
55
55
  includes(root: :children).
56
56
  ransack(params[:q]).
@@ -58,7 +58,7 @@ 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, :show).
62
62
  includes(root: :children).
63
63
  find(params[:id])
64
64
  end
@@ -7,9 +7,9 @@ module Spree
7
7
  if taxonomy
8
8
  @taxons = taxonomy.root.children
9
9
  elsif params[:ids]
10
- @taxons = Spree::Taxon.accessible_by(current_ability, :read).where(id: params[:ids].split(','))
10
+ @taxons = Spree::Taxon.accessible_by(current_ability).where(id: params[:ids].split(','))
11
11
  else
12
- @taxons = Spree::Taxon.accessible_by(current_ability, :read).order(:taxonomy_id, :lft).ransack(params[:q]).result
12
+ @taxons = Spree::Taxon.accessible_by(current_ability).order(:taxonomy_id, :lft).ransack(params[:q]).result
13
13
  end
14
14
 
15
15
  unless params[:without_children]
@@ -96,12 +96,12 @@ module Spree
96
96
 
97
97
  def taxonomy
98
98
  if params[:taxonomy_id].present?
99
- @taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :read).find(params[:taxonomy_id])
99
+ @taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :show).find(params[:taxonomy_id])
100
100
  end
101
101
  end
102
102
 
103
103
  def taxon
104
- @taxon ||= taxonomy.taxons.accessible_by(current_ability, :read).find(params[:id])
104
+ @taxon ||= taxonomy.taxons.accessible_by(current_ability, :show).find(params[:id])
105
105
  end
106
106
 
107
107
  def taxon_params
@@ -1,6 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Spree::Api::UsersController < Spree::Api::ResourceController
4
+ def index
5
+ user_scope = model_class.accessible_by(current_ability, :show)
6
+ if params[:ids]
7
+ ids = params[:ids].split(",").flatten
8
+ @users = user_scope.where(id: ids)
9
+ else
10
+ @users = user_scope.ransack(params[:q]).result
11
+ end
12
+
13
+ @users = paginate(@users.distinct)
14
+ respond_with(@users)
15
+ end
16
+
4
17
  private
5
18
 
6
19
  attr_reader :user
@@ -53,7 +53,7 @@ module Spree
53
53
  private
54
54
 
55
55
  def product
56
- @product ||= Spree::Product.accessible_by(current_ability, :read).friendly.find(params[:product_id]) if params[:product_id]
56
+ @product ||= Spree::Product.accessible_by(current_ability, :show).friendly.find(params[:product_id]) if params[:product_id]
57
57
  end
58
58
 
59
59
  def scope
@@ -64,12 +64,12 @@ module Spree
64
64
  end
65
65
 
66
66
  if current_ability.can?(:manage, Variant) && params[:show_deleted]
67
- variants = variants.with_deleted
67
+ variants = variants.with_discarded
68
68
  end
69
69
 
70
70
  in_stock_only = ActiveRecord::Type::Boolean.new.cast(params[:in_stock_only])
71
71
  suppliable_only = ActiveRecord::Type::Boolean.new.cast(params[:suppliable_only])
72
- variants = variants.accessible_by(current_ability, :read)
72
+ variants = variants.accessible_by(current_ability)
73
73
  if in_stock_only || cannot?(:view_out_of_stock, Spree::Variant)
74
74
  variants = variants.in_stock
75
75
  elsif suppliable_only
@@ -21,7 +21,7 @@ module Spree
21
21
 
22
22
  def index
23
23
  @zones = Spree::Zone.
24
- accessible_by(current_ability, :read).
24
+ accessible_by(current_ability).
25
25
  order('name ASC').
26
26
  ransack(params[:q]).
27
27
  result
@@ -55,7 +55,7 @@ module Spree
55
55
  end
56
56
 
57
57
  def zone
58
- @zone ||= Spree::Zone.accessible_by(current_ability, :read).find(params[:id])
58
+ @zone ||= Spree::Zone.accessible_by(current_ability, :show).find(params[:id])
59
59
  end
60
60
  end
61
61
  end
@@ -22,6 +22,7 @@ module Spree
22
22
  :state_attributes,
23
23
  :adjustment_attributes,
24
24
  :inventory_unit_attributes,
25
+ :customer_return_attributes,
25
26
  :return_authorization_attributes,
26
27
  :creditcard_attributes,
27
28
  :payment_source_attributes,
@@ -117,16 +118,27 @@ module Spree
117
118
  :id, :state, :variant_id, :shipment_id
118
119
  ]
119
120
 
121
+ @@customer_return_attributes = [
122
+ :id, :number, :stock_location_id, :created_at, :updated_at
123
+ ]
124
+
120
125
  @@return_authorization_attributes = [
121
126
  :id, :number, :state, :order_id, :memo, :created_at, :updated_at
122
127
  ]
123
128
 
124
- @@address_attributes = [
125
- :id, :firstname, :lastname, :full_name, :address1, :address2, :city,
126
- :zipcode, :phone, :company, :alternative_phone, :country_id, :country_iso,
127
- :state_id, :state_name, :state_text
129
+ @@address_base_attributes = [
130
+ :id, :name, :address1, :address2, :city, :zipcode, :phone, :company,
131
+ :alternative_phone, :country_id, :country_iso, :state_id, :state_name,
132
+ :state_text
128
133
  ]
129
134
 
135
+ @@address_attributes = if Spree::Config.use_combined_first_and_last_name_in_address
136
+ @@address_base_attributes
137
+ else
138
+ @@address_base_attributes +
139
+ Spree::Address::LEGACY_NAME_ATTRS.map(&:to_sym)
140
+ end
141
+
130
142
  @@country_attributes = [:id, :iso_name, :iso, :iso3, :name, :numcode]
131
143
 
132
144
  @@state_attributes = [:id, :name, :abbr, :country_id]
@@ -168,7 +180,8 @@ module Spree
168
180
 
169
181
  @@store_attributes = [
170
182
  :id, :name, :url, :meta_description, :meta_keywords, :seo_title,
171
- :mail_from_address, :default_currency, :code, :default, :available_locales
183
+ :mail_from_address, :default_currency, :code, :default, :available_locales,
184
+ :bcc_email
172
185
  ]
173
186
 
174
187
  @@store_credit_history_attributes = [
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.customer_returns(@customer_returns) do |customer_return|
4
+ json.(customer_return, *customer_return_attributes)
5
+ end
6
+ json.partial! 'spree/api/shared/pagination', pagination: @customer_returns
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.attributes([*customer_return_attributes])
4
+ json.required_attributes(required_fields_for(Spree::CustomerReturn))
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.(@customer_return, *customer_return_attributes)
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.error(I18n.t(:could_not_transition, scope: "spree.api", resource: resource.class.name.demodulize.underscore))
4
+ json.errors(resource.errors.to_hash)
@@ -1,4 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ Spree::Deprecation.warn(
4
+ 'spree/api/orders/could_not_transition is deprecated.' \
5
+ ' Please use spree/api/errors/could_not_transition'
6
+ )
7
+
3
8
  json.error(I18n.t(:could_not_transition, scope: "spree.api.order"))
4
9
  json.errors(@order.errors.to_hash)
@@ -8,6 +8,8 @@ en:
8
8
  invalid_resource: Invalid resource. Please fix errors and try again.
9
9
  invalid_taxonomy_id: Invalid taxonomy id.
10
10
  must_specify_api_key: You must specify an API key.
11
+ could_not_transition: The %{resource} could not be transitioned. Please fix the
12
+ errors and try again.
11
13
  order:
12
14
  could_not_transition: The order could not be transitioned. Please fix the
13
15
  errors and try again.
data/config/routes.rb CHANGED
@@ -3,9 +3,11 @@
3
3
  Spree::Core::Engine.routes.draw do
4
4
  namespace :admin do
5
5
  resources :users do
6
+ resource :api_key, controller: 'users/api_key', only: [:create, :destroy]
7
+
6
8
  member do
7
- put :generate_api_key
8
- put :clear_api_key
9
+ put :generate_api_key # Deprecated
10
+ put :clear_api_key # Deprecated
9
11
  end
10
12
  end
11
13
  end
@@ -38,6 +40,8 @@ Spree::Core::Engine.routes.draw do
38
40
  put :cancel
39
41
  end
40
42
  end
43
+
44
+ resources :customer_returns, except: :destroy
41
45
  end
42
46
 
43
47
  resources :checkouts, only: [:update], concerns: :order_routes do
@@ -57,7 +61,6 @@ Spree::Core::Engine.routes.draw do
57
61
  end
58
62
  resources :option_values
59
63
 
60
- resources :option_values, only: :index
61
64
  get '/orders/mine', to: 'orders#mine', as: 'my_orders'
62
65
  get "/orders/current", to: "orders#current", as: "current_order"
63
66
 
@@ -38,7 +38,7 @@ module Spree
38
38
  end
39
39
 
40
40
  def upload_image(filename)
41
- fixture_file_upload(image(filename).path, 'image/jpg')
41
+ Rack::Test::UploadedFile.new(File.open(image(filename).path), 'image/jpg')
42
42
  end
43
43
  end
44
44
  end
@@ -10,6 +10,14 @@ You can use your API key to access all resources in the API. The API key must be
10
10
  Authorization: Bearer API_KEY
11
11
  ```
12
12
 
13
+ As an admin, you can find your API token in the admin section under Users > Your e-email > API Access (at `admin/users/<user_id>/edit`)
14
+
15
+ Example:
16
+
17
+ ```
18
+ curl --header "Authorization: Bearer 1a6a9936ad150a2ee345c65331da7a3ccc2de" http://www.my-solidus-site.com/api/stores
19
+ ```
20
+
13
21
  By default, API keys are only generated for admins, but you can easily customize Solidus to generate them for all users, which is useful for instance if you want users to be able to sign in and manage their profile via the API.
14
22
 
15
23
  ### Order token
@@ -22,4 +30,4 @@ The order token must be passed in the `X-Spree-Order-Token` header in the follow
22
30
  X-Spree-Order-Token: ORDER_TOKEN
23
31
  ```
24
32
 
25
- If you are already providing an API key, you don't need to also provide the order token (although you may do so).
33
+ If you are already providing an API key, you don't need to also provide the order token (although you may do so).
@@ -27,15 +27,28 @@ When you are ready to start the checkout flow, you can call `PUT /checkouts/:ord
27
27
 
28
28
  To enter the billing and shipping addresses, use the `PATCH /checkouts/:order_number` endpoint.
29
29
 
30
- Once again, call `PUT /checkouts/:order_number/next` to transition the order from the `address` to the `shipping` state.
30
+ The `checkouts#update` endpoint always advance the order to the next state. If the above request is successful, the order should now be in the `delivery` state.
31
31
 
32
32
  ## 6. Select a shipping method
33
33
 
34
- You can retrieve the available shipping methods, along with their rates, via `GET /shipments/:shipment_number/estimated_rates`. This allows you to let your user choose the shipping method they prefer.
34
+ You can retrieve the available shipping methods, along with their rates, via `GET /orders/:order_number` or `GET /orders/current`. This allows you to let your user choose the shipping method they prefer.
35
35
 
36
- When you want to select a shipping method, call `PUT /shipments/:shipment_number/select_shipping_method`.
36
+ When you want to select a shipping method, call `PUT /checkouts/:order_number`:
37
37
 
38
- Finally, call `PUT /checkouts/:order_number/next` to transition the order from the `shipping` to the `payment` state.
38
+ ```
39
+ {
40
+ "order": {
41
+ "shipments_attributes": {
42
+ "0": {
43
+ "selected_shipping_rate_id": :shipping_rate_id,
44
+ "id": :shipment_id
45
+ }
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ If the above request is successful, the order should now be in the `payment` state.
39
52
 
40
53
  ## 7. Enter payment details
41
54
 
data/openapi/main.hub.yml CHANGED
@@ -62,4 +62,4 @@ pages:
62
62
  route:
63
63
  path: /api-reference
64
64
  data:
65
- $ref: ./api.oas2.yml
65
+ $ref: ./solidus-api.oas.yml