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