diff -r c27eee1259bd -r ed2e7aef2a3e src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Fri Oct 09 19:06:51 2020 +0200 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Fri Oct 09 19:07:05 2020 +0200 @@ -282,11 +282,15 @@ viewModel.setIssue(issue); viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); viewModel.setUsers(dao.getUserDao().list()); + if (issue.getId() >= 0) { + viewModel.setComments(dao.getIssueDao().listComments(issue)); + } } @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET) public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException { final var viewModel = new IssueEditView(); + populate(viewModel, req, dao); final var issueParam = getParameter(req, Integer.class, "issue"); if (issueParam.isPresent()) { @@ -294,10 +298,8 @@ final var issue = issueDao.find(issueParam.get()); issueDao.joinVersionInformation(issue); req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, issue.getProject().getId()); - populate(viewModel, req, dao); configure(viewModel, issue, dao); } else { - populate(viewModel, req, dao); configure(viewModel, new Issue(-1), dao); } @@ -305,7 +307,7 @@ } @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST) - public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException { + public ResponseType commitIssue(HttpServletRequest req, DataAccessObjects dao) throws SQLException { Issue issue = new Issue(-1); try { issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow()); @@ -335,16 +337,57 @@ // specifying the issue parameter keeps the edited issue as menu item setRedirectLocation(req, "./projects/view?pid=" + issue.getProject().getId()); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); + + return ResponseType.HTML; } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { // TODO: set request attribute with error text LOG.warn("Form validation failure: {}", ex.getMessage()); LOG.debug("Details:", ex); final var viewModel = new IssueEditView(); + populate(viewModel, req, dao); configure(viewModel, issue, dao); // TODO: set Error Text return forwardView(req, viewModel, "issue-form"); } + } - return ResponseType.HTML; + @RequestMapping(requestPath = "issues/comment", method = HttpMethod.POST) + public ResponseType commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException { + final var issueIdParam = getParameter(req, Integer.class, "issueid"); + if (issueIdParam.isEmpty()) { + resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form."); + return ResponseType.NONE; + } + final var issue = new Issue(issueIdParam.get()); + try { + final var issueComment = new IssueComment(getParameter(req, Integer.class, "commentid").orElse(-1), issue); + issueComment.setComment(getParameter(req, String.class, "comment").orElse("")); + + if (issueComment.getComment().isBlank()) { + throw new IllegalArgumentException("comment.null"); + } + + LOG.debug("User {} is commenting on issue #{}", req.getRemoteUser(), issue.getId()); + if (req.getRemoteUser() != null) { + dao.getUserDao().findByUsername(req.getRemoteUser()).ifPresent(issueComment::setAuthor); + } + + dao.getIssueDao().saveComment(issueComment); + + // specifying the issue parameter keeps the edited issue as menu item + setRedirectLocation(req, "./projects/issues/edit?issue=" + issue.getId()); + setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); + + return ResponseType.HTML; + } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { + // TODO: set request attribute with error text + LOG.warn("Form validation failure: {}", ex.getMessage()); + LOG.debug("Details:", ex); + final var viewModel = new IssueEditView(); + populate(viewModel, req, dao); + configure(viewModel, issue, dao); + // TODO: set Error Text + return forwardView(req, viewModel, "issue-form"); + } } }