spree_core 5.4.0.beta6 → 5.4.0.beta8

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +5 -7
  3. data/app/jobs/spree/payments/handle_webhook_job.rb +22 -0
  4. data/app/mailers/spree/base_mailer.rb +1 -1
  5. data/app/models/concerns/spree/user_methods.rb +16 -0
  6. data/app/models/spree/allowed_origin.rb +44 -0
  7. data/app/models/spree/asset.rb +121 -3
  8. data/app/models/spree/cart_promotion.rb +7 -0
  9. data/app/models/spree/checkout/default_requirements.rb +51 -0
  10. data/app/models/spree/checkout/registry.rb +112 -0
  11. data/app/models/spree/checkout/requirement.rb +49 -0
  12. data/app/models/spree/checkout/requirements.rb +56 -0
  13. data/app/models/spree/checkout/step.rb +52 -0
  14. data/app/models/spree/image/configuration/active_storage.rb +2 -14
  15. data/app/models/spree/image.rb +2 -78
  16. data/app/models/spree/legacy_user.rb +1 -0
  17. data/app/models/spree/line_item.rb +3 -3
  18. data/app/models/spree/order/checkout.rb +18 -0
  19. data/app/models/spree/order.rb +3 -0
  20. data/app/models/spree/order_promotion.rb +2 -0
  21. data/app/models/spree/payment_method.rb +34 -0
  22. data/app/models/spree/payment_session.rb +18 -0
  23. data/app/models/spree/product.rb +45 -34
  24. data/app/models/spree/shipment.rb +1 -0
  25. data/app/models/spree/store.rb +32 -0
  26. data/app/models/spree/variant.rb +21 -12
  27. data/app/services/spree/cart/create.rb +3 -30
  28. data/app/services/spree/carts/complete.rb +46 -0
  29. data/app/services/spree/carts/create.rb +32 -0
  30. data/app/services/spree/carts/update.rb +115 -0
  31. data/app/services/spree/{cart → carts}/upsert_items.rb +19 -23
  32. data/app/services/spree/payments/handle_webhook.rb +58 -0
  33. data/app/services/spree/seeds/all.rb +1 -0
  34. data/app/services/spree/seeds/allowed_origins.rb +14 -0
  35. data/app/views/spree/shared/_mailer_logo.html.erb +1 -1
  36. data/config/locales/en.yml +23 -2
  37. data/db/migrate/20260315000000_create_spree_allowed_origins.rb +14 -0
  38. data/db/migrate/20260315100000_add_product_media_support.rb +21 -0
  39. data/lib/spree/core/configuration.rb +3 -0
  40. data/lib/spree/core/dependencies.rb +4 -2
  41. data/lib/spree/core/version.rb +1 -1
  42. data/lib/spree/core.rb +1 -0
  43. data/lib/spree/permitted_attributes.rb +5 -1
  44. data/lib/spree/testing_support/factories/allowed_origin_factory.rb +8 -0
  45. data/lib/spree/testing_support/factories/asset_factory.rb +6 -9
  46. data/lib/spree/testing_support/factories/image_factory.rb +3 -1
  47. data/lib/spree/testing_support/factories/order_factory.rb +3 -0
  48. data/lib/tasks/images.rake +11 -11
  49. data/lib/tasks/products.rake +4 -2
  50. metadata +21 -6
  51. data/app/services/spree/orders/update.rb +0 -121
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.4.0.beta6
4
+ version: 5.4.0.beta8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2026-03-11 00:00:00.000000000 Z
13
+ date: 2026-03-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: i18n-tasks
@@ -840,6 +840,7 @@ files:
840
840
  - app/jobs/spree/images/save_from_url_job.rb
841
841
  - app/jobs/spree/imports/create_rows_job.rb
842
842
  - app/jobs/spree/imports/process_rows_job.rb
843
+ - app/jobs/spree/payments/handle_webhook_job.rb
843
844
  - app/jobs/spree/products/auto_match_taxons_job.rb
844
845
  - app/jobs/spree/products/refresh_metrics_job.rb
845
846
  - app/jobs/spree/products/touch_taxons_job.rb
@@ -898,6 +899,7 @@ files:
898
899
  - app/models/spree/adjustable/adjustments_updater.rb
899
900
  - app/models/spree/adjustable/promotion_accumulator.rb
900
901
  - app/models/spree/adjustment.rb
902
+ - app/models/spree/allowed_origin.rb
901
903
  - app/models/spree/api_key.rb
902
904
  - app/models/spree/asset.rb
903
905
  - app/models/spree/asset/support/active_storage.rb
@@ -921,7 +923,13 @@ files:
921
923
  - app/models/spree/calculator/shipping/price_sack.rb
922
924
  - app/models/spree/calculator/tiered_flat_rate.rb
923
925
  - app/models/spree/calculator/tiered_percent.rb
926
+ - app/models/spree/cart_promotion.rb
924
927
  - app/models/spree/category.rb
928
+ - app/models/spree/checkout/default_requirements.rb
929
+ - app/models/spree/checkout/registry.rb
930
+ - app/models/spree/checkout/requirement.rb
931
+ - app/models/spree/checkout/requirements.rb
932
+ - app/models/spree/checkout/step.rb
925
933
  - app/models/spree/classification.rb
926
934
  - app/models/spree/country.rb
927
935
  - app/models/spree/coupon_code.rb
@@ -1201,7 +1209,10 @@ files:
1201
1209
  - app/services/spree/cart/remove_out_of_stock_items.rb
1202
1210
  - app/services/spree/cart/set_quantity.rb
1203
1211
  - app/services/spree/cart/update.rb
1204
- - app/services/spree/cart/upsert_items.rb
1212
+ - app/services/spree/carts/complete.rb
1213
+ - app/services/spree/carts/create.rb
1214
+ - app/services/spree/carts/update.rb
1215
+ - app/services/spree/carts/upsert_items.rb
1205
1216
  - app/services/spree/checkout/add_store_credit.rb
1206
1217
  - app/services/spree/checkout/advance.rb
1207
1218
  - app/services/spree/checkout/complete.rb
@@ -1233,9 +1244,9 @@ files:
1233
1244
  - app/services/spree/orders/approve.rb
1234
1245
  - app/services/spree/orders/cancel.rb
1235
1246
  - app/services/spree/orders/create_user_account.rb
1236
- - app/services/spree/orders/update.rb
1237
1247
  - app/services/spree/orders/update_contact_information.rb
1238
1248
  - app/services/spree/payments/create.rb
1249
+ - app/services/spree/payments/handle_webhook.rb
1239
1250
  - app/services/spree/products/auto_match_taxons.rb
1240
1251
  - app/services/spree/products/duplicator.rb
1241
1252
  - app/services/spree/products/prepare_nested_attributes.rb
@@ -1243,6 +1254,7 @@ files:
1243
1254
  - app/services/spree/sample_data/loader.rb
1244
1255
  - app/services/spree/seeds/admin_user.rb
1245
1256
  - app/services/spree/seeds/all.rb
1257
+ - app/services/spree/seeds/allowed_origins.rb
1246
1258
  - app/services/spree/seeds/api_keys.rb
1247
1259
  - app/services/spree/seeds/countries.rb
1248
1260
  - app/services/spree/seeds/default_reimbursement_types.rb
@@ -1435,6 +1447,8 @@ files:
1435
1447
  - db/migrate/20260220000000_create_spree_markets.rb
1436
1448
  - db/migrate/20260226000000_add_locale_to_spree_orders.rb
1437
1449
  - db/migrate/20260226100000_add_token_digest_to_spree_api_keys.rb
1450
+ - db/migrate/20260315000000_create_spree_allowed_origins.rb
1451
+ - db/migrate/20260315100000_add_product_media_support.rb
1438
1452
  - db/sample_data/customers.csv
1439
1453
  - db/sample_data/metafield_definitions.rb
1440
1454
  - db/sample_data/orders.rb
@@ -1520,6 +1534,7 @@ files:
1520
1534
  - lib/spree/testing_support/factories.rb
1521
1535
  - lib/spree/testing_support/factories/address_factory.rb
1522
1536
  - lib/spree/testing_support/factories/adjustment_factory.rb
1537
+ - lib/spree/testing_support/factories/allowed_origin_factory.rb
1523
1538
  - lib/spree/testing_support/factories/api_key_factory.rb
1524
1539
  - lib/spree/testing_support/factories/asset_factory.rb
1525
1540
  - lib/spree/testing_support/factories/calculator_factory.rb
@@ -1656,9 +1671,9 @@ licenses:
1656
1671
  - BSD-3-Clause
1657
1672
  metadata:
1658
1673
  bug_tracker_uri: https://github.com/spree/spree/issues
1659
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.beta6
1674
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.beta8
1660
1675
  documentation_uri: https://docs.spreecommerce.org/
1661
- source_code_uri: https://github.com/spree/spree/tree/v5.4.0.beta6
1676
+ source_code_uri: https://github.com/spree/spree/tree/v5.4.0.beta8
1662
1677
  post_install_message:
1663
1678
  rdoc_options: []
1664
1679
  require_paths:
@@ -1,121 +0,0 @@
1
- module Spree
2
- module Orders
3
- # Core order update service with modern conventions:
4
- # - Flat parameter structure (no wrapping in "order" key)
5
- # - snake_case field names without "_attributes" suffix
6
- # - Automatic state management based on what's being updated
7
- # - Support for line_items with prefixed variant IDs
8
- #
9
- # @example Update order with line items
10
- # Spree::Orders::Update.call(
11
- # order: order,
12
- # params: {
13
- # email: "customer@example.com",
14
- # line_items: [
15
- # { variant_id: "variant_123", quantity: 2 },
16
- # { variant_id: "variant_456", quantity: 1 }
17
- # ],
18
- # ship_address: {
19
- # firstname: "John",
20
- # lastname: "Doe",
21
- # address1: "123 Main St",
22
- # city: "New York",
23
- # zipcode: "10001",
24
- # country_iso: "US",
25
- # state_abbr: "NY"
26
- # }
27
- # }
28
- # )
29
- #
30
- class Update
31
- prepend Spree::ServiceModule::Base
32
-
33
- def call(order:, params:)
34
- @order = order
35
- @params = params.to_h.deep_symbolize_keys
36
-
37
- ApplicationRecord.transaction do
38
- assign_order_attributes
39
- assign_address(:ship_address)
40
- assign_address(:bill_address)
41
-
42
- order.save!
43
-
44
- process_line_items
45
- end
46
-
47
- success(order.reload)
48
- rescue ActiveRecord::RecordNotFound
49
- raise
50
- rescue ActiveRecord::RecordInvalid => e
51
- failure(order, e.record.errors.full_messages.to_sentence)
52
- rescue StandardError => e
53
- failure(order, e.message)
54
- end
55
-
56
- private
57
-
58
- attr_reader :order, :params
59
-
60
- def assign_order_attributes
61
- order.email = params[:email] if params[:email].present?
62
- order.special_instructions = params[:special_instructions] if params.key?(:special_instructions)
63
- order.currency = params[:currency].upcase if params[:currency].present?
64
- order.locale = params[:locale] if params[:locale].present?
65
- order.metadata = order.metadata.merge(params[:metadata].to_h) if params[:metadata].present?
66
- end
67
-
68
- def assign_address(address_type)
69
- address_id_param = params[:"#{address_type}_id"]
70
- address_params = params[address_type]
71
-
72
- # Priority 1: Direct address ID reference (ship_address_id / bill_address_id)
73
- if address_id_param.present?
74
- address_id = resolve_address_id(address_id_param)
75
- order.public_send(:"#{address_type}_id=", address_id) if address_id
76
- return
77
- end
78
-
79
- # Priority 2: Nested address params (ship_address / bill_address)
80
- return unless address_params.is_a?(Hash)
81
-
82
- if address_params[:id].present?
83
- # Using existing address by ID within nested params
84
- address_id = resolve_address_id(address_params[:id])
85
- order.public_send(:"#{address_type}_id=", address_id) if address_id
86
- else
87
- # Creating/updating address with provided attributes
88
- revert_to_address_state if order.has_checkout_step?('address')
89
- order.public_send(:"#{address_type}_attributes=", address_params)
90
- end
91
- end
92
-
93
- def process_line_items
94
- return unless params[:line_items].is_a?(Array)
95
-
96
- result = Spree.cart_upsert_items_service.call(
97
- order: order,
98
- line_items: params[:line_items]
99
- )
100
-
101
- raise StandardError, result.error.to_s if result.failure?
102
- end
103
-
104
- # Translate prefixed ID to internal id
105
- def resolve_address_id(prefixed_id)
106
- return unless order.user
107
-
108
- decoded = Spree::Address.decode_prefixed_id(prefixed_id)
109
- decoded ? order.user.addresses.find_by(id: decoded)&.id : nil
110
- end
111
-
112
- # Revert order state to 'address' when address changes
113
- # This ensures shipments are recreated when transitioning back to delivery
114
- def revert_to_address_state
115
- return if ['cart', 'address'].include?(order.state)
116
-
117
- order.state = 'address'
118
- end
119
- end
120
- end
121
- end