Skip to content

Commit b95dd3a

Browse files
Merge pull request #946 from khalatevarun/feat/filter-users
Feat: sorting and filtering users
2 parents dfa8b69 + a309304 commit b95dd3a

File tree

11 files changed

+431
-28
lines changed

11 files changed

+431
-28
lines changed

controllers/pullRequests.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const githubService = require("../services/githubService");
22
const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages");
3+
const { ORDER_TYPE } = require("../utils/pullRequests");
34

45
/**
56
* Collects all pull requests and sends only required data for each pull request
@@ -38,8 +39,9 @@ const getUserPRs = async (req, res) => {
3839
*/
3940
const getStalePRs = async (req, res) => {
4041
try {
42+
const order = ORDER_TYPE.ASC;
4143
const { size, page } = req.query;
42-
const { data } = await githubService.fetchStalePRs(size, page);
44+
const { data } = await githubService.fetchOpenPRs({ perPage: size, page, resultOptions: { order } });
4345

4446
if (data.total_count) {
4547
const allPRs = githubService.extractPRdetails(data);
@@ -67,8 +69,9 @@ const getStalePRs = async (req, res) => {
6769
*/
6870
const getOpenPRs = async (req, res) => {
6971
try {
72+
const order = ORDER_TYPE.DESC;
7073
const { size, page } = req.query;
71-
const { data } = await githubService.fetchOpenPRs(size, page);
74+
const { data } = await githubService.fetchOpenPRs({ perPage: size, page, resultOptions: { order } });
7275

7376
if (data.total_count) {
7477
const allPRs = githubService.extractPRdetails(data);

controllers/users.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ const { logType } = require("../constants/logs");
88
const { fetch } = require("../utils/fetch");
99
const logger = require("../utils/logger");
1010
const obfuscate = require("../utils/obfuscate");
11-
const { getPaginationLink } = require("../utils/users");
11+
const { getPaginationLink, getFilteredUsers } = require("../utils/users");
12+
const { getQualifiers } = require("../utils/helper");
1213
const { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } = require("../constants/errorMessages");
14+
const { getFilteredPRsOrIssues } = require("../utils/pullRequests");
1315

1416
const verifyUser = async (req, res) => {
1517
const userId = req.userData.id;
@@ -65,7 +67,23 @@ const getUserById = async (req, res) => {
6567

6668
const getUsers = async (req, res) => {
6769
try {
68-
const { allUsers, nextId, prevId } = await userQuery.fetchUsers(req.query);
70+
const query = req.query?.query ?? "";
71+
const qualifiers = getQualifiers(query);
72+
73+
if (qualifiers?.filterBy) {
74+
const allPRs = await getFilteredPRsOrIssues(qualifiers);
75+
76+
const { allUsers } = await userQuery.fetchAllUsers();
77+
78+
const filteredUsers = getFilteredUsers(allPRs, allUsers);
79+
80+
return res.json({
81+
message: "Users returned successfully!",
82+
users: filteredUsers,
83+
});
84+
}
85+
86+
const { allUsers, nextId, prevId } = await userQuery.fetchPaginatedUsers(req.query);
6987

7088
return res.json({
7189
message: "Users returned successfully!",

middlewares/validators/user.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ async function getUsers(req, res, next) {
137137
.messages({
138138
"string.empty": "prev value cannot be empty",
139139
}),
140+
query: joi.string().optional(),
140141
});
141142
try {
142143
await schema.validateAsync(req.query);

models/users.js

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ const getSuggestedUsers = async (skill) => {
129129
* @param query { search, next, prev, size, page }: Filter for users
130130
* @return {Promise<userModel|Array>}
131131
*/
132-
const fetchUsers = async (query) => {
132+
const fetchPaginatedUsers = async (query) => {
133133
try {
134134
// INFO: default user size set to 100
135135
// INFO: https://github.com/Real-Dev-Squad/website-backend/pull/873#discussion_r1064229932
@@ -178,6 +178,33 @@ const fetchUsers = async (query) => {
178178
}
179179
};
180180

181+
const fetchAllUsers = async () => {
182+
try {
183+
const dbQuery = userModel;
184+
185+
const snapshot = await dbQuery.get();
186+
187+
const allUsers = [];
188+
189+
snapshot.forEach((doc) => {
190+
allUsers.push({
191+
id: doc.id,
192+
...doc.data(),
193+
phone: undefined,
194+
email: undefined,
195+
tokens: undefined,
196+
chaincode: undefined,
197+
});
198+
});
199+
return {
200+
allUsers,
201+
};
202+
} catch (err) {
203+
logger.error("Error retrieving user data", err);
204+
throw err;
205+
}
206+
};
207+
181208
/**
182209
* Fetches the user data from the the provided username or userId
183210
*
@@ -355,7 +382,7 @@ const getUsersBasedOnFilter = async (query) => {
355382

356383
module.exports = {
357384
addOrUpdate,
358-
fetchUsers,
385+
fetchPaginatedUsers,
359386
fetchUser,
360387
setIncompleteUserDetails,
361388
initializeUser,
@@ -365,5 +392,6 @@ module.exports = {
365392
getJoinData,
366393
getSuggestedUsers,
367394
fetchUserSkills,
395+
fetchAllUsers,
368396
getUsersBasedOnFilter,
369397
};

services/githubService.js

Lines changed: 72 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ const getGithubURL = (searchParams, resultsOptions = {}) => {
5656

5757
const defaultParams = {
5858
org: config.get("githubApi.org"),
59-
type: "pr",
6059
};
6160

6261
const finalSearchParams = Object.assign({}, defaultParams, searchParams);
@@ -102,6 +101,7 @@ const fetchPRsByUser = async (username) => {
102101
const { user } = await fetchUser({ username });
103102
const url = getGithubURL({
104103
author: user.github_id,
104+
type: "pr",
105105
});
106106
return getFetch(url);
107107
} catch (err) {
@@ -111,55 +111,115 @@ const fetchPRsByUser = async (username) => {
111111
};
112112

113113
/**
114-
* Fetches the oldest open `per_page` requests
114+
* Fetches the latest `per_page` open PRs
115+
*
116+
* Order by default is desc, which will fetch latest open PRs,
117+
* to fetch stale PRs just change pass order as asc
118+
*
115119
*/
116-
const fetchStalePRs = async (perPage = 10, page = 1) => {
120+
const fetchOpenPRs = async (params = {}) => {
121+
const { perPage = 100, page = 1, searchParams = {}, resultOptions = {} } = params;
122+
117123
try {
118124
const url = getGithubURL(
119125
{
126+
type: "pr",
120127
is: "open",
128+
...searchParams,
121129
},
122130
{
123131
sort: "created",
124-
order: "asc",
132+
...resultOptions,
125133
per_page: perPage,
126134
page,
127135
}
128136
);
129137
return getFetch(url);
130138
} catch (err) {
131-
logger.error(`Error while fetching pull requests: ${err}`);
139+
logger.error(`Error while fetching open pull requests: ${err}`);
132140
throw err;
133141
}
134142
};
135143

136-
/**
137-
* Fetches the latest `per_page` open PRs
138-
*/
139-
const fetchOpenPRs = async (perPage = 10, page = 1) => {
144+
const fetchMergedPRs = async (params = {}) => {
145+
const { perPage = 100, page = 1, searchParams = {}, resultOptions = {} } = params;
146+
140147
try {
141148
const url = getGithubURL(
142149
{
150+
type: "pr",
151+
is: "merged",
152+
...searchParams,
153+
},
154+
{
155+
sort: "updated",
156+
...resultOptions,
157+
per_page: perPage,
158+
page,
159+
}
160+
);
161+
162+
return getFetch(url);
163+
} catch (err) {
164+
logger.error(`Error while fetching closed pull requests: ${err}`);
165+
throw err;
166+
}
167+
};
168+
169+
const fetchOpenIssues = async (params = {}) => {
170+
const { perPage = 100, page = 1, searchParams = {}, resultOptions = {} } = params;
171+
172+
try {
173+
const url = getGithubURL(
174+
{
175+
type: "issue",
143176
is: "open",
177+
...searchParams,
144178
},
145179
{
146180
sort: "created",
147-
order: "desc",
181+
...resultOptions,
148182
per_page: perPage,
149183
page,
150184
}
151185
);
152186
return getFetch(url);
153187
} catch (err) {
154-
logger.error(`Error while fetching pull requests: ${err}`);
188+
logger.error(`Error while fetching open issues: ${err}`);
189+
throw err;
190+
}
191+
};
192+
193+
const fetchClosedIssues = async (params = {}) => {
194+
const { perPage = 100, page = 1, searchParams = {}, resultOptions = {} } = params;
195+
196+
try {
197+
const url = getGithubURL(
198+
{
199+
type: "issue",
200+
is: "closed",
201+
...searchParams,
202+
},
203+
{
204+
sort: "updated",
205+
...resultOptions,
206+
per_page: perPage,
207+
page,
208+
}
209+
);
210+
return getFetch(url);
211+
} catch (err) {
212+
logger.error(`Error while fetching closed issues: ${err}`);
155213
throw err;
156214
}
157215
};
158216

159217
module.exports = {
160218
fetchPRsByUser,
161219
fetchOpenPRs,
162-
fetchStalePRs,
220+
fetchMergedPRs,
163221
getFetch,
164222
extractPRdetails,
223+
fetchOpenIssues,
224+
fetchClosedIssues,
165225
};

0 commit comments

Comments
 (0)