Module: Gitlab::Database::MigrationHelpers::FeatureFlagMigratorHelpers

Included in:
Gitlab::Database::MigrationHelpers
Defined in:
lib/gitlab/database/migration_helpers/feature_flag_migrator_helpers.rb

Instance Method Summary collapse

Instance Method Details

#down_migrate_to_jsonb_setting(setting_name:, jsonb_column_name:) ⇒ Integer

Reverts a JSONB application setting to its default state during a migration rollback. This method removes the specified setting from the JSONB column.

Parameters:

  • setting_name (Symbol, String)

    The name of the application setting to remove from the JSONB column

  • jsonb_column_name (Symbol, String)

    The name of the application setting JSONB column to update

Returns:

  • (Integer)

    The number of affected rows for UPDATE statement



97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/gitlab/database/migration_helpers/feature_flag_migrator_helpers.rb', line 97

def down_migrate_to_jsonb_setting(setting_name:, jsonb_column_name:)
  if setting_name.blank? || jsonb_column_name.nil?
    raise ArgumentError, 'setting_name and jsonb_column_name are required'
  end

  sql = <<~SQL
    UPDATE application_settings
    SET #{jsonb_column_name} = #{jsonb_column_name} - '#{setting_name}',
    updated_at = NOW()
    WHERE id = (SELECT MAX(id) FROM application_settings)
  SQL

  execute(sql)
end

#down_migrate_to_setting(setting_name:, default_enabled:) ⇒ Integer

Reverts an application setting to its default value during a migration rollback.

Parameters:

  • setting_name (Symbol, String)

    The name of the application setting column to revert

  • default_enabled (Boolean)

    The default value to set for the application setting

Returns:

  • (Integer)

    The number of affected rows for UPDATE statement

Raises:

  • (ArgumentError)


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/gitlab/database/migration_helpers/feature_flag_migrator_helpers.rb', line 75

def down_migrate_to_setting(setting_name:, default_enabled:)
  if setting_name.blank? || default_enabled.nil?
    raise ArgumentError, 'setting_name and default_enabled are required'
  end

  raise ArgumentError, 'default_enabled must be a boolean' unless [true, false].include?(default_enabled)

  sql = <<~SQL
    UPDATE application_settings
    SET #{setting_name} = #{default_enabled}, updated_at = NOW()
    WHERE id = (SELECT MAX(id) FROM application_settings)
  SQL

  execute(sql)
end

#up_migrate_to_jsonb_setting(feature_flag_name:, setting_name:, jsonb_column_name:, default_enabled:) ⇒ Integer

Migrates a feature flag to a JSONB application setting.

Parameters:

  • feature_flag_name (Symbol, String)

    The name of the feature flag to migrate

  • setting_name (Symbol, String)

    The name of the application setting to update

  • jsonb_column_name (Symbol, String)

    The name of the application setting JSONB column to update

  • default_enabled (Boolean)

    The default value to use if the feature flag is not set

Returns:

  • (Integer)

    The number of affected rows for UPDATE statement

Raises:

  • (ArgumentError)


47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/gitlab/database/migration_helpers/feature_flag_migrator_helpers.rb', line 47

def up_migrate_to_jsonb_setting(feature_flag_name:, setting_name:, jsonb_column_name:, default_enabled:)
  if feature_flag_name.blank? || setting_name.blank? || jsonb_column_name.blank? || default_enabled.nil?
    raise ArgumentError, 'feature_flag_name, jsonb_column_name, setting_name, and default_enabled are required'
  end

  raise ArgumentError, 'default_enabled must be a boolean' unless [true, false].include?(default_enabled)

  feature_flag_state = feature_flag_state(feature_flag_name, default_enabled)

  sql = <<~SQL
    UPDATE application_settings
    SET #{jsonb_column_name} = jsonb_set(
      COALESCE(#{jsonb_column_name}, '{}'::jsonb),
      '{#{setting_name}}',
      to_jsonb(#{feature_flag_state})
    ),
    updated_at = NOW()
    WHERE id = (SELECT MAX(id) FROM application_settings)
  SQL

  execute(sql)
end

#up_migrate_to_setting(feature_flag_name:, setting_name:, default_enabled:) ⇒ Integer

Migrates a feature flag to an application setting.

Parameters:

  • feature_flag_name (Symbol, String)

    The name of the feature flag to migrate

  • setting_name (Symbol, String)

    The name of the application setting column to update

  • default_enabled (Boolean)

    The default value to use if the feature flag is not set

Returns:

  • (Integer)

    The number of affected rows for UPDATE statement

Raises:

  • (ArgumentError)


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/gitlab/database/migration_helpers/feature_flag_migrator_helpers.rb', line 22

def up_migrate_to_setting(feature_flag_name:, setting_name:, default_enabled:)
  if feature_flag_name.blank? || setting_name.blank? || default_enabled.nil?
    raise ArgumentError, 'feature_flag_name, setting_name, and default_enabled are required'
  end

  raise ArgumentError, 'default_enabled must be a boolean' unless [true, false].include?(default_enabled)

  feature_flag_state = feature_flag_state(feature_flag_name, default_enabled)

  sql = <<~SQL
    UPDATE application_settings
    SET #{setting_name} = #{feature_flag_state}, updated_at = NOW()
    WHERE id = (SELECT MAX(id) FROM application_settings)
  SQL

  execute(sql)
end