protected override CodeMemberMethod CreateMethodName()
        {
            //Debug.Assert(ReturnType==null || ReturnType.Name != "DayOfWeek[]");
            var returnTypeReference = Poco2TsGen.TranslateToClientTypeReference(ReturnType);

            returnTypeText = TypeMapper.MapCodeTypeReferenceToTsText(returnTypeReference);
            if (returnTypeText == "any" || returnTypeText == "void")
            {
                returnTypeText = NG2HttpStringResponse;
            }
            else if (returnTypeText == "response")
            {
                returnTypeText = NG2HttpStringResponse;
            }
            else if (returnTypeText == "blobresponse")
            {
                returnTypeText = NG2HttpBlobResponse;
            }

            var callbackTypeText = $"Observable<{returnTypeText}>";

            Debug.WriteLine("callback: " + callbackTypeText);
            var returnTypeReferenceWithObservable = new CodeSnipetTypeReference(callbackTypeText);

            return(new CodeMemberMethod()
            {
                Attributes = MemberAttributes.Public | MemberAttributes.Final,
                Name = MethodName,
                ReturnType = returnTypeReferenceWithObservable,
            });
        }
        void CreateDocComments()
        {
            StringBuilder builder  = new StringBuilder();
            var           noIndent = Fonlow.DocComment.StringFunctions.TrimIndentedMultiLineTextToArray(Description.Documentation);

            if (noIndent != null)
            {
                foreach (var item in noIndent)
                {
                    builder.AppendLine(item);
                }
            }

            builder.AppendLine(Description.HttpMethod + " " + Description.RelativePath);
            foreach (var item in Description.ParameterDescriptions)
            {
                var tsParameterType = Poco2TsGen.TranslateToClientTypeReference(item.ParameterDescriptor.ParameterType);
                if (!String.IsNullOrEmpty(item.Documentation))
                {
                    builder.AppendLine($"@param {{{TypeMapper.MapCodeTypeReferenceToTsText(tsParameterType)}}} {item.Name} {item.Documentation}");
                }
            }

            Type responseType         = Description.ResponseDescription.ResponseType ?? Description.ResponseDescription.DeclaredType;
            var  tsResponseType       = Poco2TsGen.TranslateToClientTypeReference(responseType);
            var  returnTypeOfResponse = responseType == null ? "void" : TypeMapper.MapCodeTypeReferenceToTsText(tsResponseType);

            if (!String.IsNullOrEmpty(Description.ResponseDescription.Documentation))
            {
                builder.AppendLine($"@return {{{returnTypeOfResponse}}} {Description.ResponseDescription.Documentation}");
            }

            Method.Comments.Add(new CodeCommentStatement(builder.ToString(), true));
        }
        protected override void RenderImplementation()
        {
            var httpMethod = Description.HttpMethod.ToLower();             //Method is always uppercase.
            //deal with parameters
            var parameters = Description.ParameterDescriptions.Select(d =>
                                                                      new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name)
                                                                      ).ToList();

            var returnTypeReference = Poco2TsGen.TranslateToClientTypeReference(ReturnType);

            if (returnTypeReference.BaseType == "response")            //response is for NG2 with better built-in support for typing, and get translated to HttpResponse<Blob>
            {
                returnTypeReference.BaseType = "any";
            }

            var callbackTypeText = String.Format("(data : {0}) => any", TypeMapper.MapCodeTypeReferenceToTsText(returnTypeReference));

            Debug.WriteLine("callback: " + callbackTypeText);
            var callbackTypeReference = new CodeSnipetTypeReference(callbackTypeText);

            parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback"));

            Method.Parameters.AddRange(parameters.ToArray());

            var jsUriQuery   = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions);
            var hasArrayJoin = jsUriQuery != null && jsUriQuery.Contains(".join(");
            var uriText      = jsUriQuery == null ? $"this.baseUri + '{Description.RelativePath}'" :
                               RemoveTrialEmptyString(hasArrayJoin ? $"this.baseUri + '{jsUriQuery}" : $"this.baseUri + '{jsUriQuery}'");

            if (httpMethod == "get" || httpMethod == "delete")
            {
                Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{httpMethod}({uriText}, callback, this.error, this.statusCode);"));
                return;
            }

            if (httpMethod == "post" || httpMethod == "put")
            {
                var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                            (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                               (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                if (fromBodyParameterDescriptions.Length > 1)
                {
                    throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                }
                var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{httpMethod}({uriText}, {dataToPost}, callback, this.error, this.statusCode);"));
                return;
            }

            Debug.Assert(false, "How come?");
        }
示例#4
0
        static void VerifyJson(Type type, string expected)
        {
            var gen = new Poco2TsGen();

            gen.CreateCodeDom(new Type[] { type }, CherryPickingMethods.NewtonsoftJson, ".Client");
            using (var writer = new StringWriter())
            {
                gen.WriteCode(writer);
                var s = writer.ToString();
                Assert.Equal(expected, s);
            }
        }
示例#5
0
        static void Verify(Type type, string expected)
        {
            var gen = new Poco2TsGen();

            gen.CreateCodeDom(new Type[] { type }, CherryPickingMethods.DataContract);
            using (var writer = new StringWriter())
            {
                gen.WriteCode(writer);
                var s = writer.ToString();
                Assert.Equal(expected, s);
            }
        }
        ClientApiTsFunctionGenBase apiFunctionGen; //to be injected in ctor of derived class.

        /// <summary>
        ///
        /// </summary>
        /// <param name="excludedControllerNames">Excluse some Api Controllers from being exposed to the client API. Each item should be fully qualified class name but without the assembly name.</param>
        /// <remarks>The client data types should better be generated through SvcUtil.exe with the DC option. The client namespace will then be the original namespace plus suffix ".client". </remarks>
        protected ControllersTsClientApiGenBase(JSOutput jsOutput, ClientApiTsFunctionGenBase apiFunctionGen)
        {
            if (jsOutput == null)
            {
                throw new ArgumentNullException("jsOutput");
            }

            this.jsOutput       = jsOutput;
            this.apiFunctionGen = apiFunctionGen;
            this.apiSelections  = jsOutput.ApiSelections;
            TargetUnit          = new CodeCompileUnit();
            poco2TsGen          = new Poco2TsGen(TargetUnit);

            TsCodeGenerationOptions options = TsCodeGenerationOptions.Instance;

            options.BracingStyle = "JS";
            options.IndentString = "    ";
            options.CamelCase    = jsOutput.CamelCase.HasValue ? jsOutput.CamelCase.Value : false;
        }
示例#7
0
        protected override CodeMemberMethod CreateMethodName()
        {
            var returnTypeReference = Poco2TsGen.TranslateToClientTypeReference(ReturnType);

            returnTypeText = TypeMapper.MapCodeTypeReferenceToTsText(returnTypeReference);
            if (returnTypeText == "any" || returnTypeText == "void")
            {
                returnTypeText = NG2HttpResponse;
            }
            var callbackTypeText = $"Observable<{returnTypeText}>";

            Debug.WriteLine("callback: " + callbackTypeText);
            var returnTypeReferenceWithObservable = new CodeSnipetTypeReference(callbackTypeText);

            return(new CodeMemberMethod()
            {
                Attributes = MemberAttributes.Public | MemberAttributes.Final,
                Name = NethodName,
                ReturnType = returnTypeReferenceWithObservable,
            });
        }
        protected override void RenderImplementation()
        {
            var httpMethod = Description.HttpMethod.ToLower();             //Method is always uppercase.
            //deal with parameters
            var parameters = Description.ParameterDescriptions.Select(d =>
                                                                      new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name)
                                                                      ).ToList();

            //parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback"));

            Method.Parameters.AddRange(parameters.ToArray());

            var jsUriQuery   = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions);
            var hasArrayJoin = jsUriQuery != null && jsUriQuery.Contains(".join(");
            var uriText      = jsUriQuery == null ? $"this.baseUri + '{Description.RelativePath}'" :
                               RemoveTrialEmptyString(hasArrayJoin? $"this.baseUri + '{jsUriQuery})": $"this.baseUri + '{jsUriQuery}'");

            // var mapFunction = returnTypeText == NG2HttpResponse ? String.Empty : ".map(response=> response.json())";

            if (ReturnType != null && TypeHelper.IsStringType(ReturnType) && this.StringAsString)          //stringAsString is for .NET Core Web API
            {
                if (httpMethod == "get" || httpMethod == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, {{ responseType: 'text' }});"));
                    return;
                }

                if (httpMethod == "post" || httpMethod == "put")
                {
                    var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                                (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                                   (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                    if (fromBodyParameterDescriptions.Length > 1)
                    {
                        throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                    }
                    var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                    var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                    if (String.IsNullOrEmpty(contentType))
                    {
                        contentType = "application/json;charset=UTF-8";
                    }

                    if (dataToPost == "null")
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, null, {{headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }});"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }});"));
                    }

                    return;
                }
            }
            else if (returnTypeText == NG2HttpBlobResponse)            //translated from blobresponse to this
            {
                const string optionForStream = "{ observe: 'response', responseType: 'blob' }";

                if (httpMethod == "get" || httpMethod == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, {optionForStream});"));
                    return;
                }

                if (httpMethod == "post" || httpMethod == "put")
                {
                    var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                                (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                                   (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                    if (fromBodyParameterDescriptions.Length > 1)
                    {
                        throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                    }
                    var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                    var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                    if (dataToPost == "null")
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, null, {optionForStream});"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {optionForStream});"));
                    }

                    return;
                }
            }
            else if (returnTypeText == NG2HttpStringResponse)            //translated from response to this
            {
                const string optionForActionResult = "{ observe: 'response', responseType: 'text' }";

                if (httpMethod == "get" || httpMethod == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, {optionForActionResult});"));
                    return;
                }

                if (httpMethod == "post" || httpMethod == "put")
                {
                    var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                                (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                                   (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                    if (fromBodyParameterDescriptions.Length > 1)
                    {
                        throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                    }
                    var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                    var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                    if (dataToPost == "null")
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, null, {optionForActionResult});"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }}, observe: 'response', responseType: 'text' }});"));
                    }

                    return;
                }
            }
            else
            {
                if (httpMethod == "get" || httpMethod == "delete")
                {
                    if (hasArrayJoin)
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText};"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText});"));
                    }
                    return;
                }

                if (httpMethod == "post" || httpMethod == "put")
                {
                    var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                                (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                                   (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                    if (fromBodyParameterDescriptions.Length > 1)
                    {
                        throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                    }
                    var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                    var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                    if (String.IsNullOrEmpty(contentType))
                    {
                        contentType = "application/json;charset=UTF-8";
                    }

                    if (dataToPost == "null")
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText}, null, {{ headers: {{ 'Content-Type': '{contentType}' }} }});"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }} }});"));
                    }

                    return;
                }
            }

            Debug.Assert(false, "How come?");
        }
示例#9
0
        protected override void RenderImplementation()
        {
            var httpMethodName = HttpMethod.ToString().ToLower();             //Method is always uppercase.
            //deal with parameters
            var parameters = ParameterDescriptions.Select(d =>
                                                          new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name))
                             .ToArray();

            //parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback"));

            Method.Parameters.AddRange(parameters);

            if (RequestBodyCodeTypeReference != null)
            {
                var p = new CodeParameterDeclarationExpression(RequestBodyCodeTypeReference, "requestBody");
                Method.Parameters.Add(p);
            }

            var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(RelativePath, ParameterDescriptions);
            var uriText    = jsUriQuery == null ? $"this.baseUri + '{RelativePath}'" :
                             RemoveTrialEmptyString($"this.baseUri + '{jsUriQuery}'");

            // var mapFunction = returnTypeText == NG2HttpResponse ? String.Empty : ".map(response=> response.json())";

            if (ReturnTypeReference != null && ReturnTypeReference.BaseType == "System.String" && ReturnTypeReference.ArrayElementType == null)            //stringAsString is for .NET Core Web API
            {
                if (httpMethodName == "get" || httpMethodName == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, {{ responseType: 'text' }});"));
                    return;
                }

                if (httpMethodName == "post" || httpMethodName == "put")
                {
                    if (String.IsNullOrEmpty(contentType))
                    {
                        contentType = "application/json;charset=UTF-8";
                    }

                    if (RequestBodyCodeTypeReference == null)
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, null, {{headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }});"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, JSON.stringify(requestBody), {{ headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }});"));
                    }

                    return;
                }
            }
            else if (returnTypeText == NG2HttpBlobResponse)            //translated from blobresponse to this
            {
                const string optionForStream = "{ observe: 'response', responseType: 'blob' }";

                if (httpMethodName == "get" || httpMethodName == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, {optionForStream});"));
                    return;
                }

                if (httpMethodName == "post" || httpMethodName == "put")
                {
                    if (RequestBodyCodeTypeReference == null)
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, null, {optionForStream});"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, JSON.stringify(requestBody), {optionForStream});"));
                    }

                    return;
                }
            }
            else if (returnTypeText == NG2HttpStringResponse)            //translated from response to this
            {
                const string optionForActionResult = "{ observe: 'response', responseType: 'text' }";

                if (httpMethodName == "get" || httpMethodName == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, {optionForActionResult});"));
                    return;
                }

                if (httpMethodName == "post" || httpMethodName == "put")
                {
                    if (RequestBodyCodeTypeReference == null)
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, null, {optionForActionResult});"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, JSON.stringify(requestBody), {{ headers: {{ 'Content-Type': '{contentType}' }}, observe: 'response', responseType: 'text' }});"));
                    }

                    return;
                }
            }
            else
            {
                var typeCast = returnTypeText == null ? "<Response>" : $"<{returnTypeText}>";
                if (httpMethodName == "get" || httpMethodName == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}{typeCast}({uriText});"));
                    return;
                }

                if (httpMethodName == "post" || httpMethodName == "put")
                {
                    if (String.IsNullOrEmpty(contentType))
                    {
                        contentType = "application/json;charset=UTF-8";
                    }

                    if (RequestBodyCodeTypeReference == null)
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}{typeCast}({uriText}, null, {{ headers: {{ 'Content-Type': '{contentType}' }} }});"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}{typeCast}({uriText}, JSON.stringify(requestBody), {{ headers: {{ 'Content-Type': '{contentType}' }} }});"));
                    }

                    return;
                }
            }

            Debug.Assert(false, "How come?");
        }
        protected override void RenderImplementation()
        {
            var httpMethod = Description.HttpMethod.ToLower();             //Method is always uppercase.
            //deal with parameters
            var parameters = Description.ParameterDescriptions.Select(d =>
                                                                      new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name)
                                                                      ).ToList();

            Method.Parameters.AddRange(parameters.ToArray());

            var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions);
            var uriText    = jsUriQuery == null ? $"'{Description.RelativePath}'" :
                             RemoveTrialEmptyString($"'{jsUriQuery}'");

            if (ReturnType != null && TypeHelper.IsStringType(ReturnType) && this.StringAsString)            //stringAsString is for .NET Core Web API
            {
                if (httpMethod == "get" || httpMethod == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}).then(d => d.text());"));
                    return;
                }

                if (httpMethod == "post" || httpMethod == "put")
                {
                    var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                                (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                                   (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                    if (fromBodyParameterDescriptions.Length > 1)
                    {
                        throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                    }
                    var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                    var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                    if (String.IsNullOrEmpty(contentType))
                    {
                        contentType = "application/json;charset=UTF-8";
                    }

                    if (dataToPost == "null")
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, null, {{headers: {{ 'Content-Type': '{contentType}' }} }}).then(d => d.text());"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }} }}).then(d => d.text());"));
                    }

                    return;
                }
            }
            else if (returnTypeText == AureliatHttpBlobResponse)            //translated from blobresponse to this
            {
                if (httpMethod == "get" || httpMethod == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}).then(d => d.blob());"));
                    return;
                }

                if (httpMethod == "post" || httpMethod == "put")
                {
                    var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                                (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                                   (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                    if (fromBodyParameterDescriptions.Length > 1)
                    {
                        throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                    }
                    var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                    var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                    if (dataToPost == "null")
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, null).then(d => d.blob());"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, JSON.stringify({dataToPost})).then(d => d.blob());"));
                    }

                    return;
                }
            }
            else if (returnTypeText == AureliaHttpResponse)             // client should care about only status
            {
                if (httpMethod == "get" || httpMethod == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText});"));
                    return;
                }

                if (httpMethod == "post" || httpMethod == "put")
                {
                    var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                                (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                                   (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                    if (fromBodyParameterDescriptions.Length > 1)
                    {
                        throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                    }
                    var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                    var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                    if (dataToPost == "null")
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, null);"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }} }});"));
                    }

                    return;
                }
            }
            else
            {
                if (httpMethod == "get" || httpMethod == "delete")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}).then(d => d.json());"));
                    return;
                }

                if (httpMethod == "post" || httpMethod == "put")
                {
                    var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                                (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                                   (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                    if (fromBodyParameterDescriptions.Length > 1)
                    {
                        throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                    }
                    var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                    var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                    if (String.IsNullOrEmpty(contentType))
                    {
                        contentType = "application/json;charset=UTF-8";
                    }

                    if (dataToPost == "null")
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, null, {{ headers: {{ 'Content-Type': '{contentType}' }} }}).then(d => d.json());"));
                    }
                    else
                    {
                        Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }} }}).then(d => d.json());"));
                    }

                    return;
                }
            }

            Debug.Assert(false, "How come?");
        }
示例#11
0
        protected override void RenderImplementation()
        {
            var parameters = Description.ParameterDescriptions.Where(p => p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri ||
                                                                     p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromQuery || p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                     p.ParameterDescriptor.ParameterBinder == ParameterBinder.None).Select(d =>
                                                                                                                                           new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name)
                                                                                                                                           ).ToList();

            var returnTypeReference = Poco2TsGen.TranslateToClientTypeReference(ReturnType);

            if (returnTypeReference.BaseType == "response")            //response is for NG2 with better built-in support for typing, and get translated to HttpResponse<Blob>
            {
                returnTypeReference.BaseType = "any";
            }

            var callbackTypeText = String.Format("(data : {0}) => any", TypeMapper.MapCodeTypeReferenceToTsText(returnTypeReference));

            Debug.WriteLine("callback: " + callbackTypeText);
            var callbackTypeReference = new CodeSnipetTypeReference(callbackTypeText);

            parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback"));

            Method.Parameters.AddRange(parameters.ToArray());

            if (handleHttpRequestHeaders)
            {
                Method.Parameters.Add(new CodeParameterDeclarationExpression(
                                          "() => {[header: string]: string}", "headersHandler?"));
            }

            var uriText = GetFullUriText();

            string headerHandlerCall = handleHttpRequestHeaders ? ", headersHandler" : String.Empty;

            if (HttpMethodName == "get" || HttpMethodName == "delete")
            {
                Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{HttpMethodName}({uriText}, callback, this.error, this.statusCode{headerHandlerCall});"));
            }
            else if (HttpMethodName == "post" || HttpMethodName == "put" || HttpMethodName == "patch")
            {
                var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                            (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                               (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                if (fromBodyParameterDescriptions.Length > 1)
                {
                    throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                }
                var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                if (dataToPost == "null")
                {
                    Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{HttpMethodName}({uriText}, null, callback, this.error, this.statusCode, '{contentType}'{headerHandlerCall});"));
                }
                else
                {
                    Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{HttpMethodName}({uriText}, {dataToPost}, callback, this.error, this.statusCode, '{contentType}'{headerHandlerCall});"));
                }
            }
            else
            {
                Debug.Assert(false, $"How come with {HttpMethodName}?");
            }
        }
        protected void RenderMethodPrototype()
        {
            var parameters = Description.ParameterDescriptions.Where(p => p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri ||
                                                                     p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromQuery || p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                     p.ParameterDescriptor.ParameterBinder == ParameterBinder.None).Select(d =>
                                                                                                                                           new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name)
                                                                                                                                           ).ToArray();

            Method.Parameters.AddRange(parameters);
        }
示例#13
0
        protected override void RenderImplementation()
        {
            var httpMethod = Description.HttpMethod.ToLower(); //Method is always uppercase.
            //deal with parameters
            var parameters = Description.ParameterDescriptions.Select(d =>
                                                                      new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name)
                                                                      ).ToList();

            //parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback"));

            Method.Parameters.AddRange(parameters.ToArray());

            var jsUriQuery = CreateUriQuery(Description.RelativePath, Description.ParameterDescriptions);
            var uriText    = jsUriQuery == null ? $"this.baseUri + '{Description.RelativePath}'" :
                             RemoveTrialEmptyString($"this.baseUri + '{jsUriQuery}'");

            // var mapFunction = returnTypeText == NG2HttpResponse ? String.Empty : ".map(response=> response.json())";
            if (httpMethod == "get" || httpMethod == "delete")
            {
                Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText}, {{ headers: {{ 'Accept': 'application/json' }} }});"));
                return;
            }

            if (httpMethod == "post" || httpMethod == "put")
            {
                var fromBodyParameterDescriptions = Description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                            (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) ||
                                                                                                                                                               (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();
                if (fromBodyParameterDescriptions.Length > 1)
                {
                    throw new InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName));
                }
                var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

                var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName;

                if (String.IsNullOrEmpty(contentType))
                {
                    contentType = "application/json;charset=UTF-8";
                }

                Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}', 'Accept': 'application/json' }} }});"));

                return;
            }

            Debug.Assert(false, "How come?");
        }