From beb34797465252028935600b54ae52c085e44216 Mon Sep 17 00:00:00 2001 From: Matt Bishop Date: Fri, 26 May 2023 13:52:50 -0400 Subject: [PATCH] Allow feature flag state configuration via application settings (#2963) * Allow feature flag state configuration via application settings * Use string values for flags * Update src/Core/Services/Implementations/LaunchDarklyFeatureService.cs Remove useless `ToString()`. Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> --------- Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> --- .../LaunchDarklyFeatureService.cs | 28 +++++++++++++++++-- src/Core/Settings/GlobalSettings.cs | 1 + src/Core/Settings/ILaunchDarklySettings.cs | 1 + 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Core/Services/Implementations/LaunchDarklyFeatureService.cs b/src/Core/Services/Implementations/LaunchDarklyFeatureService.cs index b3ac5bc628..adf2a6e96a 100644 --- a/src/Core/Services/Implementations/LaunchDarklyFeatureService.cs +++ b/src/Core/Services/Implementations/LaunchDarklyFeatureService.cs @@ -25,15 +25,37 @@ public class LaunchDarklyFeatureService : IFeatureService, IDisposable .FilePaths(globalSettings.LaunchDarkly?.FlagDataFilePath) .AutoUpdate(true) ); + } + // support configuration directly from settings + else if (globalSettings.LaunchDarkly?.FlagValues?.Any() is true) + { + var source = TestData.DataSource(); + foreach (var kvp in globalSettings.LaunchDarkly.FlagValues) + { + if (bool.TryParse(kvp.Value, out bool boolValue)) + { + source.Update(source.Flag(kvp.Key).ValueForAll(LaunchDarkly.Sdk.LdValue.Of(boolValue))); + } + else if (int.TryParse(kvp.Value, out int intValue)) + { + source.Update(source.Flag(kvp.Key).ValueForAll(LaunchDarkly.Sdk.LdValue.Of(intValue))); + } + else + { + source.Update(source.Flag(kvp.Key).ValueForAll(LaunchDarkly.Sdk.LdValue.Of(kvp.Value))); + } + } - // do not provide analytics events - ldConfig.Events(Components.NoEvents); + ldConfig.DataSource(source); } else { - // when a file-based fallback isn't available, work offline + // when fallbacks aren't available, work offline ldConfig.Offline(true); } + + // do not provide analytics events + ldConfig.Events(Components.NoEvents); } else if (globalSettings.SelfHosted) { diff --git a/src/Core/Settings/GlobalSettings.cs b/src/Core/Settings/GlobalSettings.cs index a2768458a5..758ee9e582 100644 --- a/src/Core/Settings/GlobalSettings.cs +++ b/src/Core/Settings/GlobalSettings.cs @@ -545,5 +545,6 @@ public class GlobalSettings : IGlobalSettings { public string SdkKey { get; set; } public string FlagDataFilePath { get; set; } = "flags.json"; + public Dictionary FlagValues { get; set; } = new Dictionary(); } } diff --git a/src/Core/Settings/ILaunchDarklySettings.cs b/src/Core/Settings/ILaunchDarklySettings.cs index e395a69652..05cd6dbc41 100644 --- a/src/Core/Settings/ILaunchDarklySettings.cs +++ b/src/Core/Settings/ILaunchDarklySettings.cs @@ -4,4 +4,5 @@ public interface ILaunchDarklySettings { public string SdkKey { get; set; } public string FlagDataFilePath { get; set; } + public Dictionary FlagValues { get; set; } }