Skip to content

Commit

Permalink
Merge pull request #2302 from Real-Dev-Squad/develop
Browse files Browse the repository at this point in the history
Dev to main sync
  • Loading branch information
prakashchoudhary07 authored Dec 18, 2024
2 parents 3fd1c4e + 0df8007 commit f699cdc
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 10 deletions.
30 changes: 21 additions & 9 deletions controllers/tasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -251,20 +251,32 @@ const getUserTasks = async (req, res) => {
* @param req {Object} - Express request object
* @param res {Object} - Express response object
*/

/**
* @deprecated
* WARNING: This API endpoint is being deprecated and will be removed in future versions.
* Please use the updated API endpoint: `/tasks/:username` for retrieving user's task details.
*
* This API is kept temporarily for backward compatibility.
*/

const getSelfTasks = async (req, res) => {
try {
const { username } = req.userData;

if (username) {
if (req.query.completed) {
const allCompletedTasks = await tasks.fetchUserCompletedTasks(username);
return res.json(allCompletedTasks);
} else {
const allTasks = await tasks.fetchSelfTasks(username);
return res.json(allTasks);
}
if (!username) {
return res.boom.notFound("User doesn't exist");
}
return res.boom.notFound("User doesn't exist");

const tasksData = req.query.completed
? await tasks.fetchUserCompletedTasks(username)
: await tasks.fetchSelfTasks(username);

res.set(
"X-Deprecation-Warning",
"WARNING: This endpoint is deprecated and will be removed in the future. Please use /tasks/:username to get the task details."
);
return res.json(tasksData);
} catch (err) {
logger.error(`Error while fetching tasks: ${err}`);
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
Expand Down
2 changes: 2 additions & 0 deletions routes/tasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const enableDevModeMiddleware = (req, res, next) => {

router.get("/", getTasksValidator, cacheResponse({ invalidationKey: ALL_TASKS, expiry: 10 }), tasks.fetchTasks);
router.get("/self", authenticate, tasks.getSelfTasks);

router.get("/overdue", authenticate, authorizeRoles([SUPERUSER]), tasks.overdueTasks);
router.post(
"/",
Expand All @@ -54,6 +55,7 @@ router.patch(
);
router.get("/:id/details", tasks.getTask);
router.get("/:username", tasks.getUserTasks);

router.patch(
"/self/:id",
authenticate,
Expand Down
12 changes: 11 additions & 1 deletion routes/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ const { authorizeAndAuthenticate } = require("../middlewares/authorizeUsersAndSe
const ROLES = require("../constants/roles");
const { Services } = require("../constants/bot");
const authenticateProfile = require("../middlewares/authenticateProfile");
const { devFlagMiddleware } = require("../middlewares/devFlag");
const { userAuthorization } = require("../middlewares/userAuthorization");

router.post("/", authorizeAndAuthenticate([ROLES.SUPERUSER], [Services.CRON_JOB_HANDLER]), users.markUnverified);
router.post("/update-in-discord", authenticate, authorizeRoles([SUPERUSER]), users.setInDiscordScript);
Expand All @@ -35,7 +37,15 @@ router.patch(
);
router.get("/:username", users.getUser);
router.get("/:userId/intro", authenticate, authorizeRoles([SUPERUSER]), users.getUserIntro);
router.put("/self/intro", authenticate, userValidator.validateJoinData, users.addUserIntro);
router.put("/self/intro", authenticate, userValidator.validateJoinData, users.addUserIntro); // This route is being deprecated soon, please use alternate available route `/users/:userId/intro`.
router.put(
"/:userId/intro",
devFlagMiddleware,
authenticate,
userValidator.validateJoinData,
userAuthorization,
users.addUserIntro
);
router.get("/:id/skills", users.getUserSkills);
router.get("/:id/badges", getUserBadges);
router.patch(
Expand Down
8 changes: 8 additions & 0 deletions test/integration/tasks.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,10 @@ describe("Tasks", function () {
return done;
}
expect(res).to.have.status(200);
expect(res).to.have.header(
"X-Deprecation-Warning",
"WARNING: This endpoint is deprecated and will be removed in the future. Please use /tasks/:username to get the task details."
);
expect(res.body).to.be.a("array");
expect(res.body[0].status).to.equal(COMPLETED);

Expand Down Expand Up @@ -630,6 +634,10 @@ describe("Tasks", function () {
.get("/tasks/self")
.set("cookie", `${cookieName}=${authService.generateAuthToken({ userId: assignedUser })}`);
expect(res).to.have.status(200);
expect(res).to.have.header(
"X-Deprecation-Warning",
"WARNING: This endpoint is deprecated and will be removed in the future. Please use /tasks/:username to get the task details."
);
expect(res.body).to.be.a("array");
expect([taskId1, taskId2]).to.include(taskId1);
});
Expand Down
102 changes: 102 additions & 0 deletions test/integration/users.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1579,6 +1579,108 @@ describe("Users", function () {
});
});

describe("PUT /users/:userId/intro", function () {
let userStatusData;

beforeEach(async function () {
await userStatusModel.updateUserStatus(userId, userStatusDataAfterSignup);
const updateStatus = await userStatusModel.updateUserStatus(userId, userStatusDataAfterFillingJoinSection);
userStatusData = (await firestore.collection("usersStatus").doc(updateStatus.id).get()).data();
});

it("should return 409 if the data already present", function (done) {
addJoinData(joinData(userId)[3]);
chai
.request(app)
.put(`/users/${userId}/intro?dev=true`)
.set("Cookie", `${cookieName}=${jwt}`)
.send(joinData(userId)[3])
.end((err, res) => {
if (err) {
return done(err);
}
expect(res).to.have.status(409);
expect(res.body).to.be.a("object");
expect(res.body.message).to.equal("User data is already present!");
return done();
});
});

it("Should store the info in db", function (done) {
chai
.request(app)
.put(`/users/${userId}/intro?dev=true`)
.set("Cookie", `${cookieName}=${jwt}`)
.send(joinData()[2])
.end((err, res) => {
if (err) {
return done(err);
}
expect(res).to.have.status(201);
expect(res.body).to.be.a("object");
expect(res.body.message).to.equal("User join data and newstatus data added and updated successfully");
expect(userStatusData).to.have.own.property("currentStatus");
expect(userStatusData).to.have.own.property("monthlyHours");
expect(userStatusData.currentStatus.state).to.equal("ONBOARDING");
expect(userStatusData.monthlyHours.committed).to.equal(40);
return done();
});
});

it("Should return 401 for Unauthenticated User Request", function (done) {
chai
.request(app)
.put(`/users/${userId}/intro?dev=true`)
.set("Cookie", `${cookieName}=""`)
.send(joinData()[2])
.end((err, res) => {
if (err) {
return done(err);
}
expect(res).to.have.status(401);
expect(res.body).to.be.a("object");
expect(res.body.message).to.equal("Unauthenticated User");
return done();
});
});

it("Should return 400 for invalid Data", function (done) {
chai
.request(app)
.put(`/users/${userId}/intro?dev=true`)
.set("Cookie", `${cookieName}=${jwt}`)
.send(joinData()[1])
.end((err, res) => {
if (err) {
return done(err);
}
expect(res).to.have.status(400);
expect(res.body).to.be.a("object");
expect(res.body.message).to.be.equal('"firstName" is required');
return done();
});
});

it("Should return 403 for Forbidden access", function (done) {
const userId = "anotherUser123";
addJoinData(joinData(userId)[3]);

chai
.request(app)
.put(`/users/${userId}/intro?dev=true`)
.set("cookie", `${cookieName}=${jwt}`)
.send(joinData(userId)[3])
.end((err, res) => {
if (err) return done(err);

expect(res).to.have.status(403);
expect(res.body).to.be.an("object");
expect(res.body.message).to.equal("Unauthorized access");
return done();
});
});
});

describe("PATCH /users/rejectDiff", function () {
let profileDiffsId;

Expand Down

0 comments on commit f699cdc

Please sign in to comment.