Skip to content

Commit 1a45af3

Browse files
committed
Merge branch 'develop' into feature/inDiscord
2 parents 088b2e9 + eb0a1b1 commit 1a45af3

File tree

8 files changed

+67
-18
lines changed

8 files changed

+67
-18
lines changed

controllers/issues.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,15 @@ const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages");
1010

1111
const getIssues = async (req, res) => {
1212
try {
13-
const issues = await issuesService.getOrgIssues();
13+
const { q: queryString } = req.query;
14+
let issues = {};
15+
if (queryString) {
16+
const searchedIssues = await issuesService.searchOrgIssues(queryString);
17+
issues.data = searchedIssues?.data?.items ?? [];
18+
} else {
19+
issues = await issuesService.getOrgIssues();
20+
}
21+
1422
let issuesData = issues.data.length > 0 ? issues.data : [];
1523
issuesData = issuesData.filter((issue) => !Object.keys(issue).includes("pull_request"));
1624
issuesData = issuesData.map(async (issue) => {

controllers/users.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -455,12 +455,12 @@ const filterUsers = async (req, res) => {
455455
if (!Object.keys(req.query).length) {
456456
return res.boom.badRequest("filter for item not provided");
457457
}
458-
const allUsers = await userQuery.getUsersBasedOnFilter(req.query);
458+
const users = await userQuery.getUsersBasedOnFilter(req.query);
459459

460460
return res.json({
461-
message: "Users found successfully!",
462-
users: allUsers,
463-
count: allUsers.length,
461+
message: users.length ? "Users found successfully!" : "No users found",
462+
users,
463+
count: users.length,
464464
});
465465
} catch (error) {
466466
logger.error(`Error while fetching all users: ${error}`);

middlewares/validators/user.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,14 +172,17 @@ async function validateUserQueryParams(req, res, next) {
172172
joi.array().items(joi.string().valid("IDLE", "OOO", "ACTIVE"))
173173
)
174174
.optional(),
175+
})
176+
.messages({
177+
"object.min": "Please provide at least one filter criteria",
175178
});
176179

177180
try {
178181
await schema.validateAsync(req.query);
179182
next();
180183
} catch (error) {
181184
logger.error(`Error validating query params : ${error}`);
182-
res.boom.badRequest(error.details[0].message);
185+
res.boom.badRequest(error);
183186
}
184187
}
185188

models/users.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -395,18 +395,24 @@ const getUsersBasedOnFilter = async (query) => {
395395
let finalItems = [];
396396

397397
if (doesTagQueryExist && doesStateQueryExist) {
398-
const stateItemIds = new Set(stateItems.map((item) => item.userId));
399-
finalItems = tagItems.filter((item) => stateItemIds.has(item.itemId)).map((item) => item.itemId);
398+
if (stateItems.length && tagItems.length) {
399+
const stateItemIds = new Set(stateItems.map((item) => item.userId));
400+
finalItems = tagItems.filter((item) => stateItemIds.has(item.itemId)).map((item) => item.itemId);
401+
}
400402
} else if (doesStateQueryExist) {
401403
finalItems = stateItems.map((item) => item.userId);
402404
} else if (doesTagQueryExist) {
403405
finalItems = tagItems.map((item) => item.itemId);
404406
}
405407

406-
finalItems = [...new Set(finalItems)];
407-
const userRefs = finalItems.map((itemId) => userModel.doc(itemId));
408-
const userDocs = (await firestore.getAll(...userRefs)).map((doc) => ({ id: doc.id, ...doc.data() }));
409-
return userDocs;
408+
if (finalItems.length) {
409+
finalItems = [...new Set(finalItems)];
410+
const userRefs = finalItems.map((itemId) => userModel.doc(itemId));
411+
const userDocs = (await firestore.getAll(...userRefs)).map((doc) => ({ id: doc.id, ...doc.data() }));
412+
const filteredUserDocs = userDocs.filter((doc) => !doc.roles?.archived);
413+
return filteredUserDocs;
414+
}
415+
return [];
410416
};
411417
const getAllUsers = async () => {
412418
try {

services/githubService.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ const extractPRdetails = (data) => {
4848
* @param searchParams {Object} - List of params to create github API URL
4949
* @param resultsOptions {Object} - Ordering and pagination of results
5050
*/
51-
const getGithubURL = (searchParams, resultsOptions = {}) => {
51+
const getGithubURL = (searchParams, resultsOptions = {}, searchString) => {
5252
const baseURL = config.get("githubApi.baseUrl");
5353
const issuesAndPRsPath = "/search/issues";
5454

@@ -65,7 +65,11 @@ const getGithubURL = (searchParams, resultsOptions = {}) => {
6565
const paramsStrArr = paramsObjArr.map(([key, value]) => `${key}:${value}`);
6666

6767
// The string that can be entrered as text on Github website for simple search
68-
const prsSearchText = paramsStrArr.join(" ");
68+
let prsSearchText = paramsStrArr.join(" ");
69+
70+
if (searchString) {
71+
prsSearchText = `${searchString} ${prsSearchText}`;
72+
}
6973

7074
urlObj.searchParams.append("q", prsSearchText);
7175

@@ -178,7 +182,7 @@ const fetchMergedPRs = async (params = {}) => {
178182
};
179183

180184
const fetchOpenIssues = async (params = {}) => {
181-
const { perPage = 100, page = 1, searchParams = {}, resultOptions = {} } = params;
185+
const { perPage = 100, page = 1, searchParams = {}, resultOptions = {}, searchString = "" } = params;
182186

183187
try {
184188
const url = getGithubURL(
@@ -192,7 +196,8 @@ const fetchOpenIssues = async (params = {}) => {
192196
...resultOptions,
193197
per_page: perPage,
194198
page,
195-
}
199+
},
200+
searchString
196201
);
197202
return getFetch(url);
198203
} catch (err) {
@@ -239,6 +244,7 @@ const fetchIssues = async () => {
239244
createdURL,
240245
{
241246
filter: "all",
247+
state: "open",
242248
},
243249
{
244250
Accept: "application/vnd.github+json",

services/issuesService.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@ const getOrgIssues = async () => {
99
return data;
1010
};
1111

12+
const searchOrgIssues = async (searchString) => {
13+
const data = await githubService.fetchOpenIssues({
14+
searchString,
15+
});
16+
17+
return data;
18+
};
19+
1220
module.exports = {
1321
getOrgIssues,
22+
searchOrgIssues,
1423
};

test/integration/usersFilter.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ describe("Filter Users", function () {
121121
});
122122

123123
// eslint-disable-next-line mocha/no-skipped-tests
124-
describe.skip("GET /users/search", function () {
124+
describe("GET /users/search", function () {
125125
it("Should search users based on state", function (done) {
126126
chai
127127
.request(app)
@@ -203,7 +203,7 @@ describe("Filter Users", function () {
203203
expect(res.body.message).to.equal("Users found successfully!");
204204
expect(res.body.users).to.be.a("array");
205205
expect(res.body.users.length).to.equal(2);
206-
assertUserIds(res.body.users, [activeUser, oooUser, idleUser]);
206+
assertUserIds(res.body.users, [oooUser, idleUser]);
207207
return done();
208208
});
209209
});

test/unit/services/githubService.test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,21 @@ describe("githubService", function () {
138138
expect(response).to.be.equal(`https://api.github.com/orgs/Real-Dev-Squad/issues`);
139139
});
140140
});
141+
142+
describe("fetchOpenIssues with search query param", function () {
143+
it("Should generate the correct url to fetch open issues with search param", async function () {
144+
const searchString = "website";
145+
const response = await githubService.fetchOpenIssues({
146+
searchString,
147+
});
148+
149+
const baseURL = config.get("githubApi.baseUrl");
150+
const org = config.get("githubApi.org");
151+
const path = "search/issues";
152+
const searchParams = `org%3A${org}+type%3Aissue+is%3Aopen&sort=created&per_page=100&page=1`;
153+
154+
const url = `${baseURL}/${path}?q=${searchString}+${searchParams}`;
155+
expect(response).to.be.equal(url);
156+
});
157+
});
141158
});

0 commit comments

Comments
 (0)