71 |
71 |
72 val prev = fullContent(next) |
72 val prev = fullContent(next) |
73 val diff = fullContent(cur) |
73 val diff = fullContent(cur) |
74 |
74 |
75 val result = generator.generateDiffRows( |
75 val result = generator.generateDiffRows( |
76 listOf(prev.subject, prev.component, prev.status, |
76 listOf( |
77 prev.category, prev.assignee, prev.eta, prev.affected, prev.resolved), |
77 prev.subject, prev.component, prev.status, |
78 listOf(diff.subject, diff.component, diff.status, |
78 prev.category, prev.assignee, prev.eta, prev.affected, prev.resolved |
79 diff.category, diff.assignee, diff.eta, diff.affected, diff.resolved) |
79 ), |
|
80 listOf( |
|
81 diff.subject, diff.component, diff.status, |
|
82 diff.category, diff.assignee, diff.eta, diff.affected, diff.resolved |
|
83 ) |
80 ) |
84 ) |
81 |
85 |
82 diff.subject = result[0].oldLine |
86 diff.subject = result[0].oldLine |
83 diff.component = result[1].oldLine |
87 diff.component = result[1].oldLine |
84 diff.status = result[2].oldLine |
88 diff.status = result[2].oldLine |
98 |
102 |
99 /** |
103 /** |
100 * Generates the feed entries. |
104 * Generates the feed entries. |
101 * Assumes that [historyEntry] is already sorted by timestamp (descending). |
105 * Assumes that [historyEntry] is already sorted by timestamp (descending). |
102 */ |
106 */ |
103 private fun generateFeedEntries(historyEntry: List<IssueHistoryEntry>) = |
107 private fun generateFeedEntries(historyEntry: List<IssueHistoryEntry>): List<IssueFeedEntry> = |
104 if (historyEntry.isEmpty()) emptyList() |
108 if (historyEntry.isEmpty()) { |
105 else historyEntry.zipWithNext().map { (cur, next) -> |
109 emptyList() |
106 IssueFeedEntry( |
110 } else { |
107 cur.time, cur.type, diffContent(cur.data, next.data) |
111 historyEntry.groupBy { it.data.id }.mapValues { (_, history) -> |
108 ) |
112 history.zipWithNext().map { (cur, next) -> |
109 }.plus( |
113 IssueFeedEntry( |
110 historyEntry.last().let { IssueFeedEntry(it.time, it.type, fullContent(it.data)) } |
114 cur.time, cur.type, diffContent(cur.data, next.data) |
111 ) |
115 ) |
|
116 }.plus( |
|
117 history.last().let { IssueFeedEntry(it.time, it.type, fullContent(it.data)) } |
|
118 ) |
|
119 }.flatMap { it.value }.sortedByDescending { it.time } |
|
120 } |
112 |
121 |
113 private fun issues(http: HttpRequest, dao: DataAccessObject) { |
122 private fun issues(http: HttpRequest, dao: DataAccessObject) { |
114 val project = http.pathParams["project"]?.let { dao.findProjectByNode(it) } |
123 val project = http.pathParams["project"]?.let { dao.findProjectByNode(it) } |
115 if (project == null) { |
124 if (project == null) { |
116 http.response.sendError(404) |
125 http.response.sendError(404) |