public async Task <bool> SaveKeyValuesAsync(
            IEnumerable <IKeyValueEntity> keyValues,
            string userEmail,
            string userIp,
            bool isProduction)
        {
            var uniqueDict = new Dictionary <string, IKeyValueEntity>();

            foreach (var keyValue in keyValues)
            {
                uniqueDict[keyValue.RowKey] = keyValue;
            }

            var tasks = new List <Task>(3)
            {
                _keyValueHistoryRepository.SaveKeyValuesHistoryAsync(
                    uniqueDict.Values,
                    userEmail,
                    userIp),
            };
            var resultTasks      = new List <Task <bool> >(2);
            var regularKeyValues = new List <IKeyValueEntity>();
            var secretKeyValues  = new List <IKeyValueEntity>();

            foreach (var item in uniqueDict.Values)
            {
                if (isProduction && !string.IsNullOrEmpty(_appSettings.SecretsConnString))
                {
                    if (item.Types == null || item.Types != null && !item.Types.Contains("Secret"))
                    {
                        regularKeyValues.Add(item);
                    }
                    else if (item.Types != null && item.Types.Contains("Secret"))
                    {
                        secretKeyValues.Add(item);
                    }
                }
                else
                {
                    regularKeyValues.Add(item);
                }
            }
            if (regularKeyValues.Count > 0)
            {
                var regularKeysTask = _keyValuesRepository.ReplaceKeyValueAsync(regularKeyValues);
                tasks.Add(regularKeysTask);
                resultTasks.Add(regularKeysTask);
            }
            if (secretKeyValues.Count > 0)
            {
                var secretKeysTask = _secretKeyValuesRepository.ReplaceKeyValueAsync(secretKeyValues);
                tasks.Add(secretKeysTask);
                resultTasks.Add(secretKeysTask);
            }
            await Task.WhenAll(tasks).ConfigureAwait(false);

            return(resultTasks.All(t => t.Result));
        }
Beispiel #2
0
        public async Task <bool> DeleteKeyValue(string id)
        {
            try
            {
                var keyValues = await _keyValuesRepository.GetKeyValuesAsync();

                var keyValue = keyValues.FirstOrDefault(x => x.RowKey == id);
                if (keyValue == null || string.IsNullOrWhiteSpace(keyValue.Value))
                {
                    return(false);
                }

                List <IKeyValueEntity> keysToUpdate = new List <IKeyValueEntity>();
                // check for duplications. if duplicatedKeys == 1, then change isDuplicated property to false
                var duplicatedKeys = keyValues.Where(x => x.RowKey != keyValue.RowKey && x.Value == keyValue.Value).ToList();
                if (duplicatedKeys.Count == 1)
                {
                    var duplicatedKey = duplicatedKeys.First();
                    duplicatedKey.IsDuplicated = false;
                    keysToUpdate.Add(duplicatedKey);
                }

                keyValue.Value = null;
                // this key has no values, so it is not duplicated anymore
                keyValue.IsDuplicated = false;

                keysToUpdate.Add(keyValue);

                await _keyValuesRepository.ReplaceKeyValueAsync(keysToUpdate.ToArray());

                string strObj = JsonConvert.SerializeObject(keyValues);
                await _keyValueHistoryRepository.SaveKeyValueHistoryAsync(
                    keyValue?.RowKey,
                    keyValue?.Value,
                    strObj,
                    UserInfo.UserEmail,
                    UserInfo.Ip);

                return(true);
            }
            catch (Exception ex)
            {
                _log.Error(ex, context: id);
                return(false);
            }
        }