Sat, 09 Oct 2021 20:05:39 +0200
change rss feed to display the issue history
TODO: diffs and comments
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 | ||
28 | import de.uapcore.lightpit.AbstractServlet | |
29 | import de.uapcore.lightpit.HttpRequest | |
30 | 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
|
31 | 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
|
32 | 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
|
33 | import de.uapcore.lightpit.viewmodel.IssueDiff |
195 | 34 | 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
|
35 | 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
|
36 | import java.text.SimpleDateFormat |
195 | 37 | import javax.servlet.annotation.WebServlet |
38 | ||
39 | @WebServlet(urlPatterns = ["/feed/*"]) | |
40 | class FeedServlet : AbstractServlet() { | |
41 | ||
42 | 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
|
43 | 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
|
44 | } |
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
45 | |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
46 | private fun String.convertLF() = replace("\r", "").replace("\n", "<br>") |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
47 | |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
48 | 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
|
49 | issue.id, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
50 | issue.subject, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
51 | issue.component, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
52 | issue.status.name, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
53 | issue.category.name, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
54 | issue.subject, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
55 | issue.description.convertLF(), |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
56 | issue.assignee, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
57 | 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
|
58 | issue.affected, |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
59 | issue.resolved |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
60 | ) |
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 | private fun diffContent(cur: IssueHistoryData, next: IssueHistoryData): IssueDiff { |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
63 | val prev = fullContent(next) |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
64 | val diff = fullContent(cur) |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
65 | // TODO: compute and apply diff |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
66 | return diff |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
67 | } |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
68 | |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
69 | /** |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
70 | * Generates the feed entries. |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
71 | * 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
|
72 | */ |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
73 | private fun generateFeedEntries(historyEntry: List<IssueHistoryEntry>) = |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
74 | if (historyEntry.isEmpty()) emptyList() |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
75 | else historyEntry.zipWithNext().map { (cur, next) -> |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
76 | IssueFeedEntry( |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
77 | cur.time, cur.type, diffContent(cur.data, next.data) |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
78 | ) |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
79 | }.plus( |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
80 | historyEntry.last().let { IssueFeedEntry(it.time, it.type, fullContent(it.data)) } |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
81 | ) |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
82 | |
195 | 83 | 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
|
84 | 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
|
85 | 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
|
86 | 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
|
87 | return |
94f174d591ab
fixes wrong handling of feeds - only one channel per feed is allowed
Mike Becker <universe@uap-core.de>
parents:
195
diff
changeset
|
88 | } |
195 | 89 | |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
90 | 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
|
91 | |
235
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
92 | val issueHistory = dao.listIssueHistory(project.id, days) |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
93 | // 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
|
94 | |
4258b9e010ae
change rss feed to display the issue history
Mike Becker <universe@uap-core.de>
parents:
199
diff
changeset
|
95 | 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
|
96 | http.renderFeed("issues-feed") |
195 | 97 | } |
98 | } |