spree_cm_commissioner 1.17.0 → 1.18.0.pre.pre1
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 +4 -4
- data/Gemfile.lock +1 -5
- data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +2 -1
- data/app/controllers/spree/api/v2/storefront/guests_controller.rb +26 -2
- data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
- data/app/controllers/spree_cm_commissioner/well_known_controller.rb +20 -18
- data/app/interactors/spree_cm_commissioner/universal_link_fetcher.rb +54 -0
- data/app/models/spree_cm_commissioner/dynamic_field.rb +15 -3
- data/app/models/spree_cm_commissioner/dynamic_field_option.rb +5 -1
- data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +21 -3
- data/app/models/spree_cm_commissioner/invite_team.rb +2 -0
- data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +2 -2
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +1 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +2 -1
- data/config/routes.rb +2 -1
- data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +6 -0
- data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +5 -0
- data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +5 -0
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c6c8c2151ba24667cc1e9b85cd4977c6f3745e3c74149039e62fc1c890c769f
|
4
|
+
data.tar.gz: de557da12a035a1bd7aca057b643212e3032947076b347fda2607ab5c610a77e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 640db753337cbeb97197940d575c5fea9ecccf4d64bf96fbf59b18ec2135b89a1165afe91a28d2f6a4270c2041cc4c4f14a4a42397f08c6c51433a585bc78062
|
7
|
+
data.tar.gz: dc0e18a7417112fdf20350f12d7558da7f8fc1002e6059c3595316d8da82a50a2dbcde94c07cef49282de7950c98ff16d2e703069166eb4e5a314c25ce0e8d4b
|
data/Gemfile.lock
CHANGED
@@ -34,7 +34,7 @@ GIT
|
|
34
34
|
PATH
|
35
35
|
remote: .
|
36
36
|
specs:
|
37
|
-
spree_cm_commissioner (1.
|
37
|
+
spree_cm_commissioner (1.18.0.pre.pre1)
|
38
38
|
activerecord-multi-tenant
|
39
39
|
activerecord_json_validator (~> 2.1, >= 2.1.3)
|
40
40
|
aws-sdk-cloudfront
|
@@ -572,10 +572,6 @@ GEM
|
|
572
572
|
nokogiri (1.15.4)
|
573
573
|
mini_portile2 (~> 2.8.2)
|
574
574
|
racc (~> 1.4)
|
575
|
-
nokogiri (1.15.4-x86_64-darwin)
|
576
|
-
racc (~> 1.4)
|
577
|
-
nokogiri (1.15.4-x86_64-linux)
|
578
|
-
racc (~> 1.4)
|
579
575
|
noticed (1.6.3)
|
580
576
|
http (>= 4.0.0)
|
581
577
|
rails (>= 5.2.0)
|
@@ -6,8 +6,9 @@ module SpreeCmCommissioner
|
|
6
6
|
after_action :set_cache_control_for_cdn
|
7
7
|
end
|
8
8
|
|
9
|
+
# Override This Method based on your UseCase
|
9
10
|
def max_age
|
10
|
-
ENV.fetch('CONTENT_CACHE_MAX_AGE',
|
11
|
+
ENV.fetch('CONTENT_CACHE_MAX_AGE', 1.day.to_i).to_i
|
11
12
|
end
|
12
13
|
|
13
14
|
def set_cache_control_for_cdn
|
@@ -38,7 +38,11 @@ module Spree
|
|
38
38
|
def update
|
39
39
|
spree_authorize! :update, spree_current_order, order_token
|
40
40
|
|
41
|
-
if
|
41
|
+
update_dynamic_fields if guest_params[:guest_dynamic_fields_attributes]
|
42
|
+
|
43
|
+
resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
|
44
|
+
|
45
|
+
if resource.save
|
42
46
|
render_serialized_payload { serialize_resource(resource) }
|
43
47
|
else
|
44
48
|
render_error_payload(resource, 400)
|
@@ -76,9 +80,29 @@ module Spree
|
|
76
80
|
:upload_later,
|
77
81
|
:country_code,
|
78
82
|
:contact,
|
79
|
-
guest_dynamic_fields_attributes: %i[id dynamic_field_id value _destroy]
|
83
|
+
guest_dynamic_fields_attributes: %i[id dynamic_field_id dynamic_field_option_id value _destroy]
|
80
84
|
)
|
81
85
|
end
|
86
|
+
|
87
|
+
def update_dynamic_fields
|
88
|
+
resource.guest_dynamic_fields.destroy_all
|
89
|
+
|
90
|
+
dynamic_fields_attrs = guest_params[:guest_dynamic_fields_attributes]
|
91
|
+
|
92
|
+
resource.guest_dynamic_fields = dynamic_fields_attrs.map do |attr|
|
93
|
+
build_dynamic_field(attr)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def build_dynamic_field(attr)
|
98
|
+
field = resource.guest_dynamic_fields.build(attr.except(:id))
|
99
|
+
|
100
|
+
if field.dynamic_field.requires_dynamic_field_options?
|
101
|
+
field.dynamic_field_option = field.dynamic_field.dynamic_field_options.find_by(id: field.value)
|
102
|
+
end
|
103
|
+
|
104
|
+
field
|
105
|
+
end
|
82
106
|
end
|
83
107
|
end
|
84
108
|
end
|
@@ -37,7 +37,7 @@ module SpreeCmCommissioner
|
|
37
37
|
bit_fields = SpreeCmCommissioner::KycBitwise::BIT_FIELDS.keys
|
38
38
|
|
39
39
|
if permitted_resource_params[:use_product_kyc] == '1'
|
40
|
-
permitted_resource_params[:kyc] =
|
40
|
+
permitted_resource_params[:kyc] = nil
|
41
41
|
else
|
42
42
|
@kyc_result = calculate_kyc_value(params[:variant])
|
43
43
|
permitted_resource_params[:kyc] = @kyc_result
|
@@ -3,19 +3,31 @@ module SpreeCmCommissioner
|
|
3
3
|
before_action :identify_request_source
|
4
4
|
rescue_from StandardError, with: :handle_error
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
def assetlinks_json
|
7
|
+
render_universal_link('assetlinks.json')
|
8
|
+
end
|
9
|
+
|
10
|
+
def apple_app_site_association
|
11
|
+
render_universal_link('apple-app-site-association')
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def render_universal_link(universal_link)
|
17
|
+
result = SpreeCmCommissioner::UniversalLinkFetcher.new(
|
18
|
+
universal_link: universal_link,
|
19
|
+
store: @store,
|
20
|
+
tenant: @tenant,
|
21
|
+
refresh: params[:_refresh].to_s == 'true'
|
22
|
+
).call
|
23
|
+
|
24
|
+
if result[:success]
|
25
|
+
render json: result[:data]
|
12
26
|
else
|
13
27
|
render_not_found
|
14
28
|
end
|
15
29
|
end
|
16
30
|
|
17
|
-
private
|
18
|
-
|
19
31
|
def identify_request_source
|
20
32
|
host = params[:original_host].presence || request.host.downcase
|
21
33
|
|
@@ -25,16 +37,6 @@ module SpreeCmCommissioner
|
|
25
37
|
@tenant = result.tenant
|
26
38
|
end
|
27
39
|
|
28
|
-
def render_preference(preference_key)
|
29
|
-
if @store&.send(preference_key).present?
|
30
|
-
render json: @store.send(preference_key)
|
31
|
-
elsif @tenant&.send(preference_key).present?
|
32
|
-
render json: @tenant.send(preference_key)
|
33
|
-
else
|
34
|
-
render_not_found
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
40
|
def render_not_found
|
39
41
|
render json: { error: 'Not found' }, status: :not_found
|
40
42
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
class UniversalLinkFetcher < BaseInteractor
|
3
|
+
delegate :universal_link, :store, :tenant, :refresh, to: :context
|
4
|
+
|
5
|
+
def call
|
6
|
+
return not_found unless resource
|
7
|
+
|
8
|
+
data = load_cached_preference(resource)
|
9
|
+
return not_found if data.blank?
|
10
|
+
|
11
|
+
{ success: true, data: data }
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def resource
|
17
|
+
@resource ||= store.presence || tenant
|
18
|
+
end
|
19
|
+
|
20
|
+
def load_cached_preference(resource)
|
21
|
+
preference_key = preference_key_for(universal_link)
|
22
|
+
return nil unless preference_key && resource.respond_to?(preference_key)
|
23
|
+
|
24
|
+
updated_at = resource.try(:updated_at)&.to_i || 'no_updated_at'
|
25
|
+
cache_key = build_cache_key(universal_link, resource, updated_at)
|
26
|
+
|
27
|
+
CmAppLogger.log(label: 'LOOKING_UP_CACHE', data: { cache_key: cache_key })
|
28
|
+
|
29
|
+
Rails.cache.delete(cache_key) if refresh
|
30
|
+
|
31
|
+
Rails.cache.fetch(cache_key, expires_in: 1.day, force: refresh) do
|
32
|
+
CmAppLogger.log(label: 'CACHE_MISS', data: { cache_key: cache_key })
|
33
|
+
resource.public_send(preference_key).presence
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_cache_key(universal_link, resource, updated_at)
|
38
|
+
"well_known:#{universal_link}:#{resource.class.name}:#{resource.id}:#{updated_at}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def preference_key_for(universal_link)
|
42
|
+
case universal_link
|
43
|
+
when 'assetlinks.json'
|
44
|
+
:preferred_assetlinks
|
45
|
+
when 'apple-app-site-association'
|
46
|
+
:preferred_apple_app_site_association
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def not_found
|
51
|
+
{ success: false, error: 'Not found' }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -6,15 +6,27 @@ module SpreeCmCommissioner
|
|
6
6
|
has_many :guest_dynamic_fields, class_name: 'SpreeCmCommissioner::GuestDynamicField', dependent: :destroy
|
7
7
|
has_many :product_dynamic_fields, class_name: 'SpreeCmCommissioner::ProductDynamicField', dependent: :destroy
|
8
8
|
|
9
|
-
enum data_type: {
|
9
|
+
enum data_type: { text: 0, number: 1, boolean: 2, checkbox: 3, radio: 4, selection: 5, textarea: 6 }
|
10
10
|
|
11
11
|
accepts_nested_attributes_for :dynamic_field_options, allow_destroy: true, reject_if: :all_blank
|
12
12
|
|
13
13
|
validates :label, presence: true
|
14
14
|
validates :data_type, presence: true
|
15
|
+
validates :configurations, presence: true, allow_blank: false
|
15
16
|
|
16
|
-
def
|
17
|
-
checkbox? || radio?
|
17
|
+
def requires_dynamic_field_options?
|
18
|
+
checkbox? || radio? || selection?
|
19
|
+
end
|
20
|
+
|
21
|
+
def multiple_select
|
22
|
+
return nil unless selection?
|
23
|
+
|
24
|
+
configurations['multiple_select'] == true
|
25
|
+
end
|
26
|
+
|
27
|
+
def multiple_select=(value)
|
28
|
+
self.configurations ||= {}
|
29
|
+
self.configurations['multiple_select'] = ActiveModel::Type::Boolean.new.cast(value)
|
18
30
|
end
|
19
31
|
end
|
20
32
|
end
|
@@ -1,8 +1,12 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class DynamicFieldOption < SpreeCmCommissioner::Base
|
3
3
|
belongs_to :dynamic_field, class_name: 'SpreeCmCommissioner::DynamicField', optional: false
|
4
|
+
has_many :guest_dynamic_fields, class_name: 'SpreeCmCommissioner::GuestDynamicField', dependent: :restrict_with_error
|
5
|
+
|
6
|
+
enum status: { active: 0, draft: 1, archived: 2 }
|
4
7
|
|
5
8
|
validates :value, presence: true, uniqueness: { scope: :dynamic_field_id }
|
9
|
+
validates :status, presence: true
|
6
10
|
validate :parent_field_must_be_selection_type
|
7
11
|
|
8
12
|
private
|
@@ -10,7 +14,7 @@ module SpreeCmCommissioner
|
|
10
14
|
def parent_field_must_be_selection_type
|
11
15
|
return unless dynamic_field
|
12
16
|
|
13
|
-
return if dynamic_field.
|
17
|
+
return if dynamic_field.requires_dynamic_field_options?
|
14
18
|
|
15
19
|
errors.add(:dynamic_field, 'must be a selection type field')
|
16
20
|
end
|
@@ -2,9 +2,11 @@ module SpreeCmCommissioner
|
|
2
2
|
class GuestDynamicField < SpreeCmCommissioner::Base
|
3
3
|
belongs_to :guest, class_name: 'SpreeCmCommissioner::Guest', optional: false
|
4
4
|
belongs_to :dynamic_field, class_name: 'SpreeCmCommissioner::DynamicField', optional: false
|
5
|
+
belongs_to :dynamic_field_option, class_name: 'SpreeCmCommissioner::DynamicFieldOption', optional: true
|
5
6
|
|
6
7
|
validates :value, presence: true
|
7
8
|
validate :validate_value_format, if: -> { value.present? && dynamic_field.present? }
|
9
|
+
validate :validate_option_reference, if: -> { dynamic_field_option.present? }
|
8
10
|
|
9
11
|
private
|
10
12
|
|
@@ -12,14 +14,30 @@ module SpreeCmCommissioner
|
|
12
14
|
return if dynamic_field.blank?
|
13
15
|
|
14
16
|
case dynamic_field.data_type.to_s
|
15
|
-
when '
|
17
|
+
when 'number'
|
16
18
|
errors.add(:value, 'must be a number') unless value.to_s.match?(/\A\d+\z/)
|
17
19
|
when 'boolean'
|
18
|
-
errors.add(:value, 'must be true or false') unless %w[true false
|
19
|
-
when 'checkbox', 'radio'
|
20
|
+
errors.add(:value, 'must be true or false') unless %w[true false].include?(value.to_s.downcase)
|
21
|
+
when 'checkbox', 'radio', 'selection'
|
22
|
+
validate_option_value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate_option_value
|
27
|
+
if dynamic_field_option.present?
|
28
|
+
self.value ||= dynamic_field_option.value
|
29
|
+
else
|
20
30
|
valid_options = dynamic_field.dynamic_field_options.pluck(:id).map(&:to_s)
|
21
31
|
errors.add(:value, 'is not a valid option') unless valid_options.include?(value)
|
22
32
|
end
|
23
33
|
end
|
34
|
+
|
35
|
+
def validate_option_reference
|
36
|
+
return if dynamic_field.blank? || dynamic_field_option.blank?
|
37
|
+
|
38
|
+
return if dynamic_field_option.dynamic_field_id == dynamic_field_id
|
39
|
+
|
40
|
+
errors.add(:dynamic_field_option, 'must belong to the same dynamic field')
|
41
|
+
end
|
24
42
|
end
|
25
43
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class InviteTeam < SpreeCmCommissioner::Base
|
3
|
+
validates :email, presence: true, uniqueness: { scope: :vendor_id, message: I18n.t('invite.already_invited') }
|
4
|
+
|
3
5
|
belongs_to :user, class_name: 'Spree::User', optional: true
|
4
6
|
belongs_to :inviter, class_name: 'Spree::User'
|
5
7
|
belongs_to :vendor, class_name: 'Spree::Vendor'
|
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
<p>Guest Information Fields</p>
|
4
4
|
<div class="form-check mb-3">
|
5
|
-
<%= f.check_box :use_product_kyc, id: "toggleGuestInfo", class: 'form-check-input mr-2', checked:
|
5
|
+
<%= f.check_box :use_product_kyc, id: "toggleGuestInfo", class: 'form-check-input mr-2', checked: @variant.kyc.nil? %>
|
6
6
|
<label for="toggleGuestInfo" class="form-check-label">
|
7
7
|
Use Product Guest Information
|
8
8
|
</label>
|
9
9
|
</div>
|
10
10
|
|
11
|
-
<div id="guestInfoForm" <% if @variant.kyc
|
11
|
+
<div id="guestInfoForm" <% if @variant.kyc.nil? %>style="display: none;"<% end %>">
|
12
12
|
<small class="form-text text-muted mb-4">
|
13
13
|
<%= raw I18n.t('kyc.variant_note') %>
|
14
14
|
</small>
|
@@ -2,9 +2,7 @@ module SpreeCmCommissioner
|
|
2
2
|
module V2
|
3
3
|
module Storefront
|
4
4
|
class DynamicFieldOptionSerializer < BaseSerializer
|
5
|
-
|
6
|
-
|
7
|
-
attributes :id, :value, :dynamic_field_id, :created_at, :updated_at
|
5
|
+
attributes :id, :value, :dynamic_field_id, :status, :created_at, :updated_at
|
8
6
|
end
|
9
7
|
end
|
10
8
|
end
|
@@ -2,9 +2,7 @@ module SpreeCmCommissioner
|
|
2
2
|
module V2
|
3
3
|
module Storefront
|
4
4
|
class DynamicFieldSerializer < BaseSerializer
|
5
|
-
|
6
|
-
|
7
|
-
attributes :id, :label, :data_type, :vendor_id, :created_at, :updated_at
|
5
|
+
attributes :id, :label, :data_type, :vendor_id, :multiple_select, :created_at, :updated_at
|
8
6
|
|
9
7
|
has_many :dynamic_field_options, serializer: SpreeCmCommissioner::V2::Storefront::DynamicFieldOptionSerializer
|
10
8
|
end
|
@@ -4,9 +4,10 @@ module SpreeCmCommissioner
|
|
4
4
|
class GuestDynamicFieldSerializer < BaseSerializer
|
5
5
|
set_type :guest_dynamic_field
|
6
6
|
|
7
|
-
attributes :id, :value, :guest_id, :dynamic_field_id, :created_at, :updated_at
|
7
|
+
attributes :id, :value, :guest_id, :dynamic_field_id, :dynamic_field_option_id, :created_at, :updated_at
|
8
8
|
|
9
9
|
belongs_to :dynamic_field, serializer: SpreeCmCommissioner::V2::Storefront::DynamicFieldSerializer
|
10
|
+
belongs_to :dynamic_field_option, serializer: SpreeCmCommissioner::V2::Storefront::DynamicFieldOptionSerializer
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
data/config/routes.rb
CHANGED
@@ -669,5 +669,6 @@ Rails.application.routes.draw do
|
|
669
669
|
get 'o/:id', to: 'spree_cm_commissioner/orders#show', as: 'order'
|
670
670
|
get 'li/:id', to: 'spree_cm_commissioner/line_item_qr_images#show', as: 'line_item_qr_image'
|
671
671
|
get 'g/:id', to: 'spree_cm_commissioner/guest_cards#show', as: 'guest_cards'
|
672
|
-
get '.well-known
|
672
|
+
get '.well-known/assetlinks.json', to: 'spree_cm_commissioner/well_known#assetlinks_json'
|
673
|
+
get '.well-known/apple-app-site-association', to: 'spree_cm_commissioner/well_known#apple_app_site_association'
|
673
674
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_cm_commissioner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.18.0.pre.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- You
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-07-
|
11
|
+
date: 2025-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree
|
@@ -1116,6 +1116,7 @@ files:
|
|
1116
1116
|
- app/interactors/spree_cm_commissioner/telegram_web_app_vendor_user_checker.rb
|
1117
1117
|
- app/interactors/spree_cm_commissioner/transactional_email_sender.rb
|
1118
1118
|
- app/interactors/spree_cm_commissioner/unique_device_token_cron_executor.rb
|
1119
|
+
- app/interactors/spree_cm_commissioner/universal_link_fetcher.rb
|
1119
1120
|
- app/interactors/spree_cm_commissioner/update_payment_gateway_status.rb
|
1120
1121
|
- app/interactors/spree_cm_commissioner/user_contact_updater.rb
|
1121
1122
|
- app/interactors/spree_cm_commissioner/user_device_token_deregister.rb
|
@@ -2517,6 +2518,9 @@ files:
|
|
2517
2518
|
- db/migrate/20250611023548_add_country_code_to_guests.rb
|
2518
2519
|
- db/migrate/20250612035937_add_intel_phone_number_to_guests.rb
|
2519
2520
|
- db/migrate/20250616084219_add_description_to_cm_vendor_place.rb
|
2521
|
+
- db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb
|
2522
|
+
- db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb
|
2523
|
+
- db/migrate/20250702091935_add_status_to_dynamic_field_option.rb
|
2520
2524
|
- docker-compose.yml
|
2521
2525
|
- docs/option_types/attr_types.md
|
2522
2526
|
- docs/private_key.pem
|
@@ -2669,9 +2673,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
2669
2673
|
version: '2.7'
|
2670
2674
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
2671
2675
|
requirements:
|
2672
|
-
- - "
|
2676
|
+
- - ">"
|
2673
2677
|
- !ruby/object:Gem::Version
|
2674
|
-
version:
|
2678
|
+
version: 1.3.1
|
2675
2679
|
requirements:
|
2676
2680
|
- none
|
2677
2681
|
rubygems_version: 3.4.1
|