Sat, 27 Nov 2021 10:44:17 +0100
#109 add assignee filter to rss feed
195 | 1 | /* |
2 | * Copyright 2021 Mike Becker. All rights reserved. | |
3 | * | |
4 | * Redistribution and use in source and binary forms, with or without | |
5 | * modification, are permitted provided that the following conditions are met: | |
6 | * | |
7 | * 1. Redistributions of source code must retain the above copyright | |
8 | * notice, this list of conditions and the following disclaimer. | |
9 | * | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * | |
14 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
15 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
17 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
18 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
19 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
20 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
21 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
22 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
23 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
24 | */ | |
25 | ||
26 | package de.uapcore.lightpit.servlet | |
27 | ||
236 | 28 | import com.github.difflib.text.DiffRow |
29 | import com.github.difflib.text.DiffRowGenerator | |
195 | 30 | import de.uapcore.lightpit.AbstractServlet |
31 | import de.uapcore.lightpit.HttpRequest | |
32 | import de.uapcore.lightpit.dao.DataAccessObject | |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
33 | import de.uapcore.lightpit.entities.IssueHistoryData |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
34 | import de.uapcore.lightpit.entities.IssueHistoryEntry |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
35 | import de.uapcore.lightpit.viewmodel.IssueDiff |
195 | 36 | import de.uapcore.lightpit.viewmodel.IssueFeed |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
37 | import de.uapcore.lightpit.viewmodel.IssueFeedEntry |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
38 | import java.text.SimpleDateFormat |
195 | 39 | import javax.servlet.annotation.WebServlet |
40 | ||
236 | 41 | |
195 | 42 | @WebServlet(urlPatterns = ["/feed/*"]) |
43 | class FeedServlet : AbstractServlet() { | |
44 | ||
45 | init { | |
198
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
46 | get("/%project/issues.rss", this::issues) |
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
47 | } |
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
48 | |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
49 | private fun fullContent(issue: IssueHistoryData) = IssueDiff( |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
50 | issue.id, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
51 | issue.subject, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
52 | issue.component, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
53 | issue.status.name, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
54 | issue.category.name, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
55 | issue.subject, |
236 | 56 | issue.description.replace("\r", ""), |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
57 | issue.assignee, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
58 | issue.eta?.let { SimpleDateFormat("dd.MM.yyyy").format(it) } ?: "", |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
59 | issue.affected, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
60 | issue.resolved |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
61 | ) |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
62 | |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
63 | private fun diffContent(cur: IssueHistoryData, next: IssueHistoryData): IssueDiff { |
236 | 64 | val generator = DiffRowGenerator.create() |
65 | .showInlineDiffs(true) | |
66 | .mergeOriginalRevised(true) | |
67 | .inlineDiffByWord(true) | |
68 | .oldTag { start -> if (start) "<strike style=\"color:red\">" else "</strike>" } | |
69 | .newTag { start -> if (start) "<i style=\"color: green\">" else "</i>" } | |
70 | .build() | |
71 | ||
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
72 | val prev = fullContent(next) |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
73 | val diff = fullContent(cur) |
236 | 74 | |
75 | val result = generator.generateDiffRows( | |
238
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
76 | listOf( |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
77 | prev.subject, prev.component, prev.status, |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
78 | prev.category, prev.assignee, prev.eta, prev.affected, prev.resolved |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
79 | ), |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
80 | listOf( |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
81 | diff.subject, diff.component, diff.status, |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
82 | diff.category, diff.assignee, diff.eta, diff.affected, diff.resolved |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
83 | ) |
236 | 84 | ) |
85 | ||
86 | diff.subject = result[0].oldLine | |
87 | diff.component = result[1].oldLine | |
88 | diff.status = result[2].oldLine | |
89 | diff.category = result[3].oldLine | |
90 | diff.assignee = result[4].oldLine | |
91 | diff.eta = result[5].oldLine | |
92 | diff.affected = result[6].oldLine | |
93 | diff.resolved = result[7].oldLine | |
94 | ||
95 | diff.description = generator.generateDiffRows( | |
96 | prev.description.split('\n'), | |
97 | diff.description.split('\n') | |
98 | ).joinToString("<br>", transform = DiffRow::getOldLine) | |
99 | ||
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
100 | return diff |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
101 | } |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
102 | |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
103 | /** |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
104 | * Generates the feed entries. |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
105 | * Assumes that [historyEntry] is already sorted by timestamp (descending). |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
106 | */ |
238
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
107 | private fun generateFeedEntries(historyEntry: List<IssueHistoryEntry>): List<IssueFeedEntry> = |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
108 | if (historyEntry.isEmpty()) { |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
109 | emptyList() |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
110 | } else { |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
111 | historyEntry.groupBy { it.data.id }.mapValues { (_, history) -> |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
112 | history.zipWithNext().map { (cur, next) -> |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
113 | IssueFeedEntry( |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
114 | cur.time, cur.type, diffContent(cur.data, next.data) |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
115 | ) |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
116 | }.plus( |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
117 | history.last().let { IssueFeedEntry(it.time, it.type, fullContent(it.data)) } |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
118 | ) |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
119 | }.flatMap { it.value }.sortedByDescending { it.time } |
1d48b38ca349
fix diff generated between feed entries with different issue IDs
Mike Becker <universe@uap-core.de>
parents:
236
diff
changeset
|
120 | } |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
121 | |
195 | 122 | private fun issues(http: HttpRequest, dao: DataAccessObject) { |
198
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
123 | val project = http.pathParams["project"]?.let { dao.findProjectByNode(it) } |
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
124 | if (project == null) { |
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
125 | http.response.sendError(404) |
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
126 | return |
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
127 | } |
239
9365c7fb0240
#109 add assignee filter to rss feed
Mike Becker <universe@uap-core.de>
parents:
238
diff
changeset
|
128 | val assignees = http.param("assignee")?.split(',') |
195 | 129 | |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
130 | val days = http.param("days")?.toIntOrNull() ?: 30 |
198
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
131 | |
239
9365c7fb0240
#109 add assignee filter to rss feed
Mike Becker <universe@uap-core.de>
parents:
238
diff
changeset
|
132 | val issuesFromDb = dao.listIssueHistory(project.id, days) |
9365c7fb0240
#109 add assignee filter to rss feed
Mike Becker <universe@uap-core.de>
parents:
238
diff
changeset
|
133 | val issueHistory = if (assignees == null) issuesFromDb else |
9365c7fb0240
#109 add assignee filter to rss feed
Mike Becker <universe@uap-core.de>
parents:
238
diff
changeset
|
134 | issuesFromDb.filter { assignees.contains(it.data.assigneeUsername) } |
9365c7fb0240
#109 add assignee filter to rss feed
Mike Becker <universe@uap-core.de>
parents:
238
diff
changeset
|
135 | |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
136 | // TODO: add comment history depending on parameter |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
137 | |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
138 | http.view = IssueFeed(project, generateFeedEntries(issueHistory)) |
198
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
139 | http.renderFeed("issues-feed") |
195 | 140 | } |
141 | } |