src/main/kotlin/de/uapcore/lightpit/logic/IssueLogic.kt

Mon, 05 Aug 2024 18:40:47 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 05 Aug 2024 18:40:47 +0200
changeset 311
bf67e0ff7131
permissions
-rw-r--r--

add new global issues page - fixes #404

311
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 package de.uapcore.lightpit.logic
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 import de.uapcore.lightpit.HttpRequest
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 import de.uapcore.lightpit.dao.DataAccessObject
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 import de.uapcore.lightpit.dateOptValidator
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 import de.uapcore.lightpit.entities.Issue
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 import de.uapcore.lightpit.entities.IssueComment
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 import de.uapcore.lightpit.entities.IssueRelation
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 import de.uapcore.lightpit.entities.Version
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 import de.uapcore.lightpit.types.IssueCategory
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 import de.uapcore.lightpit.types.IssueStatus
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 import de.uapcore.lightpit.types.RelationType
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 import de.uapcore.lightpit.viewmodel.IssueDetailView
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 import de.uapcore.lightpit.viewmodel.PathInfos
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 import de.uapcore.lightpit.viewmodel.PathInfosFull
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 import de.uapcore.lightpit.viewmodel.projectNavMenu
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 import java.sql.Date
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 fun Issue.hasChanged(reference: Issue) = !(component == reference.component &&
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 status == reference.status &&
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 category == reference.category &&
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 subject == reference.subject &&
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 description == reference.description &&
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 assignee == reference.assignee &&
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 eta == reference.eta &&
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 affected == reference.affected &&
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 resolved == reference.resolved)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 fun Issue.compareEtaTo(date: Date?): Int {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 val eta = this.eta
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 return if (eta == null && date == null) 0
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 else if (eta == null) 1
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 else if (date == null) -1
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 else eta.compareTo(date)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 fun Issue.applyFormData(http: HttpRequest, dao: DataAccessObject): Issue = this.apply {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 component = dao.findComponent(http.param("component")?.toIntOrNull() ?: -1)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 category = IssueCategory.valueOf(http.param("category") ?: "")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 status = IssueStatus.valueOf(http.param("status") ?: "")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 subject = http.param("subject") ?: ""
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42 description = http.param("description") ?: ""
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 assignee = http.param("assignee")?.toIntOrNull()?.let {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 when (it) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45 -1 -> null
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 -2 -> (component?.lead ?: project.owner)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 else -> dao.findUser(it)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 // TODO: process error messages
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 eta = http.param("eta", ::dateOptValidator, null, mutableListOf())
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 affected = http.param("affected")?.toIntOrNull()?.takeIf { it > 0 }?.let { Version(it, project.id) }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 resolved = http.param("resolved")?.toIntOrNull()?.takeIf { it > 0 }?.let { Version(it, project.id) }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 fun processIssueForm(issue: Issue, reference: Issue, http: HttpRequest, dao: DataAccessObject) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 if (issue.hasChanged(reference)) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 dao.updateIssue(issue)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 dao.insertHistoryEvent(issue)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 val newComment = http.param("comment")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 if (!newComment.isNullOrBlank()) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64 val comment = IssueComment(-1, issue.id).apply {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 author = http.remoteUser?.let { dao.findUserByName(it) }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 comment = newComment
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 val commentid = dao.insertComment(comment)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 dao.insertHistoryEvent(issue, comment, commentid)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 fun commitIssueComment(http: HttpRequest, dao: DataAccessObject, pathInfos: PathInfos) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 val issue = http.pathParams["issue"]?.toIntOrNull()?.let(dao::findIssue)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 if (issue == null) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 http.response.sendError(404)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 return
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 if (processIssueComment(issue, http, dao)) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 http.renderCommit("${pathInfos.issuesHref}${issue.id}")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 fun processIssueComment(issue:Issue, http: HttpRequest, dao: DataAccessObject): Boolean {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 val commentId = http.param("commentid")?.toIntOrNull() ?: -1
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
86 if (commentId > 0) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87 val comment = dao.findComment(commentId)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 if (comment == null) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
89 http.response.sendError(404)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90 return false
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 val originalAuthor = comment.author?.username
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 if (originalAuthor != null && originalAuthor == http.remoteUser) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94 val newComment = http.param("comment")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 if (!newComment.isNullOrBlank()) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96 comment.comment = newComment
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 dao.updateComment(comment)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 dao.insertHistoryEvent(issue, comment)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 } else {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101 http.response.sendError(403)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 return false
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
103 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
104 } else {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105 val comment = IssueComment(-1, issue.id).apply {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106 author = http.remoteUser?.let { dao.findUserByName(it) }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 comment = http.param("comment") ?: ""
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 val newId = dao.insertComment(comment)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 dao.insertHistoryEvent(issue, comment, newId)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 return true
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115 fun renderIssueView(
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 http: HttpRequest,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
117 dao: DataAccessObject,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118 issue: Issue,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119 pathInfos: PathInfos,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120 relationError: String? = null
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
121 ) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
122 val comments = dao.listComments(issue)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
123
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 with(http) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 pageTitle = "#${issue.id} ${issue.subject} (${issue.project.name})"
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 view = IssueDetailView(
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127 issue,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
128 comments,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
129 dao.listIssues(issue.project, true),
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 dao.listIssueRelations(issue),
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
131 dao.listCommitRefs(issue),
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
132 relationError,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
133 pathInfos
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
134 )
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
135 if (pathInfos is PathInfosFull) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
136 navigationMenu = projectNavMenu(dao.listProjects(), pathInfos)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
137 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
138 styleSheets = listOf("projects")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
139 javascript = "issue-editor"
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
140 render("issue-view")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
141 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
142 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
143
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
144 fun addIssueRelation(http: HttpRequest, dao: DataAccessObject, pathInfos: PathInfos) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
145 val issue = http.pathParams["issue"]?.toIntOrNull()?.let(dao::findIssue)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
146 if (issue == null) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
147 http.response.sendError(404)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
148 return
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
149 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
150
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
151 // determine the relation type
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
152 val type: Pair<RelationType, Boolean>? = http.param("type")?.let {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
153 try {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
154 if (it.startsWith("!")) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
155 Pair(RelationType.valueOf(it.substring(1)), true)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
156 } else {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
157 Pair(RelationType.valueOf(it), false)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
158 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
159 } catch (_: IllegalArgumentException) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
160 null
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
161 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
162 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
163
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
164 // if the relation type was invalid, send HTTP 500
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
165 if (type == null) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
166 http.response.sendError(500)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
167 return
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
168 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
169
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
170 // determine the target issue
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
171 val targetIssue: Issue? = http.param("issue")?.let {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
172 if (it.startsWith("#") && it.length > 1) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
173 it.substring(1).split(" ", limit = 2)[0].toIntOrNull()
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
174 ?.let(dao::findIssue)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
175 ?.takeIf { target -> target.project.id == issue.project.id }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
176 } else {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
177 null
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
178 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
179 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
180
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
181 // check if the target issue is valid
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
182 if (targetIssue == null) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
183 renderIssueView(http, dao, issue, pathInfos, "issue.relations.target.invalid")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
184 return
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
185 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
186
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
187 // commit the result
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
188 dao.insertIssueRelation(IssueRelation(issue, targetIssue, type.first, type.second))
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
189 http.renderCommit("${pathInfos.issuesHref}${issue.id}")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
190 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
191
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
192 fun removeIssueRelation(http: HttpRequest, dao: DataAccessObject, pathInfos: PathInfos) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
193 val issue = http.pathParams["issue"]?.toIntOrNull()?.let(dao::findIssue)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
194 if (issue == null) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
195 http.response.sendError(404)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
196 return
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
197 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
198
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
199 // determine relation
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
200 val type = http.param("type")?.let {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
201 try {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
202 RelationType.valueOf(it)}
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
203 catch (_:IllegalArgumentException) {null}
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
204 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
205 if (type == null) {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
206 http.response.sendError(500)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
207 return
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
208 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
209 val rel = http.param("to")?.toIntOrNull()?.let(dao::findIssue)?.let {
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
210 IssueRelation(
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
211 issue,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
212 it,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
213 type,
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
214 http.param("reverse")?.toBoolean() ?: false
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
215 )
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
216 }
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
217
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
218 // execute removal, if there is something to remove
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
219 rel?.run(dao::deleteIssueRelation)
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
220
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
221 // always pretend that the operation was successful - if there was nothing to remove, it's okay
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
222 http.renderCommit("${pathInfos.issuesHref}${issue.id}")
bf67e0ff7131 add new global issues page - fixes #404
Mike Becker <universe@uap-core.de>
parents:
diff changeset
223 }

mercurial