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
            });
        }
Exemple #2
0
        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
            });
        }