/// <inheritdoc /> public async Task <IResult <IDictionary <string, string> > > GetKeys(EnvironmentKeyQueryParameters parameters) { _logger.LogDebug($"retrieving keys of environment '{parameters.Environment}'"); var result = await GetKeysInternal(parameters, item => item, item => item.Key, keys => (IDictionary <string, string>) keys.ToImmutableDictionary(item => item.Key, item => item.Value, StringComparer.OrdinalIgnoreCase)); if (result.IsError) { return(result); } _logger.LogDebug($"got {result.Data.Count} keys for '{parameters.Environment}'"); if (!string.IsNullOrWhiteSpace(parameters.RemoveRoot)) { return(RemoveRoot(result.Data, parameters.RemoveRoot)); } return(result); }
/// <inheritdoc /> public async Task <IResult <IEnumerable <DtoConfigKey> > > GetKeyObjects(EnvironmentKeyQueryParameters parameters) { _logger.LogDebug($"retrieving keys for {parameters.Environment} to return as objects"); var result = await GetKeysInternal(parameters, item => new DtoConfigKey { Key = item.Key, Value = item.Value, Description = item.Description, Type = item.Type }, item => item.Key, items => items); if (result.IsError) { return(result); } var list = result.Data.ToList(); _logger.LogDebug($"got {list.Count} keys as objects"); if (!string.IsNullOrWhiteSpace(parameters.RemoveRoot)) { return(RemoveRoot(list, parameters.RemoveRoot)); } return(result); }
/// <summary> /// retrieve keys from the database as dictionary, allows for filtering and range-limiting /// </summary> /// <param name="parameters">see <see cref="EnvironmentKeyQueryParameters" /> for more information on each parameter</param> /// <param name="selector">internal selector transforming the filtered items to an intermediate representation</param> /// <param name="keySelector">selector pointing to the 'Key' property of the intermediate representation</param> /// <param name="transform">final transformation applied to the result-set</param> /// <returns></returns> private async Task <IResult <TResult> > GetKeysInternal <TItem, TResult>(EnvironmentKeyQueryParameters parameters, Expression <Func <ConfigEnvironmentKey, TItem> > selector, Func <TItem, string> keySelector, Func <IEnumerable <TItem>, TResult> transform) where TItem : class { try { _logger.LogDebug("retrieving keys using parameters:" + $"{nameof(parameters.Environment)}: {parameters.Environment}, " + $"{nameof(parameters.Filter)}: {parameters.Filter}, " + $"{nameof(parameters.PreferExactMatch)}: {parameters.PreferExactMatch}, " + $"{nameof(parameters.Range)}: {parameters.Range}, " + $"{nameof(parameters.RemoveRoot)}: {parameters.RemoveRoot}"); // if TargetVersion is above 0, we try to find the specified version of ConfigEnvironment var envResult = await(parameters.TargetVersion <= 0 ? _domainObjectStore.ReplayObject(new ConfigEnvironment(parameters.Environment), parameters.Environment.ToString()) : _domainObjectStore.ReplayObject(new ConfigEnvironment(parameters.Environment), parameters.Environment.ToString(), parameters.TargetVersion)); if (envResult.IsError) { return(Result.Error <TResult>(envResult.Message, envResult.Code)); } var environment = envResult.Data; if (!environment.Created) { return(Result.Error <TResult>($"environment '{environment.Identifier}' does not exist", ErrorCode.NotFound)); } var query = environment.Keys .Values .AsQueryable(); if (!string.IsNullOrWhiteSpace(parameters.Filter)) { _logger.LogDebug($"adding filter '{parameters.Filter}'"); query = query.Where(k => k.Key.StartsWith(parameters.Filter)); } _logger.LogDebug("ordering, and paging data"); var keys = query.OrderBy(k => k.Key) .Skip(parameters.Range.Offset) .Take(parameters.Range.Length) .Select(selector) .ToList(); if (!string.IsNullOrWhiteSpace(parameters.PreferExactMatch)) { _logger.LogDebug($"applying preferredMatch filter: '{parameters.PreferExactMatch}'"); keys = ApplyPreferredExactFilter(keys, keySelector, parameters.PreferExactMatch).ToList(); } _logger.LogDebug("transforming result using closure"); var result = transform(keys); return(Result.Success(result)); } catch (Exception e) { _logger.LogError(e, $"failed to retrieve keys for environment ({parameters.Environment})"); return(Result.Error <TResult>($"failed to retrieve keys for environment ({parameters.Environment})", ErrorCode.DbQueryError)); } }