Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev to main sync #2302

Merged
merged 2 commits into from
Dec 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading