|
1 package de.uapcore.lightpit.servlet |
|
2 |
|
3 import de.uapcore.lightpit.AbstractServlet |
|
4 import de.uapcore.lightpit.HttpRequest |
|
5 import de.uapcore.lightpit.dao.DataAccessObject |
|
6 import de.uapcore.lightpit.entities.Issue |
|
7 import de.uapcore.lightpit.logic.* |
|
8 import de.uapcore.lightpit.viewmodel.* |
|
9 import jakarta.servlet.annotation.WebServlet |
|
10 |
|
11 @WebServlet(urlPatterns = ["/issues/*"]) |
|
12 class IssuesServlet : AbstractServlet() { |
|
13 |
|
14 private val pathInfos = PathInfosOnlyIssues("issues/") |
|
15 |
|
16 init { |
|
17 get("/", this::issues) |
|
18 |
|
19 get("/%issue", this::issue) |
|
20 get("/%issue/edit", this::issueForm) |
|
21 post("/%issue/comment", this::issueComment) |
|
22 post("/%issue/relation", this::issueRelation) |
|
23 get("/%issue/removeRelation", this::issueRemoveRelation) |
|
24 post("/%issue/commit", this::issueCommit) |
|
25 } |
|
26 |
|
27 private fun issues(http: HttpRequest, dao: DataAccessObject) { |
|
28 val filter = IssueFilter(http, dao) |
|
29 val needRelationsMap = filter.onlyBlocker |
|
30 val relationsMap = if (needRelationsMap) dao.getIssueRelationMap(filter.includeDone) else emptyMap() |
|
31 |
|
32 val issues = dao.listIssues(filter.includeDone) |
|
33 .sortedWith(IssueSorter(filter.sortPrimary, filter.sortSecondary, filter.sortTertiary)) |
|
34 .filter(issueFilterFunction(filter, relationsMap, http.remoteUser ?: "<Anonymous>")) |
|
35 |
|
36 with(http) { |
|
37 pageTitle = i18n("issues") |
|
38 view = IssueOverview(issues, filter) |
|
39 styleSheets = listOf("projects") |
|
40 javascript = "issue-overview" |
|
41 render("issues") |
|
42 } |
|
43 } |
|
44 |
|
45 private fun issue(http: HttpRequest, dao: DataAccessObject) { |
|
46 val issue = http.pathParams["issue"]?.toIntOrNull()?.let(dao::findIssue) |
|
47 if (issue == null) { |
|
48 http.response.sendError(404) |
|
49 return |
|
50 } |
|
51 renderIssueView(http, dao, issue, pathInfos) |
|
52 } |
|
53 |
|
54 private fun issueForm(http: HttpRequest, dao: DataAccessObject) { |
|
55 val issue = http.pathParams["issue"]?.toIntOrNull()?.let(dao::findIssue) |
|
56 if (issue == null) { |
|
57 http.response.sendError(404) |
|
58 return |
|
59 } |
|
60 |
|
61 with(http) { |
|
62 view = IssueEditView( |
|
63 issue, |
|
64 dao.listVersions(issue.project), |
|
65 dao.listComponents(issue.project), |
|
66 dao.listUsers(), |
|
67 issue.project |
|
68 ) |
|
69 styleSheets = listOf("projects") |
|
70 javascript = "issue-editor" |
|
71 render("issue-form") |
|
72 } |
|
73 } |
|
74 |
|
75 private fun issueComment(http: HttpRequest, dao: DataAccessObject) { |
|
76 commitIssueComment(http, dao, pathInfos) |
|
77 } |
|
78 |
|
79 private fun issueCommit(http: HttpRequest, dao: DataAccessObject) { |
|
80 val reference = http.param("id")?.toIntOrNull()?.let(dao::findIssue) |
|
81 if (reference == null) { |
|
82 logger.warn("Cannot create issues while not in a project context.") |
|
83 http.response.sendError(404) |
|
84 return |
|
85 } |
|
86 val issue = Issue(reference.id, reference.project) |
|
87 processIssueForm(issue, reference, http, dao) |
|
88 if (http.param("save") != null) { |
|
89 http.renderCommit("${pathInfos.issuesHref}${issue.id}") |
|
90 } else { |
|
91 http.renderCommit(pathInfos.issuesHref) |
|
92 } |
|
93 } |
|
94 |
|
95 private fun issueRelation(http: HttpRequest, dao: DataAccessObject) { |
|
96 addIssueRelation(http, dao, pathInfos) |
|
97 } |
|
98 |
|
99 private fun issueRemoveRelation(http: HttpRequest, dao: DataAccessObject) { |
|
100 removeIssueRelation(http, dao, pathInfos) |
|
101 } |
|
102 } |