Skip to content

Commit 46b7470

Browse files
Merge pull request #1686 from Real-Dev-Squad/develop
Dev to Main sync
2 parents fb28aa1 + fdf33ee commit 46b7470

File tree

21 files changed

+1252
-28
lines changed

21 files changed

+1252
-28
lines changed

.github/pull_request_template.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
Date: `change date here`
2+
3+
Developer Name: `developer name here`
4+
5+
----
6+
7+
## Issue Ticket Number:-
8+
- add issue ticket number here e.g `#923`
9+
10+
## Description:
11+
Add description of the PR here
12+
13+
14+
Is Under Feature Flag
15+
- [x] Yes
16+
- [ ] No
17+
18+
Database changes
19+
- [ ] Yes
20+
- [x] No
21+
22+
Breaking changes (If your feature is breaking/missing something please mention pending tickets)
23+
- [ ] Yes
24+
- [x] No
25+
26+
Is Development Tested?
27+
28+
- [x] Yes
29+
- [ ] No
30+
31+
Tested in staging?
32+
33+
- [x] Yes
34+
- [ ] No
35+
36+
### Add relevant Screenshot below ( e.g test coverage etc. )
37+

constants/taskRequests.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,45 @@ const TASK_REQUEST_STATUS = {
44
PENDING: "PENDING",
55
DENIED: "DENIED",
66
};
7-
7+
const TASK_REQUEST_ERROR_MESSAGE = {
8+
INVALID_PREV: "Invalid 'prev' value",
9+
INVALID_NEXT: "Invalid 'next' value",
10+
};
811
const TASK_REQUEST_TYPE = {
912
ASSIGNMENT: "ASSIGNMENT",
1013
CREATION: "CREATION",
1114
};
15+
const TASK_REQUEST_FILTER_KEYS = {
16+
status: "status",
17+
"request-type": "requestType",
18+
};
19+
const TASK_REQUEST_FILTER_VALUES = {
20+
pending: "PENDING",
21+
approved: "APPROVED",
22+
denied: "DENIED",
23+
assignment: "ASSIGNMENT",
24+
creation: "CREATION",
25+
};
26+
const TASK_REQUEST_SORT_KEYS = {
27+
created: "createdAt",
28+
requestors: "usersCount",
29+
};
30+
const TASK_REQUEST_SORT_VALUES = {
31+
asc: "asc",
32+
desc: "desc",
33+
};
34+
const MIGRATION_TYPE = {
35+
ADD_NEW_FIELDS: "add-new-fields",
36+
REMOVE_OLD_FIELDS: "remove-redundant-fields",
37+
};
1238

13-
module.exports = { TASK_REQUEST_STATUS, TASK_REQUEST_TYPE };
39+
module.exports = {
40+
TASK_REQUEST_STATUS,
41+
TASK_REQUEST_TYPE,
42+
TASK_REQUEST_FILTER_KEYS,
43+
TASK_REQUEST_FILTER_VALUES,
44+
TASK_REQUEST_SORT_KEYS,
45+
TASK_REQUEST_ERROR_MESSAGE,
46+
TASK_REQUEST_SORT_VALUES,
47+
MIGRATION_TYPE
48+
};

controllers/issues.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const issuesService = require("../services/issuesService");
22
const tasks = require("../models/tasks");
33
const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages");
4+
const githubService = require("../services/githubService");
45

56
/**
67
* Get the issues of the repo
@@ -10,9 +11,18 @@ const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages");
1011

1112
const getIssues = async (req, res) => {
1213
try {
13-
const { q: queryString } = req.query;
14+
const { q: queryString, dev } = req.query;
1415
let issues = {};
15-
if (queryString) {
16+
const githubOrg = config.get("githubApi.org");
17+
const githubIssuerUrlPattern = new RegExp(`^https://github.com/${githubOrg}/.+/issues/\\d+$`);
18+
19+
if (githubIssuerUrlPattern.test(queryString) && dev === "true") {
20+
const url = new URL(queryString);
21+
const issueUrlPaths = url.pathname.split("/");
22+
const repositoryName = issueUrlPaths[2];
23+
const issueNumber = issueUrlPaths[4];
24+
issues.data = [await githubService.fetchIssuesById(repositoryName, issueNumber)];
25+
} else if (queryString) {
1626
const searchedIssues = await issuesService.searchOrgIssues(queryString);
1727
issues.data = searchedIssues?.data?.items ?? [];
1828
} else {

controllers/tasksRequests.js

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } = require("../constants/errorMessages");
2-
const { TASK_REQUEST_TYPE } = require("../constants/taskRequests");
2+
const { TASK_REQUEST_TYPE, MIGRATION_TYPE } = require("../constants/taskRequests");
33
const { addLog } = require("../models/logs");
44
const taskRequestsModel = require("../models/taskRequests");
55
const tasksModel = require("../models/tasks.js");
@@ -10,18 +10,20 @@ const usersUtils = require("../utils/users");
1010
const fetchTaskRequests = async (_, res) => {
1111
try {
1212
const { dev } = _.query;
13-
const data = await taskRequestsModel.fetchTaskRequests(dev === "true");
14-
15-
if (data.length > 0) {
16-
return res.status(200).json({
17-
message: "Task requests returned successfully",
18-
data,
19-
});
13+
let data;
14+
if (dev === "true") {
15+
data = await taskRequestsModel.fetchPaginatedTaskRequests(_.query);
16+
if (data.error) {
17+
return res.status(data.statusCode).json(data);
18+
}
19+
} else {
20+
data = {};
21+
data.data = await taskRequestsModel.fetchTaskRequests(true);
2022
}
2123

22-
return res.status(404).json({
23-
message: "Task requests not found",
24-
data,
24+
return res.status(200).json({
25+
message: "Task requests returned successfully",
26+
...data,
2527
});
2628
} catch (err) {
2729
logger.error("Error while fetching task requests", err);
@@ -213,10 +215,34 @@ const approveTaskRequest = async (req, res) => {
213215
}
214216
};
215217

218+
const migrateTaskRequests = async (req, res) => {
219+
try {
220+
const { action } = req.query;
221+
let responseData;
222+
switch (action) {
223+
case MIGRATION_TYPE.ADD_NEW_FIELDS: {
224+
responseData = await taskRequestsModel.addNewFields();
225+
break;
226+
}
227+
case MIGRATION_TYPE.REMOVE_OLD_FIELDS: {
228+
responseData = await taskRequestsModel.removeOldField();
229+
break;
230+
}
231+
default: {
232+
return res.boom.badRequest("Unknown action");
233+
}
234+
}
235+
return res.json({ message: "Task requests migration successful", ...responseData });
236+
} catch (err) {
237+
logger.error("Error in migration scripts", err);
238+
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
239+
}
240+
};
216241
module.exports = {
217242
approveTaskRequest,
218243
addOrUpdate,
219244
fetchTaskRequests,
220245
fetchTaskRequestById,
221246
addTaskRequests,
247+
migrateTaskRequests,
222248
};

middlewares/validators/task-requests.js

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
const joi = require("joi");
2-
const { TASK_REQUEST_TYPE } = require("../../constants/taskRequests");
2+
const { RQLQueryParser } = require("../../utils/RQLParser");
33
const githubOrg = config.get("githubApi.org");
44
const githubBaseUrl = config.get("githubApi.baseUrl");
55
const githubIssuerUrlPattern = new RegExp(`^${githubBaseUrl}/repos/${githubOrg}/.+/issues/\\d+$`);
6+
const { TASK_REQUEST_STATUS, TASK_REQUEST_TYPE } = require("../../constants/taskRequests");
67

78
const postTaskRequests = async (req, res, next) => {
89
const taskAssignmentSchema = joi
@@ -40,6 +41,61 @@ const postTaskRequests = async (req, res, next) => {
4041
}
4142
};
4243

44+
const getTaskRequests = async (req, res, next) => {
45+
const queryParamsSchema = joi
46+
.object()
47+
.keys({
48+
dev: joi.bool().optional().sensitive(),
49+
prev: joi.string().optional(),
50+
next: joi.string().optional(),
51+
size: joi.number().integer().positive().min(1).max(100).optional(),
52+
q: joi.string().optional(),
53+
})
54+
.without("prev", "next")
55+
.with("prev", "size")
56+
.with("next", "size");
57+
58+
const filtersSchema = joi.object().keys({
59+
status: joi
60+
.array()
61+
.items(
62+
joi.object().keys({
63+
value: joi.string().valid(...Object.values(TASK_REQUEST_STATUS).map((value) => value.toLowerCase())),
64+
operator: joi.string().optional(),
65+
})
66+
)
67+
.optional(),
68+
"request-type": joi
69+
.array()
70+
.items(
71+
joi.object().keys({
72+
value: joi.string().valid(...Object.values(TASK_REQUEST_TYPE).map((value) => value.toLowerCase())),
73+
operator: joi.string().optional(),
74+
})
75+
)
76+
.optional(),
77+
});
78+
79+
const sortSchema = joi.object().keys({
80+
created: joi.string().valid("asc", "desc").optional(),
81+
requestors: joi.string().valid("asc", "desc").optional(),
82+
});
83+
try {
84+
const { q: queryString } = req.query;
85+
const rqlQueryParser = new RQLQueryParser(queryString);
86+
87+
await Promise.all([
88+
filtersSchema.validateAsync(rqlQueryParser.getFilterQueries()),
89+
sortSchema.validateAsync(rqlQueryParser.getSortQueries()),
90+
queryParamsSchema.validateAsync(req.query),
91+
]);
92+
next();
93+
} catch (error) {
94+
logger.error(`Error validating get task requests payload : ${error}`);
95+
res.boom.badRequest(error?.details?.[0]?.message || error?.message);
96+
}
97+
};
4398
module.exports = {
99+
getTaskRequests,
44100
postTaskRequests,
45101
};

0 commit comments

Comments
 (0)