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?"); }
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); } }
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; }
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?"); }
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?"); }
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); }
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?"); }