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)); }
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); } }