spree_cm_commissioner 2.9.8 → 2.9.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8eb692e530b34906dfca4d757e6382b9b643e18760fd38ba31507ceb24bb687b
4
- data.tar.gz: 782a651003a7817fb539def0a19697d434978c51f7f48c0f2184b48fe87c1260
3
+ metadata.gz: 391b15d7aada08289da9a21d18a9d48d461ecf1fe0c36a361a276df201455a5e
4
+ data.tar.gz: af3f07ac5d9e449cb5300949dbbcdcb80981b78b41f0aa23a396ce6cdd49e68b
5
5
  SHA512:
6
- metadata.gz: '090263c66bf5f79ea0edfcf6602185b0d80120f33308b2d0193cacf3bb2ebc5036543f1e1000b4e823a243a31cd3dc2eaf3e4b8772c6717d16891554b3da96a0'
7
- data.tar.gz: 3540311c234819a354e154a532b7745e91ebf1faf7b15bcc40a5a6def80ea069d3820759b328decb2328f6ad60190a12686d5c23c0951c864ee89215160fd4a1
6
+ metadata.gz: 49e38586ae76dfcf37be8bb6f9c4ddef60a2ef694f491ffb648b5903070dd0932c2efb1d936f3c5a6b4c1af16355b2ddc26e4706cc04c7ed32bed0908ed88db5
7
+ data.tar.gz: be58778bd8a6124b8b3c914e9c0c83a44dce42a75c1df0f677ef00868bc388f3fa88518828e1833b701366eedf551e03a30528919a2c1f8ea16aec108d92b8fe
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (2.9.8)
37
+ spree_cm_commissioner (2.9.9)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -33,6 +33,7 @@ module SpreeCmCommissioner
33
33
  ShowContestantsController
34
34
  VotePackagesController
35
35
  ShowEliminationSessionsController
36
+ PaymentMethodsController
36
37
  ].freeze
37
38
 
38
39
  # Priority 3: Moderate Freshness (30 minutes)
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ # Order & user independent catalog of the payment methods a vendor accepts.
6
+ # Takes vendor_id as a required query param. See
7
+ # Spree::Api::V2::Tenant::PaymentMethodsController for the caching caveat
8
+ # that comes with that, and for what this deliberately leaves out.
9
+ class PaymentMethodsController < Spree::Api::V2::ResourceController
10
+ # override
11
+ def index
12
+ render_serialized_payload do
13
+ collection_serializer.new(collection).serializable_hash
14
+ end
15
+ end
16
+
17
+ # override
18
+ def collection
19
+ @collection ||= SpreeCmCommissioner::PaymentMethods::Find.new(
20
+ vendor: vendor,
21
+ store: current_store,
22
+ type: params[:type]
23
+ ).execute
24
+ end
25
+
26
+ # override
27
+ def collection_serializer
28
+ ::Spree::V2::Storefront::PaymentMethodSerializer
29
+ end
30
+
31
+ private
32
+
33
+ def vendor
34
+ @vendor ||= ::Spree::Vendor.active.find(params[:vendor_id])
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,54 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Tenant
5
+ # Order & user independent catalog of the payment methods a vendor accepts.
6
+ #
7
+ # vendor_id is a required query param. A vendor id is globally unique and
8
+ # belongs to exactly one tenant, so it is what identifies tenant, vendor and
9
+ # store here — the tenant itself comes from the Doorkeeper token, not the URL.
10
+ #
11
+ # IMPORTANT for caching (see SpreeCmCommissioner::ContentCachable): the CDN
12
+ # must include vendor_id in its cache key. If query strings are stripped,
13
+ # every vendor collapses into one cache entry and the wrong payment methods
14
+ # are served. Moving to /vendors/:vendor_id/payment_methods would remove that
15
+ # dependency — tracked as a follow-up.
16
+ #
17
+ # For the per-order truth (store credit, early adopter, payout filtering)
18
+ # use CartPaymentMethodGroupsController instead.
19
+ class PaymentMethodsController < BaseController
20
+ # override
21
+ def index
22
+ render_serialized_payload do
23
+ collection_serializer.new(collection).serializable_hash
24
+ end
25
+ end
26
+
27
+ # override
28
+ def collection
29
+ @collection ||= SpreeCmCommissioner::PaymentMethods::Find.new(
30
+ vendor: vendor,
31
+ store: current_store,
32
+ type: params[:type]
33
+ ).execute
34
+ end
35
+
36
+ # override
37
+ def collection_serializer
38
+ Spree::V2::Tenant::PaymentMethodSerializer
39
+ end
40
+
41
+ private
42
+
43
+ # Scoped to the token's tenant, so a token from another tenant gets a 404
44
+ # rather than a cache hit on someone else's vendor.
45
+ def vendor
46
+ @vendor ||= MultiTenant.with(@tenant) do
47
+ ::Spree::Vendor.active.find(params[:vendor_id])
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,59 @@
1
+ module SpreeCmCommissioner
2
+ module PaymentMethods
3
+ # Order & user independent lookup of the payment methods a vendor accepts.
4
+ #
5
+ # Mirrors the scope selection of Vpago::OrderDecorator#available_payment_methods,
6
+ # minus everything that depends on the order or the current user, so the result
7
+ # is safe to cache on the vendor id alone:
8
+ #
9
+ # - available_for_order? (only Spree::PaymentMethod::StoreCredit varies, on user balance)
10
+ # - available_on_frontend_for_early_adopter (user attribute)
11
+ # - support_payout? (order line items)
12
+ # - preferred_payment_method_id (user, affects sort only)
13
+ #
14
+ # Callers needing the per-order truth must keep using
15
+ # Spree::Api::V2::*::CartPaymentMethodGroupsController.
16
+ class Find
17
+ attr_reader :vendor, :store, :type
18
+
19
+ def initialize(vendor:, store: nil, type: nil)
20
+ @vendor = vendor
21
+ @store = store
22
+ @type = type
23
+ end
24
+
25
+ def execute
26
+ return mini_app_scope if type.present?
27
+
28
+ scope.reject(&:mini_app?)
29
+ end
30
+
31
+ private
32
+
33
+ def scope
34
+ @scope ||= source.available_on_front_end.order(:position).to_a
35
+ end
36
+
37
+ # Vendors without their own payment methods fall back to the store's,
38
+ # same as Vpago::OrderDecorator#available_payment_methods.
39
+ def source
40
+ vendor_payment_methods.exists? ? vendor_payment_methods : store_payment_methods
41
+ end
42
+
43
+ def vendor_payment_methods
44
+ @vendor_payment_methods ||= vendor&.payment_methods || Spree::PaymentMethod.none
45
+ end
46
+
47
+ def store_payment_methods
48
+ (store || Spree::Store.default).payment_methods
49
+ end
50
+
51
+ def mini_app_scope
52
+ mapped_type = SpreeCmCommissioner::PaymentMethodTypeMapper.call(type)
53
+ return [] if mapped_type.blank?
54
+
55
+ scope.select { |payment_method| payment_method.mini_app? && payment_method.type == mapped_type }
56
+ end
57
+ end
58
+ end
59
+ end
@@ -7,7 +7,8 @@ module Spree
7
7
  :country_code, :otp_enabled, :otp_email, :otp_phone_number,
8
8
  :confirm_pin_code_enabled, :tenant_id,
9
9
  :login, :qr_data, :qr_data_version, :qr_data_invalidated_at,
10
- :unread_notifications_count, :request_orders_count
10
+ :unread_notifications_count, :request_orders_count,
11
+ :preferred_payment_method_id
11
12
 
12
13
  base.attribute :has_incomplete_guest_info, &:has_incomplete_guest_info?
13
14
 
@@ -6,7 +6,7 @@ module Spree
6
6
  :public_metadata, :completed_orders,
7
7
  :phone_number, :intel_phone_number, :country_code,
8
8
  :otp_enabled, :otp_email, :otp_phone_number,
9
- :confirm_pin_code_enabled
9
+ :confirm_pin_code_enabled, :preferred_payment_method_id
10
10
 
11
11
  has_one :profile, serializer: Spree::V2::Tenant::AssetSerializer
12
12
  has_many :device_tokens, serializer: Spree::V2::Tenant::UserDeviceTokenSerializer
@@ -9,7 +9,8 @@ module SpreeCmCommissioner
9
9
  'Spree::Menu' => Spree::Menu,
10
10
  'Spree::Taxon' => Spree::Taxon,
11
11
  'Spree::Product' => Spree::Product,
12
- 'Spree::Vendor' => Spree::Vendor
12
+ 'Spree::Vendor' => Spree::Vendor,
13
+ 'Spree::PaymentMethod' => Spree::PaymentMethod
13
14
  }.freeze
14
15
 
15
16
  # eg. 'Spree::Product', 123 or 'Spree::Product', nil
@@ -84,7 +85,8 @@ module SpreeCmCommissioner
84
85
  '/api/v2/storefront/vendors/:id*',
85
86
  '/api/v2/storefront/accommodations/:id*',
86
87
  '/api/v2/storefront/accommodations/:slug*'
87
- ]
88
+ ],
89
+ 'Spree::PaymentMethod' => payment_method_patterns
88
90
  }
89
91
  end
90
92
 
@@ -107,12 +109,31 @@ module SpreeCmCommissioner
107
109
  '/api/v2/tenant/vendors/*',
108
110
  '/api/v2/storefront/vendors/*',
109
111
  '/api/v2/storefront/accommodations/*'
110
- ]
112
+ ],
113
+ 'Spree::PaymentMethod' => payment_method_patterns
111
114
  }
112
115
  end
113
116
 
114
117
  private
115
118
 
119
+ # Deliberately broad, and identical for single-record and all-record
120
+ # invalidation: a payment method is either vendor-owned or store-level, and a
121
+ # store-level one is served for every vendor through the fallback in
122
+ # SpreeCmCommissioner::PaymentMethods::Find. From the record alone we cannot
123
+ # tell which vendors are affected.
124
+ #
125
+ # vendor_id is a query param, so the trailing `*` is what clears every
126
+ # vendor's cached variant of this path in one go.
127
+ #
128
+ # Payment methods change a handful of times a year, so a broad invalidation
129
+ # is cheap.
130
+ def payment_method_patterns
131
+ [
132
+ '/api/v2/tenant/payment_methods*',
133
+ '/api/v2/storefront/payment_methods*'
134
+ ]
135
+ end
136
+
116
137
  # eg. updated_at: Fri, 26 Dec 2025 10:40:56.505450000 +07 +07:00
117
138
  def refresh_record_cache_key(record)
118
139
  # rubocop:disable Rails/SkipsModelValidations
data/config/routes.rb CHANGED
@@ -532,6 +532,7 @@ Spree::Core::Engine.add_routes do
532
532
  namespace :tenant do
533
533
  resource :token, controller: :access_tokens, only: [:create]
534
534
  resources :vendors
535
+ resources :payment_methods, only: %i[index]
535
536
  resources :products
536
537
  resources :taxons, only: %i[index show], id: /.+/
537
538
  resources :ad_campaigns, only: [:index]
@@ -757,6 +758,7 @@ Spree::Core::Engine.add_routes do
757
758
  resources :vendor_photos
758
759
  resources :events
759
760
  end
761
+ resources :payment_methods, only: %i[index]
760
762
  resource :homepage_data, only: [:show]
761
763
  resources :homepage_sections, only: [:index]
762
764
  resources :order_qrs, only: [:show]
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.9.8'.freeze
2
+ VERSION = '2.9.9'.freeze
3
3
 
4
4
  module_function
5
5
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_cm_commissioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.8
4
+ version: 2.9.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
@@ -1004,6 +1004,7 @@ files:
1004
1004
  - app/controllers/spree/api/v2/storefront/order_promotions_controller.rb
1005
1005
  - app/controllers/spree/api/v2/storefront/order_qrs_controller.rb
1006
1006
  - app/controllers/spree/api/v2/storefront/order_request_notifications_controller.rb
1007
+ - app/controllers/spree/api/v2/storefront/payment_methods_controller.rb
1007
1008
  - app/controllers/spree/api/v2/storefront/pending_line_items_controller.rb
1008
1009
  - app/controllers/spree/api/v2/storefront/pin_code_checkers_controller.rb
1009
1010
  - app/controllers/spree/api/v2/storefront/pin_code_generators_controller.rb
@@ -1074,6 +1075,7 @@ files:
1074
1075
  - app/controllers/spree/api/v2/tenant/my_votes_controller.rb
1075
1076
  - app/controllers/spree/api/v2/tenant/notifications_controller.rb
1076
1077
  - app/controllers/spree/api/v2/tenant/order_histories_controller.rb
1078
+ - app/controllers/spree/api/v2/tenant/payment_methods_controller.rb
1077
1079
  - app/controllers/spree/api/v2/tenant/pin_code_checkers_controller.rb
1078
1080
  - app/controllers/spree/api/v2/tenant/pin_code_generators_controller.rb
1079
1081
  - app/controllers/spree/api/v2/tenant/popular_route_places_controller.rb
@@ -1201,6 +1203,7 @@ files:
1201
1203
  - app/finders/spree_cm_commissioner/orders/find.rb
1202
1204
  - app/finders/spree_cm_commissioner/orders/find_by_all_state.rb
1203
1205
  - app/finders/spree_cm_commissioner/orders/find_by_state.rb
1206
+ - app/finders/spree_cm_commissioner/payment_methods/find.rb
1204
1207
  - app/finders/spree_cm_commissioner/payment_methods/group_by_bank.rb
1205
1208
  - app/finders/spree_cm_commissioner/places/find_with_route.rb
1206
1209
  - app/finders/spree_cm_commissioner/products/find_decorator.rb