protected override async Task <ActivityExecutionResult> OnExecuteAsync(WorkflowExecutionContext context, CancellationToken cancellationToken) { var moduleInfo = context.GetVariable <ModuleInfo>("ModuleInfo"); var appDir = AppDomain.CurrentDomain.BaseDirectory; var tempDir = Path.Combine(appDir, context.GetVariable <string>("TemplateDirectory"), "Generate", "src", "views"); if (!Directory.Exists(tempDir)) { throw new DirectoryNotFoundException($"模板目录 {tempDir} 不存在。"); } string targetDirectory = moduleInfo.Option.OutputFolder.IsNullOrWhiteSpace() ? Path.Combine(context.GetVariable <string>("ProjectDirectory"), "src", "views") : Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, moduleInfo.Option.OutputFolder)); ModuleApiOperation postApi = context.GetVariable <ModuleApiOperation>("PostModuleApi"); var apiSchema = postApi.Operation.RequestBody.Content.First().Value.Schema; var model = new GenerateModelModel { Name = moduleInfo.Name, ModuleInfo = moduleInfo, RequestBodySchema = apiSchema }; var overwrite = context.GetVariable <bool>("Overwrite"); await GenerateFiles(tempDir, targetDirectory, model, overwrite); return(Done()); }
public static string GenerateApiFuncName(GenerateCommandOptionBasic options, ModuleApiOperation api) { /* * 通过约定生成api方法名。 * 获取列表 get {path} * 获取详情 get {path}/{id} * 新增 post {path} * 编辑: put {path}/{id} * 编辑: put {path} * 删除: delete {path}/{id} */ string funcName = null; List <string> @params = new List <string>(); if (api.Url.Equals(options.ModulePrefix, StringComparison.OrdinalIgnoreCase)) { funcName = api.Method.Equals("get", StringComparison.OrdinalIgnoreCase) ? "getList" : api.Method.ToLower(); } //else if (api.Url.Equals(options.ModulePrefix + "/{id}", StringComparison.OrdinalIgnoreCase)) //{ // funcName = api.Method.ToLower(); // @params.Add("id"); //} else { var path = api.Url.Substring(options.ModulePrefix.Length) .Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries) .SelectMany(x => x.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)) .SelectMany(x => x.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)) .Select(x => x.ToPascalCase()) .ToList(); if (path.Count == 0 || path.Count > 0 && !(path[0].StartsWith("get", StringComparison.OrdinalIgnoreCase) || path[0].StartsWith("delete", StringComparison.OrdinalIgnoreCase) || path[0].StartsWith("post", StringComparison.OrdinalIgnoreCase) || path[0].StartsWith("put", StringComparison.OrdinalIgnoreCase))) { path.Insert(0, api.Method.ToLower()); } funcName = $"{string.Join("", path.Where(x => !x.StartsWith("{")))}" .ToCamelCase(); @params = path.Where(x => x.StartsWith("{")) .Select(x => x.Replace("{", "") .Replace("}", "") .ToCamelCase()) .ToList(); } TryAddParams(@params, api.Operation); return($"{funcName} = ({string.Join(", ", @params)})"); }
public static string GenerateApiParams(ModuleApiOperation api) { var @params = ""; if (api.Operation.Parameters.Any(x => x.In == ParameterLocation.Query)) { @params = ",\r\n params"; } if (api.Operation.RequestBody != null) { @params += ",\r\n data: body"; } return(@params); }
protected override ActivityExecutionResult OnExecute(WorkflowExecutionContext context) { var modelInfo = context.GetVariable <ModuleInfo>("ModuleInfo"); ModuleApiOperation api = modelInfo.ModuleApis.FirstOrDefault(api => api.Url.Equals(modelInfo.Option.ModulePrefix, StringComparison.OrdinalIgnoreCase) && api.Method.Equals("get", StringComparison.OrdinalIgnoreCase)); if (api == null) { Logger.LogError("找不到 GET LIST API"); return(Fault("找不到 GET LIST API")); } Logger.LogInformation("GET LIST API:{api}", modelInfo.Option.ModulePrefix); context.SetVariable("GetListModuleApi", api); return(Done()); }
protected override ActivityExecutionResult OnExecute(WorkflowExecutionContext context) { var modelInfo = context.GetVariable <ModuleInfo>("ModuleInfo"); ModuleApiOperation postApi = modelInfo.ModuleApis.FirstOrDefault(api => api.Url.Equals(modelInfo.Option.ModulePrefix, StringComparison.OrdinalIgnoreCase) && api.Method.Equals("post", StringComparison.OrdinalIgnoreCase)); if (postApi == null) { Logger.LogError("找不到 POST API"); return(Fault("找不到 POST API")); } var apiSchema = postApi.Operation.RequestBody.Content.First().Value.Schema; Logger.LogInformation("POST API:{api}, Model:{model}", modelInfo.Option.ModulePrefix, apiSchema.Reference.Id); context.SetVariable("PostModuleApi", postApi); return(Done()); }
private IDictionary <string, OpenApiSchema> GetListProperty(ModuleApiOperation listApi, ProjectInfo projectInfo) { if ((listApi.Operation.Responses.TryGetValue("200", out var statusCode200Response) && statusCode200Response.Content.TryGetValue("application/json", out var openApiMediaType))) { if (!projectInfo.ListPropertySchemaPath.IsNullOrWhiteSpace()) { var paths = projectInfo.ListPropertySchemaPath.Split(new [] { '.' }, StringSplitOptions.RemoveEmptyEntries); OpenApiSchema propertySchema = openApiMediaType.Schema; foreach (var path in paths) { if (!propertySchema.Properties.TryGetValue(path, out propertySchema)) { Logger.LogWarning("路径不匹配,{path}", projectInfo.ListPropertySchemaPath); goto defVal; } } if ("array".Equals(propertySchema.Type)) { return(propertySchema.Items.Properties); } return(propertySchema.Properties); } defVal: return(openApiMediaType.Schema.Properties); } Logger.LogError( "请确认接口的 Responses 中存在 HttpStatusCode 等于 200 的响应,并且该响应的 Media type 要包含 application/json,URL:{url}", listApi.Url); return(new Dictionary <string, OpenApiSchema>()); }
protected override async Task <ActivityExecutionResult> OnExecuteAsync(WorkflowExecutionContext context, CancellationToken cancellationToken) { var modelInfo = context.GetVariable <ModuleInfo>("ModuleInfo"); var permissionControl = context.GetVariable <bool>("PermissionControl"); var appDir = AppDomain.CurrentDomain.BaseDirectory; var tempDir = Path.Combine(appDir, context.GetVariable <string>("TemplateDirectory"), "Generate", "src", "views"); if (!Directory.Exists(tempDir)) { throw new DirectoryNotFoundException($"模板目录 {tempDir} 不存在。"); } string targetDirectory = modelInfo.Option.OutputFolder.IsNullOrWhiteSpace() ? Path.Combine(context.GetVariable <string>("ProjectDirectory"), "src", "views") : Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, modelInfo.Option.OutputFolder)); ModuleApiOperation getListApi = context.GetVariable <ModuleApiOperation>("GetListModuleApi"); var model = new GenerateListModel { Name = modelInfo.Name, ModuleInfo = modelInfo, GenerateCreate = true, GenerateEdit = true, PermissionControl = permissionControl, QueryParams = TemplateHelper.GetQueryParameters(modelInfo.ProjectInfo, getListApi.Operation), ListProperty = GetListProperty(getListApi, modelInfo.ProjectInfo) }; var overwrite = context.GetVariable <bool>("Overwrite"); await GenerateFiles(tempDir, targetDirectory, model, overwrite); return(Done()); }