Class: PinFlags::FeatureTag

Inherits:
ApplicationRecord show all
Includes:
Cacheable
Defined in:
app/models/pin_flags/feature_tag.rb

Defined Under Namespace

Modules: Cacheable

Class Method Summary collapse

Class Method Details

.disable(tag_name) ⇒ Object



33
34
35
36
37
38
# File 'app/models/pin_flags/feature_tag.rb', line 33

def self.disable(tag_name)
  normalized_name = normalize_tag_name(tag_name)
  result = find_or_create_by(name: normalized_name).update!(enabled: false)
  clear_tag_cache(normalized_name)
  result
end

.enable(tag_name) ⇒ Object



26
27
28
29
30
31
# File 'app/models/pin_flags/feature_tag.rb', line 26

def self.enable(tag_name)
  normalized_name = normalize_tag_name(tag_name)
  result = find_or_create_by(name: normalized_name).update!(enabled: true)
  clear_tag_cache(normalized_name)
  result
end

.enabled_for_subscriber?(tag_name, feature_taggable) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
43
44
45
# File 'app/models/pin_flags/feature_tag.rb', line 40

def self.enabled_for_subscriber?(tag_name, feature_taggable)
  normalized_name = normalize_tag_name(tag_name)
  return false unless enabled?(normalized_name)

  feature_taggable.feature_tag_enabled?(normalized_name)
end

.export_as_jsonObject



61
62
63
# File 'app/models/pin_flags/feature_tag.rb', line 61

def self.export_as_json
  all.as_json(only: [ :name, :enabled ]).to_json
end

.feature_taggable_modelsObject



47
48
49
50
51
52
53
54
55
# File 'app/models/pin_flags/feature_tag.rb', line 47

def self.feature_taggable_models
  Rails.application.eager_load! unless Rails.application.config.eager_load

  # Find all classes that include FeatureTaggable
  ObjectSpace.each_object(Class).select do |klass|
    klass < ActiveRecord::Base &&
    klass.included_modules.include?(PinFlags::FeatureTaggable)
  end.uniq
end

.feature_taggable_options_for_selectObject



57
58
59
# File 'app/models/pin_flags/feature_tag.rb', line 57

def self.feature_taggable_options_for_select
  feature_taggable_models.map { [ it.name, it.name ] }.sort
end

.import_from_json(json, batch_size: 1000) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'app/models/pin_flags/feature_tag.rb', line 65

def self.import_from_json(json, batch_size: 1000)
  data = JSON.parse(json)

  data.each_slice(batch_size) do |batch|
    normalized_batch = batch.map do |item|
      {
        name: normalize_tag_name(item["name"]),
        enabled: item["enabled"],
        created_at: Time.current,
        updated_at: Time.current
      }
    end

    # Use upsert_all for efficient bulk operations
    upsert_all(
      normalized_batch,
      unique_by: :name,
      update_only: [ :enabled, :updated_at ]
    )
  end

  clear_all_cache
  true
rescue JSON::ParserError
  raise PinFlags::FeatureTagImportError, "Invalid JSON format"
rescue StandardError => e
  raise PinFlags::FeatureTagImportError, "Import failed: #{e.message}"
end

.normalize_tag_name(tag_name) ⇒ Object



94
95
96
# File 'app/models/pin_flags/feature_tag.rb', line 94

def self.normalize_tag_name(tag_name)
  tag_name.to_s.strip.downcase.parameterize.underscore
end