Update `RemoteDevelopment::Settings` to handle `vscode_extensions_marketplace_settings`

MR: Add extensions gallery support to Remote Dev se... (!149344 - merged)

Description

Based on Create User-Level Extension Marketplace settings (#451875 - closed) and blocked by Create `extensions_marketplace_opt_in_status` f... (#455158 - closed).

Let's update RemoteDevelopment::Settings to support a new setting:

{
  vscode_extensions_marketplace_settings: {
    enabled: Boolean,
    disabled_reason: Symbol # ExtensionsMarketplaceDisabledReason - only present if `enabled` is false
  }
}

ExtensionsMarketDisabledReason enum will have have the following values:

  • :no_user
  • :no_flag
  • :instance_disabled
  • :opt_in_unset
  • :opt_in_disabled
  • :enabled

And relevant RemoteDevelopment::Settings functions should receive something like:

get_all_settings({ user:, extensions_marketplace_feature_flag_enabled })

Here's a rough draft of what the core logic is:

      def self.generate_settings(user:, extensions_marketplace_feature_flag_enabled:)
        return { enabled: false, disabled_reason: :no_user } unless user
        return { enabled: false, disabled_reason: :no_flag } if extensions_marketplace_feature_flag_enabled.nil?
        return { enabled: false, disabled_reason: :instance_disabled } unless extensions_marketplace_feature_flag_enabled

        opt_in_status = user.extensions_marketplace_opt_in_status.to_sym

        return { enabled: true } if opt_in_status == :enabled
        return { enabled: false, disabled_reason: :opt_in_unset } if opt_in_status == :unset
        return { enabled: false, disabled_reason: :opt_in_disabled } if opt_in_status == :disabled

        raise "Invalid user.extensions_marketplace_opt_in_status: '#{opt_in_status}'"
      end

Acceptance Criteria

  • get_all_settings and relevant RemoteDevelopment::Settings modules have been updated to encapsulate logic and support returning proper vscode_extensions_marketplace_settings for the specified user and flag

Example rails console invocation and output

Invocation:

RemoteDevelopment::Settings.get_single_setting(:vscode_extensions_gallery_metadata, {user: User.find_by_username("root"), vscode_extensions_marketplace_feature_flag_enabled: false})

Output:

{:enabled=>false, :disabled_reason=>:instance_disabled}

NOTE: You can easily update the opt-in property of the current user (if you are logged in as root) with http://gdk.test:3000/-/graphql-explorer:

mutation userPreferencesUpdate {
  userPreferencesUpdate(
    input: {
      extensionsMarketplaceOptInStatus: DISABLED
    }
  )
  {
    userPreferences {
      extensionsMarketplaceOptInStatus
    }
    errors
  }
}
Edited by Paul Slaughter