ResultadosDigitais/feature_flagger

View on GitHub
lib/feature_flagger/storage/feature_keys_migration.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module FeatureFlagger
    module Storage
      class FeatureKeysMigration

        def initialize(from_redis, to_control)
          @from_redis = from_redis
          @to_control = to_control
        end

        # call migrates features key from the old fashioned to the new
        # format.
        #
        # It must replicate feature keys with changes:
        #
        # from "avenue:traffic_lights" => 42
        # to   "avenue:42" => traffic_lights
        def call
          @from_redis.scan_each(match: "*", count: FeatureFlagger::Storage::Redis::SCAN_EACH_BATCH_SIZE) do |redis_key|
            # filter out resource_keys
            next if redis_key.start_with?("#{FeatureFlagger::Storage::Redis::RESOURCE_PREFIX}:")

            migrate_key(redis_key)
          end
        end

        private

        def migrate_key(key)
          return migrate_release_to_all(key) if feature_released_to_all?(key)

          migrate_release(key)
        end

        def migrate_release_to_all(key)
          features = @from_redis.smembers(key)

          features.each do |feature_key|
            @to_control.release_to_all(feature_key)
          end
        end

        def feature_released_to_all?(key)
          FeatureFlagger::Control::RELEASED_FEATURES == key
        end

        def migrate_release(key)
          resource_ids = @from_redis.smembers(key)

          resource_ids.each do |id|
            @to_control.release(key, id)
          end
        end
      end
    end
  end