octocore-mongo 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.md +12 -0
  3. data/CONTRIBUTING +0 -0
  4. data/Gemfile +11 -0
  5. data/Gemfile.lock +150 -0
  6. data/LICENSE +202 -0
  7. data/MAINTAINERS +0 -0
  8. data/NOTICE +8 -0
  9. data/README.md +69 -0
  10. data/Rakefile +51 -0
  11. data/bin/fakestream-mongo +258 -0
  12. data/bin/octocore-admin-mongo +54 -0
  13. data/lib/octocore-mongo.rb +157 -0
  14. data/lib/octocore-mongo/baseline.rb +131 -0
  15. data/lib/octocore-mongo/callbacks.rb +117 -0
  16. data/lib/octocore-mongo/config.rb +39 -0
  17. data/lib/octocore-mongo/config/config.yml +1 -0
  18. data/lib/octocore-mongo/config/search/index/user.yml +42 -0
  19. data/lib/octocore-mongo/counter.rb +265 -0
  20. data/lib/octocore-mongo/counter/helpers.rb +168 -0
  21. data/lib/octocore-mongo/email.rb +63 -0
  22. data/lib/octocore-mongo/featureflag.rb +79 -0
  23. data/lib/octocore-mongo/helpers.rb +6 -0
  24. data/lib/octocore-mongo/helpers/api_consumer_helper.rb +51 -0
  25. data/lib/octocore-mongo/helpers/api_helper.rb +65 -0
  26. data/lib/octocore-mongo/helpers/api_logger.rb +14 -0
  27. data/lib/octocore-mongo/helpers/client_helper.rb +104 -0
  28. data/lib/octocore-mongo/helpers/kong_helper.rb +164 -0
  29. data/lib/octocore-mongo/helpers/sinatra_helper.rb +22 -0
  30. data/lib/octocore-mongo/kafka_bridge.rb +60 -0
  31. data/lib/octocore-mongo/kldivergence.rb +14 -0
  32. data/lib/octocore-mongo/mailer.rb +1 -0
  33. data/lib/octocore-mongo/mailer/subscriber_mailer.rb +32 -0
  34. data/lib/octocore-mongo/message_parser.rb +114 -0
  35. data/lib/octocore-mongo/models.rb +275 -0
  36. data/lib/octocore-mongo/models/contactus.rb +42 -0
  37. data/lib/octocore-mongo/models/enterprise.rb +75 -0
  38. data/lib/octocore-mongo/models/enterprise/adapter_details.rb +18 -0
  39. data/lib/octocore-mongo/models/enterprise/api_event.rb +14 -0
  40. data/lib/octocore-mongo/models/enterprise/api_hit.rb +20 -0
  41. data/lib/octocore-mongo/models/enterprise/api_key.rb +11 -0
  42. data/lib/octocore-mongo/models/enterprise/api_track.rb +13 -0
  43. data/lib/octocore-mongo/models/enterprise/app_init.rb +13 -0
  44. data/lib/octocore-mongo/models/enterprise/app_login.rb +12 -0
  45. data/lib/octocore-mongo/models/enterprise/app_logout.rb +12 -0
  46. data/lib/octocore-mongo/models/enterprise/authorization.rb +67 -0
  47. data/lib/octocore-mongo/models/enterprise/category.rb +14 -0
  48. data/lib/octocore-mongo/models/enterprise/category_baseline.rb +19 -0
  49. data/lib/octocore-mongo/models/enterprise/category_hit.rb +26 -0
  50. data/lib/octocore-mongo/models/enterprise/category_trend.rb +19 -0
  51. data/lib/octocore-mongo/models/enterprise/conversions.rb +69 -0
  52. data/lib/octocore-mongo/models/enterprise/ctr.rb +54 -0
  53. data/lib/octocore-mongo/models/enterprise/dimension_choice.rb +21 -0
  54. data/lib/octocore-mongo/models/enterprise/engagement_time.rb +43 -0
  55. data/lib/octocore-mongo/models/enterprise/funnel_data.rb +20 -0
  56. data/lib/octocore-mongo/models/enterprise/funnel_tracker.rb +19 -0
  57. data/lib/octocore-mongo/models/enterprise/funnels.rb +129 -0
  58. data/lib/octocore-mongo/models/enterprise/gcm.rb +21 -0
  59. data/lib/octocore-mongo/models/enterprise/newsfeed_hit.rb +52 -0
  60. data/lib/octocore-mongo/models/enterprise/notification_hit.rb +42 -0
  61. data/lib/octocore-mongo/models/enterprise/page.rb +15 -0
  62. data/lib/octocore-mongo/models/enterprise/page_view.rb +14 -0
  63. data/lib/octocore-mongo/models/enterprise/pageload_time.rb +43 -0
  64. data/lib/octocore-mongo/models/enterprise/product.rb +22 -0
  65. data/lib/octocore-mongo/models/enterprise/product_baseline.rb +20 -0
  66. data/lib/octocore-mongo/models/enterprise/product_hit.rb +26 -0
  67. data/lib/octocore-mongo/models/enterprise/product_page_view.rb +13 -0
  68. data/lib/octocore-mongo/models/enterprise/product_trend.rb +18 -0
  69. data/lib/octocore-mongo/models/enterprise/push_key.rb +15 -0
  70. data/lib/octocore-mongo/models/enterprise/rules.rb +45 -0
  71. data/lib/octocore-mongo/models/enterprise/segment.rb +65 -0
  72. data/lib/octocore-mongo/models/enterprise/segment_data.rb +22 -0
  73. data/lib/octocore-mongo/models/enterprise/tag.rb +14 -0
  74. data/lib/octocore-mongo/models/enterprise/tag_baseline.rb +19 -0
  75. data/lib/octocore-mongo/models/enterprise/tag_hit.rb +26 -0
  76. data/lib/octocore-mongo/models/enterprise/tag_trend.rb +19 -0
  77. data/lib/octocore-mongo/models/enterprise/template.rb +18 -0
  78. data/lib/octocore-mongo/models/plans.rb +17 -0
  79. data/lib/octocore-mongo/models/subscribe.rb +13 -0
  80. data/lib/octocore-mongo/models/user.rb +13 -0
  81. data/lib/octocore-mongo/models/user/push_token.rb +15 -0
  82. data/lib/octocore-mongo/models/user/user_browser_details.rb +16 -0
  83. data/lib/octocore-mongo/models/user/user_location_history.rb +15 -0
  84. data/lib/octocore-mongo/models/user/user_persona.rb +101 -0
  85. data/lib/octocore-mongo/models/user/user_phone_details.rb +17 -0
  86. data/lib/octocore-mongo/models/user/user_profile.rb +20 -0
  87. data/lib/octocore-mongo/models/user/user_timeline.rb +111 -0
  88. data/lib/octocore-mongo/record.rb +20 -0
  89. data/lib/octocore-mongo/schedeuleable.rb +20 -0
  90. data/lib/octocore-mongo/scheduler.rb +72 -0
  91. data/lib/octocore-mongo/search.rb +5 -0
  92. data/lib/octocore-mongo/search/client.rb +33 -0
  93. data/lib/octocore-mongo/search/indexer.rb +0 -0
  94. data/lib/octocore-mongo/search/searchable.rb +18 -0
  95. data/lib/octocore-mongo/search/setup.rb +71 -0
  96. data/lib/octocore-mongo/segment.rb +287 -0
  97. data/lib/octocore-mongo/stats.rb +33 -0
  98. data/lib/octocore-mongo/trendable.rb +88 -0
  99. data/lib/octocore-mongo/trends.rb +158 -0
  100. data/lib/octocore-mongo/utils.rb +90 -0
  101. data/lib/octocore-mongo/version.rb +4 -0
  102. data/octocore-mongo.gemspec +50 -0
  103. data/spec/lib/stats_spec.rb +20 -0
  104. data/spec/spec_helper.rb +103 -0
  105. metadata +545 -0
@@ -0,0 +1,11 @@
1
+ require 'mongo_mapper'
2
+
3
+ module Octo
4
+ class ApiKey
5
+ include MongoMapper::Document
6
+
7
+ key :enterprise_key, String
8
+ key :enterprise_id, ObjectId
9
+
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ require 'mongo_mapper'
2
+
3
+ module Octo
4
+ class ApiTrack
5
+ include MongoMapper::Document
6
+
7
+ key :customid, ObjectId
8
+ key :created_at, Time
9
+ key :json_dump, String
10
+ key :type, String
11
+
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'mongo_mapper'
2
+
3
+ module Octo
4
+ class AppInit
5
+ include MongoMapper::Document
6
+
7
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
8
+
9
+ key :created_at, Time
10
+ key :userid, Integer
11
+
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ require 'mongo_mapper'
2
+
3
+ module Octo
4
+ class AppLogin
5
+ include MongoMapper::Document
6
+
7
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
8
+
9
+ key :created_at, Time
10
+ key :userid, Integer
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'mongo_mapper'
2
+
3
+ module Octo
4
+ class AppLogout
5
+ include MongoMapper::Document
6
+
7
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
8
+
9
+ key :created_at, Time
10
+ key :userid, Integer
11
+ end
12
+ end
@@ -0,0 +1,67 @@
1
+ require 'mongo_mapper'
2
+ require 'securerandom'
3
+ require 'octocore-mongo/helpers/kong_helper'
4
+
5
+ module Octo
6
+ class Authorization
7
+ include MongoMapper::Document
8
+ include Octo::Helpers::KongHelper
9
+
10
+ key :username, String
11
+
12
+ key :enterprise_id, String
13
+ key :email, String
14
+ key :apikey, String
15
+ key :session_token, String
16
+ key :custom_id, String
17
+ key :password, String
18
+ key :admin, Boolean
19
+
20
+ before_create :check_api_key, :generate_password
21
+ after_create :kong_requests
22
+
23
+ after_destroy :kong_delete
24
+
25
+ timestamps!
26
+
27
+ # Check or Generate client apikey
28
+ def check_api_key
29
+ if(self.apikey.nil?)
30
+ self.apikey = SecureRandom.hex
31
+ end
32
+ end
33
+
34
+ # Check or Generate client password
35
+ def generate_password
36
+ if(self.password.nil?)
37
+ self.password = Digest::SHA1.hexdigest(self.username + self.enterprise_id)
38
+ else
39
+ self.password = Digest::SHA1.hexdigest(self.password + self.enterprise_id)
40
+ end
41
+ end
42
+
43
+ # Perform Kong Operations after creating client
44
+ def kong_requests
45
+ kong_config = Octo.get_config :kong
46
+ if kong_config[:enabled]
47
+ url = '/consumers/'
48
+ payload = {
49
+ username: self.username,
50
+ custom_id: self.enterprise_id
51
+ }
52
+
53
+ process_kong_request(url, :PUT, payload)
54
+ create_keyauth( self.username, self.apikey)
55
+ end
56
+ end
57
+
58
+ # Delete Kong Records
59
+ def kong_delete
60
+ kong_config = Octo.get_config :kong
61
+ if kong_config[:enabled]
62
+ delete_consumer(self.username)
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,14 @@
1
+ require 'mongo_mapper'
2
+ require 'octocore-mongo/record'
3
+
4
+ module Octo
5
+ class Category
6
+ include MongoMapper::Document
7
+ include Octo::Record
8
+
9
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
10
+
11
+ key :cat_text, String
12
+ timestamps!
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ require 'mongo_mapper'
2
+
3
+ require 'octocore-mongo/baseline'
4
+ require 'octocore-mongo/schedeuleable'
5
+
6
+ module Octo
7
+ class CategoryBaseline
8
+ include MongoMapper::Document
9
+ extend Octo::Baseline
10
+ extend Octo::Scheduleable
11
+
12
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
13
+
14
+ baselineable
15
+ # Specify the type of counter
16
+ baseline_for 'Octo::CategoryHit'
17
+
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ require 'mongo_mapper'
2
+
3
+ require 'octocore-mongo/counter'
4
+ require 'octocore-mongo/trendable'
5
+ require 'octocore-mongo/schedeuleable'
6
+
7
+ module Octo
8
+
9
+ class CategoryHit
10
+ include MongoMapper::Document
11
+ extend Octo::Counter
12
+ extend Octo::Trendable
13
+ extend Octo::Scheduleable
14
+
15
+ COUNTERS = 20
16
+
17
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
18
+
19
+ countables
20
+ trendables
21
+
22
+ baseline 'Octo::CategoryBaseline'
23
+ trends_class 'Octo::CategoryTrend'
24
+
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ require 'mongo_mapper'
2
+ require 'octocore-mongo/trends'
3
+
4
+ module Octo
5
+
6
+ # Class for storing trending category
7
+ class CategoryTrend
8
+ include MongoMapper::Document
9
+ extend Octo::Trends
10
+
11
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
12
+
13
+ trendable
14
+
15
+ trend_for 'Octo::CategoryHit'
16
+ trend_class 'Octo::Category'
17
+ end
18
+ end
19
+
@@ -0,0 +1,69 @@
1
+ require 'mongo_mapper'
2
+ require 'octocore-mongo/record'
3
+
4
+ module Octo
5
+
6
+ # The conversions store
7
+ class Conversions
8
+
9
+ include MongoMapper::Document
10
+ include Octo::Record
11
+
12
+ # Types of conversions
13
+ NEWSFEED = 0
14
+ PUSH_NOTIFICATION = 1
15
+ EMAIL = 2
16
+
17
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
18
+
19
+ key :type, Integer
20
+ key :ts, Time
21
+
22
+ key :value, Float
23
+
24
+ class << self
25
+
26
+ # Fetches the types of conversions possible
27
+ # @return [Hash] The conversion name and its value hash
28
+ def types
29
+ {
30
+ 'Newsfeed' => Octo::Conversions::NEWSFEED,
31
+ 'Notification' => Octo::Conversions::PUSH_NOTIFICATION,
32
+ # 'Email' => Octo::Conversions::EMAIL
33
+ }
34
+ end
35
+
36
+ def data( enterprise_id, type, ts = 3.days.ago..Time.now.floor)
37
+ args = {
38
+ enterprise_id: enterprise_id,
39
+ type: type,
40
+ ts: ts
41
+ }
42
+ res = self.where(args)
43
+ if res.count > 0
44
+ res.first
45
+ else
46
+ res = []
47
+ e = Octo::Enterprise.find_by_id(enterprise_id)
48
+ if e.fakedata?
49
+ if ts.class == Range
50
+ ts_begin = ts.begin.floor
51
+ ts_end = ts.end.floor
52
+ ts_begin.to(ts_end, 1.day).each do |_ts|
53
+ _args = args.merge( ts: _ts, value: rand(10.0..67.0))
54
+ res << self.new(_args).save!
55
+ end
56
+ elsif ts.class == Time
57
+ args.merge!({ value: rand(10.0..67.0) })
58
+ res << self.new(args).save!
59
+ end
60
+ end
61
+ end
62
+ res
63
+ end
64
+
65
+ end
66
+ end
67
+
68
+ end
69
+
@@ -0,0 +1,54 @@
1
+ require 'mongo_mapper'
2
+ require 'octocore-mongo/record'
3
+
4
+ module Octo
5
+
6
+ class Ctr
7
+
8
+ include MongoMapper::Document
9
+ include Octo::Record
10
+
11
+ # Type of Ctr. Reserved for future use
12
+ NEWSFEED = 0
13
+
14
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
15
+
16
+ key :ts, Time
17
+
18
+ key :value, Array
19
+
20
+ class << self
21
+
22
+ def data( enterprise_id, ts = Time.now.floor)
23
+ args = {
24
+ enterprise_id: enterprise_id,
25
+ ts: ts
26
+ }
27
+ res = self.where(args)
28
+ if res.count > 0
29
+ res.first
30
+ else
31
+ args.merge!({ value: value_array(15)})
32
+ self.new(args).save!
33
+ end
34
+ end
35
+
36
+ def value_array(count)
37
+ arr = []
38
+ res = []
39
+ sum = 0
40
+ count.times do |x|
41
+ temp = rand(10.00..100.00)
42
+ arr.push(temp)
43
+ sum = sum + temp
44
+ end
45
+ count.times do |x|
46
+ res.push((arr[x]/sum)*100)
47
+ end
48
+ res
49
+ end
50
+
51
+ end
52
+ end
53
+
54
+ end
@@ -0,0 +1,21 @@
1
+ require 'mongo_mapper'
2
+ require 'octocore-mongo/record'
3
+
4
+ module Octo
5
+
6
+ # Choices for dimensions
7
+ class DimensionChoice
8
+
9
+ include MongoMapper::Document
10
+ include Octo::Record
11
+
12
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
13
+
14
+ key :dimension, Integer
15
+ key :choice, String
16
+
17
+ timestamps!
18
+
19
+ end
20
+ end
21
+
@@ -0,0 +1,43 @@
1
+ require 'mongo_mapper'
2
+
3
+ module Octo
4
+
5
+ class EngagementTime
6
+ include MongoMapper::Document
7
+
8
+ # Types of Engagement
9
+ NEWSFEED = 0
10
+
11
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
12
+ key :engagement_type, Integer
13
+ key :counter_type, Integer
14
+ key :ts, Time
15
+
16
+ key :time, Integer
17
+
18
+ timestamps!
19
+
20
+ def self.fakedata(args)
21
+ res = self.where(args)
22
+ enterprise = Octo::Enterprise.find_by_id(args[:enterprise_id])
23
+ if res.count == 0 and enterprise.fakedata?
24
+ res = []
25
+ ts = args.fetch(ts, 7.days.ago..Time.now.floor)
26
+ if ts.class == Range
27
+ start_time = ts.begin.beginning_of_day
28
+ end_time = ts.end.end_of_day
29
+ start_time.to(end_time, 1.day).each do |_ts|
30
+ _args = args.merge({ ts: _ts, time: (rand(5.0..7.0)*60).to_i })
31
+ res << self.new(_args).save!
32
+ end
33
+ elsif ts.class == Time
34
+ _args = args.merge({ time: (rand(5.0..7.0)).to_i })
35
+ res << self.new(args).save!
36
+ end
37
+ end
38
+ res
39
+ end
40
+
41
+ end
42
+ end
43
+
@@ -0,0 +1,20 @@
1
+ require 'mongo_mapper'
2
+ require 'octocore-mongo/record'
3
+
4
+ module Octo
5
+
6
+ # Stores the data for funnels
7
+ class FunnelData
8
+ include MongoMapper::Document
9
+ include Octo::Record
10
+
11
+ belongs_to :enterprise, class_name: 'Octo::Enterprise'
12
+
13
+ key :funnel_slug, String
14
+
15
+ key :ts, Time
16
+ key :value, Array
17
+
18
+ end
19
+ end
20
+
@@ -0,0 +1,19 @@
1
+ require 'mongo_mapper'
2
+
3
+ module Octo
4
+ # A model for tracking the user web flow
5
+ # Used to build a markov model on the basis
6
+ # of the activity. eg p1 --> p2 will be entered
7
+ # with weight 1, and increased by +1 every time any
8
+ # user goes from p1 to p2
9
+ class FunnelTracker
10
+ include MongoMapper::Document
11
+
12
+ key :enterprise_id, ObjectId
13
+
14
+ key :p1, String
15
+ key :direction, Integer
16
+ key :p2, String
17
+ key :weight, Integer
18
+ end
19
+ end