private static MethodDefinition GetPutMethod(ProjectFeature <AspNetCoreProjectSettings> projectFeature, ITable table) { var lines = new List <ILine>(); var aspNetCoreProject = projectFeature.GetAspNetCoreProject(); var selection = aspNetCoreProject.GetSelection(table); if (selection.Settings.UseLogger) { lines.Add(new CodeLine("Logger?.LogDebug(\"'{{0}}' has been invoked\", nameof({0}));", aspNetCoreProject.GetControllerPutAsyncMethodName(table))); lines.Add(new CodeLine()); } lines.Add(new CommentLine(" Validate request model")); lines.Add(new CodeLine("if (!ModelState.IsValid)")); lines.Add(new CodeLine(1, "return BadRequest(request);")); lines.Add(new CodeLine()); lines.Add(new CodeLine("var response = new Response();")); lines.Add(new CodeLine()); lines.Add(new CodeLine("try")); lines.Add(new CodeLine("{")); if (table.PrimaryKey?.Key.Count == 1) { lines.Add(new CommentLine(1, " Retrieve entity by id")); lines.Add(new CodeLine(1, "var entity = await Repository.{0}(new {1}(id));", aspNetCoreProject.EntityFrameworkCoreProject.GetGetRepositoryMethodName(table), aspNetCoreProject.EntityFrameworkCoreProject.GetEntityName(table))); lines.Add(new CodeLine()); } else if (table.PrimaryKey?.Key.Count > 1) { lines.Add(new CodeLine(1, "var key = id.Split('|');")); lines.Add(new CodeLine()); var key = table.GetColumnsFromConstraint(table.PrimaryKey).ToList(); for (var i = 0; i < key.Count; i++) { var column = key[i]; var parameterName = aspNetCoreProject.CodeNamingConvention.GetParameterName(column.Name); if (projectFeature.Project.Database.ColumnIsInt16(column)) { lines.Add(new CodeLine(1, "var {0} = Convert.ToInt16(key[{1}]);", parameterName, (i + 1).ToString())); } else if (projectFeature.Project.Database.ColumnIsInt32(column)) { lines.Add(new CodeLine(1, "var {0} = Convert.ToInt32(key[{1}]);", parameterName, (i + 1).ToString())); } else if (projectFeature.Project.Database.ColumnIsInt64(column)) { lines.Add(new CodeLine(1, "var {0} = Convert.ToInt64(key[{1}]);", parameterName, (i + 1).ToString())); } else { lines.Add(new CodeLine(1, "var {0} = key[{1}];", parameterName, (i + 1).ToString())); } } var exp = string.Join(", ", key.Select(item => string.Format("{0}", aspNetCoreProject.EntityFrameworkCoreProject.CodeNamingConvention.GetParameterName(item.Name)))); lines.Add(new CodeLine()); lines.Add(new CommentLine(1, " Retrieve entity")); lines.Add(new CodeLine(1, "var entity = await Repository.{0}(new {1}({2}));", aspNetCoreProject.EntityFrameworkCoreProject.GetGetRepositoryMethodName(table), aspNetCoreProject.EntityFrameworkCoreProject.GetEntityName(table), exp)); lines.Add(new CodeLine()); } lines.Add(new CodeLine(1, "if (entity != null)")); lines.Add(new CodeLine(1, "{")); lines.Add(new TodoLine(2, " Check properties to update")); lines.Add(new CodeLine()); lines.Add(new CommentLine(2, " Apply changes on entity")); foreach (var column in projectFeature.GetUpdateColumns(table)) { lines.Add(new CodeLine(2, "entity.{0} = request.{0};", aspNetCoreProject.GetPropertyName(table, column))); } lines.Add(new CodeLine()); lines.Add(new CommentLine(2, " Save changes for entity in database")); lines.Add(new CodeLine(2, "Repository.Update(entity);")); lines.Add(new CodeLine()); lines.Add(new CodeLine(2, "await Repository.CommitChangesAsync();")); if (selection.Settings.UseLogger) { lines.Add(new CodeLine()); lines.Add(new CodeLine(2, "Logger?.LogInformation(\"The entity was updated successfully\");")); } lines.Add(new CodeLine(1, "}")); lines.Add(new CodeLine("}")); lines.Add(new CodeLine("catch (Exception ex)")); lines.Add(new CodeLine("{")); if (selection.Settings.UseLogger) { lines.Add(new CodeLine(1, "response.SetError(Logger, nameof({0}), ex);", aspNetCoreProject.GetControllerPutAsyncMethodName(table))); } else { lines.Add(new CodeLine(1, "response.DidError = true;")); lines.Add(new CodeLine(1, "response.ErrorMessage = ex.Message;")); } lines.Add(new CodeLine("}")); lines.Add(new CodeLine()); lines.Add(new CodeLine("return response.ToHttpResponse();")); var parameters = new List <ParameterDefinition>(); if (table.PrimaryKey?.Key.Count == 1) { var column = table.GetColumnsFromConstraint(table.PrimaryKey).First(); parameters.Add(new ParameterDefinition(projectFeature.Project.Database.ResolveDatabaseType(column), "id")); } else if (table.PrimaryKey?.Key.Count > 1) { parameters.Add(new ParameterDefinition("string", "id")); } parameters.Add(new ParameterDefinition(aspNetCoreProject.GetRequestName(table), "request", new MetadataAttribute("FromBody"))); return(new MethodDefinition("Task<IActionResult>", aspNetCoreProject.GetControllerPutAsyncMethodName(table), parameters.ToArray()) { Attributes = { new MetadataAttribute("HttpPut", string.Format("\"{0}/{{id}}\"", aspNetCoreProject.EntityFrameworkCoreProject.GetEntityName(table))), }, AccessModifier = AccessModifier.Public, IsAsync = true, Lines = lines }); }
private static MethodDefinition GetPutMethod(ProjectFeature <AspNetCoreProjectSettings> projectFeature, ITable table) { var lines = new List <ILine>(); var selection = projectFeature.GetAspNetCoreProject().GetSelection(table); if (selection.Settings.UseLogger) { lines.Add(new CodeLine("Logger?.LogDebug(\"'{{0}}' has been invoked\", nameof({0}));", table.GetControllerPutAsyncMethodName())); lines.Add(new CodeLine()); } lines.Add(new CommentLine(" Validate request model")); lines.Add(new CodeLine("if (!ModelState.IsValid)", table.GetRequestModelName())); lines.Add(new CodeLine(1, "return BadRequest(requestModel);")); lines.Add(new CodeLine()); lines.Add(new CodeLine("var response = new SingleResponse<{0}>();", table.GetRequestModelName())); lines.Add(new CodeLine()); lines.Add(new CodeLine("try")); lines.Add(new CodeLine("{")); lines.Add(new CommentLine(1, " Retrieve entity by id")); lines.Add(new CodeLine(1, "var entity = await Repository.{0}(new {1}(id));", table.GetGetRepositoryMethodName(), table.GetEntityName())); lines.Add(new CodeLine()); lines.Add(new CodeLine(1, "if (entity != null)")); lines.Add(new CodeLine(1, "{")); lines.Add(new TodoLine(2, " Check properties to update")); lines.Add(new CommentLine(2, " Apply changes on entity")); foreach (var column in projectFeature.GetUpdateColumns(table)) { lines.Add(new CodeLine(2, "entity.{0} = requestModel.{0};", column.GetPropertyName())); } lines.Add(new CodeLine()); lines.Add(new CommentLine(2, " Save changes for entity in database")); lines.Add(new CodeLine(2, "await Repository.{0}(entity);", table.GetUpdateRepositoryMethodName())); if (selection.Settings.UseLogger) { lines.Add(new CodeLine()); lines.Add(new CodeLine(2, "Logger?.LogInformation(\"The entity was updated successfully\");")); lines.Add(new CodeLine()); lines.Add(new CodeLine(2, "response.Model = entity.ToRequestModel();")); } lines.Add(new CodeLine(1, "}")); lines.Add(new CodeLine("}")); lines.Add(new CodeLine("catch (Exception ex)")); lines.Add(new CodeLine("{")); if (selection.Settings.UseLogger) { lines.Add(new CodeLine(1, "response.SetError(ex, Logger);")); } else { lines.Add(new CodeLine(1, "response.DidError = true;")); lines.Add(new CodeLine(1, "response.ErrorMessage = ex.Message;")); } lines.Add(new CodeLine("}")); lines.Add(new CodeLine()); lines.Add(new CodeLine("return response.ToHttpResponse();")); var parameters = new List <ParameterDefinition>(); if (table.PrimaryKey?.Key.Count == 1) { var column = table.Columns.FirstOrDefault(item => item.Name == table.PrimaryKey.Key.First()); parameters.Add(new ParameterDefinition(EfCore.DatabaseExtensions.ResolveType(projectFeature.Project.Database, column), "id")); } parameters.Add(new ParameterDefinition(table.GetRequestModelName(), "requestModel", new MetadataAttribute("FromBody"))); return(new MethodDefinition("Task<IActionResult>", table.GetControllerPutAsyncMethodName(), parameters.ToArray()) { Attributes = new List <MetadataAttribute> { new MetadataAttribute("HttpPut", string.Format("\"{0}\"", table.GetEntityName())), }, IsAsync = true, Lines = lines }); }