Class: GreenFlag::FeatureDecision

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/green_flag/feature_decision.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.ensure_feature_enabled(feature_code, user, manual = false) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/models/green_flag/feature_decision.rb', line 43

def self.ensure_feature_enabled(feature_code, user, manual=false)
  feature = GreenFlag::Feature.for_code!(feature_code)
  visitor = GreenFlag::SiteVisitor.for_user!(user)

  fd = GreenFlag::FeatureDecision.where(feature_id: feature.id, 
    site_visitor_id: visitor.id).first_or_initialize

  unless fd.enabled? && fd.manual == manual
    fd.enabled = true
    fd.manual = manual
    fd.save!
  end
  fd
end

.feature_enabled?(feature_code, site_visitor_id) ⇒ Boolean

Check if the feature is enabled, AND store the result as a FeatureDecision

Returns:

  • (Boolean)


27
28
29
30
31
32
# File 'app/models/green_flag/feature_decision.rb', line 27

def self.feature_enabled?(feature_code, site_visitor_id)
  feature = GreenFlag::Feature.for_code!(feature_code)
  fd      = feature.decide_if_enabled_for_visitor(site_visitor_id)

  fd.enabled
end

.feature_enabled_for_user?(feature_code, user) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
# File 'app/models/green_flag/feature_decision.rb', line 34

def self.feature_enabled_for_user?(feature_code, user)
  feature_enabled? feature_code, GreenFlag::SiteVisitor.for_user!(user).id
end

.whitelist_user!(feature_code, user) ⇒ Object

Force the given user to have the feature enabled



39
40
41
# File 'app/models/green_flag/feature_decision.rb', line 39

def self.whitelist_user!(feature_code, user)
  ensure_feature_enabled(feature_code, user, true)
end

.whitelisted_users(feature_id) ⇒ Object



58
59
60
61
62
# File 'app/models/green_flag/feature_decision.rb', line 58

def self.whitelisted_users(feature_id)
  # inefficient, but shouldn't matter.
  feature_decisions = whitelisted(feature_id).joins(:site_visitor => :user).all
  users = feature_decisions.map(&:user)
end

Instance Method Details

#safe_save!Object



68
69
70
71
72
73
74
75
76
# File 'app/models/green_flag/feature_decision.rb', line 68

def safe_save!
  begin
    save!
    true
  rescue ActiveRecord::RecordNotUnique, PG::Error => ex
    # Race condition
    self.class.where(feature_id: feature_id, site_visitor_id: site_visitor_id).first || raise
  end
end

#undecided?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'app/models/green_flag/feature_decision.rb', line 64

def undecided?
  self.enabled.nil?
end