Skip to content

Commit f632266

Browse files
authored
Add pagination to requests and discussions, improve message (#1)
- Added pagination. Now we able to fetch all possible requests and discussions for single request - Improved message. Added authors of unresolved threads for request and who has approved
1 parent dcc3919 commit f632266

File tree

3 files changed

+75
-4
lines changed

3 files changed

+75
-4
lines changed

api/gitlab.js api/GitLab.js

+23-2
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,38 @@ class GitLab {
2525
}
2626

2727
const uri = this.__getUrl("projects", project, "merge_requests")
28-
return this.__get(uri, query)
28+
return this.__getPaginated(uri, query)
2929
}
3030

3131
discussions = (project, request) => {
32+
const query = { page: 1, per_page: 100 }
3233
const uri = this.__getUrl("projects", project, "merge_requests", request, "discussions")
33-
return this.__get(uri)
34+
35+
return this.__getPaginated(uri, query)
3436
}
3537

3638
__getUrl = (...parts) => url.build(this.baseUrl, ...parts)
3739

3840
__get = (url, query = {}) => network.get(url, query, { "Private-Token": this.token })
41+
42+
__getPaginated = (uri, query = {}) => {
43+
return this.__get(uri, query).then(async results => {
44+
const { headers } = results
45+
const totalPages = parseInt(headers["x-total-pages"]) || 1
46+
47+
let page = 1
48+
let allResults = results
49+
50+
while (totalPages > page) {
51+
page += 1
52+
53+
const nextPageResults = await this.__get(uri, { ...query, page })
54+
allResults = allResults.concat(nextPageResults)
55+
}
56+
57+
return Promise.resolve(allResults)
58+
})
59+
}
3960
}
4061

4162
module.exports = GitLab

tasks/unapproved.js tasks/Unapproved.js

+50-1
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,19 @@ class Unapproved extends BaseCommand {
4141
const link = `[${request.title}](${request.web_url})`
4242
const author = `@${request.author.username}`
4343
const project = `[${request.project.name}](${request.project.web_url})`
44+
const unresolvedAuthors = this.__unresolvedAuthorsString(request)
45+
const approvedBy = this.__approvedByString(request)
4446

45-
return `${reaction} **${link}** (${project}) by **${author}**`
47+
let message = [`${reaction} **${link}** (${project}) by **${author}**`]
48+
49+
if (unresolvedAuthors.length > 0) {
50+
message.push(`unresolved threads by: ${unresolvedAuthors}`)
51+
}
52+
if (approvedBy.length > 0) {
53+
message.push(`already approved by: ${approvedBy}`)
54+
}
55+
56+
return message.join("\n")
4657
}
4758

4859
__getEmoji = lastUpdate => {
@@ -89,6 +100,44 @@ class Unapproved extends BaseCommand {
89100
__appendDiscussions = (project, request) => this.gitlab
90101
.discussions(project.id, request.iid)
91102
.then(discussions => ({ ...request, discussions }))
103+
104+
__unresolvedAuthorsString = request => {
105+
return this.__unresolvedAuthorsFor(request).map(author => {
106+
return `@${author.username}`
107+
}).join(", ")
108+
}
109+
110+
__approvedByString = request => {
111+
return request.approved_by.map(approve => {
112+
const { user } = approve
113+
114+
return `@${user.username}`
115+
}).join(", ")
116+
}
117+
118+
__unresolvedAuthorsFor = request => {
119+
const { discussions } = request
120+
121+
const userNames = _.flow(
122+
_.partialRight(
123+
_.filter,
124+
discussion => discussion.notes.some(
125+
note => note.resolvable && !note.resolved
126+
)
127+
),
128+
_.partialRight(
129+
_.map,
130+
discussion => discussion.notes.map(note => note.author)
131+
),
132+
_.partialRight(_.flatten),
133+
_.partialRight(
134+
_.uniqBy,
135+
author => author.username
136+
),
137+
)
138+
139+
return userNames(discussions)
140+
}
92141
}
93142

94143
module.exports = Unapproved

utils/network.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ const get = (uri, params = {}, headers = {}) => new Promise((resolve, reject) =>
1414

1515
resp.on("data", chunk => (data += chunk))
1616
resp.on("end", () => {
17-
const json = JSON.parse(data)
17+
let json = JSON.parse(data)
18+
json.headers = resp.headers
1819
resolve(json)
1920
})
2021
}).on("error", reject)

0 commit comments

Comments
 (0)