private static IDictionary <string, string> CreateLookup(IEndpointOverrides global, IEndpointOverrides local, string type,
                                                                 Func <IEndpointOverrides, IDictionary <string, string> > @from, ICollection <string> declaredKeys
                                                                 )
        {
            var d = new SortedDictionary <string, string>();

            foreach (var kv in from(global))
            {
                d[kv.Key] = kv.Value;
            }

            if (local == null)
            {
                return(d);
            }

            var localDictionary = from(local);

            foreach (var kv in localDictionary)
            {
                d[kv.Key] = kv.Value;
            }

            var name = local.GetType().Name;

            foreach (var p in localDictionary.Keys.Except(declaredKeys))
            {
                Generator.ApiGenerator.Warnings.Add($"On {name} {type} key '{p}' is not found in spec");
            }

            return(d);
        }
        public static Dictionary <string, ApiQueryParameters> Patch(
            IDictionary <string, ApiQueryParameters> source,
            IEndpointOverrides overrides)
        {
            if (source == null)
            {
                return(null);
            }

            var globalOverrides = new GlobalOverrides();
            var declaredKeys    = source.Keys;
            var skipList        = CreateSkipList(globalOverrides, overrides, declaredKeys);
            var partialList     = CreatePartialList(globalOverrides, overrides, declaredKeys);

            var renameLookup   = CreateRenameLookup(globalOverrides, overrides, declaredKeys);
            var obsoleteLookup = CreateObsoleteLookup(globalOverrides, overrides, declaredKeys);

            var patchedParams = new Dictionary <string, ApiQueryParameters>();

            foreach (var kv in source)
            {
                var queryStringKey = kv.Key;
                kv.Value.QueryStringKey = queryStringKey;

                if (!renameLookup.TryGetValue(queryStringKey, out var preferredName))
                {
                    preferredName = kv.Key;
                }
                kv.Value.ClsName = CreateCSharpName(preferredName);

                if (skipList.Contains(queryStringKey))
                {
                    continue;
                }

                if (partialList.Contains(queryStringKey))
                {
                    kv.Value.RenderPartial = true;
                }

                if (obsoleteLookup.TryGetValue(queryStringKey, out var obsolete))
                {
                    kv.Value.Obsolete = obsolete;
                }

                //make sure source_enabled takes a boolean only
                if (preferredName == "source_enabled")
                {
                    kv.Value.Type = "boolean";
                }

                patchedParams.Add(preferredName, kv.Value);
            }

            return(patchedParams);
        }
        private static IList <string> CreateList(IEndpointOverrides global, IEndpointOverrides local, string type,
                                                 Func <IEndpointOverrides, IEnumerable <string> > @from, ICollection <string> declaredKeys)
        {
            var list = new List <string>();

            if (global != null)
            {
                list.AddRange(from(global));
            }
            if (local != null)
            {
                var localList = from(local).ToList();
                list.AddRange(localList);
                var name = local.GetType().Name;
                foreach (var p in localList.Except(declaredKeys))
                {
                    ApiGenerator.Warnings.Add($"On {name} {type} key '{p}' is not found in spec");
                }
            }
            return(list.Distinct().ToList());
        }
 private static IDictionary <string, string> CreateObsoleteLookup(IEndpointOverrides global, IEndpointOverrides local,
                                                                  ICollection <string> declaredKeys
                                                                  ) =>
 CreateLookup(global, local, "obsolete", e => e.ObsoleteQueryStringParams, declaredKeys);
        public static SortedDictionary <string, QueryParameters> Patch(
            string endpointName,
            IDictionary <string, QueryParameters> source,
            IEndpointOverrides overrides,
            bool checkCommon = true
            )
        {
            if (source == null)
            {
                return(null);
            }

            var globalOverrides = new GlobalOverrides();
            var declaredKeys    = source.Keys;
            var skipList        = CreateSkipList(globalOverrides, overrides, declaredKeys);
            var partialList     = CreatePartialList(globalOverrides, overrides, declaredKeys);

            var renameLookup   = CreateRenameLookup(globalOverrides, overrides, declaredKeys);
            var obsoleteLookup = CreateObsoleteLookup(globalOverrides, overrides, declaredKeys);

            var patchedParams = new SortedDictionary <string, QueryParameters>();
            var name          = overrides?.GetType().Name ?? endpointName ?? "unknown";

            foreach (var kv in source)
            {
                var queryStringKey = kv.Key;
                kv.Value.QueryStringKey = queryStringKey;

                if (checkCommon && RestApiSpec.CommonApiQueryParameters.Keys.Contains(queryStringKey))
                {
                    Generator.ApiGenerator.Warnings.Add($"key '{queryStringKey}' in {name} is already declared in _common.json");
                    continue;
                }

                if (!renameLookup.TryGetValue(queryStringKey, out var preferredName))
                {
                    preferredName = kv.Key;
                }
                kv.Value.ClsName = CreateCSharpName(preferredName);

                if (skipList.Contains(queryStringKey))
                {
                    kv.Value.Skip = true;
                }

                if (partialList.Contains(queryStringKey))
                {
                    kv.Value.RenderPartial = true;
                }

                if (obsoleteLookup.TryGetValue(queryStringKey, out var obsolete))
                {
                    kv.Value.Obsolete = obsolete;
                }

                //make sure source_enabled takes a boolean only
                if (preferredName == "source_enabled")
                {
                    kv.Value.Type = "boolean";
                }

                patchedParams[preferredName] = kv.Value;
            }

            return(patchedParams);
        }
 private static IList <string> CreatePartialList(IEndpointOverrides global, IEndpointOverrides local, ICollection <string> declaredKeys) =>
 CreateList(global, local, "partial", e => e.RenderPartial, declaredKeys);
 private static IList <string> CreateSkipList(IEndpointOverrides global, IEndpointOverrides local, ICollection <string> declaredKeys) =>
 CreateList(global, local, "skip", e => e.SkipQueryStringParams, declaredKeys);
        private void PatchRequestParameters(IEndpointOverrides overrides)
        {
            if (this.Url.Params == null)
            {
                return;
            }
            foreach (var param in RestApiSpec.CommonApiQueryParameters)
            {
                if (!this.Url.Params.ContainsKey(param.Key))
                {
                    this.Url.Params.Add(param.Key, param.Value);
                }
            }

            if (this.ObsoleteQueryParameters != null)
            {
                foreach (var param in this.ObsoleteQueryParameters)
                {
                    if (!this.Url.Params.ContainsKey(param.Key))
                    {
                        this.Url.Params.Add(param.Key, param.Value);
                    }
                }
            }
            var declaredKeys = this.Url.Params.Select(p => p.Value.OriginalQueryStringParamName ?? p.Key).ToList();
            IEnumerable <string>         skipList = new List <string>();
            IDictionary <string, string> queryStringParamsRenameList = new Dictionary <string, string>();

            if (overrides != null)
            {
                var name = overrides.GetType().Name;
                skipList = overrides.SkipQueryStringParams ?? skipList;
                queryStringParamsRenameList = overrides.RenameQueryStringParams ?? queryStringParamsRenameList;
                foreach (var p in skipList.Except(declaredKeys))
                {
                    ApiGenerator.Warnings.Add($"On {name} skip key '{p}' is not found in spec");
                }
                foreach (var p in queryStringParamsRenameList.Keys.Except(declaredKeys))
                {
                    ApiGenerator.Warnings.Add($"On {name} rename key '{p}' is not found in spec");
                }
            }

            var globalQueryStringRenames = new Dictionary <string, string>
            {
                { "_source", "source_enabled" },
                { "_source_include", "source_include" },
                { "_source_exclude", "source_exclude" },
                { "q", "query_on_query_string" },
                { "docvalue_fields", "doc_value_fields" },
            };

            foreach (var kv in globalQueryStringRenames)
            {
                if (!queryStringParamsRenameList.ContainsKey(kv.Key))
                {
                    queryStringParamsRenameList[kv.Key] = kv.Value;
                }
            }

            var globalOverrides = new GlobalOverrides();
            var patchedParams   = new Dictionary <string, ApiQueryParameters>();

            foreach (var kv in this.Url.Params)
            {
                if (kv.Value.OriginalQueryStringParamName.IsNullOrEmpty())
                {
                    kv.Value.OriginalQueryStringParamName = kv.Key;
                }

                if (skipList.Contains(kv.Key))
                {
                    continue;
                }
                if (globalOverrides.RenderPartial.Contains(kv.Key))
                {
                    kv.Value.RenderPartial = true;
                }

                if (!queryStringParamsRenameList.TryGetValue(kv.Key, out var newName))
                {
                    patchedParams.Add(kv.Key, kv.Value);
                    continue;
                }

                if (globalOverrides.RenderPartial.Contains(newName))
                {
                    kv.Value.RenderPartial = true;
                }

                //make sure source_enabled takes a boolean only
                if (newName == "source_enabled")
                {
                    kv.Value.Type = "boolean";
                }

                patchedParams.Add(newName, kv.Value);
            }

            this.Url.Params = patchedParams;
        }
Example #9
0
        private void PatchRequestParameters(IEndpointOverrides overrides)
        {
            var newParams = ApiQueryParametersPatcher.Patch(this.Url.Params, overrides);

            this.Url.Params = newParams;
        }