trueandco_analytics 0.3.0 → 0.4.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -6
  3. data/app/assets/javascripts/analitics_in_point.js +28 -0
  4. data/app/assets/javascripts/analitics_script.js +165 -0
  5. data/app/assets/javascripts/trueandco_analytics.js +2 -169
  6. data/app/views/trueandco_analytics/{receiver → site/receiver}/pull_user_statistic.erb +0 -0
  7. data/config/routes.rb +1 -1
  8. data/db/migrate/20170802133950_create_metric_users.rb +1 -1
  9. data/exe/trueandco_analytics +1 -10
  10. data/lib/generators/trueandco_analytics/templates/trueandco_analytics.rb +3 -3
  11. data/lib/trueandco_analytics.rb +44 -26
  12. data/lib/trueandco_analytics/{locales → common/locales}/en.yml +0 -0
  13. data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/application_record.rb +0 -0
  14. data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user.rb +0 -0
  15. data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user_session.rb +0 -0
  16. data/lib/trueandco_analytics/common/models/metric_user_visit.rb +8 -0
  17. data/lib/trueandco_analytics/{modules → common/modules}/info.rb +0 -0
  18. data/lib/trueandco_analytics/{reports → common/reports}/application_report.rb +0 -0
  19. data/lib/trueandco_analytics/{reports → common/reports}/details_report.rb +0 -0
  20. data/lib/trueandco_analytics/{reports → common/reports}/page_buy_in_date_range_report.rb +0 -0
  21. data/lib/trueandco_analytics/{services → common/services}/logger.rb +0 -0
  22. data/lib/trueandco_analytics/{services → common/services}/redis_connect.rb +0 -0
  23. data/lib/trueandco_analytics/{services → common/services}/reports.rb +1 -6
  24. data/lib/trueandco_analytics/{services → common/services}/workers.rb +0 -0
  25. data/lib/trueandco_analytics/config/params.rb +7 -7
  26. data/lib/trueandco_analytics/{cli → console/cli}/common.rb +0 -0
  27. data/lib/trueandco_analytics/{cli → console/cli}/report.rb +0 -0
  28. data/lib/trueandco_analytics/console/commands/report_c/generate.rb +29 -0
  29. data/lib/{extension_string.rb → trueandco_analytics/console/extension_string.rb} +0 -0
  30. data/lib/trueandco_analytics/engine.rb +2 -6
  31. data/{app/commands/trueandco_analytics → lib/trueandco_analytics/site/commands}/arr_jsons_to_arr_hash.rb +1 -1
  32. data/lib/trueandco_analytics/site/commands/metric_c/add_list.rb +63 -0
  33. data/lib/trueandco_analytics/site/commands/session_c/create.rb +63 -0
  34. data/lib/trueandco_analytics/site/commands/session_c/put_data.rb +49 -0
  35. data/lib/trueandco_analytics/site/commands/user_c/create_or_update_user_if_exist.rb +39 -0
  36. data/{app/controllers/trueandco_analytics → lib/trueandco_analytics/site/controllers}/application_controller.rb +2 -2
  37. data/{app/controllers/trueandco_analytics → lib/trueandco_analytics/site/controllers}/reciver_controller.rb +5 -7
  38. data/lib/trueandco_analytics/site/helpers/trueandco_analytics_helper.rb +18 -0
  39. data/lib/trueandco_analytics/site/workers/user_session_metric_worker.rb +20 -0
  40. data/lib/trueandco_analytics/version.rb +1 -1
  41. metadata +31 -29
  42. data/app/commands/trueandco_analytics/metric_c/add_list.rb +0 -65
  43. data/app/commands/trueandco_analytics/report_c/generate.rb +0 -31
  44. data/app/commands/trueandco_analytics/session_c/create.rb +0 -65
  45. data/app/commands/trueandco_analytics/session_c/put_data.rb +0 -46
  46. data/app/commands/trueandco_analytics/user_c/create_or_update_user_if_exist.rb +0 -41
  47. data/app/models/trueandco_analytics/metric_user_visit.rb +0 -8
  48. data/app/workers/trueandco_analytics/user_session_metric_worker.rb +0 -21
  49. data/lib/trueandco_analytics/helpers/trueandco_analytics_helper.rb +0 -35
@@ -1,5 +1,5 @@
1
- module TrueandcoAnalytics
1
+ module TrueandcoAnalytics::Site
2
2
  class ApplicationController < ActionController::Base
3
3
  protect_from_forgery with: :exception
4
4
  end
5
- end
5
+ end
@@ -1,16 +1,14 @@
1
- require_dependency "trueandco_analytics/application_controller"
2
-
3
- module TrueandcoAnalytics
1
+ module TrueandcoAnalytics::Site
4
2
  class ReceiverController < ApplicationController
5
-
3
+
6
4
  def pull_user_statistic
7
5
  data = JSON.parse(params[:user_metric])
8
6
  userInfo = request.user_agent
9
7
  page_path = request.url.match(/(?:\/\/.+?\/)(.+?)(?=\?|$)/)[1]
10
- data = data.merge({ page_path: page_path }).to_json
8
+ data = data.merge({page_path: page_path}).to_json
11
9
  request_info = {
12
- 'remote_ip' => request.remote_ip,
13
- 'user_agent' => request.user_agent
10
+ 'remote_ip' => request.remote_ip,
11
+ 'user_agent' => request.user_agent
14
12
  }
15
13
  SessionC::PutData.new(data, request_info, userInfo).execute
16
14
  render nothing: true, status: 201, content_type: 'text/plain'
@@ -0,0 +1,18 @@
1
+ module TrueandcoAnalytics::Site::TrueandcoAnalyticsHelper
2
+ def track_user_behavior
3
+ pull_user_statistic_path = ::TrueandcoAnalytics::Engine.routes.url_helpers.receiver_pull_user_statistic_path
4
+ return unless @user_behavior.nil?
5
+ @user_behavior = 1
6
+ js_string = <<-USER_BEHAVIOR_TRACK
7
+
8
+ var statistics_url = "#{root_url.chomp('/')}#{pull_user_statistic_path}",
9
+ app_token = "#{form_authenticity_token}",
10
+ selector = "#{::TrueandcoAnalytics::Config::Params.buy_selector}",
11
+ time_survey = "#{::TrueandcoAnalytics::Config::Params.time_survey}";
12
+
13
+ analitics_in_point(statistics_url, app_token, selector, time_survey);
14
+
15
+ USER_BEHAVIOR_TRACK
16
+ javascript_tag js_string, defer: 'defer'
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module TrueandcoAnalytics::Site
2
+ class UserSessionMetricWorker
3
+ include Sidekiq::Worker
4
+ sidekiq_options queue: :user_metric
5
+
6
+ def perform(*args)
7
+ info_pages, info_request = args[0], args[1]
8
+ @redis = ::TrueandcoAnalytics::RedisConnect.get
9
+ user_session_data_json = @redis.lrange(info_pages, 0, -1)
10
+ return if user_session_data_json.nil?
11
+ user_session_data = ArrJsonsToArrHash.new(user_session_data_json).execute
12
+ return unless user_session_data.any?
13
+ first_point = user_session_data[0]
14
+ last_point = user_session_data[-1]
15
+ metric_user = UserC::CreateOrUpdateUserIfExist.new(info_request['user_agent'], last_point['time']['timestamp']).execute
16
+ session = SessionC::Create.new(metric_user, first_point, last_point['time']['timestamp'], info_request).execute
17
+ MetricC::AddList.new(metric_user, session, user_session_data).execute
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module TrueandcoAnalytics
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trueandco_analytics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Moroz Ivan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-22 00:00:00.000000000 Z
11
+ date: 2017-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -175,45 +175,47 @@ files:
175
175
  - MIT-LICENSE
176
176
  - README.md
177
177
  - Rakefile
178
+ - app/assets/javascripts/analitics_in_point.js
179
+ - app/assets/javascripts/analitics_script.js
178
180
  - app/assets/javascripts/trueandco_analytics.js
179
- - app/commands/trueandco_analytics/arr_jsons_to_arr_hash.rb
180
- - app/commands/trueandco_analytics/metric_c/add_list.rb
181
- - app/commands/trueandco_analytics/report_c/generate.rb
182
- - app/commands/trueandco_analytics/session_c/create.rb
183
- - app/commands/trueandco_analytics/session_c/put_data.rb
184
- - app/commands/trueandco_analytics/user_c/create_or_update_user_if_exist.rb
185
- - app/controllers/trueandco_analytics/application_controller.rb
186
- - app/controllers/trueandco_analytics/reciver_controller.rb
187
- - app/models/trueandco_analytics/application_record.rb
188
- - app/models/trueandco_analytics/metric_user.rb
189
- - app/models/trueandco_analytics/metric_user_session.rb
190
- - app/models/trueandco_analytics/metric_user_visit.rb
191
- - app/views/trueandco_analytics/receiver/pull_user_statistic.erb
192
- - app/workers/trueandco_analytics/user_session_metric_worker.rb
181
+ - app/views/trueandco_analytics/site/receiver/pull_user_statistic.erb
193
182
  - config/routes.rb
194
183
  - config/secrets.yml
195
184
  - db/migrate/20170802133950_create_metric_users.rb
196
185
  - db/migrate/20170802134044_create_metric_user_visits.rb
197
186
  - db/migrate/20170802134059_create_metric_user_sessions.rb
198
187
  - exe/trueandco_analytics
199
- - lib/extension_string.rb
200
188
  - lib/generators/trueandco_analytics/install_generator.rb
201
189
  - lib/generators/trueandco_analytics/templates/trueandco_analytics.rb
202
190
  - lib/trueandco_analytics.rb
203
- - lib/trueandco_analytics/cli/common.rb
204
- - lib/trueandco_analytics/cli/report.rb
191
+ - lib/trueandco_analytics/common/locales/en.yml
192
+ - lib/trueandco_analytics/common/models/application_record.rb
193
+ - lib/trueandco_analytics/common/models/metric_user.rb
194
+ - lib/trueandco_analytics/common/models/metric_user_session.rb
195
+ - lib/trueandco_analytics/common/models/metric_user_visit.rb
196
+ - lib/trueandco_analytics/common/modules/info.rb
197
+ - lib/trueandco_analytics/common/reports/application_report.rb
198
+ - lib/trueandco_analytics/common/reports/details_report.rb
199
+ - lib/trueandco_analytics/common/reports/page_buy_in_date_range_report.rb
200
+ - lib/trueandco_analytics/common/services/logger.rb
201
+ - lib/trueandco_analytics/common/services/redis_connect.rb
202
+ - lib/trueandco_analytics/common/services/reports.rb
203
+ - lib/trueandco_analytics/common/services/workers.rb
205
204
  - lib/trueandco_analytics/config/params.rb
205
+ - lib/trueandco_analytics/console/cli/common.rb
206
+ - lib/trueandco_analytics/console/cli/report.rb
207
+ - lib/trueandco_analytics/console/commands/report_c/generate.rb
208
+ - lib/trueandco_analytics/console/extension_string.rb
206
209
  - lib/trueandco_analytics/engine.rb
207
- - lib/trueandco_analytics/helpers/trueandco_analytics_helper.rb
208
- - lib/trueandco_analytics/locales/en.yml
209
- - lib/trueandco_analytics/modules/info.rb
210
- - lib/trueandco_analytics/reports/application_report.rb
211
- - lib/trueandco_analytics/reports/details_report.rb
212
- - lib/trueandco_analytics/reports/page_buy_in_date_range_report.rb
213
- - lib/trueandco_analytics/services/logger.rb
214
- - lib/trueandco_analytics/services/redis_connect.rb
215
- - lib/trueandco_analytics/services/reports.rb
216
- - lib/trueandco_analytics/services/workers.rb
210
+ - lib/trueandco_analytics/site/commands/arr_jsons_to_arr_hash.rb
211
+ - lib/trueandco_analytics/site/commands/metric_c/add_list.rb
212
+ - lib/trueandco_analytics/site/commands/session_c/create.rb
213
+ - lib/trueandco_analytics/site/commands/session_c/put_data.rb
214
+ - lib/trueandco_analytics/site/commands/user_c/create_or_update_user_if_exist.rb
215
+ - lib/trueandco_analytics/site/controllers/application_controller.rb
216
+ - lib/trueandco_analytics/site/controllers/reciver_controller.rb
217
+ - lib/trueandco_analytics/site/helpers/trueandco_analytics_helper.rb
218
+ - lib/trueandco_analytics/site/workers/user_session_metric_worker.rb
217
219
  - lib/trueandco_analytics/version.rb
218
220
  homepage: ''
219
221
  licenses:
@@ -1,65 +0,0 @@
1
- module TrueandcoAnalytics
2
- module MetricC
3
- class AddList
4
-
5
- def initialize(metric_user, session, user_session_data)
6
- if metric_user.nil? || session.nil? || user_session_data.nil?
7
- raise ArgumentError.new("#{self.to_s} metric_user=#{metric_user}
8
- session=#{session} user_session_data=#{user_session_data}")
9
- end
10
- @metric_user = metric_user
11
- @session = session
12
- @user_session_data = user_session_data
13
- end
14
-
15
- def execute
16
- uniq_pages = info_uniq_page
17
- return if uniq_pages.nil?
18
- uniq_pages.each do |page|
19
- data = {
20
- metric_user: metric_user,
21
- metric_user_session: session,
22
- page_path: page['page_path'],
23
- user_action: page['clicks']['clickDetails'].to_json,
24
- time_s: page['time']['timeOnPage'],
25
- is_buy: page['clicks']['clickDetails'].length > 0
26
- }
27
- MetricUserVisit.create(data)
28
- end
29
- end
30
-
31
- private
32
-
33
- attr_reader :metric_user, :session, :user_session_data
34
-
35
- def info_uniq_page
36
- length = user_session_data.length
37
- return user_session_data if length < 2
38
- results = []
39
- page = user_session_data[0]['page_path']
40
- clickDetails = []
41
- index = 0
42
- while index < length - 1
43
- unless user_session_data[index]['clicks']['clickDetails'].empty?
44
- clickDetails = user_session_data[index]['clicks']['clickDetails']
45
- end
46
- index += 1
47
- unless page == user_session_data[index]['page_path']
48
- data = user_session_data[index - 1]
49
- data['clicks']['clickDetails'] = clickDetails
50
- results << data
51
- page = user_session_data[index]['page_path']
52
- clickDetails = []
53
- end
54
- end
55
- data = user_session_data[index]
56
- unless data['clicks']['clickDetails'].empty?
57
- clickDetails = data['clicks']['clickDetails']
58
- end
59
- data['clicks']['clickDetails'] = clickDetails
60
- results << data
61
- results
62
- end
63
- end
64
- end
65
- end
@@ -1,31 +0,0 @@
1
- module TrueandcoAnalytics
2
- module ReportC
3
- class Generate
4
- include TrueandcoAnalytics::Modules::Info
5
-
6
- def initialize(name: nil, format: nil, datetime_start: nil, datetime_end: nil, path: nil)
7
- @name = name
8
- @format = format
9
- @datetime_start = datetime_start
10
- @datetime_end = datetime_end
11
- @path = path || CURRENT_PATH
12
- end
13
-
14
- def execute
15
- report = ::TrueandcoAnalytics::Reports.get_report_obj(name, format, datetime_start, datetime_end)
16
- return if report.nil? || report.data.empty?
17
- @path += report.report_name if File.directory?(path)
18
- dirname = File.dirname(path)
19
- unless File.directory?(dirname)
20
- FileUtils.mkdir_p(dirname)
21
- end
22
- File.open(path, 'w+') { |f| f.write(report.data) }
23
- result(I18n.t('trueandco_analytics.result.done', path: path))
24
- end
25
-
26
- private
27
-
28
- attr_reader :name, :format, :datetime_start, :datetime_end, :path
29
- end
30
- end
31
- end
@@ -1,65 +0,0 @@
1
- module TrueandcoAnalytics
2
- module SessionC
3
- class Create
4
-
5
- def initialize(metric_user, first_point, timestamp_end, request_info)
6
-
7
- if metric_user.nil? || first_point.nil? || timestamp_end.nil? ||request_info.nil?
8
- raise ArgumentError.new("#{self.to_s} metric_user=#{metric_user}
9
- first_point=#{first_point} timestamp_end=#{timestamp_end} request_info=#{request_info}")
10
- end
11
-
12
- @metric_user = metric_user
13
- @ip = request_info['remote_ip']
14
- @user_agent = request_info['user_agent']
15
- @session_start = first_point['time']['timestamp']
16
- @referer = first_point['userReferrer']
17
- @live_time_s = timestamp_end - @session_start
18
- end
19
-
20
- def execute
21
- Browser::Base.include(Browser::Aliases)
22
- browser = Browser.new(user_agent, accept_language: "en-us")
23
- data = {
24
- metric_user: metric_user,
25
- user_agent: user_agent,
26
- referer: referer,
27
- session_start: datetime_session_start,
28
- live_time_s: 60,
29
- ip_4: ip_v4(ip),
30
- ip_6: ip_v6(ip),
31
- browser: browser.name,
32
- is_mobile: browser.mobile? || false
33
- }
34
- MetricUserSession.create(data)
35
- end
36
-
37
- private
38
-
39
- attr_reader :metric_user, :ip, :user_agent, :session_start, :live_time_s, :referer
40
-
41
- def datetime_session_start
42
- DateTime.strptime(session_start.to_s,'%s')
43
- end
44
-
45
- def ip_v4(ip)
46
- ip_o = get_ip_object(ip)
47
- result = 0
48
- result = ip_o.to_i if ip_o.ipv4?
49
- result
50
- end
51
-
52
-
53
- def ip_v6(ip)
54
- ip_o = get_ip_object(ip)
55
- result = 0
56
- result = ip_o.data if ip_o.ipv6?
57
- result
58
- end
59
-
60
- def get_ip_object(ip)
61
- @ip_o ||= IPAddress.parse ip
62
- end
63
- end
64
- end
65
- end
@@ -1,46 +0,0 @@
1
- module TrueandcoAnalytics
2
- module SessionC
3
- class PutData
4
-
5
- def initialize(json_data, request_info, userInfo)
6
- @json_data = json_data
7
- @userInfo = userInfo
8
- @request_info = request_info
9
- @redis = RedisConnect.get
10
- @time_survey = Config::Params.time_survey
11
- @time_dead_session = Config::Params.time_dead_session
12
- end
13
-
14
- def execute
15
- 1.times do
16
- break if userInfo.nil? || userInfo.empty?
17
- user_key = ::FNV.new.fnv1_32 userInfo.to_s
18
- mange_job(user_key)
19
- redis.rpush(user_key, json_data)
20
- redis.expire(user_key, time_dead_session + 3)
21
- end
22
- end
23
-
24
- private
25
-
26
- attr_reader :json_data, :userInfo, :request_info, :redis, :time_dead_session, :time_survey
27
-
28
- def mange_job(user_key)
29
- user_job_key = "#{user_key}:job_key"
30
- unless redis.exists user_job_key
31
- create_job(user_key, user_job_key)
32
- end
33
- if redis.ttl(user_job_key) < time_survey * 3
34
- job_id = redis.get(user_job_key)
35
- Sidekiq::ScheduledSet.new.find_job(job_id)&.delete
36
- create_job(user_key, user_job_key)
37
- end
38
- end
39
-
40
- def create_job(user_key, user_job_key)
41
- job_id = UserSessionMetricWorker.perform_at(time_dead_session.seconds.from_now, user_key, request_info)
42
- redis.setex(user_job_key, time_dead_session, job_id)
43
- end
44
- end
45
- end
46
- end
@@ -1,41 +0,0 @@
1
- module TrueandcoAnalytics
2
- module UserC
3
- class CreateOrUpdateUserIfExist
4
-
5
- def initialize(user_agent, timestamp_end)
6
- if user_agent.nil? || timestamp_end.nil?
7
- raise ArgumentError.new("#{self.to_s} user_agent=#{user_agent} timestamp_end=#{timestamp_end}")
8
- end
9
- @user_agent = user_agent
10
- @timestamp_end = timestamp_end
11
- @user_id = Config::Params.user_method&.id
12
- end
13
-
14
- def execute
15
- user = nil
16
- user = TrueandcoAnalytics::MetricUser.find_by(user_id: user_id) if user_id
17
- user = TrueandcoAnalytics::MetricUser.find_by(hash_id: hash_id) if user.nil?
18
- user = if user.nil?
19
- TrueandcoAnalytics::MetricUser.create(user_id: user_id || 0, datetime_create: datetime_end,
20
- last_active_datetime: datetime_end, hash_id: hash_id)
21
- else
22
- user.update_attribute(:last_active_datetime, datetime_end)
23
- user
24
- end
25
- user
26
- end
27
-
28
- private
29
-
30
- attr_reader :user_agent, :timestamp_end, :user_id
31
-
32
- def datetime_end
33
- DateTime.strptime(timestamp_end.to_s,'%s')
34
- end
35
-
36
- def hash_id
37
- @hash_id ||= FNV.new.fnv1_32(user_agent)
38
- end
39
- end
40
- end
41
- end
@@ -1,8 +0,0 @@
1
- module TrueandcoAnalytics
2
- class MetricUserVisit < ApplicationRecord
3
- self.table_name = 'metric_user_visits'
4
-
5
- belongs_to :metric_user_session
6
- belongs_to :metric_user
7
- end
8
- end
@@ -1,21 +0,0 @@
1
- module TrueandcoAnalytics
2
-
3
- class UserSessionMetricWorker
4
- include Sidekiq::Worker
5
- sidekiq_options queue: :user_metric
6
-
7
- def perform(*args)
8
- info_pages,info_request = args[0],args[1]
9
- @redis = RedisConnect.get
10
- user_session_data_json = @redis.lrange(info_pages, 0, -1)
11
- return if user_session_data_json.nil?
12
- user_session_data = ArrJsonsToArrHash.new(user_session_data_json).execute
13
- return unless user_session_data.any?
14
- first_point = user_session_data[0]
15
- last_point = user_session_data[-1]
16
- metric_user = UserC::CreateOrUpdateUserIfExist.new(info_request['user_agent'], last_point['time']['timestamp']).execute
17
- session = SessionC::Create.new(metric_user, first_point, last_point['time']['timestamp'], info_request).execute
18
- MetricC::AddList.new(metric_user, session, user_session_data).execute
19
- end
20
- end
21
- end