コード例 #1
0
        private async Task <FeatureBitTableDefinition> GetExistingFeatureBit(IFeatureBitDefinition definition)
        {
            var tableDefinition = definition.ToTableDefinition(_table.Name);
            var tableResult     = await _table.ExecuteAsync(TableOperation.Retrieve <FeatureBitTableDefinition>(tableDefinition.PartitionKey, tableDefinition.RowKey));

            return((FeatureBitTableDefinition)tableResult.Result);
        }
コード例 #2
0
        private static bool EvaluateEnvironmentBasedFeatureState(IFeatureBitDefinition bitDef)
        {
            bool featureState;
            var  env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT").ToUpperInvariant();

            featureState = !bitDef.ExcludedEnvironments.ToUpperInvariant().Contains(env);
            return(featureState);
        }
コード例 #3
0
        private static bool EvaluateEnvironmentBasedFeatureState(IFeatureBitDefinition bitDef)
        {
            bool featureState;
            var  env            = SystemContext.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")?.ToUpperInvariant();
            var  environmentAry = bitDef.ExcludedEnvironments.ToUpperInvariant().Split(',');

            featureState = !environmentAry.Contains(env);
            return(featureState);
        }
コード例 #4
0
        public async Task RemoveAsync(IFeatureBitDefinition definition)
        {
            var existing = await GetExistingFeatureBit(definition);

            if (existing != null)
            {
                await _table.ExecuteAsync(TableOperation.Delete(existing));
            }
        }
コード例 #5
0
 /// <summary>
 /// <see cref="IFeatureBitDefinition.Update"/>
 /// </summary>
 public void Update(IFeatureBitDefinition newEntity)
 {
     AllowedUsers                  = newEntity.AllowedUsers;
     LastModifiedByUser            = newEntity.LastModifiedByUser;
     ExcludedEnvironments          = newEntity.ExcludedEnvironments;
     LastModifiedDateTime          = newEntity.LastModifiedDateTime;
     MinimumAllowedPermissionLevel = newEntity.MinimumAllowedPermissionLevel;
     OnOff = newEntity.OnOff;
 }
コード例 #6
0
        public async Task RemoveAsync(IFeatureBitDefinition definitionToRemove)
        {
            var toRemove = await GetByNameAsync(definitionToRemove.Name);

            if (toRemove != null)
            {
                DbContext.Remove(toRemove);
                await DbContext.SaveChangesAsync();
            }
        }
コード例 #7
0
 /// <summary>
 /// Indacicates if a given feature is enabled or not.
 /// </summary>
 /// <param name="feature">Feature </param>
 /// <returns>Returns the boolean value of the feature status.</returns>
 public bool IsEnabled(IFeatureBitDefinition feature)
 {
     if (feature != null)
     {
         return(EvaluateBitValue(feature));
     }
     else
     {
         throw new ArgumentNullException(nameof(feature));
     }
 }
コード例 #8
0
        public async Task ItCanGetASpecificIFeatureBitDefinitionByName()
        {
            // Arrange
            AddThreeDefinitions();

            // Act
            IFeatureBitDefinition result = (await _it.GetByNameAsync("item2"));

            // Assert
            result.MinimumAllowedPermissionLevel.Should().Be(10);
        }
コード例 #9
0
        public async Task UpdateAsync(IFeatureBitDefinition definition)
        {
            var existing = await GetExistingFeatureBit(definition);

            if (existing == null)
            {
                throw new DataException($"Could not update.  Feature bit with name '{definition.Name}' does not exist");
            }
            existing.Update(definition);
            var replaceOp = TableOperation.Replace(existing);
            await _table.ExecuteAsync(replaceOp);
        }
コード例 #10
0
        public async Task <IFeatureBitDefinition> AddAsync(IFeatureBitDefinition definition)
        {
            if (await GetExistingFeatureBit(definition) != null)
            {
                throw new DataException($"Cannot add. Feature bit with name '{definition.Name}' already exists.");
            }
            definition.Id = await GetNextId();

            var insertOp = TableOperation.Insert(definition.ToTableDefinition(_table.Name));
            var result   = await _table.ExecuteAsync(insertOp);

            return((IFeatureBitDefinition)result.Result);
        }
コード例 #11
0
        public async Task <IFeatureBitDefinition> AddAsync(IFeatureBitDefinition definition)
        {
            FeatureBitEfDefinition newEntity = definition.ToEfDefinition();

            ValidateDefinition(newEntity);

            await MakeSureAFeatureBitWithThatNameDoesNotExist(newEntity);

            var entity = await DbContext.FeatureBitDefinitions.AddAsync(newEntity);

            await DbContext.SaveChangesAsync();

            return(entity.Entity);
        }
コード例 #12
0
        private static bool EvaluateBitValue(IFeatureBitDefinition bitDef)
        {
            bool result;

            if (bitDef.ExcludedEnvironments?.Length > 0)
            {
                result = EvaluateEnvironmentBasedFeatureState(bitDef);
            }
            else
            {
                result = bitDef.IsOnOff;
            }

            return(result);
        }
コード例 #13
0
 public static FeatureBitEfDefinition ToEfDefinition(this IFeatureBitDefinition definition)
 {
     return(new FeatureBitEfDefinition
     {
         Name = definition.Name,
         ExcludedEnvironments = definition.ExcludedEnvironments,
         ExactAllowedPermissionLevel = definition.ExactAllowedPermissionLevel,
         AllowedUsers = definition.AllowedUsers,
         CreatedByUser = definition.CreatedByUser,
         CreatedDateTime = definition.CreatedDateTime,
         OnOff = definition.OnOff,
         Id = definition.Id,
         LastModifiedByUser = definition.LastModifiedByUser,
         LastModifiedDateTime = definition.LastModifiedDateTime,
         MinimumAllowedPermissionLevel = definition.MinimumAllowedPermissionLevel
     });
 }
コード例 #14
0
        private static bool EvaluateEnvironmentBasedFeatureState(IFeatureBitDefinition bitDef)
        {
            bool featureState;
            var  env = SystemContext.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")?.ToUpperInvariant();
            var  excludedEnvironmentAry = GetEnvironmentList(bitDef.ExcludedEnvironments);
            var  includedEnvironmentAry = GetEnvironmentList(bitDef.IncludedEnvironments);

            if (includedEnvironmentAry.Any())
            {
                featureState = includedEnvironmentAry.Contains(env);
            }
            else
            {
                featureState = !excludedEnvironmentAry.Contains(env);
            }

            return(featureState);
        }
コード例 #15
0
        public async Task ItCanAddIFeatureBitDefinitions()
        {
            // Arrange
            var item1 = new FeatureBitEfDefinition {
                Name = "item1", CreatedByUser = "******", LastModifiedByUser = "******"
            };

            // Act
            IFeatureBitDefinition result = await _it.AddAsync(item1);

            // Assert
            result.Name.Should().Be("item1");
            result.Id.Should().NotBe(0);
            using (var context = new FeatureBitsEfDbContext(_options))
            {
                context.FeatureBitDefinitions.Should().Contain(f => f.Name == "item1");
            }
        }
コード例 #16
0
        private object[] GetDataRow(IFeatureBitDefinition featureBitDefinition)
        {
            var cells = new List <object>
            {
                featureBitDefinition.Id,
                featureBitDefinition.Name
            };

            if (_options.Long)
            {
                cells.Add(featureBitDefinition.OnOff);
                cells.Add(featureBitDefinition.ExcludedEnvironments);
                cells.Add(featureBitDefinition.MinimumAllowedPermissionLevel);
                cells.Add(featureBitDefinition.ExactAllowedPermissionLevel ?? -1);
                cells.Add(featureBitDefinition.AllowedUsers);
            }

            return(cells.ToArray());
        }
コード例 #17
0
 public async Task UpdateAsync(IFeatureBitDefinition definition)
 {
     try
     {
         DbContext.Update(definition);
         await DbContext.SaveChangesAsync();
     } catch (DbUpdateConcurrencyException ex)
     {
         if (ex.Entries.Count == 1 && ex.Entries[0].IsKeySet == false)
         {
             DbContext.Add(definition);
             await DbContext.SaveChangesAsync();
         }
         else
         {
             throw ex;
         }
     }
 }
コード例 #18
0
        /// <summary>
        /// Determine if a feature should be enabled or disabled
        /// </summary>
        /// <param name="feature">Feature to be checked</param>
        /// <param name="currentPermissionLevel">The permission level of the current user</param>
        /// <typeparam name="T">An enumeration or an integer</typeparam>
        /// <returns>True if the feature is enabled.</returns>
        public bool IsEnabled <T>(T feature, int currentPermissionLevel) where T : struct, IConvertible
        {
            Type tType = typeof(T);

            if (!(tType.IsEnum || tType == typeof(int)))
            {
                throw new ArgumentException("T must be an enumerated type");
            }

            IFeatureBitDefinition bitDef = Definitions.FirstOrDefault(x => x.Id == feature.ToInt32(new FeatureBitFormatProvider()));

            if (bitDef != null)
            {
                return(EvaluateBitValue(bitDef, currentPermissionLevel));
            }

            string featureString = tType.IsEnum ? Enum.GetName(tType, feature) : feature.ToString(CultureInfo.InvariantCulture);

            throw new KeyNotFoundException($"Unable to find Feature {featureString}");
        }
コード例 #19
0
 public static FeatureBitTableDefinition ToTableDefinition(this IFeatureBitDefinition definition, string tableName)
 {
     return(new FeatureBitTableDefinition
     {
         Name = definition.Name,
         PartitionKey = tableName,
         RowKey = definition.Name,
         ExcludedEnvironments = definition.ExcludedEnvironments,
         ExactAllowedPermissionLevel = definition.ExactAllowedPermissionLevel,
         AllowedUsers = definition.AllowedUsers,
         IncludedEnvironments = definition.IncludedEnvironments,
         CreatedByUser = definition.CreatedByUser,
         CreatedDateTime = definition.CreatedDateTime,
         OnOff = definition.OnOff,
         Id = definition.Id,
         LastModifiedByUser = definition.LastModifiedByUser,
         LastModifiedDateTime = definition.LastModifiedDateTime,
         MinimumAllowedPermissionLevel = definition.MinimumAllowedPermissionLevel
     });
 }
コード例 #20
0
        private static bool EvaluateBitValue(IFeatureBitDefinition bitDef, int currentUsersPermissionLevel)
        {
            bool result;

            if (bitDef.ExcludedEnvironments?.Length > 0 || bitDef.IncludedEnvironments?.Length > 0)
            {
                result = EvaluateEnvironmentBasedFeatureState(bitDef);
            }
            else if (currentUsersPermissionLevel > 0 && bitDef.ExactAllowedPermissionLevel > 0)
            {
                result = bitDef.ExactAllowedPermissionLevel == currentUsersPermissionLevel;
            }
            else if (bitDef.MinimumAllowedPermissionLevel > 0)
            {
                result = CheckMinimumPermission(bitDef, currentUsersPermissionLevel);
            }
            else
            {
                result = bitDef.OnOff;
            }

            return(result);
        }
コード例 #21
0
        public async Task <int> RunAsync()
        {
            int returnValue = 0;

            try
            {
                IFeatureBitDefinition newBit = BuildBit();
                await _repo.AddAsync(newBit);

                SystemContext.ConsoleWriteLine("Feature bit added.");
            }
            catch (DataException e)
            {
                returnValue = await HandleFeatureBitAlreadyExists(e);
            }
            catch (Exception e)
            {
                returnValue = 1;
                SystemContext.ConsoleErrorWriteLine(e.ToString());
            }

            return(returnValue);
        }
コード例 #22
0
 public async Task UpdateAsync(IFeatureBitDefinition definition)
 {
     DbContext.Update(definition);
     await DbContext.SaveChangesAsync();
 }
コード例 #23
0
 private static FeatureBitEvaluator SetupFeatureBitEvaluator(IFeatureBitDefinition bitDefinition)
 {
     return(SetupFeatureBitEvaluator(new List <IFeatureBitDefinition> {
         bitDefinition
     }));
 }
コード例 #24
0
 private static bool CheckMinimumPermission(IFeatureBitDefinition bitDef, int currentUsersPermissionLevel) =>
 currentUsersPermissionLevel >= bitDef.MinimumAllowedPermissionLevel;