public RequestResponseTypescriptContract(HttpRequestHandlerDefinition httpRequestHandlerDefinition, TypescriptContext ctx) : base(ctx) { _httpRequestHandlerDefinition = httpRequestHandlerDefinition; if (_httpRequestHandlerDefinition.Definition.ResponseType.GetTypeInfo().IsGenericType&& _httpRequestHandlerDefinition.Definition.ResponseType.GetGenericTypeDefinition() == typeof(Task <>)) { _httpRequestHandlerDefinition.Definition.ResponseType = _httpRequestHandlerDefinition.Definition.ResponseType.GetGenericArguments()[0]; } }
protected override void AdditionalGeneration(Data data, Type type, ILocalConvertContext context) { var attr = type.GetTypeInfo().GetCustomAttribute <HttpRequestAttribute>(); if (attr == null) { throw new ArgumentNullException("attr cannot be null"); } var parsed = new HttpRequestHandlerDefinition(attr, new RequestAndResponse(type)); var queryStringParameters = ParseProperties(data, parsed, BindingType.FromQuery); var routeParameters = ParseProperties(data, parsed, BindingType.FromRoute); var bodyParameters = ParseProperties(data, parsed, BindingType.FromBody); var httpRequestType = typeof(IHttpRequest <>).MakeGenericType(parsed.Definition.ResponseType); var replaceRouteArgs = _.Foreach(routeParameters, prop => $".replace('{{{prop.Original.PropertyName}}}', this.{prop.Parsed.Name} ? this.{prop.Parsed.Name}.toString() : '')"); var hasBody = parsed.HttpMethod == HttpMethod.Patch || parsed.HttpMethod == HttpMethod.Post || parsed.HttpMethod == HttpMethod.Put; var body = $@"{{{ _.Foreach(bodyParameters, prop => $@" {prop.Parsed.Name}: this.{prop.Parsed.Name},").TrimEnd(',') } }}"; var queryStringPropertyName = PropName(context, httpRequestType, nameof(IHttpRequest <object> .QueryString)); var methodPropertyName = PropName(context, httpRequestType, nameof(IHttpRequest <object> .Method)); var routePropertyName = PropName(context, httpRequestType, nameof(IHttpRequest <object> .Route)); var bodyPropertyName = PropName(context, httpRequestType, nameof(IHttpRequest <object> .Body)); var code = $@" public __name = '{context.Configuration.GetTypeName(type)}'; private __request = () => {{ const req: {context.GetTypeScriptType(httpRequestType).ToTypeScriptType()} = {{ {methodPropertyName}: '{parsed.HttpMethod.ToString().ToLower()}', {routePropertyName}: '{parsed.Route}'{replaceRouteArgs}, {bodyPropertyName}: {(hasBody ? body : "undefined")}, {queryStringPropertyName}: {{}} }}; {_getQueryStringLines(queryStringParameters.Select(x => x.Parsed), queryStringPropertyName, context)} return req; }} public execute = (dispatcher: { context.GetTypeScriptType(typeof(IRequestDispatcher)).ToTypeScriptType() }) => dispatcher.execute(this.__request());"; data.Body.AddRange(code.Replace("\r\n", "\n").Split('\n')); }
public OperationResult CreateCSharp(string operationName, HttpRequestHandlerDefinition builderDefinition, HashSet <string> uniqueClassNames) { var requestBodyProperties = builderDefinition.Parameters.Where(x => x.BindingType == BindingType.FromBody || x.BindingType == BindingType.FromForm).ToArray(); var requestClass = builderDefinition.Definition.RequestType.Name; var original = requestClass; var tryCount = 1; while (uniqueClassNames.Contains(requestClass)) { requestClass = $"{original}_{++tryCount}"; } var methodArgs = string.Join(", ", builderDefinition.Parameters.GroupBy(x => x.PropertyName).Select(x => new { Name = x.Key, Type = x.First().BindingType == BindingType.FromBody || x.First().BindingType == BindingType.FromForm ? requestClass : GetCorrectFormat(x.First().PropertyInfo.PropertyType), Binder = x.First().BindingType }).Select(x => $"[Microsoft.AspNetCore.Mvc.{x.Binder}Attribute] {x.Type} {x.Name}")); var isAsync = builderDefinition.Definition.ResponseType.IsConstructedGenericType && builderDefinition.Definition.ResponseType.GetGenericTypeDefinition() == typeof(Task <>); var responseType = isAsync ? builderDefinition.Definition.ResponseType.GetGenericArguments()[0] : builderDefinition.Definition.ResponseType; var requestVariable = "request_" + Guid.NewGuid().ToString().Replace("-", ""); var operationResult = new OperationResult(); operationResult.OperationName = operationName; operationResult.RequestClass = $@"public class {requestClass} {{{CodeStr.Foreach(requestBodyProperties, source => $@" public {GetCorrectFormat(source.PropertyInfo.PropertyType)} {source.PropertyInfo.Name} {{ get; set; }}")} }}"; operationResult.Operation = $@"{GetAttributes(builderDefinition.Definition)}[Microsoft.AspNetCore.Mvc.Http{builderDefinition.HttpMethod}Attribute(""{builderDefinition.Route}""), {GetCorrectFormat(typeof(ProducesAttribute))}(typeof({GetCorrectFormat(responseType)}))] public {(isAsync ? "async " : string.Empty)}{GetCorrectFormat(isAsync ? typeof(Task<IActionResult>) : typeof(IActionResult))} {operationName}({methodArgs}) {{ var {requestVariable} = new {GetCorrectFormat(builderDefinition.Definition.RequestType)} {{{CodeStr.Foreach(builderDefinition.Parameters, assignment => $@" {assignment.PropertyInfo.Name} = {assignment.PropertyName}{(assignment.BindingType == BindingType.FromBody || assignment.BindingType == BindingType.FromForm ? $".{assignment.PropertyInfo.Name}" : "")},").Trim(',')} }}; var response = {(isAsync ? "await " : string.Empty)}_requestProcessor.Process{(isAsync ? "Async" : string.Empty)}<{GetCorrectFormat(builderDefinition.Definition.RequestType)},{GetCorrectFormat(responseType)}>({requestVariable}, this); return response; }}"; return(operationResult); }
public OperationResult CreateCSharp(string operationName, HttpRequestHandlerDefinition builderDefinition) { var requestBodyProperties = builderDefinition.Parameters.Where(x => x.BindingType == BindingType.FromBody || x.BindingType == BindingType.FromForm).ToArray(); var requestClass = builderDefinition.Definition.RequestType.Name + "_" + Guid.NewGuid().ToString().Replace("-", ""); var methodArgs = string.Join(", ", builderDefinition.Parameters.GroupBy(x => x.PropertyName).Select(x => new { Name = x.Key, Type = x.First().BindingType == BindingType.FromBody || x.First().BindingType == BindingType.FromForm ? requestClass : GetCorrectFormat(x.First().PropertyInfo.PropertyType), Binder = x.First().BindingType == BindingType.FromBody ? "FromBody" : "FromUri", BindingType = x.First().BindingType }).Select(x => $"[System.Web.Http.{x.Binder}Attribute] {x.Type} {x.Name}{CodeStr.If(x.BindingType == BindingType.FromQuery, $" = default({x.Type})")}")); var isAsync = builderDefinition.Definition.ResponseType.IsConstructedGenericType && builderDefinition.Definition.ResponseType.GetGenericTypeDefinition() == typeof(Task <>); var responseType = isAsync ? builderDefinition.Definition.ResponseType.GetGenericArguments()[0] : builderDefinition.Definition.ResponseType; var requestVariable = "request_" + Guid.NewGuid().ToString().Replace("-", ""); var operationResult = new OperationResult(); operationResult.OperationName = operationName; operationResult.RequestClass = $@"public class {requestClass} {{{CodeStr.Foreach(requestBodyProperties, source => $@" public {GetCorrectFormat(source.PropertyInfo.PropertyType)} {source.PropertyInfo.Name} {{ get; set; }}")} }}"; operationResult.Operation = $@"[System.Web.Http.Http{builderDefinition.HttpMethod}Attribute, {GetCorrectFormat(typeof(RouteAttribute))}(""{ builderDefinition.Route}""), {GetCorrectFormat(typeof(ResponseTypeAttribute))}(typeof({GetCorrectFormat(responseType)}))] public {(isAsync ? "async " : string.Empty)}{GetCorrectFormat(isAsync ? typeof(Task<IHttpActionResult>) : typeof(IHttpActionResult))} {operationName}({methodArgs}) {{ var {requestVariable} = new {GetCorrectFormat(builderDefinition.Definition.RequestType)}();{CodeStr.Foreach(builderDefinition.Parameters, assignment => $@" {requestVariable}.{assignment.PropertyInfo.Name} = {assignment.PropertyName}{(assignment.BindingType == BindingType.FromBody || assignment.BindingType == BindingType.FromForm ? $".{assignment.PropertyInfo.Name}" : "")};")} var response = {(isAsync ? "await " : string.Empty)}_requestProcessor.Process{(isAsync ? "Async" : string.Empty)}<{GetCorrectFormat(builderDefinition.Definition.RequestType)},{GetCorrectFormat(responseType)}>({requestVariable}, this); return response; }}"; return(operationResult); }
private static IEnumerable <ParsedProperty> ParseProperties(Data data, HttpRequestHandlerDefinition requestHandlerDefinition, BindingType bindingType) { var propertyBindings = requestHandlerDefinition.Parameters.Where(x => x.BindingType == bindingType); return(propertyBindings.Select(x => new ParsedProperty(x, data.Properties.Single(p => p.PropertyInfo == x.PropertyInfo)))); }