Skip to content

Commit 50da002

Browse files
authored
Merge pull request #2 from mikanyg/development
Support for IDateTimeToggleValueProvider in all 3 Azure providers
2 parents 123110b + 4674b55 commit 50da002

File tree

12 files changed

+147
-46
lines changed

12 files changed

+147
-46
lines changed

src/FeatureToggle.Azure.DocumentDB/FeatureToggle.Azure.DocumentDB.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
<Copyright>Copyright © 2018</Copyright>
1010
<RepositoryType>Git</RepositoryType>
1111
<RepositoryUrl>https://github.com/mikanyg/FeatureToggle.Azure.git</RepositoryUrl>
12-
<PackageReleaseNotes>1.0.0
12+
<PackageReleaseNotes>1.1.0
13+
- Provider implements IDateTimeToggleValueProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledOnOrAfterDateFeatureToggle or FeatureToggle.EnabledOnOrBeforeDateFeatureToggle.
14+
1.0.0
1315
- Initial release</PackageReleaseNotes>
1416
<PackageTags>FeatureToggle Toggle Azure DocumentDB DocDB CosmosDB NetStandard</PackageTags>
1517
<Description>FeatureToggle provider for storing feature toggles in Azure DocumentDB.</Description>
18+
<Version>1.1.0</Version>
1619
</PropertyGroup>
1720

1821
<ItemGroup>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace FeatureToggle.Azure.Providers
2+
{
3+
public class BooleanFeatureToggleDocument : FeatureToggleDocument
4+
{
5+
public BooleanFeatureToggleDocument() : base() { }
6+
7+
public BooleanFeatureToggleDocument(string toggleName) : base(toggleName)
8+
{
9+
Enabled = false;
10+
}
11+
12+
public bool Enabled { get; set; }
13+
}
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
3+
namespace FeatureToggle.Azure.Providers
4+
{
5+
public class DateTimeFeatureToggleDocument : FeatureToggleDocument
6+
{
7+
public DateTimeFeatureToggleDocument() : base() { }
8+
9+
public DateTimeFeatureToggleDocument(string toggleName) : base(toggleName)
10+
{
11+
ToggleTimestamp = default(DateTime);
12+
}
13+
14+
public DateTime ToggleTimestamp { get; set; }
15+
}
16+
}

src/FeatureToggle.Azure.DocumentDB/Providers/DocumentDbProvider.cs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace FeatureToggle.Azure.Providers
99
{
10-
public class DocumentDbProvider : IBooleanToggleValueProvider
10+
public class DocumentDbProvider : IBooleanToggleValueProvider, IDateTimeToggleValueProvider
1111
{
1212
private static bool _collectionVerified;
1313

@@ -34,43 +34,56 @@ public static void Configure(DocumentDbConfiguration config)
3434
}
3535

3636
public bool EvaluateBooleanToggleValue(IFeatureToggle toggle)
37+
{
38+
return EvaluateToggleValue(toggle, document => document.Enabled, toggleName => new BooleanFeatureToggleDocument(toggleName));
39+
}
40+
41+
public DateTime EvaluateDateTimeToggleValue(IFeatureToggle toggle)
42+
{
43+
return EvaluateToggleValue(toggle, document => document.ToggleTimestamp, toggleName => new DateTimeFeatureToggleDocument(toggleName));
44+
}
45+
46+
private TValue EvaluateToggleValue<TDocument, TValue>(IFeatureToggle toggle, Func<TDocument, TValue> valueSelector, Func<string, TDocument> documentCreator) where TDocument : FeatureToggleDocument
3747
{
3848
var client = GetDocumentClient();
3949

4050
var toggleName = toggle.GetType().Name;
4151

42-
bool toggleValue;
52+
TValue toggleValue;
4353

4454
try
4555
{
4656
// Fetch feature toggle
47-
var reponse = client.ReadDocumentAsync<FeatureToggleDocument>(
57+
var response = client.ReadDocumentAsync<TDocument>(
4858
UriFactory.CreateDocumentUri(Configuration.DatabaseId, Configuration.CollectionId, toggleName)).Result;
4959

50-
toggleValue = reponse.Document.Enabled;
60+
var document = response.Document;
61+
62+
toggleValue = valueSelector(document);
5163
}
5264
catch (AggregateException ae) when (ae.InnerExceptions.First() is DocumentClientException ex && ex.StatusCode == HttpStatusCode.NotFound)
5365
{
5466
Trace.TraceWarning($"Feature toggle '{toggleName}' not found.");
5567

56-
toggleValue = HandleMissingToggle(toggleName, client);
68+
var newDocument = HandleMissingToggle(toggleName, () => documentCreator(toggleName), client);
69+
toggleValue = valueSelector(newDocument);
5770
}
58-
71+
5972
return toggleValue;
6073
}
6174

62-
private bool HandleMissingToggle(string toggleName, DocumentClient client)
75+
private TDocument HandleMissingToggle<TDocument>(string toggleName, Func<TDocument> documentCreator, DocumentClient client) where TDocument : FeatureToggleDocument
6376
{
6477
if (!Configuration.AutoCreateFeature)
6578
throw new ToggleConfigurationError($"Feature toggle '{toggleName}' does not exist. Either create it manually or configure the provider to auto create it.");
6679

6780
Trace.TraceInformation($"AutoCreateFeature enabled, creating feature toggle '{toggleName}'.");
6881

69-
var document = new FeatureToggleDocument(toggleName);
82+
var document = documentCreator();
7083
var response = client.CreateDocumentAsync(
7184
UriFactory.CreateDocumentCollectionUri(Configuration.DatabaseId, Configuration.CollectionId), document, disableAutomaticIdGeneration:true).Result;
7285

73-
return document.Enabled;
86+
return document;
7487
}
7588

7689
private DocumentClient GetDocumentClient()
@@ -105,6 +118,6 @@ private DocumentClient GetDocumentClient()
105118
_collectionVerified = true;
106119

107120
return client;
108-
}
121+
}
109122
}
110123
}

src/FeatureToggle.Azure.DocumentDB/Providers/FeatureToggleDocument.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@
33

44
namespace FeatureToggle.Azure.Providers
55
{
6-
public class FeatureToggleDocument
6+
public abstract class FeatureToggleDocument
77
{
8-
public FeatureToggleDocument() { }
8+
protected FeatureToggleDocument() { }
99

10-
public FeatureToggleDocument(string toggleName)
10+
protected FeatureToggleDocument(string toggleName)
1111
{
12-
Id = toggleName ?? throw new ArgumentNullException(nameof(toggleName));
13-
Enabled = false;
12+
Id = toggleName ?? throw new ArgumentNullException(nameof(toggleName));
1413
}
1514

1615
[JsonProperty(PropertyName = "id")]
17-
public string Id { get; set; }
18-
public bool Enabled { get; set; }
16+
public string Id { get; set; }
1917
}
2018
}

src/FeatureToggle.Azure.ServiceFabric/FeatureToggle.Azure.ServiceFabric.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
<Copyright>Copyright © 2018</Copyright>
1010
<RepositoryType>Git</RepositoryType>
1111
<RepositoryUrl>https://github.com/mikanyg/FeatureToggle.Azure.git</RepositoryUrl>
12-
<PackageReleaseNotes>1.0.0
12+
<PackageReleaseNotes>1.1.0
13+
- Provider implements IDateTimeToggleValueProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledOnOrAfterDateFeatureToggle or FeatureToggle.EnabledOnOrBeforeDateFeatureToggle.
14+
1.0.0
1315
- Initial release</PackageReleaseNotes>
1416
<PackageTags>FeatureToggle Toggle Azure ServiceFabric Fabric NetStandard</PackageTags>
1517
<Description>FeatureToggle provider for storing feature toggles in Service Fabric configuration packages.</Description>
18+
<Version>1.1.0</Version>
1619
</PropertyGroup>
1720

1821
<ItemGroup>

src/FeatureToggle.Azure.ServiceFabric/Providers/ServiceFabricConfigProvider.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace FeatureToggle.Azure.Providers
66
{
7-
public class ServiceFabricConfigProvider : IBooleanToggleValueProvider
7+
public class ServiceFabricConfigProvider : IBooleanToggleValueProvider, IDateTimeToggleValueProvider
88
{
99
private const string KeyNotFoundInSettingsMessage = "The key '{0}' was not found in settings.xml";
1010

@@ -41,6 +41,19 @@ public bool EvaluateBooleanToggleValue(IFeatureToggle toggle)
4141
return ParseBooleanConfigString(configValue, key);
4242
}
4343

44+
public DateTime EvaluateDateTimeToggleValue(IFeatureToggle toggle)
45+
{
46+
var key = ExpectedAppSettingsKeyFor(toggle);
47+
48+
ValidateKeyExists(key);
49+
50+
var configValue = GetConfigValue(key);
51+
52+
var parser = new ConfigurationDateParser();
53+
54+
return parser.ParseDateTimeConfigString(configValue, key);
55+
}
56+
4457
private string ExpectedAppSettingsKeyFor(IFeatureToggle toggle)
4558
{
4659
var prefix = Configuration.UsePrefix ? ToggleConfigurationSettings.Prefix : string.Empty;
@@ -88,6 +101,6 @@ private string[] GetConfigKeysInSection()
88101

89102
var section = settings.Sections[Configuration.ConfigSectionName];
90103
return section.Parameters.Select(p => p.Name).ToArray();
91-
}
104+
}
92105
}
93106
}

src/FeatureToggle.Azure.TableStorage/FeatureToggle.Azure.TableStorage.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
<Copyright>Copyright © 2018</Copyright>
1010
<RepositoryType>Git</RepositoryType>
1111
<RepositoryUrl>https://github.com/mikanyg/FeatureToggle.Azure.git</RepositoryUrl>
12-
<PackageReleaseNotes>1.0.0
12+
<PackageReleaseNotes>1.1.0
13+
- Provider implements IDateTimeToggleValueProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledOnOrAfterDateFeatureToggle or FeatureToggle.EnabledOnOrBeforeDateFeatureToggle.
14+
1.0.0
1315
- Initial release</PackageReleaseNotes>
1416
<PackageTags>FeatureToggle Toggle Azure TableStorage Table Storage NetStandard</PackageTags>
1517
<Description>FeatureToggle provider for storing feature toggles in Azure Table storage.</Description>
18+
<Version>1.1.0</Version>
1619
</PropertyGroup>
1720

1821
<ItemGroup>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace FeatureToggle.Azure.Providers
2+
{
3+
public class BooleanFeatureToggleEntity : FeatureToggleEntity
4+
{
5+
public BooleanFeatureToggleEntity() : base() { }
6+
7+
public BooleanFeatureToggleEntity(string componentName, string toggleName) : base(componentName, toggleName)
8+
{
9+
Enabled = false;
10+
}
11+
12+
public bool Enabled { get; set; }
13+
}
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
3+
namespace FeatureToggle.Azure.Providers
4+
{
5+
public class DateTimeFeatureToggleEntity : FeatureToggleEntity
6+
{
7+
public DateTimeFeatureToggleEntity() : base() { }
8+
9+
public DateTimeFeatureToggleEntity(string componentName, string toggleName) : base(componentName, toggleName)
10+
{
11+
ToggleTimestamp = new DateTime(1900, 1, 1); // Table Storage does not support DateTime.Min
12+
}
13+
14+
public DateTime ToggleTimestamp { get; set; }
15+
}
16+
}

0 commit comments

Comments
 (0)