diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache index 7b20b10a086..1e66c83c769 100644 --- a/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache +++ b/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache @@ -26,7 +26,7 @@ namespace {{packageName}}.{{packageContext}}.Modules { {{#operation}} {{httpMethod}}["{{path}}"] = parameters => { - {{#allParams}}{{#isBodyParam}}var {{paramName}} = this.Bind<{{&dataType}}>();{{/isBodyParam}}{{^isBodyParam}}{{#isEnum}}var {{paramName}} = Parameters.ValueOf<{{>innerApiEnumName}}?>(parameters, "{{paramName}}");{{/isEnum}}{{^isEnum}}var {{paramName}} = Parameters.ValueOf<{{&dataType}}>(parameters, "{{paramName}}");{{/isEnum}}{{#hasMore}} + {{#allParams}}{{#isBodyParam}}var {{paramName}} = this.Bind<{{&dataType}}>();{{/isBodyParam}}{{^isBodyParam}}{{#isEnum}}var {{paramName}} = Parameters.ValueOf<{{>innerApiEnumName}}?>({{>innerParameterValueOfArgs}});{{/isEnum}}{{^isEnum}}var {{paramName}} = Parameters.ValueOf<{{&dataType}}>({{>innerParameterValueOfArgs}});{{/isEnum}}{{#hasMore}} {{/hasMore}}{{/isBodyParam}}{{/allParams}}{{#allParams}}{{#required}} Preconditions.IsNotNull({{paramName}}, "Required parameter: '{{paramName}}' is missing at '{{operationId}}'"); {{/required}}{{/allParams}} diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/innerParameterType.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/innerParameterType.mustache new file mode 100644 index 00000000000..c9a8cb66449 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nancyfx/innerParameterType.mustache @@ -0,0 +1 @@ +{{#isQueryParam}}ParameterType.Query{{/isQueryParam}}{{#isPathParam}}ParameterType.Path{{/isPathParam}}{{#isHeaderParam}}ParameterType.Header{{/isHeaderParam}}{{^isQueryParam}}{{^isPathParam}}{{^isHeaderParam}}ParameterType.Undefined{{/isHeaderParam}}{{/isPathParam}}{{/isQueryParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/innerParameterValueOfArgs.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/innerParameterValueOfArgs.mustache new file mode 100644 index 00000000000..2aca302eecf --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nancyfx/innerParameterValueOfArgs.mustache @@ -0,0 +1 @@ +parameters, Context.Request, "{{paramName}}", {{>innerParameterType}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/parameters.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/parameters.mustache index 5f336b76766..ad0825e6ee7 100644 --- a/modules/swagger-codegen/src/main/resources/nancyfx/parameters.mustache +++ b/modules/swagger-codegen/src/main/resources/nancyfx/parameters.mustache @@ -13,12 +13,12 @@ namespace {{packageName}}.{{packageContext}}.Utils { private static readonly IDictionary> Parsers = CreateParsers(); - internal static TValue ValueOf(dynamic parameters, string name) + internal static TValue ValueOf(dynamic parameters, Request request, string name, ParameterType parameterType) { var valueType = typeof (TValue); var valueUnderlyingType = Nullable.GetUnderlyingType(valueType); var isNullable = default(TValue) == null; - string value = RawValue(parameters, name); + string value = RawValueOf(parameters, request, name, parameterType); Preconditions.Evaluate(!string.IsNullOrEmpty(value) || isNullable, string.Format("Required parameter: '{0}' is missing", name)); if (value == null && isNullable) { @@ -28,19 +28,31 @@ namespace {{packageName}}.{{packageContext}}.Utils { return EnumValueOf(name, value); } - return ValueOf(parameters, name, value, valueType); + return ValueOf(parameters, name, value, valueType, request, parameterType); } - private static string RawValue(dynamic parameters, string name) + private static string RawValueOf(dynamic parameters, Request request, string name, ParameterType parameterType) { try { - return parameters[name]; + switch (parameterType) + { + case ParameterType.Query: + string querValue = request.Query[name]; + return querValue; + case ParameterType.Path: + string pathValue = parameters[name]; + return pathValue; + case ParameterType.Header: + var headerValue = request.Headers[name]; + return headerValue != null ? string.Join(",", headerValue) : null; + } } catch (Exception e) { throw new InvalidOperationException(string.Format("Could not obtain value of '{0}' parameter", name), e); } + throw new InvalidOperationException(string.Format("Parameter with type: {0} is not supported", parameterType)); } private static TValue EnumValueOf(string name, string value) @@ -60,14 +72,22 @@ namespace {{packageName}}.{{packageContext}}.Utils name, value, value.ToComparable())); } - private static TValue ValueOf(dynamic parameters, string name, string value, Type valueType) + private static TValue ValueOf(dynamic parameters, string name, string value, Type valueType, Request request, ParameterType parameterType) { var parser = Parsers.GetIfPresent(valueType); if (parser != null) { return ParseValueUsing(name, value, valueType, parser); } - return DynamicValueOf(parameters, name); + if (parameterType == ParameterType.Path) + { + return DynamicValueOf(parameters, name); + } + if (parameterType == ParameterType.Query) + { + return DynamicValueOf(request.Query, name); + } + throw new InvalidOperationException(string.Format("Could not get value for {0} with type {1}", name, valueType)); } private static TValue ParseValueUsing(string name, string value, Type valueType, Func parser) @@ -88,7 +108,7 @@ namespace {{packageName}}.{{packageContext}}.Utils private static TValue DynamicValueOf(dynamic parameters, string name) { - string value = RawValue(parameters, name); + string value = parameters[name]; try { TValue result = parameters[name]; @@ -102,7 +122,7 @@ namespace {{packageName}}.{{packageContext}}.Utils } catch (Exception e) { - throw new InvalidOperationException(string.Format("Could not get '{0}' value of '{1}' type dynamicly", + throw new InvalidOperationException(string.Format("Could not get '{0}' value of '{1}' type dynamicly", name, typeof(TValue)), e); } } @@ -364,4 +384,12 @@ namespace {{packageName}}.{{packageContext}}.Utils } } } + + internal enum ParameterType + { + Undefined, + Query, + Path, + Header + } } \ No newline at end of file