spree_api 5.4.0.beta7 → 5.4.0.beta9

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/spree/api/v3/error_handler.rb +3 -0
  3. data/app/controllers/spree/api/v3/store/auth_controller.rb +62 -19
  4. data/app/controllers/spree/api/v3/store/carts/{shipments_controller.rb → fulfillments_controller.rb} +13 -13
  5. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +91 -0
  6. data/app/controllers/spree/api/v3/store/customers_controller.rb +6 -2
  7. data/app/controllers/spree/api/v3/store/products_controller.rb +1 -1
  8. data/app/serializers/spree/api/v3/admin/address_serializer.rb +2 -2
  9. data/app/serializers/spree/api/v3/admin/allowed_origin_serializer.rb +21 -0
  10. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +2 -2
  11. data/app/serializers/spree/api/v3/admin/{shipping_method_serializer.rb → delivery_method_serializer.rb} +1 -1
  12. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +11 -0
  13. data/app/serializers/spree/api/v3/admin/{shipment_serializer.rb → fulfillment_serializer.rb} +3 -3
  14. data/app/serializers/spree/api/v3/admin/media_serializer.rb +17 -0
  15. data/app/serializers/spree/api/v3/admin/order_serializer.rb +5 -4
  16. data/app/serializers/spree/api/v3/admin/product_serializer.rb +8 -9
  17. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +2 -2
  18. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +8 -3
  19. data/app/serializers/spree/api/v3/base_serializer.rb +1 -1
  20. data/app/serializers/spree/api/v3/cart_serializer.rb +11 -3
  21. data/app/serializers/spree/api/v3/{shipping_method_serializer.rb → delivery_method_serializer.rb} +1 -1
  22. data/app/serializers/spree/api/v3/{shipping_rate_serializer.rb → delivery_rate_serializer.rb} +4 -4
  23. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +45 -0
  24. data/app/serializers/spree/api/v3/gift_card_serializer.rb +2 -2
  25. data/app/serializers/spree/api/v3/media_serializer.rb +60 -0
  26. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +2 -2
  27. data/app/serializers/spree/api/v3/order_serializer.rb +21 -5
  28. data/app/serializers/spree/api/v3/payment_serializer.rb +6 -2
  29. data/app/serializers/spree/api/v3/product_serializer.rb +10 -11
  30. data/app/serializers/spree/api/v3/variant_serializer.rb +14 -9
  31. data/config/locales/en.yml +3 -0
  32. data/config/routes.rb +4 -1
  33. data/lib/spree/api/configuration.rb +2 -0
  34. data/lib/spree/api/dependencies.rb +14 -8
  35. data/lib/spree/api/openapi/schema_helper.rb +31 -1
  36. metadata +17 -15
  37. data/app/serializers/spree/api/v3/admin/image_serializer.rb +0 -10
  38. data/app/serializers/spree/api/v3/admin/shipping_rate_serializer.rb +0 -11
  39. data/app/serializers/spree/api/v3/image_serializer.rb +0 -43
  40. data/app/serializers/spree/api/v3/shipment_serializer.rb +0 -19
@@ -0,0 +1,45 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ class FulfillmentSerializer < BaseSerializer
5
+ typelize number: :string, status: :string, fulfillment_type: :string,
6
+ tracking: [:string, nullable: true],
7
+ tracking_url: [:string, nullable: true], fulfilled_at: [:string, nullable: true],
8
+ cost: :string, display_cost: :string,
9
+ items: 'Array<{ item_id: string; variant_id: string; quantity: number }>'
10
+
11
+ attributes :number, :tracking, :tracking_url,
12
+ :cost, :display_cost,
13
+ created_at: :iso8601, updated_at: :iso8601
14
+
15
+ attribute :status do |shipment|
16
+ shipment.state
17
+ end
18
+
19
+ attribute :fulfillment_type do |shipment|
20
+ shipment.digital? ? 'digital' : 'shipping'
21
+ end
22
+
23
+ attribute :fulfilled_at do |shipment|
24
+ shipment.shipped_at&.iso8601
25
+ end
26
+
27
+ # Which items (and how many) are in this fulfillment.
28
+ # A line item can be split across fulfillments with different quantities.
29
+ attribute :items do |shipment|
30
+ shipment.manifest.map do |item|
31
+ {
32
+ item_id: item.line_item.prefixed_id,
33
+ variant_id: item.variant.prefixed_id,
34
+ quantity: item.quantity
35
+ }
36
+ end
37
+ end
38
+
39
+ one :shipping_method, key: :delivery_method, resource: Spree.api.delivery_method_serializer
40
+ one :stock_location, resource: Spree.api.stock_location_serializer
41
+ many :shipping_rates, key: :delivery_rates, resource: Spree.api.delivery_rate_serializer
42
+ end
43
+ end
44
+ end
45
+ end
@@ -3,7 +3,7 @@ module Spree
3
3
  module V3
4
4
  class GiftCardSerializer < BaseSerializer
5
5
  typelize code: :string,
6
- state: :string,
6
+ status: :string,
7
7
  amount: :string,
8
8
  amount_used: :string,
9
9
  amount_authorized: :string,
@@ -21,7 +21,7 @@ module Spree
21
21
  gift_card.display_code
22
22
  end
23
23
 
24
- attribute :state do |gift_card|
24
+ attribute :status do |gift_card|
25
25
  gift_card.display_state
26
26
  end
27
27
 
@@ -0,0 +1,60 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ class MediaSerializer < BaseSerializer
5
+ typelize position: :number, alt: [:string, nullable: true],
6
+ product_id: [:string, nullable: true],
7
+ variant_ids: [:string, multi: true],
8
+ media_type: :string,
9
+ focal_point_x: [:number, nullable: true],
10
+ focal_point_y: [:number, nullable: true],
11
+ external_video_url: [:string, nullable: true],
12
+ original_url: [:string, nullable: true], mini_url: [:string, nullable: true],
13
+ small_url: [:string, nullable: true], medium_url: [:string, nullable: true],
14
+ large_url: [:string, nullable: true], xlarge_url: [:string, nullable: true],
15
+ og_image_url: [:string, nullable: true]
16
+
17
+ attribute :product_id do |asset|
18
+ asset.product&.prefixed_id
19
+ end
20
+
21
+ # Returns prefixed IDs of variants this media is associated with.
22
+ # Currently: single variant via viewable (legacy). In 6.0: multiple via VariantMedia join table.
23
+ attribute :variant_ids do |asset|
24
+ if asset.viewable_type == 'Spree::Variant'
25
+ [asset.viewable&.prefixed_id].compact
26
+ else
27
+ []
28
+ end
29
+ end
30
+
31
+ attributes :position, :alt, :media_type,
32
+ :focal_point_x, :focal_point_y, :external_video_url,
33
+ created_at: :iso8601, updated_at: :iso8601
34
+
35
+ attribute :original_url do |asset|
36
+ image_url_for(asset)
37
+ end
38
+
39
+ # Dynamically define attributes for each configured image variant
40
+ # Uses named variants from Spree::Config.product_image_variant_sizes
41
+ # (e.g., mini, small, medium, large, xlarge)
42
+ Spree::Config.product_image_variant_sizes.each_key do |variant_name|
43
+ attribute :"#{variant_name}_url" do |asset|
44
+ variant_url(asset, variant_name)
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def variant_url(asset, variant_name)
51
+ return nil unless asset&.attachment&.attached?
52
+
53
+ Rails.application.routes.url_helpers.cdn_image_url(
54
+ asset.attachment.variant(variant_name)
55
+ )
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -6,7 +6,7 @@ module Spree
6
6
  class NewsletterSubscriberSerializer < BaseSerializer
7
7
  typelize email: :string, verified: :boolean,
8
8
  verified_at: [:string, nullable: true],
9
- user_id: [:string, nullable: true]
9
+ customer_id: [:string, nullable: true]
10
10
 
11
11
  attributes :email, created_at: :iso8601, updated_at: :iso8601
12
12
 
@@ -18,7 +18,7 @@ module Spree
18
18
  subscriber.verified_at&.iso8601
19
19
  end
20
20
 
21
- attribute :user_id do |subscriber|
21
+ attribute :customer_id do |subscriber|
22
22
  subscriber.user&.prefixed_id
23
23
  end
24
24
  end
@@ -6,9 +6,9 @@ module Spree
6
6
  class OrderSerializer < BaseSerializer
7
7
  typelize number: :string, email: :string,
8
8
  special_instructions: [:string, nullable: true], currency: :string, locale: [:string, nullable: true], item_count: :number,
9
- shipment_state: [:string, nullable: true], payment_state: [:string, nullable: true],
9
+ fulfillment_status: [:string, nullable: true], payment_status: [:string, nullable: true],
10
10
  item_total: :string, display_item_total: :string,
11
- ship_total: :string, display_ship_total: :string,
11
+ delivery_total: :string, display_delivery_total: :string,
12
12
  adjustment_total: :string, display_adjustment_total: :string,
13
13
  promo_total: :string, display_promo_total: :string,
14
14
  tax_total: :string, display_tax_total: :string,
@@ -18,16 +18,32 @@ module Spree
18
18
  bill_address: { nullable: true }, ship_address: { nullable: true }
19
19
 
20
20
  attributes :number, :email, :special_instructions,
21
- :currency, :locale, :item_count, :shipment_state, :payment_state,
22
- :item_total, :display_item_total, :ship_total, :display_ship_total,
21
+ :currency, :locale, :item_count,
22
+ :item_total, :display_item_total,
23
23
  :adjustment_total, :display_adjustment_total, :promo_total, :display_promo_total,
24
24
  :tax_total, :display_tax_total, :included_tax_total, :display_included_tax_total,
25
25
  :additional_tax_total, :display_additional_tax_total, :total, :display_total,
26
26
  completed_at: :iso8601, created_at: :iso8601, updated_at: :iso8601
27
27
 
28
+ attribute :fulfillment_status do |order|
29
+ order.shipment_state
30
+ end
31
+
32
+ attribute :payment_status do |order|
33
+ order.payment_state
34
+ end
35
+
36
+ attribute :delivery_total do |order|
37
+ order.ship_total
38
+ end
39
+
40
+ attribute :display_delivery_total do |order|
41
+ order.display_ship_total.to_s
42
+ end
43
+
28
44
  many :order_promotions, key: :promotions, resource: Spree.api.order_promotion_serializer
29
45
  many :line_items, key: :items, resource: Spree.api.line_item_serializer
30
- many :shipments, resource: Spree.api.shipment_serializer
46
+ many :shipments, key: :fulfillments, resource: Spree.api.fulfillment_serializer
31
47
  many :payments, resource: Spree.api.payment_serializer
32
48
  one :bill_address, resource: Spree.api.address_serializer
33
49
  one :ship_address, resource: Spree.api.address_serializer
@@ -2,7 +2,7 @@ module Spree
2
2
  module Api
3
3
  module V3
4
4
  class PaymentSerializer < BaseSerializer
5
- typelize state: :string, payment_method_id: :string, response_code: [:string, nullable: true],
5
+ typelize status: :string, payment_method_id: :string, response_code: [:string, nullable: true],
6
6
  number: :string, amount: :string, display_amount: :string,
7
7
  source_type: [:string, nullable: true, enum: %w[credit_card store_credit payment_source]],
8
8
  source_id: [:string, nullable: true],
@@ -12,9 +12,13 @@ module Spree
12
12
  payment.payment_method&.prefixed_id
13
13
  end
14
14
 
15
- attributes :state, :response_code, :number, :amount, :display_amount,
15
+ attributes :response_code, :number, :amount, :display_amount,
16
16
  created_at: :iso8601, updated_at: :iso8601
17
17
 
18
+ attribute :status do |payment|
19
+ payment.state
20
+ end
21
+
18
22
  attribute :source_type do |payment|
19
23
  case payment.source_type
20
24
  when 'Spree::CreditCard'
@@ -40,9 +40,9 @@ module Spree
40
40
  product.default_variant&.prefixed_id
41
41
  end
42
42
 
43
- # Main product image URL for listings (cached thumbnail)
43
+ # Main product image URL for listings (cached primary_media)
44
44
  attribute :thumbnail_url do |product|
45
- image_url_for(product.thumbnail)
45
+ image_url_for(product.primary_media)
46
46
  end
47
47
 
48
48
  attribute :tags do |product|
@@ -68,10 +68,14 @@ module Spree
68
68
  end
69
69
 
70
70
  # Conditional associations
71
- many :variant_images,
72
- key: :images,
73
- resource: Spree.api.image_serializer,
74
- if: proc { expand?('images') }
71
+ one :primary_media,
72
+ resource: Spree.api.media_serializer,
73
+ if: proc { expand?('primary_media') }
74
+
75
+ many :gallery_media,
76
+ key: :media,
77
+ resource: Spree.api.media_serializer,
78
+ if: proc { expand?('media') }
75
79
 
76
80
  many :variants,
77
81
  resource: Spree.api.variant_serializer,
@@ -81,11 +85,6 @@ module Spree
81
85
  resource: Spree.api.variant_serializer,
82
86
  if: proc { expand?('default_variant') }
83
87
 
84
- one :master,
85
- key: :master_variant,
86
- resource: Spree.api.variant_serializer,
87
- if: proc { expand?('master_variant') }
88
-
89
88
  many :option_types,
90
89
  resource: Spree.api.option_type_serializer,
91
90
  if: proc { expand?('option_types') }
@@ -5,8 +5,8 @@ module Spree
5
5
  # Customer-facing variant data with limited fields
6
6
  class VariantSerializer < BaseSerializer
7
7
  typelize product_id: :string, sku: [:string, nullable: true],
8
- is_master: :boolean, options_text: :string, track_inventory: :boolean, image_count: :number,
9
- thumbnail: [:string, nullable: true],
8
+ options_text: :string, track_inventory: :boolean, media_count: :number,
9
+ thumbnail_url: [:string, nullable: true],
10
10
  purchasable: :boolean, in_stock: :boolean, backorderable: :boolean,
11
11
  weight: [:number, nullable: true], height: [:number, nullable: true], width: [:number, nullable: true], depth: [:number, nullable: true],
12
12
  price: 'Price',
@@ -16,12 +16,12 @@ module Spree
16
16
  variant.product&.prefixed_id
17
17
  end
18
18
 
19
- attributes :sku, :is_master, :options_text, :track_inventory, :image_count,
19
+ attributes :sku, :options_text, :track_inventory, :media_count,
20
20
  created_at: :iso8601, updated_at: :iso8601
21
21
 
22
- # Main variant image URL for listings (cached thumbnail)
23
- attribute :thumbnail do |variant|
24
- image_url_for(variant.thumbnail)
22
+ # Main variant image URL for listings (cached primary_media)
23
+ attribute :thumbnail_url do |variant|
24
+ image_url_for(variant.primary_media)
25
25
  end
26
26
 
27
27
  attribute :purchasable do |variant|
@@ -70,9 +70,14 @@ module Spree
70
70
  end
71
71
 
72
72
  # Conditional associations
73
- many :images,
74
- resource: Spree.api.image_serializer,
75
- if: proc { expand?('images') }
73
+ one :primary_media,
74
+ resource: Spree.api.media_serializer,
75
+ if: proc { expand?('primary_media') }
76
+
77
+ many :gallery_media,
78
+ key: :media,
79
+ resource: Spree.api.media_serializer,
80
+ if: proc { expand?('media') }
76
81
 
77
82
  many :option_values, resource: Spree.api.option_value_serializer
78
83
 
@@ -7,6 +7,9 @@ en:
7
7
  invalid_resource: Invalid resource. Please fix errors and try again.
8
8
  invalid_taxonomy_id: Invalid taxonomy id.
9
9
  current_password_invalid: Current password is invalid or missing
10
+ password_reset_requested: If an account exists for that email, password reset instructions have been sent.
11
+ password_reset_token_invalid: Password reset token is invalid or has expired.
12
+ redirect_url_not_allowed: The redirect URL is not from an allowed origin for this store.
10
13
  must_specify_api_key: You must specify an API key.
11
14
  negative_quantity: quantity is negative
12
15
  order:
data/config/routes.rb CHANGED
@@ -5,6 +5,7 @@ Spree::Core::Engine.add_routes do
5
5
  # Authentication
6
6
  post 'auth/login', to: 'auth#create'
7
7
  post 'auth/refresh', to: 'auth#refresh'
8
+ post 'auth/logout', to: 'auth#logout'
8
9
  post 'auth/oauth/callback', to: 'auth#oauth_callback'
9
10
 
10
11
  # Markets
@@ -38,7 +39,7 @@ Spree::Core::Engine.add_routes do
38
39
  end
39
40
  resources :items, only: [:create, :update, :destroy], controller: 'carts/items'
40
41
  resources :coupon_codes, only: [:create, :destroy], controller: 'carts/coupon_codes'
41
- resources :shipments, only: [:index, :update], controller: 'carts/shipments'
42
+ resources :fulfillments, only: [:index, :update], controller: 'carts/fulfillments'
42
43
  resources :payment_methods, only: [:index], controller: 'carts/payment_methods'
43
44
  resources :payments, only: [:index, :show, :create], controller: 'carts/payments'
44
45
  resources :payment_sessions, only: [:create, :show, :update], controller: 'carts/payment_sessions' do
@@ -59,6 +60,8 @@ Spree::Core::Engine.add_routes do
59
60
 
60
61
  # Customer nested resources
61
62
  namespace :customer, path: 'customer' do
63
+ resources :password_resets, only: [:create, :update]
64
+
62
65
  resources :orders, only: [:index, :show]
63
66
  resources :addresses, only: [:index, :show, :create, :update, :destroy] do
64
67
  member do
@@ -11,6 +11,7 @@ module Spree
11
11
 
12
12
  preference :jwt_expiration, :integer, default: 3600 # 1 hour in seconds
13
13
  preference :jwt_secret_key, :string, default: nil
14
+ preference :refresh_token_expiry, :integer, default: 2_592_000 # 30 days in seconds
14
15
 
15
16
  # Rate limiting
16
17
  preference :rate_limit_per_key, :integer, default: 300 # per publishable API key
@@ -19,6 +20,7 @@ module Spree
19
20
  preference :rate_limit_register, :integer, default: 3 # per IP
20
21
  preference :rate_limit_refresh, :integer, default: 10 # per IP
21
22
  preference :rate_limit_oauth, :integer, default: 5 # per IP
23
+ preference :rate_limit_password_reset, :integer, default: 3 # per IP
22
24
 
23
25
  # Request body size limit in bytes
24
26
  preference :max_request_body_size, :integer, default: 102_400 # 100KB
@@ -96,7 +96,7 @@ module Spree
96
96
  price_serializer: 'Spree::Api::V3::PriceSerializer',
97
97
  product_serializer: 'Spree::Api::V3::ProductSerializer',
98
98
  variant_serializer: 'Spree::Api::V3::VariantSerializer',
99
- image_serializer: 'Spree::Api::V3::ImageSerializer',
99
+ media_serializer: 'Spree::Api::V3::MediaSerializer',
100
100
  option_type_serializer: 'Spree::Api::V3::OptionTypeSerializer',
101
101
  option_value_serializer: 'Spree::Api::V3::OptionValueSerializer',
102
102
  cart_serializer: 'Spree::Api::V3::CartSerializer',
@@ -107,7 +107,8 @@ module Spree
107
107
  payment_setup_session_serializer: 'Spree::Api::V3::PaymentSetupSessionSerializer',
108
108
  payment_source_serializer: 'Spree::Api::V3::PaymentSourceSerializer',
109
109
  store_credit_serializer: 'Spree::Api::V3::StoreCreditSerializer',
110
- shipment_serializer: 'Spree::Api::V3::ShipmentSerializer',
110
+ shipment_serializer: 'Spree::Api::V3::FulfillmentSerializer',
111
+ fulfillment_serializer: 'Spree::Api::V3::FulfillmentSerializer',
111
112
  address_serializer: 'Spree::Api::V3::AddressSerializer',
112
113
  customer_serializer: 'Spree::Api::V3::CustomerSerializer',
113
114
  country_serializer: 'Spree::Api::V3::CountrySerializer',
@@ -116,8 +117,10 @@ module Spree
116
117
  wishlist_serializer: 'Spree::Api::V3::WishlistSerializer',
117
118
  wished_item_serializer: 'Spree::Api::V3::WishedItemSerializer',
118
119
  payment_method_serializer: 'Spree::Api::V3::PaymentMethodSerializer',
119
- shipping_method_serializer: 'Spree::Api::V3::ShippingMethodSerializer',
120
- shipping_rate_serializer: 'Spree::Api::V3::ShippingRateSerializer',
120
+ shipping_method_serializer: 'Spree::Api::V3::DeliveryMethodSerializer',
121
+ shipping_rate_serializer: 'Spree::Api::V3::DeliveryRateSerializer',
122
+ delivery_method_serializer: 'Spree::Api::V3::DeliveryMethodSerializer',
123
+ delivery_rate_serializer: 'Spree::Api::V3::DeliveryRateSerializer',
121
124
  stock_location_serializer: 'Spree::Api::V3::StockLocationSerializer',
122
125
  category_serializer: 'Spree::Api::V3::CategorySerializer',
123
126
  cart_promotion_serializer: 'Spree::Api::V3::CartPromotionSerializer',
@@ -161,10 +164,11 @@ module Spree
161
164
  admin_line_item_serializer: 'Spree::Api::V3::Admin::LineItemSerializer',
162
165
  admin_option_type_serializer: 'Spree::Api::V3::Admin::OptionTypeSerializer',
163
166
  admin_option_value_serializer: 'Spree::Api::V3::Admin::OptionValueSerializer',
164
- admin_image_serializer: 'Spree::Api::V3::Admin::ImageSerializer',
167
+ admin_media_serializer: 'Spree::Api::V3::Admin::MediaSerializer',
165
168
  admin_asset_serializer: 'Spree::Api::V3::Admin::AssetSerializer',
166
169
  admin_stock_item_serializer: 'Spree::Api::V3::Admin::StockItemSerializer',
167
- admin_shipment_serializer: 'Spree::Api::V3::Admin::ShipmentSerializer',
170
+ admin_shipment_serializer: 'Spree::Api::V3::Admin::FulfillmentSerializer',
171
+ admin_fulfillment_serializer: 'Spree::Api::V3::Admin::FulfillmentSerializer',
168
172
  admin_payment_serializer: 'Spree::Api::V3::Admin::PaymentSerializer',
169
173
  admin_refund_serializer: 'Spree::Api::V3::Admin::RefundSerializer',
170
174
  admin_adjustment_serializer: 'Spree::Api::V3::Admin::AdjustmentSerializer',
@@ -174,9 +178,11 @@ module Spree
174
178
  admin_reimbursement_serializer: 'Spree::Api::V3::Admin::ReimbursementSerializer',
175
179
  admin_admin_user_serializer: 'Spree::Api::V3::Admin::AdminUserSerializer',
176
180
  admin_address_serializer: 'Spree::Api::V3::Admin::AddressSerializer',
177
- admin_shipping_method_serializer: 'Spree::Api::V3::Admin::ShippingMethodSerializer',
181
+ admin_shipping_method_serializer: 'Spree::Api::V3::Admin::DeliveryMethodSerializer',
182
+ admin_delivery_method_serializer: 'Spree::Api::V3::Admin::DeliveryMethodSerializer',
178
183
  admin_stock_location_serializer: 'Spree::Api::V3::Admin::StockLocationSerializer',
179
- admin_shipping_rate_serializer: 'Spree::Api::V3::Admin::ShippingRateSerializer',
184
+ admin_shipping_rate_serializer: 'Spree::Api::V3::Admin::DeliveryRateSerializer',
185
+ admin_delivery_rate_serializer: 'Spree::Api::V3::Admin::DeliveryRateSerializer',
180
186
  admin_order_promotion_serializer: 'Spree::Api::V3::Admin::OrderPromotionSerializer',
181
187
  admin_payment_method_serializer: 'Spree::Api::V3::Admin::PaymentMethodSerializer',
182
188
  admin_credit_card_serializer: 'Spree::Api::V3::Admin::CreditCardSerializer',
@@ -81,9 +81,10 @@ module Spree
81
81
  type: :object,
82
82
  properties: {
83
83
  token: { type: :string, description: 'JWT access token' },
84
+ refresh_token: { type: :string, description: 'Refresh token for obtaining new access tokens' },
84
85
  user: { '$ref' => '#/components/schemas/Customer' }
85
86
  },
86
- required: %w[token user]
87
+ required: %w[token refresh_token user]
87
88
  },
88
89
  CheckoutRequirement: {
89
90
  type: :object,
@@ -93,6 +94,16 @@ module Spree
93
94
  message: { type: :string, description: 'Human-readable requirement message', example: 'Add a payment method' }
94
95
  },
95
96
  required: %w[step field message]
97
+ },
98
+ FulfillmentManifestItem: {
99
+ type: :object,
100
+ description: 'An item within a fulfillment — which line item and how many units are in this fulfillment',
101
+ properties: {
102
+ item_id: { type: :string, description: 'Line item prefixed ID', example: 'li_abc123' },
103
+ variant_id: { type: :string, description: 'Variant prefixed ID', example: 'variant_abc123' },
104
+ quantity: { type: :integer, description: 'Quantity in this fulfillment', example: 2 }
105
+ },
106
+ required: %w[item_id variant_id quantity]
96
107
  }
97
108
  }
98
109
  end
@@ -120,6 +131,7 @@ module Spree
120
131
  strip_null_from_enums(s)
121
132
  end
122
133
  patch_cart_schema(schemas)
134
+ patch_fulfillment_schema(schemas)
123
135
  schemas
124
136
  end
125
137
  end
@@ -142,6 +154,24 @@ module Spree
142
154
  end
143
155
  end
144
156
 
157
+ # Typelizer cannot represent Array<{...}> inline object types in OpenAPI,
158
+ # so we patch Fulfillment#items to reference the FulfillmentManifestItem component schema.
159
+ def patch_fulfillment_schema(schemas)
160
+ fulfillment = schemas['Fulfillment'] || schemas[:Fulfillment]
161
+ return unless fulfillment
162
+
163
+ props = fulfillment[:properties]
164
+ return unless props
165
+
166
+ items_key = props.key?('items') ? 'items' : :items
167
+ if props[items_key]
168
+ props[items_key] = {
169
+ type: :array,
170
+ items: { '$ref' => '#/components/schemas/FulfillmentManifestItem' }
171
+ }
172
+ end
173
+ end
174
+
145
175
  # Typelizer adds nil to enum arrays for nullable fields.
146
176
  # OpenAPI 3.0 handles nullability via `nullable: true`, so the nil entry is redundant
147
177
  # and causes issues with code generators.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.4.0.beta7
4
+ version: 5.4.0.beta9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vendo Connect Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-15 00:00:00.000000000 Z
11
+ date: 2026-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rswag-specs
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 5.4.0.beta7
89
+ version: 5.4.0.beta9
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 5.4.0.beta7
96
+ version: 5.4.0.beta9
97
97
  description: Spree's API
98
98
  email:
99
99
  - hello@spreecommerce.org
@@ -121,11 +121,11 @@ files:
121
121
  - app/controllers/spree/api/v3/store/auth_controller.rb
122
122
  - app/controllers/spree/api/v3/store/base_controller.rb
123
123
  - app/controllers/spree/api/v3/store/carts/coupon_codes_controller.rb
124
+ - app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb
124
125
  - app/controllers/spree/api/v3/store/carts/items_controller.rb
125
126
  - app/controllers/spree/api/v3/store/carts/payment_methods_controller.rb
126
127
  - app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb
127
128
  - app/controllers/spree/api/v3/store/carts/payments_controller.rb
128
- - app/controllers/spree/api/v3/store/carts/shipments_controller.rb
129
129
  - app/controllers/spree/api/v3/store/carts/store_credits_controller.rb
130
130
  - app/controllers/spree/api/v3/store/carts_controller.rb
131
131
  - app/controllers/spree/api/v3/store/categories/products_controller.rb
@@ -136,6 +136,7 @@ files:
136
136
  - app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb
137
137
  - app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb
138
138
  - app/controllers/spree/api/v3/store/customer/orders_controller.rb
139
+ - app/controllers/spree/api/v3/store/customer/password_resets_controller.rb
139
140
  - app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb
140
141
  - app/controllers/spree/api/v3/store/customers_controller.rb
141
142
  - app/controllers/spree/api/v3/store/digitals_controller.rb
@@ -155,13 +156,17 @@ files:
155
156
  - app/serializers/spree/api/v3/admin/address_serializer.rb
156
157
  - app/serializers/spree/api/v3/admin/adjustment_serializer.rb
157
158
  - app/serializers/spree/api/v3/admin/admin_user_serializer.rb
159
+ - app/serializers/spree/api/v3/admin/allowed_origin_serializer.rb
158
160
  - app/serializers/spree/api/v3/admin/asset_serializer.rb
159
161
  - app/serializers/spree/api/v3/admin/category_serializer.rb
160
162
  - app/serializers/spree/api/v3/admin/credit_card_serializer.rb
161
163
  - app/serializers/spree/api/v3/admin/customer_serializer.rb
164
+ - app/serializers/spree/api/v3/admin/delivery_method_serializer.rb
165
+ - app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb
162
166
  - app/serializers/spree/api/v3/admin/digital_link_serializer.rb
163
- - app/serializers/spree/api/v3/admin/image_serializer.rb
167
+ - app/serializers/spree/api/v3/admin/fulfillment_serializer.rb
164
168
  - app/serializers/spree/api/v3/admin/line_item_serializer.rb
169
+ - app/serializers/spree/api/v3/admin/media_serializer.rb
165
170
  - app/serializers/spree/api/v3/admin/metafield_serializer.rb
166
171
  - app/serializers/spree/api/v3/admin/option_type_serializer.rb
167
172
  - app/serializers/spree/api/v3/admin/option_value_serializer.rb
@@ -175,10 +180,7 @@ files:
175
180
  - app/serializers/spree/api/v3/admin/refund_serializer.rb
176
181
  - app/serializers/spree/api/v3/admin/reimbursement_serializer.rb
177
182
  - app/serializers/spree/api/v3/admin/return_authorization_serializer.rb
178
- - app/serializers/spree/api/v3/admin/shipment_serializer.rb
179
183
  - app/serializers/spree/api/v3/admin/shipping_category_serializer.rb
180
- - app/serializers/spree/api/v3/admin/shipping_method_serializer.rb
181
- - app/serializers/spree/api/v3/admin/shipping_rate_serializer.rb
182
184
  - app/serializers/spree/api/v3/admin/stock_item_serializer.rb
183
185
  - app/serializers/spree/api/v3/admin/stock_location_serializer.rb
184
186
  - app/serializers/spree/api/v3/admin/store_credit_serializer.rb
@@ -194,18 +196,21 @@ files:
194
196
  - app/serializers/spree/api/v3/currency_serializer.rb
195
197
  - app/serializers/spree/api/v3/customer_return_serializer.rb
196
198
  - app/serializers/spree/api/v3/customer_serializer.rb
199
+ - app/serializers/spree/api/v3/delivery_method_serializer.rb
200
+ - app/serializers/spree/api/v3/delivery_rate_serializer.rb
197
201
  - app/serializers/spree/api/v3/digital_link_serializer.rb
198
202
  - app/serializers/spree/api/v3/digital_serializer.rb
199
203
  - app/serializers/spree/api/v3/export_serializer.rb
204
+ - app/serializers/spree/api/v3/fulfillment_serializer.rb
200
205
  - app/serializers/spree/api/v3/gift_card_batch_serializer.rb
201
206
  - app/serializers/spree/api/v3/gift_card_serializer.rb
202
- - app/serializers/spree/api/v3/image_serializer.rb
203
207
  - app/serializers/spree/api/v3/import_row_serializer.rb
204
208
  - app/serializers/spree/api/v3/import_serializer.rb
205
209
  - app/serializers/spree/api/v3/invitation_serializer.rb
206
210
  - app/serializers/spree/api/v3/line_item_serializer.rb
207
211
  - app/serializers/spree/api/v3/locale_serializer.rb
208
212
  - app/serializers/spree/api/v3/market_serializer.rb
213
+ - app/serializers/spree/api/v3/media_serializer.rb
209
214
  - app/serializers/spree/api/v3/metafield_serializer.rb
210
215
  - app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb
211
216
  - app/serializers/spree/api/v3/option_type_serializer.rb
@@ -225,10 +230,7 @@ files:
225
230
  - app/serializers/spree/api/v3/report_serializer.rb
226
231
  - app/serializers/spree/api/v3/return_authorization_serializer.rb
227
232
  - app/serializers/spree/api/v3/return_item_serializer.rb
228
- - app/serializers/spree/api/v3/shipment_serializer.rb
229
233
  - app/serializers/spree/api/v3/shipping_category_serializer.rb
230
- - app/serializers/spree/api/v3/shipping_method_serializer.rb
231
- - app/serializers/spree/api/v3/shipping_rate_serializer.rb
232
234
  - app/serializers/spree/api/v3/state_serializer.rb
233
235
  - app/serializers/spree/api/v3/stock_item_serializer.rb
234
236
  - app/serializers/spree/api/v3/stock_location_serializer.rb
@@ -266,9 +268,9 @@ licenses:
266
268
  - BSD-3-Clause
267
269
  metadata:
268
270
  bug_tracker_uri: https://github.com/spree/spree/issues
269
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.beta7
271
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.beta9
270
272
  documentation_uri: https://docs.spreecommerce.org/
271
- source_code_uri: https://github.com/spree/spree/tree/v5.4.0.beta7
273
+ source_code_uri: https://github.com/spree/spree/tree/v5.4.0.beta9
272
274
  post_install_message:
273
275
  rdoc_options: []
274
276
  require_paths:
@@ -1,10 +0,0 @@
1
- module Spree
2
- module Api
3
- module V3
4
- module Admin
5
- class ImageSerializer < V3::ImageSerializer
6
- end
7
- end
8
- end
9
- end
10
- end
@@ -1,11 +0,0 @@
1
- module Spree
2
- module Api
3
- module V3
4
- module Admin
5
- class ShippingRateSerializer < V3::ShippingRateSerializer
6
- one :shipping_method, resource: Spree.api.admin_shipping_method_serializer, if: proc { expand?('shipping_method') }
7
- end
8
- end
9
- end
10
- end
11
- end