Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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));
            }
        }