src/main/kotlin/de/uapcore/lightpit/servlet/IssuesServlet.kt

changeset 311
bf67e0ff7131
equal deleted inserted replaced
310:bbf4eb9a71f8 311:bf67e0ff7131
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 }

mercurial