workarea-core 3.4.40 → 3.4.45

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 645f331b3405886c0d82f57d7de6da260a505fd827354b7725d21e618b4b7758
4
- data.tar.gz: 42bb34aaa339295bd0312eb23b33b00e247bde4d57e86958aadb23125c49033f
3
+ metadata.gz: fa0ecabb9a16f7c58840b3d50dc6486c2f064c3d613c744607997105f26102fc
4
+ data.tar.gz: 4ec03996dd8e2bced8818056b06e3128c3b8fa6b079907e2b018e0504641e75b
5
5
  SHA512:
6
- metadata.gz: 50e7704ee466d04fb2b24c36a8f85229d22fd5833fa6bd1a472f6a5a874a7272f4fe5863cff1bdc4dd594e9078d9afc351ba152e403711759c7a7511d7b4729b
7
- data.tar.gz: 4deaaf2b72591659f834f0d105a94ad4f7f69abc31041817ec467beb5d0d2e3f961ca344a0ff780478e448122525a0819eab4029533b6927b4903b279d328a08
6
+ metadata.gz: bee72675acacaffba697db529d9d9a0897603d9327e0d29044825f71c8f114617d056714ab8e83d40b03844d912d065e629a6de2227c4afcea486a1433b99b48
7
+ data.tar.gz: 49ad054e62f63e717f553ad1f75d28f6cb54d9a8e911989513eb4b2d63d7013e5d46e8762040696a20937f8082a570b394b729755f77a73c2d6584f12871ea0b
@@ -9,6 +9,7 @@ module Workarea
9
9
  @current_referrer ||= TrafficReferrer.new(
10
10
  RefererParser::Parser.new.parse(referrer).slice(:source, :medium, :uri)
11
11
  )
12
+ rescue RefererParser::InvalidUriError
12
13
  end
13
14
  end
14
15
  end
@@ -123,6 +123,31 @@ module Workarea
123
123
  return nil if orders.zero?
124
124
  revenue / orders.to_f
125
125
  end
126
+
127
+ def merge!(other)
128
+ # To recalculate average_order_value
129
+ self.orders += other.orders
130
+ self.revenue += other.revenue
131
+
132
+ update = {
133
+ '$set' => {
134
+ average_order_value: average_order_value,
135
+ updated_at: Time.current.utc
136
+ },
137
+ '$inc' => {
138
+ orders: other.orders,
139
+ revenue: other.revenue,
140
+ discounts: other.discounts
141
+ }
142
+ }
143
+
144
+ update['$min'] = { first_order_at: other.first_order_at.utc } if other.first_order_at.present?
145
+ update['$max'] = { last_order_at: other.last_order_at.utc } if other.last_order_at.present?
146
+
147
+ self.class.collection.update_one({ _id: id }, update, upsert: true)
148
+ other.delete
149
+ reload
150
+ end
126
151
  end
127
152
  end
128
153
  end
@@ -11,7 +11,10 @@ module Workarea
11
11
  belongs_to :release, class_name: 'Workarea::Release', index: true
12
12
  belongs_to :releasable, polymorphic: true, index: true, optional: true
13
13
 
14
- index({ 'document_path.type' => 1, 'document_path.document_id' => 1})
14
+ index(
15
+ { 'document_path.type' => 1, 'document_path.document_id' => 1 },
16
+ { name: 'document_path' }
17
+ )
15
18
 
16
19
  # Whether these value changes to this field should be included when
17
20
  # saving a changeset. Used in building changeset hashes.
@@ -38,7 +38,7 @@ module Workarea
38
38
  aggregation = search(query)['aggregations']['grouped_by_type']['type']
39
39
  aggregation['buckets']
40
40
  .reduce([]) { |m, b| m + b['top']['hits']['hits'] }
41
- .sort_by { |r| [r['_source']['jump_to_position'], r['_score']] }
41
+ .sort_by { |r| [r['_source']['jump_to_position'] || 999, r['_score'] || 0] }
42
42
  .map do |result|
43
43
  {
44
44
  label: result['_source']['jump_to_text'],
@@ -0,0 +1,33 @@
1
+ module Workarea
2
+ class UpdateEmail
3
+ include Sidekiq::Worker
4
+ include Sidekiq::CallbacksWorker
5
+
6
+ sidekiq_options(
7
+ enqueue_on: { User => :update, with: -> { [id, changes] } }
8
+ )
9
+
10
+ def perform(id, changes)
11
+ return unless changes['email'].present? && changes['email'].first.present?
12
+
13
+ old_email, new_email = changes['email']
14
+ update_payment_profile(id, old_email, new_email)
15
+ update_metrics(old_email, new_email)
16
+ end
17
+
18
+ def update_payment_profile(id, old_email, new_email)
19
+ user = User.find(id)
20
+ user.email = old_email # set old email so we lookup by old email value
21
+
22
+ Payment::Profile.update_email(PaymentReference.new(user), new_email)
23
+ end
24
+
25
+ def update_metrics(old_email, new_email)
26
+ old_metrics = Metrics::User.find(old_email) rescue nil
27
+ return if old_metrics.blank?
28
+
29
+ new_metrics = Metrics::User.find_or_initialize_by(id: new_email)
30
+ new_metrics.merge!(old_metrics)
31
+ end
32
+ end
33
+ end
@@ -38,7 +38,7 @@ namespace :workarea do
38
38
  author: author
39
39
  }
40
40
 
41
- if subject.start_with?('Revert')
41
+ if subject.start_with?('Revert "')
42
42
  reverts << body.match(/[a-f0-9]{40}/)
43
43
  reverts << sha
44
44
  end
@@ -140,6 +140,7 @@ require 'workarea/ext/mongoid/find_ordered'
140
140
  require 'workarea/ext/sprockets/ruby_processor'
141
141
  require 'workarea/ext/jbuilder/jbuilder_append_partials'
142
142
  require 'workarea/ext/jbuilder/jbuilder_cache'
143
+ require 'workarea/ext/referer_parser/parser.decorator'
143
144
 
144
145
  if Rails.env.development?
145
146
  require 'workarea/ext/freedom_patches/routes_reloader'
@@ -0,0 +1,43 @@
1
+ module RefererParser
2
+ # This code is actually in `master` branch of
3
+ # https://github.com/snowplow-referer-parser/ruby-referer-parser but
4
+ # has not yet been released. It's used to allow through android-app://
5
+ # URLs.
6
+ decorate Parser do
7
+ # Given a string or URI, return a hash of data
8
+ def parse(obj)
9
+ url = obj.is_a?(URI) ? obj : URI.parse(obj.to_s)
10
+
11
+ unless ['android-app', 'http', 'https'].include?(url.scheme)
12
+ raise InvalidUriError, "Only Android-App, HTTP, and HTTPS schemes are supported -- #{url.scheme}"
13
+ end
14
+
15
+ data = { known: false, uri: url.to_s }
16
+
17
+ domain, name_key = domain_and_name_key_for(url)
18
+ if domain && name_key
19
+ referer_data = @name_hash[name_key]
20
+ data[:known] = true
21
+ data[:source] = referer_data[:source]
22
+ data[:medium] = referer_data[:medium]
23
+ data[:domain] = domain
24
+
25
+ # Parse parameters if the referer uses them
26
+ if url.query && referer_data[:parameters]
27
+ query_params = CGI.parse(url.query)
28
+ referer_data[:parameters].each do |param|
29
+ # If there is a matching parameter, get the first non-blank value
30
+ unless (values = query_params[param]).empty?
31
+ data[:term] = values.reject { |v| v.strip == '' }.first
32
+ break if data[:term]
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ data
39
+ rescue URI::InvalidURIError
40
+ raise InvalidUriError.new("Unable to parse URI, not a URI? -- #{obj.inspect}", $ERROR_INFO)
41
+ end
42
+ end
43
+ end
@@ -2,7 +2,7 @@ module Workarea
2
2
  module VERSION
3
3
  MAJOR = 3
4
4
  MINOR = 4
5
- PATCH = 40
5
+ PATCH = 45
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+
3
+ module RefererParser
4
+ class ParserTest < Workarea::TestCase
5
+ def test_parse_android_app_referrers
6
+ referrers = [
7
+ 'android-app://com.linkedin.android',
8
+ 'android-app://org.telegram.plus',
9
+ 'android-app://com.twitter.android'
10
+ ]
11
+
12
+ referrers.each do |uri|
13
+ referrer = Parser.new.parse(uri)
14
+
15
+ refute(referrer[:known])
16
+ assert_equal(uri, referrer[:uri])
17
+ end
18
+ end
19
+ end
20
+ end
@@ -74,6 +74,57 @@ module Workarea
74
74
  assert_equal(50, two.revenue_percentile)
75
75
  assert_equal(50, two.average_order_value_percentile)
76
76
  end
77
+
78
+ def test_merging_metrics
79
+ freeze_time
80
+
81
+ first = User.create!(
82
+ first_order_at: 2.weeks.ago,
83
+ last_order_at: 1.day.ago,
84
+ orders: 2,
85
+ revenue: 100,
86
+ discounts: -10,
87
+ average_order_value: 50,
88
+ )
89
+
90
+ first.merge!(User.new)
91
+ first.reload
92
+ assert_equal(1, Metrics::User.count)
93
+ assert_equal(2.weeks.ago, first.first_order_at)
94
+ assert_equal(1.day.ago, first.last_order_at)
95
+ assert_equal(2, first.orders)
96
+ assert_equal(100, first.revenue)
97
+ assert_equal(-10, first.discounts)
98
+ assert_equal(50, first.average_order_value)
99
+
100
+ second = User.create!(id: 'foo').tap { |u| u.merge!(first) }
101
+ second.reload
102
+ assert_equal(1, Metrics::User.count)
103
+ assert_equal(2.weeks.ago, second.first_order_at)
104
+ assert_equal(1.day.ago, second.last_order_at)
105
+ assert_equal(2, second.orders)
106
+ assert_equal(100, second.revenue)
107
+ assert_equal(-10, second.discounts)
108
+ assert_equal(50, second.average_order_value)
109
+
110
+ third = User.create!(
111
+ first_order_at: 3.weeks.ago,
112
+ last_order_at: 3.weeks.ago,
113
+ orders: 2,
114
+ revenue: 120,
115
+ average_order_value: 60,
116
+ )
117
+
118
+ third.merge!(second)
119
+ third.reload
120
+ assert_equal(1, Metrics::User.count)
121
+ assert_equal(3.weeks.ago, third.first_order_at)
122
+ assert_equal(1.day.ago, third.last_order_at)
123
+ assert_equal(4, third.orders)
124
+ assert_equal(220, third.revenue)
125
+ assert_equal(-10, third.discounts)
126
+ assert_equal(55, third.average_order_value)
127
+ end
77
128
  end
78
129
  end
79
130
  end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class UpdateEmailTest < TestCase
5
+ def test_updating_payment_profile
6
+ user = create_user(email: 'user@workarea.com')
7
+ profile = Payment::Profile.lookup(PaymentReference.new(user))
8
+
9
+ UpdateEmail.new.perform(user.id.to_s, 'email' => [nil, 'user@workarea.com'])
10
+ assert_equal(profile.reload.email, 'user@workarea.com')
11
+
12
+ UpdateEmail.new.perform(
13
+ user.id.to_s,
14
+ 'email' => ['user@workarea.com', 'test@workarea.com']
15
+ )
16
+ assert_equal(profile.reload.email, 'test@workarea.com')
17
+ end
18
+
19
+ def test_updating_metrics
20
+ user = create_user(email: 'user@workarea.com')
21
+ old_metrics = Metrics::User.find_or_initialize_by(id: 'user@workarea.com')
22
+ old_metrics.update!(orders: 3)
23
+
24
+ UpdateEmail.new.perform(user.id.to_s, 'email' => [nil, 'user@workarea.com'])
25
+ assert_equal(1, Metrics::User.count)
26
+ assert_equal(3, old_metrics.reload.orders)
27
+
28
+ new_metrics = Metrics::User.create!(id: 'test@workarea.com', orders: 1)
29
+
30
+ UpdateEmail.new.perform(
31
+ user.id.to_s,
32
+ 'email' => ['user@workarea.com', 'test@workarea.com']
33
+ )
34
+ assert_equal(1, Metrics::User.count)
35
+ assert_raises(Mongoid::Errors::DocumentNotFound) { old_metrics.reload }
36
+ assert_equal(4, new_metrics.reload.orders)
37
+ end
38
+ end
39
+ end
@@ -58,7 +58,7 @@ Gem::Specification.new do |s|
58
58
  s.add_dependency 'i18n-js', '~> 3.2.1'
59
59
  s.add_dependency 'local_time', '~> 1.0.3'
60
60
  s.add_dependency 'lodash-rails', '~> 4.17.4'
61
- s.add_dependency 'jquery-rails', '~> 4.3.1'
61
+ s.add_dependency 'jquery-rails', '~> 4.4.0'
62
62
  s.add_dependency 'jquery-ui-rails', '~> 6.0.1'
63
63
  s.add_dependency 'tooltipster-rails', '~> 4.1.2'
64
64
  s.add_dependency 'chart-js-rails', '~> 0.0.9' # TODO remove v4
@@ -67,7 +67,7 @@ Gem::Specification.new do |s|
67
67
  s.add_dependency 'wysihtml-rails', '~> 0.6.0.beta2'
68
68
  s.add_dependency 'rack-attack', '~> 6.3.1'
69
69
  s.add_dependency 'jquery-livetype-rails', '~> 0.1.0' # TODO remove v4
70
- s.add_dependency 'redcarpet', '~> 3.4.0'
70
+ s.add_dependency 'redcarpet', '~> 3.5.1', '>= 3.5.1'
71
71
  s.add_dependency 'jquery-unique-clone-rails', '~> 1.0.0'
72
72
  s.add_dependency 'avalanche-rails', '~> 1.2.0'
73
73
  s.add_dependency 'inline_svg', '~> 1.3.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workarea-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.40
4
+ version: 3.4.45
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Crouse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-16 00:00:00.000000000 Z
11
+ date: 2021-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -632,14 +632,14 @@ dependencies:
632
632
  requirements:
633
633
  - - "~>"
634
634
  - !ruby/object:Gem::Version
635
- version: 4.3.1
635
+ version: 4.4.0
636
636
  type: :runtime
637
637
  prerelease: false
638
638
  version_requirements: !ruby/object:Gem::Requirement
639
639
  requirements:
640
640
  - - "~>"
641
641
  - !ruby/object:Gem::Version
642
- version: 4.3.1
642
+ version: 4.4.0
643
643
  - !ruby/object:Gem::Dependency
644
644
  name: jquery-ui-rails
645
645
  requirement: !ruby/object:Gem::Requirement
@@ -758,14 +758,20 @@ dependencies:
758
758
  requirements:
759
759
  - - "~>"
760
760
  - !ruby/object:Gem::Version
761
- version: 3.4.0
761
+ version: 3.5.1
762
+ - - ">="
763
+ - !ruby/object:Gem::Version
764
+ version: 3.5.1
762
765
  type: :runtime
763
766
  prerelease: false
764
767
  version_requirements: !ruby/object:Gem::Requirement
765
768
  requirements:
766
769
  - - "~>"
767
770
  - !ruby/object:Gem::Version
768
- version: 3.4.0
771
+ version: 3.5.1
772
+ - - ">="
773
+ - !ruby/object:Gem::Version
774
+ version: 3.5.1
769
775
  - !ruby/object:Gem::Dependency
770
776
  name: jquery-unique-clone-rails
771
777
  requirement: !ruby/object:Gem::Requirement
@@ -882,22 +888,22 @@ dependencies:
882
888
  name: minitest
883
889
  requirement: !ruby/object:Gem::Requirement
884
890
  requirements:
885
- - - ">="
886
- - !ruby/object:Gem::Version
887
- version: 5.10.1
888
891
  - - "~>"
889
892
  - !ruby/object:Gem::Version
890
893
  version: 5.10.3
894
+ - - ">="
895
+ - !ruby/object:Gem::Version
896
+ version: 5.10.1
891
897
  type: :runtime
892
898
  prerelease: false
893
899
  version_requirements: !ruby/object:Gem::Requirement
894
900
  requirements:
895
- - - ">="
896
- - !ruby/object:Gem::Version
897
- version: 5.10.1
898
901
  - - "~>"
899
902
  - !ruby/object:Gem::Version
900
903
  version: 5.10.3
904
+ - - ">="
905
+ - !ruby/object:Gem::Version
906
+ version: 5.10.1
901
907
  - !ruby/object:Gem::Dependency
902
908
  name: countries
903
909
  requirement: !ruby/object:Gem::Requirement
@@ -1711,7 +1717,7 @@ files:
1711
1717
  - app/workers/workarea/status_reporter.rb
1712
1718
  - app/workers/workarea/undo_release.rb
1713
1719
  - app/workers/workarea/update_elasticsearch_settings.rb
1714
- - app/workers/workarea/update_payment_profile_email.rb
1720
+ - app/workers/workarea/update_email.rb
1715
1721
  - app/workers/workarea/verify_scheduled_releases.rb
1716
1722
  - bin/rails
1717
1723
  - config/i18n-js.yml
@@ -1873,6 +1879,7 @@ files:
1873
1879
  - lib/workarea/ext/mongoid/list_field.rb
1874
1880
  - lib/workarea/ext/mongoid/moped_bson.rb
1875
1881
  - lib/workarea/ext/mongoid/timestamps_timeless.rb
1882
+ - lib/workarea/ext/referer_parser/parser.decorator
1876
1883
  - lib/workarea/ext/sprockets/ruby_processor.rb
1877
1884
  - lib/workarea/ext/sprockets/task.rb
1878
1885
  - lib/workarea/geolocation.rb
@@ -2017,6 +2024,7 @@ files:
2017
2024
  - test/lib/workarea/ext/mongoid/except_test.rb
2018
2025
  - test/lib/workarea/ext/mongoid/find_ordered_test.rb
2019
2026
  - test/lib/workarea/ext/mongoid/list_field_test.rb
2027
+ - test/lib/workarea/ext/referer_parser/parser_test.rb
2020
2028
  - test/lib/workarea/geolocation_test.rb
2021
2029
  - test/lib/workarea/lint/inconsistent_details_test.rb
2022
2030
  - test/lib/workarea/lint/products_missing_images_test.rb
@@ -2366,7 +2374,7 @@ files:
2366
2374
  - test/workers/workarea/send_refund_email_test.rb
2367
2375
  - test/workers/workarea/status_reporter_test.rb
2368
2376
  - test/workers/workarea/undo_release_test.rb
2369
- - test/workers/workarea/update_payment_profile_email_test.rb
2377
+ - test/workers/workarea/update_email_test.rb
2370
2378
  - test/workers/workarea/verify_scheduled_releases_test.rb
2371
2379
  - vendor/active_shipping/.gitignore
2372
2380
  - vendor/active_shipping/.travis.yml
@@ -2614,7 +2622,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
2614
2622
  - !ruby/object:Gem::Version
2615
2623
  version: '0'
2616
2624
  requirements: []
2617
- rubygems_version: 3.0.3
2625
+ rubygems_version: 3.2.3
2618
2626
  signing_key:
2619
2627
  specification_version: 4
2620
2628
  summary: Core of the Workarea Commerce Platform
@@ -1,22 +0,0 @@
1
- module Workarea
2
- class UpdatePaymentProfileEmail
3
- include Sidekiq::Worker
4
- include Sidekiq::CallbacksWorker
5
-
6
- sidekiq_options(
7
- enqueue_on: { User => :update, with: -> { [id, changes] } }
8
- )
9
-
10
- def perform(id, changes)
11
- if changes['email'].present? && changes['email'].first.present?
12
- old_email = changes['email'].first
13
- new_email = changes['email'].last
14
-
15
- user = User.find(id)
16
- user.email = old_email # set old email so we lookup by old email value
17
-
18
- Payment::Profile.update_email(PaymentReference.new(user), new_email)
19
- end
20
- end
21
- end
22
- end
@@ -1,27 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Workarea
4
- class UpdatePaymentProfileEmailTest < Workarea::TestCase
5
- setup do
6
- @user = create_user(email: 'user@workarea.com')
7
- @profile = Payment::Profile.lookup(PaymentReference.new(@user))
8
- @worker = UpdatePaymentProfileEmail.new
9
- end
10
-
11
- def test_updating_payment_profile_email_address
12
- @worker.perform(
13
- @user.id.to_s,
14
- 'email' => ['user@workarea.com', 'test@workarea.com']
15
- )
16
-
17
- @profile.reload
18
- assert_equal(@profile.email, 'test@workarea.com')
19
- end
20
-
21
- def test_skipping_update_if_email_change_is_nil
22
- @worker.perform(@user.id.to_s, 'email' => [nil, 'user@workarea.com'])
23
- @profile.reload
24
- assert_equal(@profile.email, 'user@workarea.com')
25
- end
26
- end
27
- end