diff -r d71bc6db42ef -r 4258b9e010ae src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt
--- a/src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt Sat Oct 09 17:46:12 2021 +0200
+++ b/src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt Sat Oct 09 20:05:39 2021 +0200
@@ -28,10 +28,12 @@
import de.uapcore.lightpit.AbstractServlet
import de.uapcore.lightpit.HttpRequest
import de.uapcore.lightpit.dao.DataAccessObject
-import de.uapcore.lightpit.util.IssueFilter
-import de.uapcore.lightpit.util.IssueSorter
-import de.uapcore.lightpit.util.SpecificFilter
+import de.uapcore.lightpit.entities.IssueHistoryData
+import de.uapcore.lightpit.entities.IssueHistoryEntry
+import de.uapcore.lightpit.viewmodel.IssueDiff
import de.uapcore.lightpit.viewmodel.IssueFeed
+import de.uapcore.lightpit.viewmodel.IssueFeedEntry
+import java.text.SimpleDateFormat
import javax.servlet.annotation.WebServlet
@WebServlet(urlPatterns = ["/feed/*"])
@@ -41,6 +43,43 @@
get("/%project/issues.rss", this::issues)
}
+ private fun String.convertLF() = replace("\r", "").replace("\n", "
")
+
+ private fun fullContent(issue: IssueHistoryData) = IssueDiff(
+ issue.id,
+ issue.subject,
+ issue.component,
+ issue.status.name,
+ issue.category.name,
+ issue.subject,
+ issue.description.convertLF(),
+ issue.assignee,
+ issue.eta?.let { SimpleDateFormat("dd.MM.yyyy").format(it) } ?: "",
+ issue.affected,
+ issue.resolved
+ )
+
+ private fun diffContent(cur: IssueHistoryData, next: IssueHistoryData): IssueDiff {
+ val prev = fullContent(next)
+ val diff = fullContent(cur)
+ // TODO: compute and apply diff
+ return diff
+ }
+
+ /**
+ * Generates the feed entries.
+ * Assumes that [historyEntry] is already sorted by timestamp (descending).
+ */
+ private fun generateFeedEntries(historyEntry: List) =
+ if (historyEntry.isEmpty()) emptyList()
+ else historyEntry.zipWithNext().map { (cur, next) ->
+ IssueFeedEntry(
+ cur.time, cur.type, diffContent(cur.data, next.data)
+ )
+ }.plus(
+ historyEntry.last().let { IssueFeedEntry(it.time, it.type, fullContent(it.data)) }
+ )
+
private fun issues(http: HttpRequest, dao: DataAccessObject) {
val project = http.pathParams["project"]?.let { dao.findProjectByNode(it) }
if (project == null) {
@@ -48,10 +87,12 @@
return
}
- // TODO: add a timestamp filter (e.g. last 30 days)
- val issues = dao.listIssues(IssueFilter(SpecificFilter(project))).sortedWith(IssueSorter.DEFAULT_ISSUE_SORTER)
+ val days = http.param("days")?.toIntOrNull() ?: 30
- http.view = IssueFeed(project, issues)
+ val issueHistory = dao.listIssueHistory(project.id, days)
+ // TODO: add comment history depending on parameter
+
+ http.view = IssueFeed(project, generateFeedEntries(issueHistory))
http.renderFeed("issues-feed")
}
}
\ No newline at end of file