diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Fri Oct 23 12:38:20 2020 +0200 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Fri Oct 23 13:29:33 2020 +0200 @@ -422,16 +422,39 @@ private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { final var project = viewModel.getProjectInfo().getProject(); - issue.setProject(project); + issue.setProject(project); // automatically set current project for new issues viewModel.setIssue(issue); viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); viewModel.setUsers(dao.getUserDao().list()); viewModel.setComponents(dao.getComponentDao().list(project)); - if (issue.getId() >= 0) { - viewModel.setComments(dao.getIssueDao().listComments(issue)); - } } + @RequestMapping(requestPath = "$project/issues/$issue/view", method = HttpMethod.GET) + public ResponseType viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + final var viewModel = new IssueDetailView(); + populate(viewModel, pathParameters, dao); + + final var projectInfo = viewModel.getProjectInfo(); + if (projectInfo == null) { + resp.sendError(HttpServletResponse.SC_NOT_FOUND); + return ResponseType.NONE; + } + + final var issueDao = dao.getIssueDao(); + final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue"))); + if (issue == null) { + resp.sendError(HttpServletResponse.SC_NOT_FOUND); + return ResponseType.NONE; + } + + issueDao.joinVersionInformation(issue); + viewModel.setIssue(issue); + viewModel.setComments(issueDao.listComments(issue)); + + return forwardView(req, viewModel, "issue-view"); + } + + // TODO: why should the issue editor be child of $project? @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { final var viewModel = new IssueEditView(); @@ -522,8 +545,8 @@ dao.getIssueDao().saveOrUpdate(issue, issue.getProject()); - // TODO: fix issue #14 - setRedirectLocation(req, "./projects/" + issue.getProject().getNode() + "/all-components/all-versions/issues/"); + // TODO: fix redirect location + setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); return ResponseType.HTML; @@ -561,8 +584,8 @@ dao.getIssueDao().saveComment(issueComment); - // TODO: fix redirect location (e.g. after fixing #24) - setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/edit"); + // TODO: fix redirect location + setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); return ResponseType.HTML;