280 private void configure(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { |
280 private void configure(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { |
281 issue.setProject(viewModel.getProjectInfo().getProject()); |
281 issue.setProject(viewModel.getProjectInfo().getProject()); |
282 viewModel.setIssue(issue); |
282 viewModel.setIssue(issue); |
283 viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); |
283 viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); |
284 viewModel.setUsers(dao.getUserDao().list()); |
284 viewModel.setUsers(dao.getUserDao().list()); |
|
285 if (issue.getId() >= 0) { |
|
286 viewModel.setComments(dao.getIssueDao().listComments(issue)); |
|
287 } |
285 } |
288 } |
286 |
289 |
287 @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET) |
290 @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET) |
288 public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException { |
291 public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException { |
289 final var viewModel = new IssueEditView(); |
292 final var viewModel = new IssueEditView(); |
|
293 populate(viewModel, req, dao); |
290 |
294 |
291 final var issueParam = getParameter(req, Integer.class, "issue"); |
295 final var issueParam = getParameter(req, Integer.class, "issue"); |
292 if (issueParam.isPresent()) { |
296 if (issueParam.isPresent()) { |
293 final var issueDao = dao.getIssueDao(); |
297 final var issueDao = dao.getIssueDao(); |
294 final var issue = issueDao.find(issueParam.get()); |
298 final var issue = issueDao.find(issueParam.get()); |
295 issueDao.joinVersionInformation(issue); |
299 issueDao.joinVersionInformation(issue); |
296 req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, issue.getProject().getId()); |
300 req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, issue.getProject().getId()); |
297 populate(viewModel, req, dao); |
|
298 configure(viewModel, issue, dao); |
301 configure(viewModel, issue, dao); |
299 } else { |
302 } else { |
300 populate(viewModel, req, dao); |
|
301 configure(viewModel, new Issue(-1), dao); |
303 configure(viewModel, new Issue(-1), dao); |
302 } |
304 } |
303 |
305 |
304 return forwardView(req, viewModel, "issue-form"); |
306 return forwardView(req, viewModel, "issue-form"); |
305 } |
307 } |
306 |
308 |
307 @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST) |
309 @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST) |
308 public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException { |
310 public ResponseType commitIssue(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
309 Issue issue = new Issue(-1); |
311 Issue issue = new Issue(-1); |
310 try { |
312 try { |
311 issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow()); |
313 issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow()); |
312 issue.setProject(new Project(getParameter(req, Integer.class, "pid").orElseThrow())); |
314 issue.setProject(new Project(getParameter(req, Integer.class, "pid").orElseThrow())); |
313 getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory); |
315 getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory); |
333 dao.getIssueDao().saveOrUpdate(issue); |
335 dao.getIssueDao().saveOrUpdate(issue); |
334 |
336 |
335 // specifying the issue parameter keeps the edited issue as menu item |
337 // specifying the issue parameter keeps the edited issue as menu item |
336 setRedirectLocation(req, "./projects/view?pid=" + issue.getProject().getId()); |
338 setRedirectLocation(req, "./projects/view?pid=" + issue.getProject().getId()); |
337 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
339 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
|
340 |
|
341 return ResponseType.HTML; |
338 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
342 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
339 // TODO: set request attribute with error text |
343 // TODO: set request attribute with error text |
340 LOG.warn("Form validation failure: {}", ex.getMessage()); |
344 LOG.warn("Form validation failure: {}", ex.getMessage()); |
341 LOG.debug("Details:", ex); |
345 LOG.debug("Details:", ex); |
342 final var viewModel = new IssueEditView(); |
346 final var viewModel = new IssueEditView(); |
|
347 populate(viewModel, req, dao); |
343 configure(viewModel, issue, dao); |
348 configure(viewModel, issue, dao); |
344 // TODO: set Error Text |
349 // TODO: set Error Text |
345 return forwardView(req, viewModel, "issue-form"); |
350 return forwardView(req, viewModel, "issue-form"); |
346 } |
351 } |
347 |
352 } |
348 return ResponseType.HTML; |
353 |
|
354 @RequestMapping(requestPath = "issues/comment", method = HttpMethod.POST) |
|
355 public ResponseType commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException { |
|
356 final var issueIdParam = getParameter(req, Integer.class, "issueid"); |
|
357 if (issueIdParam.isEmpty()) { |
|
358 resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form."); |
|
359 return ResponseType.NONE; |
|
360 } |
|
361 final var issue = new Issue(issueIdParam.get()); |
|
362 try { |
|
363 final var issueComment = new IssueComment(getParameter(req, Integer.class, "commentid").orElse(-1), issue); |
|
364 issueComment.setComment(getParameter(req, String.class, "comment").orElse("")); |
|
365 |
|
366 if (issueComment.getComment().isBlank()) { |
|
367 throw new IllegalArgumentException("comment.null"); |
|
368 } |
|
369 |
|
370 LOG.debug("User {} is commenting on issue #{}", req.getRemoteUser(), issue.getId()); |
|
371 if (req.getRemoteUser() != null) { |
|
372 dao.getUserDao().findByUsername(req.getRemoteUser()).ifPresent(issueComment::setAuthor); |
|
373 } |
|
374 |
|
375 dao.getIssueDao().saveComment(issueComment); |
|
376 |
|
377 // specifying the issue parameter keeps the edited issue as menu item |
|
378 setRedirectLocation(req, "./projects/issues/edit?issue=" + issue.getId()); |
|
379 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
|
380 |
|
381 return ResponseType.HTML; |
|
382 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
|
383 // TODO: set request attribute with error text |
|
384 LOG.warn("Form validation failure: {}", ex.getMessage()); |
|
385 LOG.debug("Details:", ex); |
|
386 final var viewModel = new IssueEditView(); |
|
387 populate(viewModel, req, dao); |
|
388 configure(viewModel, issue, dao); |
|
389 // TODO: set Error Text |
|
390 return forwardView(req, viewModel, "issue-form"); |
|
391 } |
349 } |
392 } |
350 } |
393 } |