private static string GetServiceCheck(Type t) { var sb = new StringBuilder(); var i = 0; foreach (var p in t.GetProperties()) { if (p.Name == t.Name + "Guid" || p.Name == t.Name + "Id" || p.Name == "CreatedBy" || p.Name == "ModifiedBy" || p.Name == "CreatedDate" || p.Name == "ModifiedDate") { continue; } var isNotNull = false; var rlst = p.GetCustomAttributes(typeof(NotNullAttribute), true); if (!(rlst == null || rlst.Length == 0)) { isNotNull = true; } var isString = false; var sllst = p.GetCustomAttributes(typeof(StringLengthAttribute), true); if (!(sllst == null || sllst.Length == 0)) { isString = true; } var isLong = (p.PropertyType == typeof(long) || p.PropertyType == typeof(long?)); var isDateTime = (p.PropertyType == typeof(DateTime) || p.PropertyType == typeof(DateTime?)); var isGuid = (p.PropertyType == typeof(Guid) || p.PropertyType == typeof(Guid?)); if (isLong && isNotNull) { var space = i == 0 ? "" : " "; const string space2 = " "; sb.AppendLine(space + $"if (eentity123Model.{p.Name} == 0)"); sb.AppendLine(space2 + $"{{"); sb.AppendLine(space2 + $" result.Add(new ReturnErrorItem(\"{p.Name}\", \"{p.Name} cannot be empty\"));"); sb.AppendLine(space2 + $"}}"); if (p.Name.EndsWith("TypeId")) { var fKeyType = GetFkeyType(t.Name, p); if (fKeyType != null && CodeGenUtils.IsEnumAvailable(fKeyType.Name + "s")) { sb.AppendLine(space2 + $"else if (!ValidationUtils.IsEnumValid<{fKeyType.Name}s,long>(eentity123Model.{p.Name}))"); sb.AppendLine(space2 + $"{{"); sb.AppendLine(space2 + $" result.Add(new ReturnErrorItem(\"{p.Name}\", \"{p.Name} is not a valid {fKeyType.Name}\"));"); sb.AppendLine(space2 + $"}}"); } } i++; } else if (isString) { var space = i == 0 ? "" : " "; const string space2 = " "; sb.AppendLine(space + $"if (eentity123Model.{p.Name} != null && eentity123Model.{p.Name}.Length > EEntity123Model.COLUMN_SIZE_{p.Name})"); sb.AppendLine(space2 + $"{{"); sb.AppendLine(space2 + $" result.Add(new ReturnErrorItem(\"{p.Name}\", $\"{p.Name} size should not exceed {{EEntity123Model.COLUMN_SIZE_{p.Name}}}\"));"); sb.AppendLine(space2 + $"}}"); if (isNotNull) { sb.AppendLine(space2 + $"if (eentity123Model.{p.Name} == null)"); sb.AppendLine(space2 + $"{{"); sb.AppendLine(space2 + $" result.Add(new ReturnErrorItem(\"{p.Name}\", \"{p.Name} is reqired \"));"); sb.AppendLine(space2 + $"}}"); } i++; } else if (isDateTime) { var space = i == 0 ? "" : " "; const string space2 = " "; if (!isNotNull) { sb.AppendLine(space + $"if (eentity123Model.{p.Name} != null && !DateUtils.IsValidDate(eentity123Model.{p.Name}.Value))"); sb.AppendLine(space2 + $"{{"); sb.AppendLine(space2 + $" result.Add(new ReturnErrorItem(\"{p.Name}\", $\"{p.Name} is not a validate datetime\"));"); sb.AppendLine(space2 + $"}}"); } else { sb.AppendLine(space + $"if (!DateUtils.IsValidDate(eentity123Model.{p.Name}))"); sb.AppendLine(space2 + $"{{"); sb.AppendLine(space2 + $" result.Add(new ReturnErrorItem(\"{p.Name}\", $\"{p.Name} is not a validate datetime\"));"); sb.AppendLine(space2 + $"}}"); } i++; } else if (isGuid) { var space = i == 0 ? "" : " "; const string space2 = " "; if (!isNotNull) { sb.AppendLine(space + $"if (eentity123Model.{p.Name} != null && Guid.Empty == eentity123Model.{p.Name}.Value)"); sb.AppendLine(space2 + $"{{"); sb.AppendLine(space2 + $" result.Add(new ReturnErrorItem(\"{p.Name}\", $\"{p.Name} is not a validate guid\"));"); sb.AppendLine(space2 + $"}}"); } else { sb.AppendLine(space + $"if (Guid.Empty == eentity123Model.{p.Name})"); sb.AppendLine(space2 + $"{{"); sb.AppendLine(space2 + $" result.Add(new ReturnErrorItem(\"{p.Name}\", $\"{p.Name} is not a validate guid\"));"); sb.AppendLine(space2 + $"}}"); } i++; } } return(sb.ToString()); }
public static void MainApp() { var isTS = true; var sb = new StringBuilder(); var t = typeof(AccountController); var assembly = t.Assembly; if (assembly == null) { Console.WriteLine("Unabel to find the Op.Common assembly"); return; } var combined = CodeGenUtils.GetParsedStructure(assembly); //Process all the Models to make sure they are not missed when generating the TS Models CodeGenUtils.AddDependentModels(ref combined); sb.AppendLine(System.Text.Json.JsonSerializer.Serialize <CombinedClass>(combined, new System.Text.Json.JsonSerializerOptions { WriteIndented = true })); CodeGenUtils.CleanAndWriteAndOpenFile(Directory.GetCurrentDirectory() + "\\TS_Code_Structure.json", sb); sb = new StringBuilder(); foreach (var cInfo in combined.TypescriptModelClassInfoList) { if (cInfo.CanIgnore) { continue; } sb.AppendLine($"export class {cInfo.Name} {{"); foreach (var prop in cInfo.ModelType.GetProperties()) { sb.AppendLine($" {CodeGenUtils.LowerFirstCharacter(prop.Name)} : {CodeGenUtils.GetModelProperty(isTS, prop.PropertyType)} = {CodeGenUtils.GetModelPropertyDefaultValue(isTS, prop.PropertyType)};"); } sb.AppendLine($"}}"); sb.AppendLine($""); } CodeGenUtils.CleanAndWriteAndOpenFile(GetReactModelDirectory() + "\\app-model.ts", sb); sb = new StringBuilder(); sb.AppendLine($"import FrameworkHttpClientService from \"app/core/http/FrameworkHttpClientService\";"); sb.AppendLine($"import {{ ReturnModel }} from \"app/models/return.model\";"); sb.AppendLine($"import {{ ReturnListModel }} from \"app/models/return-list.model\";"); sb.AppendLine($"import * as models from \"./app-model\";"); sb.AppendLine($""); sb.AppendLine($"export default {{ "); foreach (var funcInfo in combined.FunctionInfoList) { foreach (var method in funcInfo.Methods) { if (method.CanIgnore) { continue; } var listSuffix = ""; if (method.GetOutputParameterTypeWithModuleNamePrefix(isTS).Contains("ReturnListModel")) { listSuffix = "List"; } sb.AppendLine($" async {CodeGenUtils.LowerFirstCharacter(method.MethodName)}({CodeGenUtils.GetTSFunctionParameter(isTS, method.InputParameters)}): {method.GetOutputParameterTypeWithModuleNamePrefix(isTS)} {{"); if (method.CallType == MethodCallType.Get) { if (method.InputParameters.Count == 0) { sb.AppendLine($" return FrameworkHttpClientService.get{listSuffix}(`/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}`);"); } else { var qry = CodeGenUtils.GetTSFunctionQueryParametersAsString(isTS, method.InputParameters); if (method.InputParameters.Count == 1 && !CodeGenUtils.IsAllAppParamBasicDataType(method.InputParameters)) { qry = method.InputParameters[0].Value; } sb.AppendLine($" return FrameworkHttpClientService.get{listSuffix}WithModel(`/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}`,{qry});"); } } else if (method.CallType == MethodCallType.Post) { if (method.InputParameters.Count > 1) { if (!CodeGenUtils.IsAllAppParamBasicDataType(method.InputParameters)) { throw new Exception("Post Not supported with multiple complex input parameter"); } } if (method.InputParameters.Count == 0) { sb.AppendLine($" return FrameworkHttpClientService.post{listSuffix}(\'/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\');"); } else { var qry = CodeGenUtils.GetTSFunctionQueryParametersAsString(isTS, method.InputParameters); if (method.InputParameters.Count == 1 && !CodeGenUtils.IsAllAppParamBasicDataType(method.InputParameters)) { qry = method.InputParameters[0].Value; } sb.AppendLine($" return FrameworkHttpClientService.post{listSuffix}WithModel(\'/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\',{qry});"); } } else if (method.CallType == MethodCallType.Put) { if (method.InputParameters.Count > 1) { if (!CodeGenUtils.IsAllAppParamBasicDataType(method.InputParameters)) { throw new Exception("Put Not supported with multiple complex input parameter"); } } if (method.InputParameters.Count == 0) { sb.AppendLine($" return FrameworkHttpClientService.put{listSuffix}(\'/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\');"); } else { var qry = CodeGenUtils.GetTSFunctionQueryParametersAsString(isTS, method.InputParameters); if (method.InputParameters.Count == 1 && !CodeGenUtils.IsAllAppParamBasicDataType(method.InputParameters)) { qry = method.InputParameters[0].Value; } sb.AppendLine($" return FrameworkHttpClientService.put{listSuffix}WithModel(\'/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\',{qry});"); } } else if (method.CallType == MethodCallType.Delete) { if (method.InputParameters.Count > 1) { if (!CodeGenUtils.IsAllAppParamBasicDataType(method.InputParameters)) { throw new Exception("Delete Not supported with multiple complex input parameter"); } } if (method.InputParameters.Count == 0) { sb.AppendLine($" return FrameworkHttpClientService.delete{listSuffix}(\'/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\');"); } else { var qry = CodeGenUtils.GetTSFunctionQueryParametersAsString(isTS, method.InputParameters); if (method.InputParameters.Count == 1 && !CodeGenUtils.IsAllAppParamBasicDataType(method.InputParameters)) { qry = method.InputParameters[0].Value; } sb.AppendLine($" return FrameworkHttpClientService.delete{listSuffix}WithModel(\'/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\',{qry});"); } } else { throw new Exception($"{method.CallType} Not supported"); } sb.AppendLine($" }},"); sb.AppendLine($""); } } sb.AppendLine($"}}"); CodeGenUtils.CleanAndWriteAndOpenFile(GetReactHttpApiDirectory() + "\\app-http-client.ts", sb); }
public static void MainApp(bool isTest = false) { var isTS = false; var sb = new StringBuilder(); var t = typeof(AccountController); var assembly = t.Assembly; if (assembly == null) { Console.WriteLine("Unabel to find the LogR.Common assembly"); return; } var combined = CodeGenUtils.GetParsedStructure(assembly); //Process all the Models to make sure they are not missed when generating the TS Models CodeGenUtils.AddDependentModels(ref combined); sb.AppendLine(System.Text.Json.JsonSerializer.Serialize <CombinedClass>(combined, new System.Text.Json.JsonSerializerOptions { WriteIndented = true })); CodeGenUtils.CleanAndWriteAndOpenFile(Directory.GetCurrentDirectory() + "\\TS_Code_Structure.json", sb); sb = new StringBuilder(); sb.AppendLine("using System;"); sb.AppendLine("using System.Collections.Generic;"); sb.AppendLine("using System.ComponentModel.DataAnnotations;"); if (isTest) { sb.AppendLine("using System.Text.Json.Serialization;"); } else { sb.AppendLine("using Newtonsoft.Json;"); } sb.AppendLine("using Framework.Infrastructure.Attributes;"); if (isTest) { sb.AppendLine("namespace LogR.Api.IntegrationTests"); } else { sb.AppendLine($"namespace LogR.WordAddIn.Shared.Models"); } sb.AppendLine("{"); foreach (var cInfo in combined.TypescriptModelClassInfoList) { if (cInfo.CanIgnore) { continue; } sb.AppendLine($" public class {cInfo.Name}"); sb.AppendLine($" {{"); foreach (var prop in cInfo.ModelType.GetProperties()) { var requiredStr = ""; var rlst = prop.GetCustomAttributes(typeof(RequiredAttribute), true); if (!(rlst == null || rlst.Length == 0)) { requiredStr = "[Required]"; } if (isTest) { sb.AppendLine($" {requiredStr}[JsonPropertyName(\"{CodeGenUtils.LowerFirstCharacter(prop.Name)}\")]"); } else { sb.AppendLine($" {requiredStr}[JsonProperty(\"{CodeGenUtils.LowerFirstCharacter(prop.Name)}\")]"); } sb.AppendLine($" public {CodeGenUtils.GetModelProperty(isTS, prop.PropertyType)} {prop.Name} {{set; get;}} = {CodeGenUtils.GetModelPropertyDefaultValue(isTS, prop.PropertyType)};"); } sb.AppendLine($" // Property Names"); foreach (var prop in cInfo.ModelType.GetProperties()) { sb.AppendLine($" public const string {prop.Name + "__Name"} = \"{prop.Name}\";"); } var sSb = new List <string>(); foreach (var prop in cInfo.ModelType.GetProperties()) { var slst = prop.GetCustomAttributes(typeof(StringLengthAttribute), true); if (slst == null || slst.Length == 0) { continue; } sSb.Add($" public const int {prop.Name + "__Size"} = {((StringLengthAttribute)slst[0]).MaximumLength};"); } if (sSb.Count > 0) { sb.AppendLine($" // String Column Sizes"); foreach (var item in sSb) { sb.AppendLine(item); } } sb.AppendLine($" }}"); sb.AppendLine($""); } sb.AppendLine("}"); if (isTest) { CodeGenUtils.CleanAndWriteAndOpenFile(GetTestModelDirectory() + "\\ApiModels.cs", sb); } else { CodeGenUtils.CleanAndWriteAndOpenFile(GetReactModelDirectory() + "\\ApiModels.cs", sb); } var isb = new StringBuilder(); isb.AppendLine("using System;"); isb.AppendLine("using Framework.Infrastructure.Models.Result;"); isb.AppendLine("using Framework.Infrastructure.Utils;"); if (isTest) { isb.Append(""); } else { isb.AppendLine("using LogR.WordAddIn.Shared.Models;"); } if (isTest) { isb.Append(""); } else { isb.AppendLine("using LogR.WordAddIn.Shared.Services;"); } isb.AppendLine(); if (isTest) { isb.AppendLine("namespace LogR.Api.IntegrationTests"); } else { isb.AppendLine($"namespace LogR.WordAddIn.Shared.Interfaces"); } isb.AppendLine("{"); isb.AppendLine($" public interface IHttpService"); isb.AppendLine($" {{"); sb = new StringBuilder(); sb.AppendLine("using System;"); if (isTest) { sb.AppendLine("using System.Net.Http;"); } sb.AppendLine("using Framework.Infrastructure.Models.Result;"); sb.AppendLine("using Framework.Infrastructure.Utils;"); if (isTest) { sb.AppendLine("using Framework.TestUtilies;"); } if (isTest) { sb.AppendLine("using LogR.Api.All;"); } if (isTest) { sb.Append(""); } else { sb.AppendLine("using LogR.WordAddIn.Shared.Interfaces;"); } if (isTest) { sb.Append(""); } else { sb.AppendLine("using LogR.WordAddIn.Shared.Models;"); } if (isTest) { sb.Append(""); } else { sb.AppendLine("using LogR.WordAddIn.Shared.Services;"); } sb.AppendLine(); if (isTest) { sb.AppendLine("namespace LogR.Api.IntegrationTests"); } else { sb.AppendLine($"namespace LogR.WordAddIn.Shared.Services"); } sb.AppendLine("{"); if (isTest) { sb.AppendLine(" public class HttpService : IDisposable"); } else { sb.AppendLine($" public class HttpService : IHttpService"); } sb.AppendLine($" {{"); if (isTest) { sb.AppendLine(" private readonly string site;"); } else { sb.AppendLine($" private readonly AppConfigService appConfigService;"); } if (isTest) { sb.AppendLine(" private readonly FrameworkTestEnvironment<Startup> env;"); } if (isTest) { sb.AppendLine(" private bool disposedValue;"); } if (isTest) { sb.AppendLine(" public HttpService(string site, FrameworkTestEnvironment<Startup> env)"); } else { sb.AppendLine($" public HttpService(AppConfigService appConfigService)"); } sb.AppendLine($" {{"); if (isTest) { sb.AppendLine(" this.site = site ?? \"\";"); } else { sb.AppendLine($" this.appConfigService = appConfigService;"); } if (isTest) { sb.AppendLine(" this.env = env;"); } sb.AppendLine($" }}"); sb.AppendLine(""); if (isTest) { sb.AppendLine(" protected virtual void Dispose(bool disposing)"); } if (isTest) { sb.AppendLine(" {"); } if (isTest) { sb.AppendLine(" if (!disposedValue)"); } if (isTest) { sb.AppendLine(" {"); } if (isTest) { sb.AppendLine(" disposedValue = true;"); } if (isTest) { sb.AppendLine(" }"); } if (isTest) { sb.AppendLine(" }"); } if (isTest) { sb.AppendLine(""); } if (isTest) { sb.AppendLine(" public void Dispose()"); } if (isTest) { sb.AppendLine(" {"); } if (isTest) { sb.AppendLine(" Dispose(disposing: true);"); } if (isTest) { sb.AppendLine(" GC.SuppressFinalize(this);"); } if (isTest) { sb.AppendLine(" }"); } sb.AppendLine($" public string Url(string fragment)"); sb.AppendLine($" {{"); if (isTest) { sb.AppendLine(" return RestClientUtils.Url(site, fragment);"); } else { sb.AppendLine($" return RestClientUtils.Url(appConfigService.Site, fragment);"); } sb.AppendLine($" }}"); sb.AppendLine(""); var tokenVar = "token: appConfigService.CurrentToken, headers : appConfigService.CurrentHeaders"; if (isTest) { tokenVar = "appHeader = appHeader"; } string lineValue; string iLineValue; foreach (var funcInfo in combined.FunctionInfoList) { foreach (var method in funcInfo.Methods) { if (method.CanIgnore) { continue; } //var returnModel = "ReturnModel"; var listSuffix = ""; if (method.GetOutputParameterTypeWithModuleNamePrefix(isTS).Contains("ReturnListModel")) { listSuffix = "List"; //returnModel = "ReturnListModel"; } var(modelName, outerClass) = CodeGenUtils.GetModelPrefixedClassNameInfo(isTS, method.OutputParameterType); if (modelName == null) { modelName = ""; } if (isTest) { lineValue = ($" public virtual (HttpResponseMessage response, {method.GetOutputParameterTypeWithModuleNamePrefix(isTS)} result) {method.MethodName}({CodeGenUtils.GetTSFunctionParameter(isTS, method.InputParameters, isTest)})"); } else { lineValue = ($" public virtual {method.GetOutputParameterTypeWithModuleNamePrefix(isTS)} {method.MethodName}({CodeGenUtils.GetTSFunctionParameter(isTS, method.InputParameters, isTest)})"); } sb.AppendLine(lineValue); lineValue = ($" {{"); sb.AppendLine(lineValue); iLineValue = ($" {method.GetOutputParameterTypeWithModuleNamePrefix(isTS)} {method.MethodName}({CodeGenUtils.GetTSFunctionParameter(isTS, method.InputParameters, isTest)});"); isb.AppendLine(iLineValue); var space = " "; if (method.CallType == MethodCallType.Get) { if (method.InputParameters.Count == 0) { if (isTest) { lineValue = ($"{space}return env.GetAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>,Object>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),null,appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Get{listSuffix}<{modelName}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{tokenVar});"); } sb.AppendLine(lineValue); } else { var inputParamType = assembly.GetType(method.InputParameters[0].TypeFullName); if (inputParamType == null) { inputParamType = Type.GetType(method.InputParameters[0].TypeFullName); } if (method.InputParameters[0].Key == "Nullable`1") { if (method.InputParameters[0].Value == "123~!@#") { continue; } } var qry = CodeGenUtils.GetTSFunctionQueryParametersAsString(isTS, method.InputParameters); if (method.InputParameters.Count == 1) { var p = method.InputParameters[0].Value; var s = ""; var k = method.InputParameters[0].Key; if (!CodeGenUtils.IsBasicType(method.InputParameters[0].Key)) { s = ""; } else { p = "new { " + p + " }"; k = "Object"; } if (isTest) { lineValue = ($"{space}return env.GetAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>,{k}>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{p},appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Get{listSuffix}<{modelName}{s}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{p},{tokenVar});"); } sb.AppendLine(lineValue); } else { if (isTest) { lineValue = ($"{space}return env.GetAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>,Object>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{qry},appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Get{listSuffix}<{modelName}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{qry},{tokenVar});"); } sb.AppendLine(lineValue); } } } else if (method.CallType == MethodCallType.Post) { if (method.InputParameters.Count > 1) { throw new Exception("Post Not supported with multiple input parameter"); } if (method.InputParameters.Count == 0) { if (isTest) { lineValue = ($"{space}return env.PostAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>,Object>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),null,appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Post{listSuffix}<{modelName}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{tokenVar});"); } sb.AppendLine(lineValue); } else { var p = method.InputParameters[0].Value; var s = ",object"; var k = method.InputParameters[0].Key; if (!CodeGenUtils.IsBasicType(method.InputParameters[0].Key)) { s = "," + method.InputParameters[0].Key; } else { p = "new { " + p + " }"; k = "Object"; } if (isTest) { lineValue = ($"{space}return env.PostAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>,{k}>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{p},appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Post{listSuffix}WithModel<{modelName}{s}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{p},{tokenVar});"); } sb.AppendLine(lineValue); } } else if (method.CallType == MethodCallType.Put) { if (method.InputParameters.Count > 1) { //CodeGenUtils.MethodParamsCount(method.InputParameters); if (!CodeGenUtils.IsAllAppParamBasicDataType(method.InputParameters)) { throw new Exception("Post Not supported with multiple complex input parameter"); } } if (method.InputParameters.Count == 0) { if (isTest) { lineValue = ($"{space}return env.PutAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>,Object>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),null,appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Put{listSuffix}<{modelName}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{tokenVar});"); } sb.AppendLine(lineValue); } else { var p = ""; var s = ""; var k = ""; var pLst = new List <string>(); foreach (var ip in method.InputParameters) { if (!CodeGenUtils.IsBasicType(ip.Key)) { k = ip.Key; p = ip.Value; s = "," + ip.Key; } else { if (method.InputParameters.Count == 1) { p = "new { " + ip.Value + " }"; } else { pLst.Add(ip.Value); } k = "Object"; s = ",object"; } } if (method.InputParameters.Count > 1) { p = "new { " + String.Join(",", pLst) + " }"; } if (isTest) { lineValue = ($"{space}return env.PutAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>,{k}>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{p},appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Put{listSuffix}WithModel<{modelName}{s}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{p},{tokenVar});"); } sb.AppendLine(lineValue); } } else if (method.CallType == MethodCallType.Delete) { if (method.InputParameters.Count > 1) { throw new Exception("Delte Not supported with multiple input parameter"); } if (method.InputParameters.Count == 0) { if (isTest) { lineValue = ($"{space}return env.DeleteAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Delete{listSuffix}<{modelName}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{tokenVar});"); } sb.AppendLine(lineValue); } else { var p = method.InputParameters[0].Value; var s = ""; if (!CodeGenUtils.IsBasicType(method.InputParameters[0].Key)) { s = "," + method.InputParameters[0].Key; } else { p = "new { " + p + " }"; } if (isTest) { lineValue = ($"{space}return env.DeleteAndReadAsJsonWithNewTokenClientAsync<Return{listSuffix}Model<{modelName}>>(token,Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{p},appHeader).Result;"); } else { lineValue = ($"{space}return RestClientUtils.Delete{listSuffix}<{modelName}{s}>(Url(\"/api/v1/{funcInfo.ApiClassName.ToLower()}/{method.ApiMethodName.ToLower()}\"),{p},{tokenVar});"); } sb.AppendLine(lineValue); } } lineValue = ($" }}"); sb.AppendLine(lineValue); lineValue = ($""); sb.AppendLine(lineValue); } } lineValue = ($" }}"); sb.AppendLine(lineValue); lineValue = ($"}}"); sb.AppendLine(lineValue); iLineValue = ($" }}"); isb.AppendLine(iLineValue); iLineValue = ($"}}"); isb.AppendLine(iLineValue); if (isTest) { CodeGenUtils.CleanAndWriteAndOpenFile(GetTestHttpApiDirectory() + "\\HttpService.cs", sb); } else { CodeGenUtils.CleanAndWriteAndOpenFile(GetReactHttpApiDirectory() + "\\HttpService.cs", sb); CodeGenUtils.CleanAndWriteAndOpenFile(GetReactInterfaceDirectory() + "\\IHttpService.cs", isb); } }
public static CombinedClass GetParsedStructure(Assembly assembly) { var combined = new CombinedClass(); foreach (var aClass in assembly.GetTypes()) { if (!typeof(Microsoft.AspNetCore.Mvc.Controller).IsAssignableFrom(aClass)) { continue; } var cItem = new TClass { ClassName = aClass.Name }; combined.FunctionInfoList.Add(cItem); var methodInfos = aClass.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public); if (methodInfos.Length == 0) { continue; } foreach (var method in methodInfos) { MethodCallType callType; var methodParams = method.GetParameters(); var returnType = method.ReturnType; if (method.GetCustomAttribute(typeof(HttpPostAttribute)) != null) { if (!DoesMethodParamsOneOrNoBody(methodParams)) { throw new NotImplementedException($"This Post scenario is not implemented for {aClass.Name} - {method.Name}"); } callType = MethodCallType.Post; } else if (method.GetCustomAttribute(typeof(HttpGetAttribute)) != null) { callType = MethodCallType.Get; if (DoesMethodParamsAnyBody(methodParams)) { throw new NotImplementedException($"This get scenario is not implemented for {aClass.Name} - {method.Name}"); } } else if (method.GetCustomAttribute(typeof(HttpPutAttribute)) != null) { if (!DoesMethodParamsOneOrNoBody(methodParams)) { throw new NotImplementedException($"This put scenario is not implemented for {aClass.Name} - {method.Name}"); } callType = MethodCallType.Put; } else if (method.GetCustomAttribute(typeof(HttpDeleteAttribute)) != null) { if (DoesMethodParamsAnyBody(methodParams)) { throw new NotImplementedException($"This delete scenario is not implemented for {aClass.Name} - {method.Name}"); } callType = MethodCallType.Delete; } else { throw new NotImplementedException("This scenario is not implemented"); } var rName = returnType.Name; var underlysingReturnType = returnType; if (returnType.BaseType == typeof(System.Threading.Tasks.Task)) { (rName, underlysingReturnType) = CodeGenUtils.ProcessGenericVariable(combined, returnType); } else { if (returnType.IsGenericType) { (rName, underlysingReturnType) = CodeGenUtils.ProcessGenericVariable(combined, returnType); } } var mItem = new TMethod { MethodName = method.Name, CallType = callType, OutputParameterType = rName, CanIgnore = CodeGenUtils.CanIgnoreReturnType(underlysingReturnType) }; cItem.Methods.Add(mItem); //var inputParam = ""; foreach (var param in methodParams) { if (!combined.TypescriptModelClassInfoList.Any(x => x.Name == param.ParameterType.Name)) { combined.TypescriptModelClassInfoList.Add(new TypescriptModelClass { Name = param.ParameterType.Name, ModelType = param.ParameterType, CanIgnore = CanIgnoreReturnType(param.ParameterType) }); } mItem.InputParameters.Add(new InputParam { Key = param.ParameterType.Name, Value = param.Name, TypeFullName = param.ParameterType.FullName, InputType = GetInputType(param) }); } } } return(combined); }