vwo-sdk 1.29.0 → 1.35.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,11 +12,11 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require_relative '../logger'
16
15
  require_relative '../enums'
17
16
  require_relative '../utils/campaign'
18
17
  require_relative '../services/segment_evaluator'
19
18
  require_relative '../utils/validations'
19
+ require_relative '../utils/log_message'
20
20
  require_relative 'bucketer'
21
21
  require_relative '../constants'
22
22
  require_relative '../services/hooks_manager'
@@ -40,7 +40,7 @@ class VWO
40
40
  # @param[Class] - Class instance having the capability of
41
41
  # get and save.
42
42
  def initialize(settings_file, user_storage_service = nil, options = {})
43
- @logger = VWO::Logger.get_instance
43
+ @logger = VWO::Utils::Logger
44
44
  @user_storage_service = user_storage_service
45
45
  @bucketer = VWO::Core::Bucketer.new
46
46
  @settings_file = settings_file
@@ -110,78 +110,84 @@ class VWO
110
110
  variation = get_variation_if_whitelisting_passed(user_id, campaign, variation_targeting_variables, api_name, decision, true)
111
111
  return variation if variation && variation['name']
112
112
 
113
- user_campaign_map = get_user_storage(user_id, campaign_key)
114
- variation = get_stored_variation(user_id, campaign_key, user_campaign_map) if valid_hash?(user_campaign_map)
115
-
116
- if variation
117
- variation = variation.dup # deep copy
118
- end
113
+ if campaign.has_key?("isAlwaysCheckSegment")
114
+ is_presegmentation = check_presegmentation(campaign, user_id, custom_variables, api_name)
115
+ return get_variationIfPreSegmentation_applied(is_presegmentation, campaign, user_id, goal_identifier, decision)
116
+ else
117
+ user_campaign_map = get_user_storage(user_id, campaign_key)
118
+ variation = get_stored_variation(user_id, campaign_key, user_campaign_map) if valid_hash?(user_campaign_map)
119
119
 
120
- if variation
121
- if valid_string?(user_campaign_map['goal_identifier']) && api_name == ApiMethods::TRACK
122
- variation['goal_identifier'] = user_campaign_map['goal_identifier']
120
+ if variation
121
+ variation = variation.dup # deep copy
123
122
  end
124
- @has_stored_variation = true
125
- @logger.log(
126
- LogLevelEnum::INFO,
127
- format(
128
- LogMessageEnum::InfoMessages::GOT_STORED_VARIATION,
129
- file: FILE,
130
- campaign_key: campaign_key,
131
- user_id: user_id,
132
- variation_name: variation['name']
133
- )
134
- )
135
- decision[:from_user_storage_service] = !!variation['name']
123
+
136
124
  if variation
137
- if campaign['type'] == CampaignTypes::VISUAL_AB || campaign['type'] == CampaignTypes::FEATURE_TEST
138
- decision[:variation_name] = variation['name']
139
- decision[:variation_id] = variation['id']
140
- if campaign['type'] == CampaignTypes::FEATURE_TEST
141
- decision[:is_feature_enabled] = variation['isFeatureEnabled']
142
- end
125
+ if valid_string?(user_campaign_map['goal_identifier']) && api_name == ApiMethods::TRACK
126
+ variation['goal_identifier'] = user_campaign_map['goal_identifier']
143
127
  end
144
- @hooks_manager.execute(decision)
145
- end
146
- return variation
147
- else
148
- @logger.log(
149
- LogLevelEnum::DEBUG,
150
- format(
151
- LogMessageEnum::DebugMessages::NO_STORED_VARIATION,
152
- file: FILE,
153
- campaign_key: campaign_key,
154
- user_id: user_id
128
+ @has_stored_variation = true
129
+ @logger.log(
130
+ LogLevelEnum::INFO,
131
+ 'GOT_STORED_VARIATION',
132
+ {
133
+ '{file}' => FILE,
134
+ '{campaignKey}' => campaign_key,
135
+ '{userId}' => user_id,
136
+ '{variationName}' => variation['name']
137
+ }
155
138
  )
156
- )
157
-
158
- if ([ApiMethods::TRACK, ApiMethods::GET_VARIATION_NAME, ApiMethods::GET_FEATURE_VARIABLE_VALUE].include? api_name) && @user_storage_service
139
+ decision[:from_user_storage_service] = !!variation['name']
140
+ if variation
141
+ if campaign['type'] == CampaignTypes::VISUAL_AB || campaign['type'] == CampaignTypes::FEATURE_TEST
142
+ decision[:variation_name] = variation['name']
143
+ decision[:variation_id] = variation['id']
144
+ if campaign['type'] == CampaignTypes::FEATURE_TEST
145
+ decision[:is_feature_enabled] = variation['isFeatureEnabled']
146
+ end
147
+ end
148
+ @hooks_manager.execute(decision)
149
+ end
150
+ return variation
151
+ else
159
152
  @logger.log(
160
153
  LogLevelEnum::DEBUG,
161
- format(
162
- LogMessageEnum::DebugMessages::CAMPAIGN_NOT_ACTIVATED,
163
- file: FILE,
164
- campaign_key: campaign_key,
165
- user_id: user_id,
166
- api_name: api_name
167
- )
154
+ 'USER_STORAGE_SERVICE_NO_STORED_DATA',
155
+ {
156
+ '{file}' => FILE,
157
+ '{campaignKey}' => campaign_key,
158
+ '{userId}' => user_id
159
+ }
168
160
  )
169
-
170
- @logger.log(
171
- LogLevelEnum::INFO,
172
- format(
173
- LogMessageEnum::InfoMessages::CAMPAIGN_NOT_ACTIVATED,
174
- file: FILE,
175
- campaign_key: campaign_key,
176
- user_id: user_id,
177
- api_name: api_name,
178
- reason: api_name == ApiMethods::TRACK ? 'track it' : 'get the decision/value'
161
+
162
+ if ([ApiMethods::TRACK, ApiMethods::GET_VARIATION_NAME, ApiMethods::GET_FEATURE_VARIABLE_VALUE].include? api_name) && @user_storage_service
163
+ @logger.log(
164
+ LogLevelEnum::WARNING,
165
+ 'CAMPAIGN_NOT_ACTIVATED',
166
+ {
167
+ '{file}' => FILE,
168
+ '{campaignKey}' => campaign_key,
169
+ '{userId}' => user_id,
170
+ '{api}' => api_name
171
+ }
179
172
  )
180
- )
181
- return
173
+
174
+ @logger.log(
175
+ LogLevelEnum::INFO,
176
+ 'CAMPAIGN_NOT_ACTIVATED',
177
+ {
178
+ '{file}' => FILE,
179
+ '{campaignKey}' => campaign_key,
180
+ '{userId}' => user_id,
181
+ '{reason}' => api_name == ApiMethods::TRACK ? 'track it' : 'get the decision/value'
182
+ }
183
+ )
184
+ return
185
+ end
182
186
  end
183
187
  end
184
188
 
189
+
190
+
185
191
  # Pre-segmentation
186
192
  is_presegmentation = check_presegmentation(campaign, user_id, custom_variables, api_name)
187
193
  is_presegmentation_and_traffic_passed = is_presegmentation && @bucketer.user_part_of_campaign?(user_id, campaign)
@@ -191,61 +197,57 @@ class VWO
191
197
 
192
198
  if is_presegmentation_and_traffic_passed && is_campaign_part_of_group
193
199
  group_campaigns = get_group_campaigns(@settings_file, group_id)
194
-
195
200
  if group_campaigns
196
201
  is_any_campaign_whitelisted_or_stored = check_whitelisting_or_storage_for_grouped_campaigns(user_id, campaign, group_campaigns, group_name, variation_targeting_variables, true)
197
-
198
202
  if is_any_campaign_whitelisted_or_stored
199
203
  @logger.log(
200
204
  LogLevelEnum::INFO,
201
- format(
202
- LogMessageEnum::InfoMessages::CALLED_CAMPAIGN_NOT_WINNER,
203
- file: FILE,
204
- campaign_key: campaign_key,
205
- user_id: user_id,
206
- group_name: group_name
207
- )
205
+ 'MEG_CALLED_CAMPAIGN_NOT_WINNER',
206
+ {
207
+ '{file}' => FILE,
208
+ '{campaignKey}' => campaign_key,
209
+ '{userId}' => user_id,
210
+ '{groupName}' => group_name,
211
+ }
208
212
  )
209
213
  return nil
210
214
  end
211
-
212
215
  eligible_campaigns = get_eligible_campaigns(user_id, group_campaigns, campaign, custom_variables)
213
216
  non_eligible_campaigns_key = get_non_eligible_campaigns_key(eligible_campaigns, group_campaigns)
214
-
215
217
  @logger.log(
216
218
  LogLevelEnum::DEBUG,
217
- format(
218
- LogMessageEnum::DebugMessages::GOT_ELIGIBLE_CAMPAIGNS,
219
- file: FILE,
220
- user_id: user_id,
221
- eligible_campaigns_key: get_eligible_campaigns_key(eligible_campaigns).join(","),
222
- ineligible_campaigns_log_text: non_eligible_campaigns_key ? ("campaigns:" + non_eligible_campaigns_key.join("'")) : "no campaigns",
223
- group_name: group_name
224
- )
219
+ 'MEG_ELIGIBLE_CAMPAIGNS',
220
+ {
221
+ '{file}' => FILE,
222
+ '{userId}' => user_id,
223
+ '{eligibleCampaignKeys}' => get_eligible_campaigns_key(eligible_campaigns).join(","),
224
+ '{inEligibleText}' => non_eligible_campaigns_key ? ("campaigns:" + non_eligible_campaigns_key.join("'")) : "no campaigns",
225
+ '{groupName}' => group_name
226
+ }
225
227
  )
226
228
 
227
229
  @logger.log(
228
230
  LogLevelEnum::INFO,
229
- format(
230
- LogMessageEnum::InfoMessages::GOT_ELIGIBLE_CAMPAIGNS,
231
- file: FILE,
232
- user_id: user_id,
233
- no_of_eligible_campaigns: eligible_campaigns.length,
234
- no_of_group_campaigns: group_campaigns.length,
235
- group_name: group_name
236
- )
231
+ 'MEG_ELIGIBLE_CAMPAIGNS',
232
+ {
233
+ '{file}' => FILE,
234
+ '{userId}' => user_id,
235
+ '{noOfEligibleCampaigns}' => eligible_campaigns.length,
236
+ '{noOfGroupCampaigns}' => group_campaigns.length,
237
+ '{groupName}' => group_name
238
+ }
237
239
  )
238
240
 
239
241
  winner_campaign = get_winner_campaign(user_id, eligible_campaigns, group_id)
240
242
  @logger.log(
241
243
  LogLevelEnum::INFO,
242
- format(
243
- LogMessageEnum::InfoMessages::GOT_WINNER_CAMPAIGN,
244
- file: FILE,
245
- user_id: user_id,
246
- campaign_key: winner_campaign["key"],
247
- group_name: group_name
248
- )
244
+ 'MEG_GOT_WINNER_CAMPAIGN',
245
+ {
246
+ '{file}' => FILE,
247
+ '{userId}' => user_id,
248
+ '{campaignKey}' => winner_campaign["key"],
249
+ '{groupName}' => group_name,
250
+ }
249
251
  )
250
252
 
251
253
  if winner_campaign && winner_campaign["id"] == campaign["id"]
@@ -258,31 +260,61 @@ class VWO
258
260
  else
259
261
  @logger.log(
260
262
  LogLevelEnum::INFO,
261
- format(
262
- LogMessageEnum::InfoMessages::CALLED_CAMPAIGN_NOT_WINNER,
263
- file: FILE,
264
- campaign_key: campaign_key,
265
- user_id: user_id,
266
- group_name: group_name
267
- )
263
+ 'MEG_CALLED_CAMPAIGN_NOT_WINNER',
264
+ {
265
+ '{file}' => FILE,
266
+ '{campaignKey}' => campaign_key,
267
+ '{userId}' => user_id,
268
+ '{groupName}' => group_name,
269
+ }
268
270
  )
269
271
  return nil
270
272
  end
271
273
  end
272
274
  end
273
275
 
274
- if variation.nil?
275
- variation = get_variation_allotted(user_id, campaign)
276
-
277
- if variation && variation['name']
278
- save_user_storage(user_id, campaign_key, campaign['type'], variation['name'], goal_identifier) if variation['name']
279
- else
280
- @logger.log(
281
- LogLevelEnum::INFO,
282
- format(LogMessageEnum::InfoMessages::NO_VARIATION_ALLOCATED, file: FILE, campaign_key: campaign_key, user_id: user_id)
283
- )
276
+ if variation
277
+ if campaign['type'] == CampaignTypes::VISUAL_AB || campaign['type'] == CampaignTypes::FEATURE_TEST
278
+ decision[:variation_name] = variation['name']
279
+ decision[:variation_id] = variation['id']
280
+ if campaign['type'] == CampaignTypes::FEATURE_TEST
281
+ decision[:is_feature_enabled] = variation['isFeatureEnabled']
282
+ end
284
283
  end
284
+ @hooks_manager.execute(decision)
285
+ return variation
286
+ end
287
+
288
+ return get_variationIfPreSegmentation_applied(is_presegmentation, campaign, user_id, goal_identifier, decision)
289
+ end
285
290
 
291
+ # Get variation by murmur logic if pre segmentation pass
292
+ #
293
+ # @param[Boolean] :is_presegmentation The unique key assigned to User
294
+ # @param[Hash] :campaign Campaign hash for Unique campaign key
295
+ # @param[String] :user_id the unique ID assigned to User
296
+ # @param[String] :goal_identifier goal Identifier used in track API
297
+ # @param[Hash] :decision data containing campaign info passed to hooks manager
298
+ #
299
+ # @return[Hash]
300
+ def get_variationIfPreSegmentation_applied(is_presegmentation, campaign, user_id, goal_identifier, decision)
301
+ unless is_presegmentation
302
+ return nil
303
+ end
304
+ campaign_key = campaign['key']
305
+ variation = get_variation_allotted(user_id, campaign)
306
+ if variation && variation['name']
307
+ save_user_storage(user_id, campaign_key, campaign['type'], variation['name'], goal_identifier) if variation['name']
308
+ else
309
+ @logger.log(
310
+ LogLevelEnum::INFO,
311
+ 'DECISION_NO_VARIATION_ALLOTED',
312
+ {
313
+ '{file}' => FILE,
314
+ '{campaignKey}' => campaign_key,
315
+ '{userId}' => user_id
316
+ }
317
+ )
286
318
  end
287
319
 
288
320
  if variation
@@ -309,37 +341,29 @@ class VWO
309
341
  unless valid_value?(user_id)
310
342
  @logger.log(
311
343
  LogLevelEnum::ERROR,
312
- format(LogMessageEnum::ErrorMessages::INVALID_USER_ID, file: FILE, user_id: user_id, method: 'get_variation_alloted')
344
+ 'USER_ID_INVALID',
345
+ {
346
+ '{file}' => FILE,
347
+ '{userId}' => user_id
348
+ },
349
+ disable_logs
313
350
  )
314
351
  return
315
352
  end
316
353
 
317
- if @bucketer.user_part_of_campaign?(user_id, campaign)
318
- variation = get_variation_of_campaign_for_user(user_id, campaign)
319
- @logger.log(
320
- LogLevelEnum::DEBUG,
321
- format(
322
- LogMessageEnum::DebugMessages::GOT_VARIATION_FOR_USER,
323
- file: FILE,
324
- variation_name: variation['name'],
325
- user_id: user_id,
326
- campaign_key: campaign['key'],
327
- method: 'get_variation_allotted'
328
- ),
329
- disable_logs
330
- )
354
+ if @bucketer.user_part_of_campaign?(user_id, campaign, true)
355
+ variation = get_variation_of_campaign_for_user(user_id, campaign, disable_logs)
331
356
  variation
332
357
  else
333
358
  # not part of campaign
334
359
  @logger.log(
335
- LogLevelEnum::DEBUG,
336
- format(
337
- LogMessageEnum::DebugMessages::USER_NOT_PART_OF_CAMPAIGN,
338
- file: FILE,
339
- user_id: user_id,
340
- campaign_key: nil,
341
- method: 'get_variation_allotted'
342
- ),
360
+ LogLevelEnum::INFO,
361
+ 'USER_NOT_PART_OF_CAMPAIGN',
362
+ {
363
+ '{file}' => FILE,
364
+ '{campaignKey}' => nil,
365
+ '{userId}' => user_id
366
+ },
343
367
  disable_logs
344
368
  )
345
369
  nil
@@ -352,44 +376,36 @@ class VWO
352
376
  # @param[Hash] :campaign The Campaign of which user is to be made a part of
353
377
  # @return[Hash] Variation allotted to User
354
378
 
355
- def get_variation_of_campaign_for_user(user_id, campaign)
356
- unless campaign
357
- @logger.log(
358
- LogLevelEnum::ERROR,
359
- format(
360
- LogMessageEnum::ErrorMessages::INVALID_CAMPAIGN,
361
- file: FILE,
362
- method: 'get_variation_of_campaign_for_user'
363
- )
364
- )
365
- return nil
366
- end
367
-
368
- variation = @bucketer.bucket_user_to_variation(user_id, campaign)
379
+ def get_variation_of_campaign_for_user(user_id, campaign, disable_logs = false)
380
+ variation = @bucketer.bucket_user_to_variation(user_id, campaign, disable_logs)
369
381
 
370
382
  if variation && variation['name']
371
383
  @logger.log(
372
384
  LogLevelEnum::INFO,
373
- format(
374
- LogMessageEnum::InfoMessages::GOT_VARIATION_FOR_USER,
375
- file: FILE,
376
- variation_name: variation['name'],
377
- user_id: user_id,
378
- campaign_key: campaign['key']
379
- )
385
+ 'USER_VARIATION_ALLOCATION_STATUS',
386
+ {
387
+ '{file}' => FILE,
388
+ '{status}' => variation ? 'got variation:' + variation['name'] : 'did not get any variation',
389
+ '{userId}' => user_id,
390
+ '{campaignKey}' => campaign['key']
391
+ },
392
+ disable_logs
380
393
  )
381
394
  return variation
382
395
  end
383
396
 
384
- @logger.log(
385
- LogLevelEnum::INFO,
386
- format(
387
- LogMessageEnum::InfoMessages::USER_GOT_NO_VARIATION,
388
- file: FILE,
389
- user_id: user_id,
390
- campaign_key: campaign['key']
397
+ if campaign
398
+ @logger.log(
399
+ LogLevelEnum::INFO,
400
+ 'DECISION_NO_VARIATION_ALLOTED',
401
+ {
402
+ '{file}' => FILE,
403
+ '{userId}' => user_id,
404
+ '{campaignKey}' => campaign['key']
405
+ },
406
+ disable_logs
391
407
  )
392
- )
408
+ end
393
409
  nil
394
410
  end
395
411
 
@@ -406,7 +422,8 @@ class VWO
406
422
  unless @user_storage_service
407
423
  @logger.log(
408
424
  LogLevelEnum::DEBUG,
409
- format(LogMessageEnum::DebugMessages::NO_USER_STORAGE_SERVICE_SAVE, file: FILE),
425
+ 'USER_STORAGE_SERVICE_NOT_CONFIGURED',
426
+ {'{file}' => FILE},
410
427
  disable_logs
411
428
  )
412
429
  return false
@@ -423,27 +440,24 @@ class VWO
423
440
 
424
441
  @logger.log(
425
442
  LogLevelEnum::INFO,
426
- format(LogMessageEnum::InfoMessages::SAVING_DATA_USER_STORAGE_SERVICE, file: FILE, user_id: user_id),
427
- disable_logs
428
- )
429
-
430
- @logger.log(
431
- LogLevelEnum::INFO,
432
- format(
433
- LogMessageEnum::InfoMessages::VARIATION_ALLOCATED,
434
- file: FILE,
435
- campaign_key: campaign_key,
436
- user_id: user_id,
437
- variation_name: variation_name,
438
- campaign_type: campaign_type
439
- ),
443
+ 'SETTING_DATA_USER_STORAGE_SERVICE',
444
+ {
445
+ '{file}' => FILE,
446
+ '{userId}' => user_id,
447
+ '{campaignKey}' => campaign_key
448
+ },
440
449
  disable_logs
441
450
  )
442
451
  true
443
- rescue StandardError
452
+ rescue StandardError => e
444
453
  @logger.log(
445
454
  LogLevelEnum::ERROR,
446
- format(LogMessageEnum::ErrorMessages::SAVE_USER_STORAGE_SERVICE_FAILED, file: FILE, user_id: user_id),
455
+ 'USER_STORAGE_SERVICE_SET_FAILED',
456
+ {
457
+ '{file}' => FILE,
458
+ '{userId}' => user_id,
459
+ '{error}' => e.message
460
+ },
447
461
  disable_logs
448
462
  )
449
463
  false
@@ -464,7 +478,7 @@ class VWO
464
478
 
465
479
  def evaluate_whitelisting(user_id, campaign, api_name, campaign_key, variation_targeting_variables = {}, disable_logs = false)
466
480
  if campaign.key?('isUserListEnabled') && campaign["isUserListEnabled"]
467
- vwo_user_id = generator_for(user_id, @settings_file['accountId'])
481
+ vwo_user_id = generator_for(user_id, @settings_file['accountId'], true)
468
482
  if variation_targeting_variables.nil?
469
483
  variation_targeting_variables = { _vwo_user_id: vwo_user_id }
470
484
  else
@@ -490,36 +504,33 @@ class VWO
490
504
  status = StatusEnum::FAILED
491
505
  end
492
506
  @logger.log(
493
- LogLevelEnum::DEBUG,
494
- format(
495
- LogMessageEnum::DebugMessages::SEGMENTATION_STATUS,
496
- file: FILE,
497
- campaign_key: campaign_key,
498
- user_id: user_id,
499
- status: status,
500
- custom_variables: variation_targeting_variables,
501
- variation_name: status == StatusEnum::PASSED ? (campaign['type'] == CampaignTypes::FEATURE_ROLLOUT ? 'and hence becomes part of the rollout' : "for " + variation['name']) : '',
502
- segmentation_type: SegmentationTypeEnum::WHITELISTING,
503
- api_name: api_name
504
- ),
507
+ LogLevelEnum::INFO,
508
+ 'SEGMENTATION_STATUS',
509
+ {
510
+ '{file}' => FILE,
511
+ '{campaignKey}' => campaign_key,
512
+ '{userId}' => user_id,
513
+ '{customVariables}' => variation_targeting_variables,
514
+ '{status}' => status,
515
+ '{segmentationType}' => SegmentationTypeEnum::WHITELISTING,
516
+ '{variation}' => status == StatusEnum::PASSED ? (campaign['type'] == CampaignTypes::FEATURE_ROLLOUT ? 'and hence becomes part of the rollout' : variation['name'] + ' and hence becomes part of the rollout') : '',
517
+ },
505
518
  disable_logs
506
519
  )
507
520
  else
508
521
  @logger.log(
509
522
  LogLevelEnum::DEBUG,
510
- format(
511
- LogMessageEnum::InfoMessages::SKIPPING_SEGMENTATION,
512
- file: FILE,
513
- campaign_key: campaign_key,
514
- user_id: user_id,
515
- api_name: api_name,
516
- variation: variation['name']
517
- ),
523
+ 'SEGMENTATION_SKIPPED',
524
+ {
525
+ '{file}' => FILE,
526
+ '{campaignKey}' => campaign_key,
527
+ '{userId}' => user_id,
528
+ '{variation}' => campaign['type'] == CampaignTypes::FEATURE_ROLLOUT ? '' : 'for variation:' + variation['name']
529
+ },
518
530
  disable_logs
519
531
  )
520
532
  end
521
533
  end
522
-
523
534
  if targeted_variations.length > 1
524
535
  targeted_variations_deep_clone = Marshal.load(Marshal.dump(targeted_variations))
525
536
  scale_variation_weights(targeted_variations_deep_clone)
@@ -541,7 +552,8 @@ class VWO
541
552
  targeted_variations_deep_clone,
542
553
  @bucketer.get_bucket_value_for_user(
543
554
  user_id,
544
- campaign
555
+ campaign,
556
+ disable_logs
545
557
  )
546
558
  )
547
559
  else
@@ -587,28 +599,36 @@ class VWO
587
599
  unless @user_storage_service
588
600
  @logger.log(
589
601
  LogLevelEnum::DEBUG,
590
- format(LogMessageEnum::DebugMessages::NO_USER_STORAGE_SERVICE_LOOKUP, file: FILE),
602
+ 'USER_STORAGE_SERVICE_NOT_CONFIGURED',
603
+ {'{file}' => FILE},
591
604
  disable_logs
592
605
  )
593
606
  return false
594
607
  end
595
608
 
596
609
  data = @user_storage_service.get(user_id, campaign_key)
597
- @logger.log(
598
- LogLevelEnum::INFO,
599
- format(
600
- LogMessageEnum::InfoMessages::LOOKING_UP_USER_STORAGE_SERVICE,
601
- file: FILE,
602
- user_id: user_id,
603
- status: data.nil? ? 'Not Found' : 'Found'
604
- ),
605
- disable_logs
606
- )
610
+ if data
611
+ @logger.log(
612
+ LogLevelEnum::INFO,
613
+ 'GETTING_DATA_USER_STORAGE_SERVICE',
614
+ {
615
+ '{file}' => FILE,
616
+ '{userId}' => user_id,
617
+ '{campaignKey}' => campaign_key
618
+ },
619
+ disable_logs
620
+ )
621
+ end
607
622
  data
608
- rescue StandardError
623
+ rescue StandardError => e
609
624
  @logger.log(
610
625
  LogLevelEnum::ERROR,
611
- format(LogMessageEnum::ErrorMessages::LOOK_UP_USER_STORAGE_SERVICE_FAILED, file: FILE, user_id: user_id),
626
+ 'USER_STORAGE_SERVICE_GET_FAILED',
627
+ {
628
+ '{file}' => FILE,
629
+ '{userId}' => user_id,
630
+ '{error}' => e.message
631
+ },
612
632
  disable_logs
613
633
  )
614
634
  false
@@ -627,17 +647,6 @@ class VWO
627
647
  return unless user_campaign_map['campaign_key'] == campaign_key
628
648
 
629
649
  variation_name = user_campaign_map['variation_name']
630
- @logger.log(
631
- LogLevelEnum::DEBUG,
632
- format(
633
- LogMessageEnum::DebugMessages::GETTING_STORED_VARIATION,
634
- file: FILE,
635
- campaign_key: campaign_key,
636
- user_id: user_id,
637
- variation_name: variation_name
638
- ),
639
- disable_logs
640
- )
641
650
 
642
651
  get_campaign_variation(
643
652
  @settings_file,
@@ -662,59 +671,53 @@ class VWO
662
671
 
663
672
  if is_valid_segments
664
673
  unless custom_variables
665
- @logger.log(
666
- LogLevelEnum::INFO,
667
- format(
668
- LogMessageEnum::InfoMessages::NO_CUSTOM_VARIABLES,
669
- file: FILE,
670
- campaign_key: campaign_key,
671
- user_id: user_id,
672
- api_name: api_name
673
- ),
674
- disable_logs
675
- )
676
674
  custom_variables = {}
677
675
  end
678
- unless @segment_evaluator.evaluate(campaign_key, user_id, segments, custom_variables, disable_logs)
679
- @logger.log(
680
- LogLevelEnum::INFO,
681
- format(
682
- LogMessageEnum::InfoMessages::USER_FAILED_SEGMENTATION,
683
- file: FileNameEnum::SegmentEvaluator,
684
- user_id: user_id,
685
- campaign_key: campaign_key,
686
- custom_variables: custom_variables
687
- ),
688
- disable_logs
689
- )
690
- return false
691
- end
676
+ response = @segment_evaluator.evaluate(campaign_key, user_id, segments, custom_variables, disable_logs)
692
677
  @logger.log(
693
678
  LogLevelEnum::INFO,
694
- format(
695
- LogMessageEnum::InfoMessages::USER_PASSED_SEGMENTATION,
696
- file: FileNameEnum::SegmentEvaluator,
697
- user_id: user_id,
698
- campaign_key: campaign_key,
699
- custom_variables: custom_variables
700
- ),
679
+ 'SEGMENTATION_STATUS',
680
+ {
681
+ '{file}' => FILE,
682
+ '{userId}' => user_id,
683
+ '{status}' => response ? 'passed' : 'failed',
684
+ '{campaignKey}' => campaign_key,
685
+ '{customVariables}' => custom_variables,
686
+ '{segmentationType}' => 'pre-segmentation',
687
+ '{variation}' => ''
688
+ },
701
689
  disable_logs
702
690
  )
691
+ return response
703
692
  else
704
693
  @logger.log(
705
- LogLevelEnum::INFO,
706
- format(
707
- LogMessageEnum::InfoMessages::SKIPPING_SEGMENTATION,
708
- file: FILE,
709
- campaign_key: campaign_key,
710
- user_id: user_id,
711
- api_name: api_name,
712
- variation: ''
713
- ),
694
+ LogLevelEnum::DEBUG,
695
+ 'SEGMENTATION_SKIPPED',
696
+ {
697
+ '{file}' => FILE,
698
+ '{userId}' => user_id,
699
+ '{campaignKey}' => campaign_key,
700
+ '{variation}' => ''
701
+ },
714
702
  disable_logs
715
703
  )
716
704
  end
717
705
  true
706
+ rescue StandardError => e
707
+ @logger.log(
708
+ LogLevelEnum::ERROR,
709
+ 'SEGMENTATION_ERROR',
710
+ {
711
+ '{file}' => FILE,
712
+ '{userId}' => user_id,
713
+ '{campaignKey}' => campaign_key,
714
+ '{variation}' => '',
715
+ '{customVariables}' => custom_variables,
716
+ '{err}' => e.message
717
+ },
718
+ disable_logs
719
+ )
720
+ false
718
721
  end
719
722
 
720
723
  # Finds and returns eligible campaigns from group_campaigns.
@@ -729,7 +732,7 @@ class VWO
729
732
  eligible_campaigns = []
730
733
 
731
734
  group_campaigns.each do |campaign|
732
- if called_campaign["id"] == campaign["id"] || check_presegmentation(campaign, user_id, custom_variables, '', true) && @bucketer.user_part_of_campaign?(user_id, campaign)
735
+ if called_campaign["id"] == campaign["id"] || check_presegmentation(campaign, user_id, custom_variables, '', true) && @bucketer.user_part_of_campaign?(user_id, campaign, true)
733
736
  eligible_campaigns.push(campaign)
734
737
  end
735
738
  end
@@ -806,14 +809,14 @@ class VWO
806
809
  if targeted_variation
807
810
  @logger.log(
808
811
  LogLevelEnum::INFO,
809
- format(
810
- LogMessageEnum::InfoMessages::OTHER_CAMPAIGN_SATISFIES_WHITELISTING_OR_STORAGE,
811
- file: FILE,
812
- campaign_key: campaign["key"],
813
- user_id: user_id,
814
- group_name: group_name,
815
- type: "whitelisting"
816
- ),
812
+ 'OTHER_CAMPAIGN_SATISFIES_WHITELISTING_STORAGE',
813
+ {
814
+ '{file}' => FILE,
815
+ '{campaignKey}' => campaign["key"],
816
+ '{userId}' => user_id,
817
+ '{groupName}' => group_name,
818
+ '{type}' => "whitelisting"
819
+ },
817
820
  disable_logs
818
821
  )
819
822
  return true
@@ -827,14 +830,14 @@ class VWO
827
830
  if user_storage_data
828
831
  @logger.log(
829
832
  LogLevelEnum::INFO,
830
- format(
831
- LogMessageEnum::InfoMessages::OTHER_CAMPAIGN_SATISFIES_WHITELISTING_OR_STORAGE,
832
- file: FILE,
833
- campaign_key: campaign["key"],
834
- user_id: user_id,
835
- group_name: group_name,
836
- type: "user storage"
837
- ),
833
+ 'OTHER_CAMPAIGN_SATISFIES_WHITELISTING_STORAGE',
834
+ {
835
+ '{file}' => FILE,
836
+ '{campaignKey}' => campaign["key"],
837
+ '{userId}' => user_id,
838
+ '{groupName}' => group_name,
839
+ '{type}' => "user storag"
840
+ },
838
841
  disable_logs
839
842
  )
840
843
  return true
@@ -872,17 +875,16 @@ class VWO
872
875
 
873
876
  @logger.log(
874
877
  LogLevelEnum::INFO,
875
- format(
876
- LogMessageEnum::InfoMessages::SEGMENTATION_STATUS,
877
- file: FILE,
878
- campaign_key: campaign_key,
879
- user_id: user_id,
880
- status: status,
881
- custom_variables: variation_targeting_variables ? variation_targeting_variables : {},
882
- variation_name: (status == StatusEnum::PASSED && campaign['type'] != CampaignTypes::FEATURE_ROLLOUT) ? "and #{variation['name']} is Assigned" : ' ',
883
- segmentation_type: SegmentationTypeEnum::WHITELISTING,
884
- api_name: api_name
885
- ),
878
+ 'SEGMENTATION_STATUS',
879
+ {
880
+ '{file}' => FILE,
881
+ '{campaignKey}' => campaign_key,
882
+ '{userId}' => user_id,
883
+ '{customVariables}' => variation_targeting_variables ? variation_targeting_variables : {},
884
+ '{status}' => status,
885
+ '{segmentationType}' => SegmentationTypeEnum::WHITELISTING,
886
+ '{variation}' => (status == StatusEnum::PASSED && campaign['type'] != CampaignTypes::FEATURE_ROLLOUT) ? "for variation:#{variation['name']}" : ' '
887
+ },
886
888
  disable_logs
887
889
  )
888
890
 
@@ -901,14 +903,15 @@ class VWO
901
903
  return variation if variation && variation['name']
902
904
  else
903
905
  @logger.log(
904
- LogLevelEnum::INFO,
905
- format(
906
- LogMessageEnum::InfoMessages::WHITELISTING_SKIPPED,
907
- file: FILE,
908
- campaign_key: campaign_key,
909
- user_id: user_id,
910
- api_name: api_name
911
- ),
906
+ LogLevelEnum::DEBUG,
907
+ 'WHITELISTING_SKIPPED',
908
+ {
909
+ '{file}' => FILE,
910
+ '{campaignKey}' => campaign_key,
911
+ '{userId}' => user_id,
912
+ '{reason}' => '',
913
+ '{variation}' => ''
914
+ },
912
915
  disable_logs
913
916
  )
914
917
  end