spree_cm_commissioner 1.10.0.pre.hotfix.pre.sms → 1.10.0
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/.github/workflows/test_and_build_gem.yml +24 -48
- data/.vscode/settings.json +1 -1
- data/Gemfile.lock +1 -1
- data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
- data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
- data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
- data/app/interactors/spree_cm_commissioner/create_event.rb +0 -23
- data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
- data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
- data/app/interactors/spree_cm_commissioner/sms.rb +0 -14
- data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +1 -2
- data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +1 -2
- data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +2 -4
- data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +8 -27
- data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +1 -3
- data/app/models/concerns/spree_cm_commissioner/user_identity.rb +4 -7
- data/app/models/spree_cm_commissioner/place.rb +2 -11
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -11
- data/app/models/spree_cm_commissioner/trip.rb +11 -0
- data/app/models/spree_cm_commissioner/trip_stop.rb +4 -11
- data/app/models/spree_cm_commissioner/variant_decorator.rb +2 -9
- data/app/models/spree_cm_commissioner/vehicle.rb +7 -0
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +1 -2
- data/app/models/spree_cm_commissioner/vendor_stop.rb +1 -2
- data/app/overrides/spree/admin/users/index/body.html.erb.deface +0 -3
- data/app/overrides/spree/admin/users/index/headers.html.erb.deface +0 -3
- data/app/serializers/spree/v2/tenant/guest_serializer.rb +0 -1
- data/app/services/spree_cm_commissioner/aes_encryption_service.rb +4 -6
- data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +0 -2
- data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -3
- data/config/routes.rb +0 -2
- data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +1 -11
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +4 -21
- data/app/controllers/spree/admin/cms_pages_controller_decorator.rb +0 -32
- data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +0 -41
- data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +0 -18
- data/app/models/spree_cm_commissioner/cms_page_decorator.rb +0 -9
- data/app/models/spree_cm_commissioner/taxon_option_type.rb +0 -8
- data/app/models/spree_cm_commissioner/taxon_option_value.rb +0 -8
- data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +0 -7
- data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +0 -21
- data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
- data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +0 -20
- data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +0 -10
- data/db/migrate/20250430091742_create_cm_taxon_option_types.rb +0 -9
- data/db/migrate/20250430092928_create_cm_taxon_option_values.rb +0 -9
- data/db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb +0 -5
- data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +0 -6
- data/lib/tasks/migrate_and_rebuild_place_hierarchy.rake +0 -9
- data/lib/tasks/update_orphan_root_places.rake +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 634d4cd6a4373be586e59598dab82c2440eb292abe53abeeb1161e6bfca85da2
|
4
|
+
data.tar.gz: 3e0e4f5293ce46f30d227269baf174b7b8b3a32ac269a30b733f3e7ea1065aca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7830251cadb15def91fb9d7bc6c6c68dacb3af529d941f6c1d17364f3dd621c2e3539bf24d7d870d0b82e88f2309d78ab895de19219144192dd8924f1a1943b1
|
7
|
+
data.tar.gz: 64bbba3e3a8227f1788748ac27ee108d8f3ad93d89829336f53817556eb6a7e67fd4c43263ce6aa57e087df046139db1c9a665f57411634e1648d8dbd55b9f33
|
@@ -3,11 +3,6 @@ name: Commissioner Gem
|
|
3
3
|
|
4
4
|
on:
|
5
5
|
pull_request:
|
6
|
-
types:
|
7
|
-
- opened
|
8
|
-
- edited
|
9
|
-
- synchronize
|
10
|
-
- reopened
|
11
6
|
branches:
|
12
7
|
- develop
|
13
8
|
push:
|
@@ -19,8 +14,8 @@ jobs:
|
|
19
14
|
|
20
15
|
steps:
|
21
16
|
- name: Check PR title format
|
22
|
-
if: github.event_name == 'pull_request'
|
23
17
|
uses: actions/github-script@v7
|
18
|
+
if: github.event_name == 'pull_request'
|
24
19
|
with:
|
25
20
|
script: |
|
26
21
|
const title = context.payload.pull_request.title.trim();
|
@@ -37,8 +32,8 @@ jobs:
|
|
37
32
|
console.log("PR title format is correct.");
|
38
33
|
}
|
39
34
|
- name: Check commit messages format
|
40
|
-
if: github.event_name == 'pull_request'
|
41
35
|
uses: actions/github-script@v7
|
36
|
+
if: github.event_name == 'pull_request'
|
42
37
|
with:
|
43
38
|
script: |
|
44
39
|
const pr = context.payload.pull_request;
|
@@ -69,52 +64,33 @@ jobs:
|
|
69
64
|
console.log("All commit messages are correctly formatted.");
|
70
65
|
}
|
71
66
|
- name: Check for unresolved review threads
|
72
|
-
if: github.event_name == 'pull_request'
|
73
67
|
uses: actions/github-script@v7
|
68
|
+
if: github.event_name == 'pull_request'
|
74
69
|
with:
|
75
70
|
script: |
|
76
|
-
const
|
77
|
-
const
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
comments(first: 1) {
|
87
|
-
nodes {
|
88
|
-
body
|
89
|
-
author {
|
90
|
-
login
|
91
|
-
}
|
92
|
-
}
|
93
|
-
}
|
94
|
-
}
|
95
|
-
}
|
96
|
-
}
|
97
|
-
}
|
98
|
-
}
|
99
|
-
`;
|
100
|
-
const variables = { owner, repo, prNumber };
|
101
|
-
const result = await github.graphql(query, variables);
|
102
|
-
const threads = result.repository.pullRequest.reviewThreads.nodes;
|
103
|
-
|
104
|
-
const unresolved = threads.filter(t => !t.isResolved);
|
105
|
-
|
106
|
-
if (unresolved.length > 0) {
|
107
|
-
unresolved.forEach(thread => {
|
108
|
-
const comments = thread.comments.nodes;
|
109
|
-
if (comments.length > 0) {
|
110
|
-
console.log(`💬 Comment by ${comments[0].author.login}: ${comments[0].body}`);
|
111
|
-
}
|
71
|
+
const pr = context.payload.pull_request;
|
72
|
+
const owner = context.repo.owner;
|
73
|
+
const repo = context.repo.repo;
|
74
|
+
|
75
|
+
try {
|
76
|
+
const response = await github.rest.pulls.listReviewComments({
|
77
|
+
owner,
|
78
|
+
repo,
|
79
|
+
pull_number: pr.number,
|
80
|
+
per_page: 100
|
112
81
|
});
|
113
|
-
core.setFailed(`❌ There are ${unresolved.length} unresolved review thread(s). Please resolve them before merging.`);
|
114
|
-
} else {
|
115
|
-
console.log("✅ All review threads are resolved.");
|
116
|
-
}
|
117
82
|
|
83
|
+
const unresolved = response.data.filter(comment => comment.in_reply_to_id && !comment.resolved);
|
84
|
+
|
85
|
+
if (unresolved.length > 0) {
|
86
|
+
core.setFailed(`There are ${unresolved.length} unresolved review comment(s). Please resolve all threads before merging.`);
|
87
|
+
} else {
|
88
|
+
console.log("All review comments are resolved.");
|
89
|
+
}
|
90
|
+
} catch (error) {
|
91
|
+
console.error("Error fetching review comments:", error.message);
|
92
|
+
core.setFailed("Failed to check for unresolved review threads.");
|
93
|
+
}
|
118
94
|
test_and_build_gem:
|
119
95
|
needs: [validate-commits]
|
120
96
|
# if: github.head_ref != '2572-enforce-pr-workflow' || github.base_ref != 'develop'
|
data/.vscode/settings.json
CHANGED
data/Gemfile.lock
CHANGED
@@ -4,7 +4,7 @@ module Spree
|
|
4
4
|
module Tenant
|
5
5
|
class AccountRecoversController < BaseController
|
6
6
|
def update
|
7
|
-
context = SpreeCmCommissioner::AccountRecover.call(**filter_params.slice(:id_token, :login, :password
|
7
|
+
context = SpreeCmCommissioner::AccountRecover.call(**filter_params.slice(:id_token, :login, :password))
|
8
8
|
if context.success?
|
9
9
|
render json: { message: 'Account Recovered successfully' }, status: :ok
|
10
10
|
else
|
@@ -15,7 +15,7 @@ module Spree
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def filter_params
|
18
|
-
params.permit(:id_token, :login, :password)
|
18
|
+
params.permit(:id_token, :login, :password)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class AccountRecover < BaseInteractor
|
3
|
-
delegate :id_token, :login, :password,
|
3
|
+
delegate :id_token, :login, :password, to: :context
|
4
4
|
|
5
5
|
def call
|
6
6
|
validate_user
|
@@ -15,7 +15,7 @@ module SpreeCmCommissioner
|
|
15
15
|
def validate_user
|
16
16
|
# get email password user
|
17
17
|
if login.present? && password.present?
|
18
|
-
context.user = Spree.user_class.find_user_by_login(login
|
18
|
+
context.user = Spree.user_class.find_user_by_login(login)
|
19
19
|
# get social user
|
20
20
|
elsif id_token.present?
|
21
21
|
checker_context = SpreeCmCommissioner::UserIdTokenChecker.call(id_token: id_token)
|
@@ -10,8 +10,6 @@ module SpreeCmCommissioner
|
|
10
10
|
assign_prototype
|
11
11
|
create_child_taxon
|
12
12
|
build_home_banner
|
13
|
-
assign_option_types
|
14
|
-
assign_option_values
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
@@ -63,26 +61,5 @@ module SpreeCmCommissioner
|
|
63
61
|
|
64
62
|
context.fail!(message: 'Home banner upload failed') unless banner.persisted?
|
65
63
|
end
|
66
|
-
|
67
|
-
def assign_options(model_class, param_key, foreign_key)
|
68
|
-
return unless params[param_key]
|
69
|
-
|
70
|
-
params[param_key].each do |id|
|
71
|
-
record = model_class.new(
|
72
|
-
taxon_id: @parent_taxon.id,
|
73
|
-
foreign_key => id
|
74
|
-
)
|
75
|
-
|
76
|
-
context.fail!(message: record.errors.full_messages.join(', ')) unless record.save
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def assign_option_types
|
81
|
-
assign_options(SpreeCmCommissioner::TaxonOptionType, :option_type_id, :option_type_id)
|
82
|
-
end
|
83
|
-
|
84
|
-
def assign_option_values
|
85
|
-
assign_options(SpreeCmCommissioner::TaxonOptionValue, :option_value_id, :option_value_id)
|
86
|
-
end
|
87
64
|
end
|
88
65
|
end
|
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
|
|
3
3
|
include Interactor
|
4
4
|
|
5
5
|
def call
|
6
|
-
user = Spree.user_class.find_user_by_login(context.login
|
6
|
+
user = Spree.user_class.find_user_by_login(context.login) if context.login.present?
|
7
7
|
|
8
8
|
context.fail!(message: I18n.t('account_checker.verify.already_exist', login: context.login)) if user.present?
|
9
9
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class PinCodeSender < BaseInteractor
|
3
|
-
include SpreeCmCommissioner::PinCodeSenderHelper
|
4
|
-
|
5
3
|
def call
|
6
4
|
context.fail!(message: I18n.t('pincode_sender.pincode.blank')) if context.pin_code.nil?
|
7
5
|
|
@@ -17,8 +15,10 @@ module SpreeCmCommissioner
|
|
17
15
|
private
|
18
16
|
|
19
17
|
def send_sms
|
18
|
+
from = context.tenant || Spree::Store.default
|
19
|
+
|
20
20
|
options = {
|
21
|
-
from:
|
21
|
+
from: from,
|
22
22
|
to: context.pin_code.contact,
|
23
23
|
body: I18n.t('pincode_sender.sms.body', code: context.pin_code.code, readable_type: context.pin_code.readable_type)
|
24
24
|
}
|
@@ -11,8 +11,6 @@ module SpreeCmCommissioner
|
|
11
11
|
context.sms_log.error = e.message
|
12
12
|
context.sms_log.save
|
13
13
|
context.fail!(message: e.message)
|
14
|
-
|
15
|
-
log_error_to_telegram(e.message)
|
16
14
|
end
|
17
15
|
end
|
18
16
|
|
@@ -59,17 +57,5 @@ module SpreeCmCommissioner
|
|
59
57
|
result = SpreeCmCommissioner::InternationalMobileFormatter.call(phone_number: number)
|
60
58
|
result.formatted_phone_number
|
61
59
|
end
|
62
|
-
|
63
|
-
def log_error_to_telegram(message)
|
64
|
-
return unless ENV['PIN_CODE_DEBUG_NOTIFIY_TELEGRAM_ENABLE'] == 'yes'
|
65
|
-
|
66
|
-
options = {
|
67
|
-
pin_code_id: context.pin_code.id,
|
68
|
-
tenant_id: context.tenant&.id,
|
69
|
-
error_message: message
|
70
|
-
}
|
71
|
-
|
72
|
-
SpreeCmCommissioner::TelegramDebugPinCodeSenderJob.perform_later(options)
|
73
|
-
end
|
74
60
|
end
|
75
61
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class TelegramDebugPinCodeSender < BaseInteractor
|
3
|
-
delegate :pin_code, :name,
|
3
|
+
delegate :pin_code, :name, to: :context
|
4
4
|
|
5
5
|
def call
|
6
6
|
telegram_client.send_message(
|
@@ -16,7 +16,6 @@ module SpreeCmCommissioner
|
|
16
16
|
text << "<b>From: #{name}</b>"
|
17
17
|
text << "<b>PIN CODE sent to #{pin_code.contact}</b>"
|
18
18
|
text << "<code>#{pin_code.code}</code> is your #{pin_code.readable_type}"
|
19
|
-
text << "⚠️ Error: <code>#{error_message}<code> ⚠️" if error_message.present?
|
20
19
|
|
21
20
|
text.compact.join("\n")
|
22
21
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class UserForgottenPasswordUpdater < BaseInteractor
|
3
3
|
# :email, :phone_number, :country_code :pin_code, :pin_code_token, :password, :password_confirmation
|
4
|
-
delegate :tenant_id, to: :context
|
5
4
|
|
6
5
|
def call
|
7
6
|
find_user_by_login!
|
@@ -20,7 +19,7 @@ module SpreeCmCommissioner
|
|
20
19
|
def find_user_by_login!
|
21
20
|
login = phone_number || email
|
22
21
|
|
23
|
-
context.user = Spree.user_class.find_user_by_login(login
|
22
|
+
context.user = Spree.user_class.find_user_by_login(login)
|
24
23
|
context.fail!(message: I18n.t('account_checker.verify.not_exist', login: login)) if context.user.blank?
|
25
24
|
end
|
26
25
|
|
@@ -1,15 +1,13 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class UserPasswordAuthenticator < BaseInteractor
|
3
|
-
delegate :login, :password,
|
3
|
+
delegate :login, :password, to: :context
|
4
4
|
|
5
5
|
def call
|
6
|
-
context.user = Spree.user_class.find_user_by_login(login
|
6
|
+
context.user = Spree.user_class.find_user_by_login(login)
|
7
7
|
context.fail!(message: I18n.t('authenticator.incorrect_login')) if context.user.nil?
|
8
|
-
|
9
8
|
if spree_confirmable? && active_for_authentication? && !validate_password(user)
|
10
9
|
context.fail!(message: I18n.t('authenticator.incorrect_password'))
|
11
10
|
end
|
12
|
-
|
13
11
|
context.fail!(message: I18n.t('authenticator.incorrect_password')) unless validate_password(context.user)
|
14
12
|
context.fail!(message: 'account_temporarily_deleted') if context.user.soft_deleted?
|
15
13
|
end
|
@@ -25,8 +25,10 @@ module SpreeCmCommissioner
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def verify_signature
|
28
|
+
public_key = ENV['VATTANAC_PUBLIC_KEY'].presence || Rails.application.credentials.vattanac.public_key
|
29
|
+
|
28
30
|
rsa_service = SpreeCmCommissioner::RsaService.new(
|
29
|
-
public_key:
|
31
|
+
public_key: public_key
|
30
32
|
)
|
31
33
|
|
32
34
|
return if rsa_service.verify(context.encrypted_data, context.signature)
|
@@ -35,6 +37,8 @@ module SpreeCmCommissioner
|
|
35
37
|
end
|
36
38
|
|
37
39
|
def decrypt_payload
|
40
|
+
aes_key = ENV['VATTANAC_AES_SECRET_KEY'].presence || Rails.application.credentials.vattanac.aes_secret_key
|
41
|
+
|
38
42
|
context.fail!(message: 'Invalid AES key length', status: :unprocessable_entity) unless aes_key
|
39
43
|
|
40
44
|
begin
|
@@ -53,7 +57,7 @@ module SpreeCmCommissioner
|
|
53
57
|
user_data = context.user_data
|
54
58
|
|
55
59
|
identity = SpreeCmCommissioner::UserIdentityProvider.vattanac_bank
|
56
|
-
.find_or_initialize_by(sub: user_data['
|
60
|
+
.find_or_initialize_by(sub: user_data['id'])
|
57
61
|
|
58
62
|
if identity.persisted?
|
59
63
|
context.user = identity.user
|
@@ -78,7 +82,7 @@ module SpreeCmCommissioner
|
|
78
82
|
identity = context.identity
|
79
83
|
|
80
84
|
identity.name = full_name
|
81
|
-
|
85
|
+
|
82
86
|
context.user = Spree::User.new(
|
83
87
|
first_name: user_data['firstName'],
|
84
88
|
last_name: user_data['lastName'],
|
@@ -95,41 +99,18 @@ module SpreeCmCommissioner
|
|
95
99
|
|
96
100
|
def construct_data
|
97
101
|
user = context.user
|
98
|
-
|
99
|
-
raw_data = {
|
102
|
+
context.data = {
|
100
103
|
sessionId: session_id,
|
101
104
|
name: user.full_name,
|
102
105
|
phone: user.phone_number,
|
103
106
|
email: user.email,
|
104
107
|
webUrl: "#{Spree::Store.default.formatted_url}/vattanac_bank_web_app?session_id=#{session_id}"
|
105
108
|
}
|
106
|
-
|
107
|
-
json_data = raw_data.to_json
|
108
|
-
|
109
|
-
encrypted_data = SpreeCmCommissioner::AesEncryptionService.encrypt(json_data, aes_key)
|
110
|
-
|
111
|
-
rsa_service = SpreeCmCommissioner::RsaService.new(private_key: bookmeplus_private_key)
|
112
|
-
|
113
|
-
signed_data = rsa_service.sign(encrypted_data)
|
114
|
-
|
115
|
-
context.data = signed_data
|
116
109
|
end
|
117
110
|
|
118
111
|
def session_id
|
119
112
|
payload = { user_id: context.user.id }
|
120
113
|
SpreeCmCommissioner::UserSessionJwtToken.encode(payload, context.user.reload.secure_token)
|
121
114
|
end
|
122
|
-
|
123
|
-
def aes_key
|
124
|
-
ENV['VATTANAC_AES_SECRET_KEY'].presence || Rails.application.credentials.vattanac.aes_secret_key
|
125
|
-
end
|
126
|
-
|
127
|
-
def bookmeplus_private_key
|
128
|
-
ENV['BOOKMEPLUS_PRIVATE_KEY'].presence || Rails.application.credentials.bookmeplus.private_key
|
129
|
-
end
|
130
|
-
|
131
|
-
def vattanac_public_key
|
132
|
-
ENV['VATTANAC_PUBLIC_KEY'].presence || Rails.application.credentials.vattanac.public_key
|
133
|
-
end
|
134
115
|
end
|
135
116
|
end
|
@@ -5,14 +5,12 @@ module SpreeCmCommissioner
|
|
5
5
|
def perform(options)
|
6
6
|
pin_code = SpreeCmCommissioner::PinCode.find(options[:pin_code_id])
|
7
7
|
tenant = SpreeCmCommissioner::Tenant.find_by(id: options[:tenant_id])
|
8
|
-
error_message = options[:error_message]
|
9
8
|
|
10
9
|
name = sender_name(tenant)
|
11
10
|
|
12
11
|
SpreeCmCommissioner::TelegramDebugPinCodeSender.call(
|
13
12
|
pin_code: pin_code,
|
14
|
-
name: name
|
15
|
-
error_message: error_message
|
13
|
+
name: name
|
16
14
|
)
|
17
15
|
end
|
18
16
|
end
|
@@ -25,21 +25,18 @@ module SpreeCmCommissioner
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class_methods do
|
28
|
-
def find_user_by_login(login
|
28
|
+
def find_user_by_login(login)
|
29
29
|
return nil if login.blank?
|
30
30
|
|
31
31
|
login = login.downcase
|
32
32
|
parser = PhoneNumberParser.call(phone_number: login)
|
33
33
|
|
34
|
-
scope = Spree.user_class.all
|
35
|
-
scope = scope.where(tenant_id: tenant_id) if tenant_id.present?
|
36
|
-
|
37
34
|
if parser.intel_phone_number.present?
|
38
|
-
|
35
|
+
find_by(intel_phone_number: parser.intel_phone_number)
|
39
36
|
elsif login =~ URI::MailTo::EMAIL_REGEXP
|
40
|
-
|
37
|
+
find_by(email: login)
|
41
38
|
else
|
42
|
-
|
39
|
+
find_by(login: login)
|
43
40
|
end
|
44
41
|
end
|
45
42
|
end
|
@@ -2,8 +2,6 @@ require_dependency 'spree_cm_commissioner'
|
|
2
2
|
|
3
3
|
module SpreeCmCommissioner
|
4
4
|
class Place < ApplicationRecord
|
5
|
-
acts_as_nested_set
|
6
|
-
|
7
5
|
validates :reference, presence: true, if: :validate_reference?
|
8
6
|
validates :lat, presence: true, if: :validate_lat?
|
9
7
|
validates :lon, presence: true, if: :validate_lon?
|
@@ -15,22 +13,15 @@ module SpreeCmCommissioner
|
|
15
13
|
|
16
14
|
has_many :product_places, class_name: 'SpreeCmCommissioner::ProductPlace', dependent: :destroy
|
17
15
|
has_many :products, through: :product_places
|
16
|
+
has_many :children, class_name: 'SpreeCmCommissioner::Place', foreign_key: :parent_id, dependent: :destroy
|
17
|
+
belongs_to :parent, class_name: 'SpreeCmCommissioner::Place', optional: true
|
18
18
|
|
19
|
-
has_many :children, -> { order(:lft) }, class_name: 'SpreeCmCommissioner::Place', foreign_key: :parent_id, dependent: :destroy
|
20
19
|
has_many :vendor_stops, class_name: 'SpreeCmCommissioner::VendorStop', dependent: :destroy
|
21
20
|
|
22
21
|
def self.ransackable_attributes(auth_object = nil)
|
23
22
|
super & %w[name code]
|
24
23
|
end
|
25
24
|
|
26
|
-
def full_path_name
|
27
|
-
self_and_ancestors.map(&:name).reverse.join(', ')
|
28
|
-
end
|
29
|
-
|
30
|
-
def path_ids
|
31
|
-
self_and_ancestors.map(&:id)
|
32
|
-
end
|
33
|
-
|
34
25
|
def validate_reference?
|
35
26
|
Spree::Store.default.code.exclude?('billing')
|
36
27
|
end
|
@@ -57,9 +57,6 @@ module SpreeCmCommissioner
|
|
57
57
|
base.has_many :event_blazer_queries, class_name: 'SpreeCmCommissioner::TaxonBlazerQuery'
|
58
58
|
base.has_many :blazer_queries, through: :event_blazer_queries, class_name: 'Blazer::Query'
|
59
59
|
|
60
|
-
base.has_many :taxon_option_types, class_name: 'SpreeCmCommissioner::TaxonOptionType'
|
61
|
-
base.has_many :taxon_option_values, class_name: 'SpreeCmCommissioner::TaxonOptionValue'
|
62
|
-
|
63
60
|
def base.active_homepage_events
|
64
61
|
joins(:homepage_section_relatables)
|
65
62
|
.joins("INNER JOIN spree_taxons taxon ON taxon.id = cm_homepage_section_relatables.relatable_id
|
@@ -99,14 +96,6 @@ module SpreeCmCommissioner
|
|
99
96
|
.uniq
|
100
97
|
end
|
101
98
|
|
102
|
-
def selected_option_types
|
103
|
-
taxon_option_types.pluck(:option_type_id)
|
104
|
-
end
|
105
|
-
|
106
|
-
def selected_option_values
|
107
|
-
taxon_option_values.pluck(:option_value_id)
|
108
|
-
end
|
109
|
-
|
110
99
|
def event_url
|
111
100
|
"https://#{Spree::Store.default.url}/t/#{permalink}"
|
112
101
|
end
|
@@ -14,12 +14,23 @@ module SpreeCmCommissioner
|
|
14
14
|
validates :duration, numericality: { greater_than: 0 }
|
15
15
|
validate :origin_and_destination_cannot_be_the_same
|
16
16
|
|
17
|
+
has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy
|
18
|
+
|
19
|
+
after_commit :create_trip_stops
|
20
|
+
|
21
|
+
accepts_nested_attributes_for :trip_stops, allow_destroy: true
|
22
|
+
|
17
23
|
def convert_duration_to_seconds
|
18
24
|
return if hours.blank? && minutes.blank? && seconds.blank?
|
19
25
|
|
20
26
|
self.duration = (hours.to_i * 3600) + (minutes.to_i * 60) + seconds.to_i
|
21
27
|
end
|
22
28
|
|
29
|
+
def create_trip_stops
|
30
|
+
trip_stops.create(stop_type: :boarding, stop_id: origin_id)
|
31
|
+
trip_stops.create(stop_type: :drop_off, stop_id: destination_id)
|
32
|
+
end
|
33
|
+
|
23
34
|
def duration_in_hms
|
24
35
|
return { hours: 0, minutes: 0, seconds: 0 } if duration.nil?
|
25
36
|
|
@@ -8,8 +8,8 @@ module SpreeCmCommissioner
|
|
8
8
|
belongs_to :stop, class_name: 'SpreeCmCommissioner::Place'
|
9
9
|
|
10
10
|
before_validation :set_stop_name
|
11
|
-
|
12
|
-
|
11
|
+
after_create :create_vendor_stop
|
12
|
+
|
13
13
|
validates :stop_id, uniqueness: { scope: :trip_id }
|
14
14
|
|
15
15
|
def set_stop_name
|
@@ -17,20 +17,13 @@ module SpreeCmCommissioner
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def create_vendor_stop
|
20
|
-
|
21
|
-
vendor_stop.update(trip_count: vendor_stop.trip_count.to_i + 1)
|
20
|
+
vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).first_or_create if trip.present?
|
22
21
|
end
|
23
22
|
|
24
23
|
private
|
25
24
|
|
26
|
-
def decrement_trip_count
|
27
|
-
vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).find_each do |vendor_stop|
|
28
|
-
vendor_stop.update(trip_count: [vendor_stop.trip_count - 1, 0].max)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
25
|
def vendor
|
33
|
-
Spree::Product.find(trip
|
26
|
+
Spree::Product.find(trip.product_id).vendor
|
34
27
|
end
|
35
28
|
end
|
36
29
|
end
|
@@ -26,16 +26,9 @@ module SpreeCmCommissioner
|
|
26
26
|
class_name: 'SpreeCmCommissioner::Trip'
|
27
27
|
base.has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy, foreign_key: :trip_id
|
28
28
|
base.accepts_nested_attributes_for :option_values
|
29
|
-
base.
|
29
|
+
base.has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', foreign_key: :trip_id, dependent: :destroy
|
30
|
+
base.after_commit :sync_trip, if: -> { product.product_type == 'transit' }
|
30
31
|
base.accepts_nested_attributes_for :trip_stops, allow_destroy: true
|
31
|
-
base.after_commit :create_trip_stops, if: :transit?
|
32
|
-
end
|
33
|
-
|
34
|
-
def create_trip_stops
|
35
|
-
return if is_master?
|
36
|
-
|
37
|
-
trip_stops.find_or_create_by(stop_type: :boarding, stop_id: options.origin)
|
38
|
-
trip_stops.find_or_create_by(stop_type: :drop_off, stop_id: options.destination)
|
39
32
|
end
|
40
33
|
|
41
34
|
def delivery_required?
|
@@ -8,6 +8,7 @@ module SpreeCmCommissioner
|
|
8
8
|
has_one :primary_photo, -> { order(position: :asc) }, class_name: 'SpreeCmCommissioner::VehiclePhoto', as: :viewable, dependent: :destroy
|
9
9
|
belongs_to :vendor, class_name: 'Spree::Vendor'
|
10
10
|
|
11
|
+
before_save :set_attributes
|
11
12
|
after_commit :create_vehicle_option_value
|
12
13
|
|
13
14
|
has_many :vehicle_photo, class_name: 'SpreeCmCommissioner::VehiclePhoto', as: :viewable, dependent: :destroy
|
@@ -16,6 +17,12 @@ module SpreeCmCommissioner
|
|
16
17
|
validates :code, uniqueness: { scope: :vendor_id }, presence: true
|
17
18
|
validates :license_plate, uniqueness: {}, allow_blank: true
|
18
19
|
|
20
|
+
def set_attributes
|
21
|
+
self.route_type = vehicle_type.route_type
|
22
|
+
self.number_of_seats = vehicle_type.vehicle_seats_count
|
23
|
+
self.allow_seat_selection = vehicle_type.allow_seat_selection
|
24
|
+
end
|
25
|
+
|
19
26
|
def create_vehicle_option_value
|
20
27
|
SpreeCmCommissioner::VehicleOptionValueCreator.call(self)
|
21
28
|
end
|
@@ -79,8 +79,7 @@ module SpreeCmCommissioner
|
|
79
79
|
dependent: :destroy, inverse_of: :relatable
|
80
80
|
|
81
81
|
base.has_many :vehicle_types, class_name: 'SpreeCmCommissioner::VehicleType', dependent: :destroy
|
82
|
-
base.has_many :vehicles, class_name: 'SpreeCmCommissioner::Vehicle', dependent: :destroy
|
83
|
-
# base.has_many :vehicles, through: :vehicle_types, class_name: 'SpreeCmCommissioner::Vehicle', dependent: :destroy
|
82
|
+
base.has_many :vehicles, through: :vehicle_types, class_name: 'SpreeCmCommissioner::Vehicle', dependent: :destroy
|
84
83
|
|
85
84
|
base.validates :account_name, :account_number, presence: true, if: lambda {
|
86
85
|
payment_qrcode.present? && Spree::Store.default.code.include?('billing')
|
@@ -4,7 +4,6 @@ module SpreeCmCommissioner
|
|
4
4
|
belongs_to :vendor, class_name: 'Spree::Vendor'
|
5
5
|
belongs_to :stop, class_name: 'SpreeCmCommissioner::Place'
|
6
6
|
|
7
|
-
|
8
|
-
enum :stop_type, { boarding: 0, drop_off: 1 }
|
7
|
+
enum stop_type: { boarding: 0, drop_off: 1 }
|
9
8
|
end
|
10
9
|
end
|
@@ -19,9 +19,6 @@
|
|
19
19
|
<th>
|
20
20
|
<%= sort_link @search, :phone_number, I18n.t('activerecord.attributes.spree/order.phone_number'), {}, {title: 'phone_number_title'} %>
|
21
21
|
</th>
|
22
|
-
<th>
|
23
|
-
<%= Spree.t(:tenant) %>
|
24
|
-
</th>
|
25
22
|
<th>
|
26
23
|
<%= sort_link @search, :created_at, Spree.t(:create_at), {}, {title: 'create_at_title'} %>
|
27
24
|
</th>
|
@@ -13,7 +13,6 @@ module Spree
|
|
13
13
|
|
14
14
|
belongs_to :occupation, serializer: Spree::V2::Tenant::TaxonSerializer
|
15
15
|
belongs_to :nationality, serializer: Spree::V2::Tenant::TaxonSerializer
|
16
|
-
has_one :id_card, serializer: Spree::V2::Tenant::IdCardSerializer
|
17
16
|
|
18
17
|
# allowed_checkout updates frequently
|
19
18
|
cache_options store: nil
|
@@ -8,13 +8,12 @@ module SpreeCmCommissioner
|
|
8
8
|
IV_LENGTH = 12
|
9
9
|
TAG_LENGTH = 16
|
10
10
|
|
11
|
-
def self.encrypt(plaintext,
|
12
|
-
key = Base64.decode64(base64_key)
|
11
|
+
def self.encrypt(plaintext, key)
|
13
12
|
validate_key!(key)
|
14
13
|
|
15
14
|
cipher = OpenSSL::Cipher.new(ALGORITHM)
|
16
15
|
cipher.encrypt
|
17
|
-
cipher.key = key[0, KEY_LENGTH]
|
16
|
+
cipher.key = key.b[0, KEY_LENGTH]
|
18
17
|
iv = cipher.random_iv
|
19
18
|
cipher.iv = iv
|
20
19
|
|
@@ -25,8 +24,7 @@ module SpreeCmCommissioner
|
|
25
24
|
Base64.strict_encode64(combined)
|
26
25
|
end
|
27
26
|
|
28
|
-
def self.decrypt(encrypted_text,
|
29
|
-
key = Base64.decode64(base64_key)
|
27
|
+
def self.decrypt(encrypted_text, key)
|
30
28
|
validate_key!(key)
|
31
29
|
|
32
30
|
combined = Base64.decode64(encrypted_text)
|
@@ -36,7 +34,7 @@ module SpreeCmCommissioner
|
|
36
34
|
|
37
35
|
cipher = OpenSSL::Cipher.new(ALGORITHM)
|
38
36
|
cipher.decrypt
|
39
|
-
cipher.key = key[0, KEY_LENGTH]
|
37
|
+
cipher.key = key.b[0, KEY_LENGTH]
|
40
38
|
cipher.iv = iv
|
41
39
|
cipher.auth_tag = tag
|
42
40
|
|
@@ -48,8 +48,6 @@ module SpreeCmCommissioner
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def fetch_option_value(guest, option_type_name)
|
51
|
-
return guest.formatted_bib_number if option_type_name == 'bib-prefix'
|
52
|
-
|
53
51
|
guest.line_item&.variant&.find_option_value_name_for(option_type_name: option_type_name)
|
54
52
|
end
|
55
53
|
|
@@ -25,11 +25,9 @@ module SpreeCmCommissioner
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.auth_context(params)
|
28
|
-
tenant_id = find_oauth_application(params)&.tenant_id
|
29
|
-
|
30
28
|
case flow_type(params)
|
31
29
|
when 'login_auth'
|
32
|
-
options = { login: params[:username], password: params[:password]
|
30
|
+
options = { login: params[:username], password: params[:password] }
|
33
31
|
SpreeCmCommissioner::UserPasswordAuthenticator.call(options)
|
34
32
|
when 'social_auth'
|
35
33
|
options = { id_token: params[:id_token] }
|
data/config/routes.rb
CHANGED
@@ -516,8 +516,6 @@ Spree::Core::Engine.add_routes do
|
|
516
516
|
resource :reset_passwords, only: [:update]
|
517
517
|
resource :change_passwords, only: [:update]
|
518
518
|
resource :user_contacts, only: [:update]
|
519
|
-
|
520
|
-
resources :cms_pages, only: %i[index show]
|
521
519
|
end
|
522
520
|
|
523
521
|
namespace :storefront do
|
@@ -10,15 +10,5 @@ FactoryBot.define do
|
|
10
10
|
address_components { FFaker::Address.street_address }
|
11
11
|
lat { FFaker::Geolocation.lat }
|
12
12
|
lon { FFaker::Geolocation.lng }
|
13
|
-
trait :with_parent do
|
14
|
-
association :parent, factory: :cm_place
|
15
|
-
end
|
16
|
-
transient do
|
17
|
-
children_count { 0 }
|
18
|
-
end
|
19
|
-
|
20
|
-
after(:create) do |place, evaluator|
|
21
|
-
create_list(:cm_place, evaluator.children_count, parent: place)
|
22
|
-
end
|
23
13
|
end
|
24
|
-
end
|
14
|
+
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.10.0
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- You
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-05-
|
11
|
+
date: 2025-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree
|
@@ -702,7 +702,6 @@ files:
|
|
702
702
|
- app/controllers/spree/admin/calendars/base_controller.rb
|
703
703
|
- app/controllers/spree/admin/calendars/orders_controller.rb
|
704
704
|
- app/controllers/spree/admin/classifications_controller.rb
|
705
|
-
- app/controllers/spree/admin/cms_pages_controller_decorator.rb
|
706
705
|
- app/controllers/spree/admin/customer_notifications_controller.rb
|
707
706
|
- app/controllers/spree/admin/device_tokens_controller.rb
|
708
707
|
- app/controllers/spree/admin/event_blazer_queries_controller.rb
|
@@ -860,7 +859,6 @@ files:
|
|
860
859
|
- app/controllers/spree/api/v2/tenant/cart_payment_method_groups_controller.rb
|
861
860
|
- app/controllers/spree/api/v2/tenant/change_passwords_controller.rb
|
862
861
|
- app/controllers/spree/api/v2/tenant/checkout_controller.rb
|
863
|
-
- app/controllers/spree/api/v2/tenant/cms_pages_controller.rb
|
864
862
|
- app/controllers/spree/api/v2/tenant/customer_notifications_controller.rb
|
865
863
|
- app/controllers/spree/api/v2/tenant/guests_controller.rb
|
866
864
|
- app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb
|
@@ -944,7 +942,6 @@ files:
|
|
944
942
|
- app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb
|
945
943
|
- app/controllers/spree_cm_commissioner/api/v2/storefront/cart_controller_decorator.rb
|
946
944
|
- app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb
|
947
|
-
- app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb
|
948
945
|
- app/controllers/spree_cm_commissioner/application_controller_decorator.rb
|
949
946
|
- app/controllers/spree_cm_commissioner/guest_cards_controller.rb
|
950
947
|
- app/controllers/spree_cm_commissioner/line_item_qr_images_controller.rb
|
@@ -1159,7 +1156,6 @@ files:
|
|
1159
1156
|
- app/models/spree_cm_commissioner/check_in_ability.rb
|
1160
1157
|
- app/models/spree_cm_commissioner/check_in_record.rb
|
1161
1158
|
- app/models/spree_cm_commissioner/classification_decorator.rb
|
1162
|
-
- app/models/spree_cm_commissioner/cms_page_decorator.rb
|
1163
1159
|
- app/models/spree_cm_commissioner/configuration.rb
|
1164
1160
|
- app/models/spree_cm_commissioner/crew_invite.rb
|
1165
1161
|
- app/models/spree_cm_commissioner/customer.rb
|
@@ -1271,8 +1267,6 @@ files:
|
|
1271
1267
|
- app/models/spree_cm_commissioner/taxon_category_icon.rb
|
1272
1268
|
- app/models/spree_cm_commissioner/taxon_decorator.rb
|
1273
1269
|
- app/models/spree_cm_commissioner/taxon_home_banner.rb
|
1274
|
-
- app/models/spree_cm_commissioner/taxon_option_type.rb
|
1275
|
-
- app/models/spree_cm_commissioner/taxon_option_value.rb
|
1276
1270
|
- app/models/spree_cm_commissioner/taxon_vendor.rb
|
1277
1271
|
- app/models/spree_cm_commissioner/taxon_video_banner.rb
|
1278
1272
|
- app/models/spree_cm_commissioner/taxon_web_banner.rb
|
@@ -1326,8 +1320,6 @@ files:
|
|
1326
1320
|
- app/notifications/spree_cm_commissioner/order_requested_notification.rb
|
1327
1321
|
- app/overrides/spree/admin/adjustments/_adjustment/payable_table_body.html.erb.deface
|
1328
1322
|
- app/overrides/spree/admin/adjustments/_adjustments_table/payable_table_header.html.erb.deface
|
1329
|
-
- app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface
|
1330
|
-
- app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface
|
1331
1323
|
- app/overrides/spree/admin/menu_items/_form/badge_field.html.erb.deface
|
1332
1324
|
- app/overrides/spree/admin/oauth_applications/_form/tenant_fields.html.erb.deface
|
1333
1325
|
- app/overrides/spree/admin/option_types/_form/attr_type.html.erb.deface
|
@@ -1470,7 +1462,6 @@ files:
|
|
1470
1462
|
- app/queries/spree_cm_commissioner/users_by_event_fetcher_query.rb
|
1471
1463
|
- app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb
|
1472
1464
|
- app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb
|
1473
|
-
- app/queries/spree_cm_commissioner/vendor_stop_place_query.rb
|
1474
1465
|
- app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb
|
1475
1466
|
- app/request_schemas/spree_cm_commissioner/application_request_schema.rb
|
1476
1467
|
- app/request_schemas/spree_cm_commissioner/profile_image_request_schema.rb
|
@@ -1785,7 +1776,6 @@ files:
|
|
1785
1776
|
- app/views/spree/admin/promotions/rules/_guest_occupations.html.erb
|
1786
1777
|
- app/views/spree/admin/promotions/rules/_vendors.html.erb
|
1787
1778
|
- app/views/spree/admin/promotions/rules/_weekend.html.erb
|
1788
|
-
- app/views/spree/admin/shared/_cms_pages_tabs.html.erb
|
1789
1779
|
- app/views/spree/admin/shared/_customer_notification_tabs.html.erb
|
1790
1780
|
- app/views/spree/admin/shared/_direct_upload.html.erb
|
1791
1781
|
- app/views/spree/admin/shared/_import_order_tabs.html.erb
|
@@ -2382,14 +2372,9 @@ files:
|
|
2382
2372
|
- db/migrate/20250403083001_create_spree_cm_commissioner_taxon_blazer_query.rb
|
2383
2373
|
- db/migrate/20250404050117_add_archived_at_to_spree_orders.rb
|
2384
2374
|
- db/migrate/20250407092556_add_variant_id_to_cm_trips.rb
|
2385
|
-
- db/migrate/20250418072528_add_nested_set_columns_to_places.rb
|
2386
2375
|
- db/migrate/20250425084929_add_description_to_spree_prototypes.rb
|
2387
2376
|
- db/migrate/20250425085938_add_preferences_to_spree_prototypes.rb
|
2388
2377
|
- db/migrate/20250428025645_add_slug_to_spree_prototypes.rb
|
2389
|
-
- db/migrate/20250430091742_create_cm_taxon_option_types.rb
|
2390
|
-
- db/migrate/20250430092928_create_cm_taxon_option_values.rb
|
2391
|
-
- db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb
|
2392
|
-
- db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb
|
2393
2378
|
- docker-compose.yml
|
2394
2379
|
- docs/option_types/attr_types.md
|
2395
2380
|
- docs/private_key.pem
|
@@ -2503,11 +2488,9 @@ files:
|
|
2503
2488
|
- lib/tasks/fetch_email.rake
|
2504
2489
|
- lib/tasks/kh_location_option_values.rake
|
2505
2490
|
- lib/tasks/kh_provinces.rake
|
2506
|
-
- lib/tasks/migrate_and_rebuild_place_hierarchy.rake
|
2507
2491
|
- lib/tasks/remove_duplicate_device_tokens.rake
|
2508
2492
|
- lib/tasks/subscriptions_order_creator.rake
|
2509
2493
|
- lib/tasks/update_gateway_status.rake
|
2510
|
-
- lib/tasks/update_orphan_root_places.rake
|
2511
2494
|
- lib/tasks/update_taxons.rake
|
2512
2495
|
- lib/tasks/variants_public_metadata_updater.rake
|
2513
2496
|
- lib/tasks/vendor_updater.rake
|
@@ -2535,9 +2518,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
2535
2518
|
version: '2.7'
|
2536
2519
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
2537
2520
|
requirements:
|
2538
|
-
- - "
|
2521
|
+
- - ">="
|
2539
2522
|
- !ruby/object:Gem::Version
|
2540
|
-
version:
|
2523
|
+
version: '0'
|
2541
2524
|
requirements:
|
2542
2525
|
- none
|
2543
2526
|
rubygems_version: 3.4.1
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Spree
|
2
|
-
module Admin
|
3
|
-
module CmsPagesControllerDecorator
|
4
|
-
def scope
|
5
|
-
return Spree::CmsPage.none unless current_store&.cms_pages
|
6
|
-
|
7
|
-
scope = current_store.cms_pages
|
8
|
-
|
9
|
-
case params[:tab]
|
10
|
-
when 'default'
|
11
|
-
scope = scope.where(tenant_id: nil)
|
12
|
-
when 'tenants'
|
13
|
-
scope = if params[:tenant_id].present?
|
14
|
-
scope.where(tenant_id: params[:tenant_id])
|
15
|
-
else
|
16
|
-
scope.where.not(tenant_id: nil)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
scope
|
21
|
-
end
|
22
|
-
|
23
|
-
def permitted_resource_params
|
24
|
-
super.merge(tenant_id: params[:cms_page][:tenant_id])
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
unless Spree::Admin::CmsPagesController.included_modules.include?(Spree::Admin::CmsPagesControllerDecorator)
|
31
|
-
Spree::Admin::CmsPagesController.prepend(Spree::Admin::CmsPagesControllerDecorator)
|
32
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module Spree
|
2
|
-
module Api
|
3
|
-
module V2
|
4
|
-
module Tenant
|
5
|
-
class CmsPagesController < BaseController
|
6
|
-
private
|
7
|
-
|
8
|
-
def model_class
|
9
|
-
Spree::CmsPage
|
10
|
-
end
|
11
|
-
|
12
|
-
def resource
|
13
|
-
@resource ||= scope.find_by(slug: params[:id]) || scope.find(params[:id])
|
14
|
-
end
|
15
|
-
|
16
|
-
def resource_serializer
|
17
|
-
Spree::Api::Dependencies.storefront_cms_page_serializer.constantize
|
18
|
-
end
|
19
|
-
|
20
|
-
def collection_serializer
|
21
|
-
Spree::Api::Dependencies.storefront_cms_page_serializer.constantize
|
22
|
-
end
|
23
|
-
|
24
|
-
def collection_finder
|
25
|
-
Spree::Api::Dependencies.storefront_cms_page_finder.constantize
|
26
|
-
end
|
27
|
-
|
28
|
-
def scope
|
29
|
-
model_class.by_locale(I18n.locale).where(tenant_id: MultiTenant.current_tenant_id)
|
30
|
-
end
|
31
|
-
|
32
|
-
def scope_includes
|
33
|
-
{
|
34
|
-
cms_sections: :linked_resource
|
35
|
-
}
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
module Api
|
3
|
-
module V2
|
4
|
-
module Storefront
|
5
|
-
module CmsPagesControllerDecorator
|
6
|
-
def scope
|
7
|
-
super.by_locale(I18n.locale).where(tenant_id: nil)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
# Prepend the decorator to the CmsPagesController
|
16
|
-
unless Spree::Api::V2::Storefront::CmsPagesController.ancestors.include?(SpreeCmCommissioner::Api::V2::Storefront::CmsPagesControllerDecorator)
|
17
|
-
Spree::Api::V2::Storefront::CmsPagesController.prepend(SpreeCmCommissioner::Api::V2::Storefront::CmsPagesControllerDecorator)
|
18
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
module CmsPageDecorator
|
3
|
-
def self.prepended(base)
|
4
|
-
base.multi_tenant :tenant, class_name: 'SpreeCmCommissioner::Tenant'
|
5
|
-
end
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
Spree::CmsPage.prepend(SpreeCmCommissioner::CmsPageDecorator) unless Spree::CmsPage.included_modules.include?(SpreeCmCommissioner::CmsPageDecorator)
|
@@ -1,8 +0,0 @@
|
|
1
|
-
require_dependency 'spree_cm_commissioner'
|
2
|
-
|
3
|
-
module SpreeCmCommissioner
|
4
|
-
class TaxonOptionType < ApplicationRecord
|
5
|
-
belongs_to :taxon, class_name: 'Spree::Taxon', dependent: :destroy
|
6
|
-
belongs_to :option_type, class_name: 'Spree::OptionType', dependent: :destroy
|
7
|
-
end
|
8
|
-
end
|
@@ -1,8 +0,0 @@
|
|
1
|
-
require_dependency 'spree_cm_commissioner'
|
2
|
-
|
3
|
-
module SpreeCmCommissioner
|
4
|
-
class TaxonOptionValue < ApplicationRecord
|
5
|
-
belongs_to :taxon, class_name: 'Spree::Taxon', dependent: :destroy
|
6
|
-
belongs_to :option_value, class_name: 'Spree::OptionValue', dependent: :destroy
|
7
|
-
end
|
8
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
<!-- insert_before "erb[loud]:contains('f.field_container :title')" -->
|
2
|
-
|
3
|
-
<%= f.field_container :tenant_id, class: ['col-12'] do %>
|
4
|
-
<%= f.label :tenant_id, raw(Spree.t(:tenant) + ' (optional)') %>
|
5
|
-
<%= f.collection_select :tenant_id, SpreeCmCommissioner::Tenant.all, :id, :name, { prompt: Spree.t('select_tenant') }, { class: 'form-control select2' } %>
|
6
|
-
<%= f.error_message_on :tenant_id %>
|
7
|
-
<% end %>
|
@@ -1,21 +0,0 @@
|
|
1
|
-
<!-- insert_before "erb[silent]:contains('content_for :page_actions')" -->
|
2
|
-
|
3
|
-
<%= render partial: 'spree/admin/shared/cms_pages_tabs' %>
|
4
|
-
|
5
|
-
<% if params[:tab] == 'default' %>
|
6
|
-
<div class="alert alert-info mb-3">
|
7
|
-
<%= svg_icon name: "info-circle.svg", classes: 'mr-2', width: '16', height: '16' %>
|
8
|
-
CMS Pages for the default store. These pages are shared globally and are not tied to any specific tenant.
|
9
|
-
</div>
|
10
|
-
<% elsif params[:tab] == 'tenants' && params[:tenant_id].present? %>
|
11
|
-
<div class="alert alert-info mb-3">
|
12
|
-
<%= svg_icon name: "info-circle.svg", classes: 'mr-2', width: '16', height: '16' %>
|
13
|
-
CMS Pages for the tenant: <strong><%= SpreeCmCommissioner::Tenant.find(params[:tenant_id]).name %></strong>.
|
14
|
-
These pages are displayed only to users associated with this tenant.
|
15
|
-
</div>
|
16
|
-
<% elsif params[:tab] == 'tenants' %>
|
17
|
-
<div class="alert alert-info mb-3">
|
18
|
-
<%= svg_icon name: "info-circle.svg", classes: 'mr-2', width: '16', height: '16' %>
|
19
|
-
CMS Pages for all tenants. These pages are displayed only to users associated with specific tenants.
|
20
|
-
</div>
|
21
|
-
<% end %>
|
@@ -1,54 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
class VendorStopPlaceQuery
|
3
|
-
attr_reader :query, :vendor_id, :stop_type, :reference_stop_id
|
4
|
-
|
5
|
-
def initialize(query:, vendor_id:, stop_type: :boarding, reference_stop_id: nil)
|
6
|
-
@query = query.to_s.strip
|
7
|
-
@vendor_id = vendor_id
|
8
|
-
@stop_type = stop_type
|
9
|
-
@reference_stop_id = reference_stop_id
|
10
|
-
end
|
11
|
-
|
12
|
-
def call
|
13
|
-
results = vendor_stops
|
14
|
-
return [] if results.empty?
|
15
|
-
|
16
|
-
places = results.includes(:stop).map(&:stop).compact.uniq
|
17
|
-
|
18
|
-
format_places(places)
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def vendor_stops
|
24
|
-
scope = base_scope
|
25
|
-
return scope if query.blank?
|
26
|
-
|
27
|
-
scope = scope.where.not(stop_id: reference_stop_id) if reference_stop_id.present?
|
28
|
-
scope.where('cm_places.name ILIKE ?', "%#{query}%")
|
29
|
-
end
|
30
|
-
|
31
|
-
def base_scope
|
32
|
-
SpreeCmCommissioner::VendorStop
|
33
|
-
.joins(:stop)
|
34
|
-
.where(vendor_id: vendor_id)
|
35
|
-
.where(stop_type: stop_type)
|
36
|
-
.order(trip_count: :desc)
|
37
|
-
.where.not(trip_count: 0)
|
38
|
-
end
|
39
|
-
|
40
|
-
def format_places(places)
|
41
|
-
places
|
42
|
-
.sort_by { |p| [-p.depth, -p.lft] }
|
43
|
-
.filter_map do |place|
|
44
|
-
next if place.depth.zero?
|
45
|
-
|
46
|
-
{
|
47
|
-
id: place.id,
|
48
|
-
parent_id: place.parent_id,
|
49
|
-
name: place.self_and_ancestors.map(&:name).reverse.join(', ')
|
50
|
-
}
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
<% content_for(:page_tabs) do %>
|
2
|
-
<% if can?(:admin, Spree::CmsPage) %>
|
3
|
-
<%= content_tag :li, class: 'nav-item' do %>
|
4
|
-
<%= link_to_with_icon 'building.svg',
|
5
|
-
Spree::Store.default&.name || Spree.t(:store),
|
6
|
-
admin_cms_pages_url(tab: :default),
|
7
|
-
class: "nav-link #{'active' if params[:tab].blank? || params[:tab] == 'default'}" %>
|
8
|
-
<% end %>
|
9
|
-
|
10
|
-
<!-- Tenant Tabs -->
|
11
|
-
<% SpreeCmCommissioner::Tenant.all.each do |tenant| %>
|
12
|
-
<%= content_tag :li, class: 'nav-item' do %>
|
13
|
-
<%= link_to_with_icon 'building.svg',
|
14
|
-
tenant.name,
|
15
|
-
admin_cms_pages_url(tab: :tenants, tenant_id: tenant.id),
|
16
|
-
class: "nav-link #{'active' if params[:tenant_id].to_s == tenant.id.to_s}" %>
|
17
|
-
<% end %>
|
18
|
-
<% end %>
|
19
|
-
<% end %>
|
20
|
-
<% end %>
|
@@ -1,10 +0,0 @@
|
|
1
|
-
class AddNestedSetColumnsToPlaces < ActiveRecord::Migration[7.0]
|
2
|
-
def change
|
3
|
-
add_column :cm_places, :parent_id, :integer if !column_exists?(:cm_places, :parent_id)
|
4
|
-
add_column :cm_places, :lft, :integer if !column_exists?(:cm_places, :lft)
|
5
|
-
add_column :cm_places, :rgt, :integer if !column_exists?(:cm_places, :rgt)
|
6
|
-
|
7
|
-
add_column :cm_places, :depth, :integer if !column_exists?(:cm_places, :depth)
|
8
|
-
add_column :cm_places, :children_count, :integer if !column_exists?(:cm_places, :children_count)
|
9
|
-
end
|
10
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
class CreateCmTaxonOptionTypes < ActiveRecord::Migration[7.0]
|
2
|
-
def change
|
3
|
-
create_table :cm_taxon_option_types do |t|
|
4
|
-
t.references :taxon, null: false, if_not_exists: true
|
5
|
-
t.references :option_type, null: false, if_not_exists: true
|
6
|
-
t.timestamps
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
class CreateCmTaxonOptionValues < ActiveRecord::Migration[7.0]
|
2
|
-
def change
|
3
|
-
create_table :cm_taxon_option_values do |t|
|
4
|
-
t.references :taxon, null: false, if_not_exists: true
|
5
|
-
t.references :option_value, null: false, if_not_exists: true
|
6
|
-
t.timestamps
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
namespace :spree_cm_commissioner do
|
2
|
-
desc 'Migrate and Rebuild place hierarchy..'
|
3
|
-
task migrate_and_rebuild_place_hierarchy: :environment do
|
4
|
-
puts 'Resetting column information :lft and :rgt columns...'
|
5
|
-
SpreeCmCommissioner::Place.reset_column_information
|
6
|
-
SpreeCmCommissioner::Place.rebuild!
|
7
|
-
puts 'Place hierarchy rebuild completed successfully!'
|
8
|
-
end
|
9
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
namespace :spree_cm_commissioner do
|
2
|
-
desc 'Update orphan root places...'
|
3
|
-
task update_orphan_root_places: :environment do
|
4
|
-
count = SpreeCmCommissioner::Place.where(parent_id: 0).update_all(parent_id: nil) # rubocop:disable Rails/SkipsModelValidations
|
5
|
-
puts "#{count} orphan root places updated."
|
6
|
-
end
|
7
|
-
end
|