From 156f9c86b1974c49299f29e65498fb0a12bf1d6c Mon Sep 17 00:00:00 2001 From: tejaskh3 Date: Thu, 19 Jun 2025 10:57:50 +0530 Subject: [PATCH 1/6] fix: api to get OOO req and ack OOO req --- controllers/auth.js | 28 ++++++++++++++-------------- controllers/oooRequests.ts | 15 +++++++++------ controllers/requests.ts | 1 + middlewares/validators/requests.ts | 4 +++- models/requests.ts | 12 +++++++++--- models/userFutureStatus.ts | 3 +++ models/userStatus.js | 2 ++ utils/mapOOOResponseData.ts | 22 ++++++++++++++++++++++ 8 files changed, 63 insertions(+), 24 deletions(-) create mode 100644 utils/mapOOOResponseData.ts diff --git a/controllers/auth.js b/controllers/auth.js index 6b1bf4cd6..42168665b 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -172,20 +172,20 @@ const githubAuthCallback = (req, res, next) => { updated_at: null, }; - if (!userData.email) { - const githubBaseUrl = config.get("githubApi.baseUrl"); - const res = await fetch(`${githubBaseUrl}/user/emails`, { - headers: { - Authorization: `token ${accessToken}`, - }, - }); - const emails = await res.json(); - const primaryEmails = emails.filter((item) => item.primary); - - if (primaryEmails.length > 0) { - userData.email = primaryEmails[0].email; - } - } + // if (!userData.email) { + // const githubBaseUrl = config.get("githubApi.baseUrl"); + // const res = await fetch(`${githubBaseUrl}/user/emails`, { + // headers: { + // Authorization: `token ${accessToken}`, + // }, + // }); + // const emails = await res.json(); + // const primaryEmails = emails.filter((item) => item.primary); + + // if (primaryEmails.length > 0) { + // userData.email = primaryEmails[0].email; + // } + // } const { userId, incompleteUserDetails, role } = await users.addOrUpdate(userData); diff --git a/controllers/oooRequests.ts b/controllers/oooRequests.ts index 36d2baeab..c725b2524 100644 --- a/controllers/oooRequests.ts +++ b/controllers/oooRequests.ts @@ -50,11 +50,11 @@ export const createOooRequestController = async ( if (!isUserPartOfDiscord) { return res.boom.forbidden(UNAUTHORIZED_TO_CREATE_OOO_REQUEST); } - + console.log("userStatus", isUserPartOfDiscord); try { const userStatus = await getUserStatus(userId); const validationResponse = await validateUserStatus(userId, userStatus); - + console.log("validationResponse", validationResponse); if (validationResponse) { if (validationResponse.error === USER_STATUS_NOT_FOUND) { return res.boom.notFound(validationResponse.error); @@ -90,6 +90,7 @@ export const createOooRequestController = async ( }; export const updateOooRequestController = async (req: UpdateRequest, res: CustomResponse) => { + console.log("reached ooo request controller") const requestBody = req.body; const userId = req?.userData?.id; const requestId = req.params.id; @@ -119,21 +120,23 @@ export const updateOooRequestController = async (req: UpdateRequest, res: Custom }; await addLog(requestLog.type, requestLog.meta, requestLog.body); if (requestResult.state === REQUEST_STATE.APPROVED) { - const requestData = await getRequests({ id: requestId }); + const requestData = await getRequests({ id: requestId, type: REQUEST_TYPE.OOO }); if (requestData) { - const { from, until, requestedBy, message } = requestData as any; + const { from, until, userId, reason } = requestData as any; const userFutureStatusData = { requestId, status: REQUEST_TYPE.OOO, state: statusState.UPCOMING, from, endsOn: until, - userId: requestedBy, - message, + userId, + message: reason, }; + await createUserFutureStatus(userFutureStatusData); await addFutureStatus(userFutureStatusData); + console.log("done with the controller") } } return res.status(201).json({ diff --git a/controllers/requests.ts b/controllers/requests.ts index fd8974ea0..b4ac0aa0c 100644 --- a/controllers/requests.ts +++ b/controllers/requests.ts @@ -40,6 +40,7 @@ export const createRequestController = async ( export const updateRequestController = async (req: UpdateRequest, res: CustomResponse) => { const type = req.body.type; + console.log("reached main controller") switch (type) { case REQUEST_TYPE.OOO: return await updateOooRequestController(req as UpdateRequest, res as ExtensionRequestResponse); diff --git a/middlewares/validators/requests.ts b/middlewares/validators/requests.ts index 80ff0478b..e9e18c172 100644 --- a/middlewares/validators/requests.ts +++ b/middlewares/validators/requests.ts @@ -66,11 +66,13 @@ export const updateRequestsMiddleware = async ( "any.only": "state must be APPROVED or REJECTED", }), type: joi.string().valid(REQUEST_TYPE.OOO, REQUEST_TYPE.EXTENSION, REQUEST_TYPE.ONBOARDING).required(), - message: joi.string().optional() + comment: joi.string().optional(), + status: joi.string().valid(REQUEST_STATE.APPROVED, REQUEST_STATE.REJECTED).optional(), }); try { await schema.validateAsync(req.body, { abortEarly: false }); + console.log("it is going to next") next(); } catch (error) { const errorMessages = error.details.map((detail:any) => detail.message); diff --git a/models/requests.ts b/models/requests.ts index 064eebd8c..58cf15f12 100644 --- a/models/requests.ts +++ b/models/requests.ts @@ -1,6 +1,6 @@ import firestore from "../utils/firestore"; const requestModel = firestore.collection("requests"); -import { REQUEST_ALREADY_APPROVED, REQUEST_ALREADY_REJECTED, REQUEST_STATE } from "../constants/requests"; +import { REQUEST_ALREADY_APPROVED, REQUEST_ALREADY_REJECTED, REQUEST_STATE, REQUEST_TYPE } from "../constants/requests"; import { ERROR_WHILE_FETCHING_REQUEST, ERROR_WHILE_CREATING_REQUEST, @@ -8,6 +8,8 @@ import { REQUEST_DOES_NOT_EXIST, } from "../constants/requests"; import { getUserId } from "../utils/users"; +import { mapOOOResponseData } from "../utils/mapOOOResponseData"; +const logger = require("../utils/logger"); const SIZE = 5; export const createRequest = async (body: any) => { @@ -37,12 +39,12 @@ export const updateRequest = async (id: string, body: any, lastModifiedBy: strin error: REQUEST_DOES_NOT_EXIST, }; } - if (existingRequestDoc.data().state === REQUEST_STATE.APPROVED) { + if (existingRequestDoc.data().status === REQUEST_STATE.APPROVED) { return { error: REQUEST_ALREADY_APPROVED, }; } - if (existingRequestDoc.data().state === REQUEST_STATE.REJECTED) { + if (existingRequestDoc.data().status === REQUEST_STATE.REJECTED) { return { error: REQUEST_ALREADY_REJECTED, }; @@ -149,6 +151,10 @@ export const getRequests = async (query: any) => { return null; } + // because the Request document is changed and the dashboard site still expects the old data format when dev flag is off + if(type === REQUEST_TYPE.OOO && !dev){ + allRequests = mapOOOResponseData(allRequests); + } return { allRequests, prev: prevDoc.empty ? null : prevDoc.docs[0].id, diff --git a/models/userFutureStatus.ts b/models/userFutureStatus.ts index b1e003ba4..269de9841 100644 --- a/models/userFutureStatus.ts +++ b/models/userFutureStatus.ts @@ -10,11 +10,14 @@ import * as admin from "firebase-admin"; */ export const createUserFutureStatus = async (body: UserFutureStatusType) => { try { + console.log("reached create user future status") + console.log("body", body) const statusBody: UserFutureStatusType = { createdAt: Date.now(), ...body, }; const resultDoc = await userFutureStatusModel.add(statusBody); + console.log("updated user future status") return { id: resultDoc.id, ...body, diff --git a/models/userStatus.js b/models/userStatus.js index 0a250a814..2c0b041c3 100644 --- a/models/userStatus.js +++ b/models/userStatus.js @@ -677,6 +677,7 @@ const cancelOooStatus = async (userId) => { const addFutureStatus = async (futureStatusData) => { try { + console.log("reached add future status"); const userStatusDocs = await userStatusModel.where("userId", "==", futureStatusData.userId).limit(1).get(); const [userStatusDoc] = userStatusDocs.docs; let docId; @@ -698,6 +699,7 @@ const addFutureStatus = async (futureStatusData) => { futureStatus: futureStatusData, }; await userStatusModel.doc(docId).update(newStatusData); + console.log("updated future status"); return { id: docId, userStatusExists: true, data: newStatusData }; } catch (error) { logger.error(`error in updating User Status Document ${error}`); diff --git a/utils/mapOOOResponseData.ts b/utils/mapOOOResponseData.ts new file mode 100644 index 000000000..6cb408876 --- /dev/null +++ b/utils/mapOOOResponseData.ts @@ -0,0 +1,22 @@ +import { OooStatusRequest } from "../types/oooRequest"; + +/** + * @description Map the OOO response data to the desired format + * @param data - The OOO response data in the new format + * @returns The mapped OOO response data in the old format + */ +export const mapOOOResponseData = (data: OooStatusRequest[]) => { + return data.map((item) => ({ + id: item.id, + from: item.from, + until: item.until, + type: item.type, + message: item.reason, + state: item.status, + reason: item.reason, + createdAt: item.createdAt, + updatedAt: item.updatedAt, + requestedBy: item.userId, + lastModifiedBy: item.lastModifiedBy, + })); +}; \ No newline at end of file From 26f469650d6c2a2e6d4ccfbd3a04028b7fe16ed8 Mon Sep 17 00:00:00 2001 From: tejaskh3 Date: Thu, 19 Jun 2025 14:01:48 +0530 Subject: [PATCH 2/6] remove: console --- controllers/oooRequests.ts | 3 --- controllers/requests.ts | 1 - middlewares/validators/requests.ts | 1 + utils/mapOOOResponseData.ts | 2 +- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/controllers/oooRequests.ts b/controllers/oooRequests.ts index c725b2524..d601264ce 100644 --- a/controllers/oooRequests.ts +++ b/controllers/oooRequests.ts @@ -50,11 +50,9 @@ export const createOooRequestController = async ( if (!isUserPartOfDiscord) { return res.boom.forbidden(UNAUTHORIZED_TO_CREATE_OOO_REQUEST); } - console.log("userStatus", isUserPartOfDiscord); try { const userStatus = await getUserStatus(userId); const validationResponse = await validateUserStatus(userId, userStatus); - console.log("validationResponse", validationResponse); if (validationResponse) { if (validationResponse.error === USER_STATUS_NOT_FOUND) { return res.boom.notFound(validationResponse.error); @@ -90,7 +88,6 @@ export const createOooRequestController = async ( }; export const updateOooRequestController = async (req: UpdateRequest, res: CustomResponse) => { - console.log("reached ooo request controller") const requestBody = req.body; const userId = req?.userData?.id; const requestId = req.params.id; diff --git a/controllers/requests.ts b/controllers/requests.ts index b4ac0aa0c..fd8974ea0 100644 --- a/controllers/requests.ts +++ b/controllers/requests.ts @@ -40,7 +40,6 @@ export const createRequestController = async ( export const updateRequestController = async (req: UpdateRequest, res: CustomResponse) => { const type = req.body.type; - console.log("reached main controller") switch (type) { case REQUEST_TYPE.OOO: return await updateOooRequestController(req as UpdateRequest, res as ExtensionRequestResponse); diff --git a/middlewares/validators/requests.ts b/middlewares/validators/requests.ts index e9e18c172..7730329c3 100644 --- a/middlewares/validators/requests.ts +++ b/middlewares/validators/requests.ts @@ -67,6 +67,7 @@ export const updateRequestsMiddleware = async ( }), type: joi.string().valid(REQUEST_TYPE.OOO, REQUEST_TYPE.EXTENSION, REQUEST_TYPE.ONBOARDING).required(), comment: joi.string().optional(), + message: joi.string().optional(), status: joi.string().valid(REQUEST_STATE.APPROVED, REQUEST_STATE.REJECTED).optional(), }); diff --git a/utils/mapOOOResponseData.ts b/utils/mapOOOResponseData.ts index 6cb408876..1e99dc66b 100644 --- a/utils/mapOOOResponseData.ts +++ b/utils/mapOOOResponseData.ts @@ -13,7 +13,7 @@ export const mapOOOResponseData = (data: OooStatusRequest[]) => { type: item.type, message: item.reason, state: item.status, - reason: item.reason, + reason: item.comment, createdAt: item.createdAt, updatedAt: item.updatedAt, requestedBy: item.userId, From e36a07637cef56226d6ccd4378a8c8379c4f5c14 Mon Sep 17 00:00:00 2001 From: tejaskh3 Date: Mon, 7 Jul 2025 03:00:49 +0530 Subject: [PATCH 3/6] wip --- test/integration/onboardingExtension.test.ts | 2 +- test/integration/requests.test.ts | 111 ++++++++++++++++--- 2 files changed, 99 insertions(+), 14 deletions(-) diff --git a/test/integration/onboardingExtension.test.ts b/test/integration/onboardingExtension.test.ts index a862ad82e..ef1669896 100644 --- a/test/integration/onboardingExtension.test.ts +++ b/test/integration/onboardingExtension.test.ts @@ -440,7 +440,7 @@ describe("/requests Onboarding Extension", () => { if(err) return done(err); expect(res.statusCode).to.equal(400); expect(res.body.error).to.equal("Bad Request"); - expect(res.body.message).to.equal('"type" must be one of [OOO, EXTENSION, ONBOARDING]'); + expect(res.body.message).to.equal('Invalid request type'); done(); }) }) diff --git a/test/integration/requests.test.ts b/test/integration/requests.test.ts index 2e83acf18..7de653e0e 100644 --- a/test/integration/requests.test.ts +++ b/test/integration/requests.test.ts @@ -34,6 +34,8 @@ import { UNAUTHORIZED_TO_CREATE_OOO_REQUEST, USER_STATUS_NOT_FOUND, OOO_STATUS_ALREADY_EXIST, + REQUEST_FETCHED_SUCCESSFULLY, + ERROR_WHILE_FETCHING_REQUEST, } from "../../constants/requests"; import { updateTask } from "../../models/tasks"; import { validTaskAssignmentRequest, validTaskCreqtionRequest } from "../fixtures/taskRequests/taskRequests"; @@ -561,19 +563,6 @@ describe("/requests OOO", function () { }); }); - it("should return 400 if request is already approved", function (done) { - chai - .request(app) - .put(`/requests/${approvedOooRequestId}`) - .set("cookie", `${cookieName}=${superUserToken}`) - .send(validOooStatusUpdate) - .end(function (err, res) { - expect(res).to.have.status(400); - expect(res.body).to.have.property("message"); - expect(res.body.message).to.equal(REQUEST_ALREADY_APPROVED); - done(); - }); - }); }); describe("GET /requests", function () { @@ -691,7 +680,71 @@ describe("/requests OOO", function () { done(); }); }); + it("should return requests with page link when page query is passed", function (done) { + chai + .request(app) + .get("/requests?page=1") + .end(function (err, res) { + expect(res).to.have.status(200); + expect(res.body).to.have.property("message"); + expect(res.body.message).to.equal(REQUEST_FETCHED_SUCCESSFULLY); + expect(res.body).to.have.property("page"); + expect(res.body.page).to.equal("/requests?page=2"); + done(); + }); + }); + + it("should return requests with next and prev links when cursor based pagination is used", function (done) { + chai + .request(app) + .get("/requests?next=someDocId") + .end(function (err, res) { + expect(res).to.have.status(200); + expect(res.body).to.have.property("message"); + expect(res.body.message).to.equal(REQUEST_FETCHED_SUCCESSFULLY); + expect(res.body).to.have.property("next"); + expect(res.body).to.have.property("prev"); + done(); + }); + }); }); + + + + it("should return 204 if requests array is empty", function (done) { + chai + .request(app) + .get("/requests") + .end(function (err, res) { + expect(res).to.have.status(204); + done(); + }); + }); + + it("should return request when queried by id", function (done) { + chai + .request(app) + .get("/requests?id=someId") + .end(function (err, res) { + expect(res).to.have.status(200); + expect(res.body).to.have.property("message"); + expect(res.body.message).to.equal(REQUEST_FETCHED_SUCCESSFULLY); + expect(res.body).to.have.property("data"); + done(); + }); + }); + + it("should return 500 if error occurs while fetching requests", function (done) { + chai + .request(app) + .get("/requests") + .end(function (err, res) { + expect(res).to.have.status(500); + expect(res.body).to.have.property("message"); + expect(res.body.message).to.equal(ERROR_WHILE_FETCHING_REQUEST); + done(); + }); + }); }); describe("/requests Extension", function () { @@ -965,6 +1018,37 @@ describe("/requests Extension", function () { }); }); + it("should return 400(Bad Request) if request type is invalid", function (done) { + chai + .request(app) + .put(`/requests/${pendingExtensionRequestId}`) + .set("cookie", `${cookieName}=${superUserJwtToken}`) + .send({ + type: "INVALID_TYPE", + state: REQUEST_STATE.APPROVED + }) + .end(function (err, res) { + expect(res).to.have.status(400); + expect(res.body).to.have.property("message"); + expect(res.body.message).to.equal("Invalid request type"); + done(); + }); + }); + + it("should return 400(Bad Request) if request state is invalid", function (done) { + chai + .request(app) + .put(`/requests/${pendingExtensionRequestId}`) + .set("cookie", `${cookieName}=${superUserJwtToken}`) + .send(invalidExtensionRequest) + .end(function (err, res) { + expect(res).to.have.status(400); + expect(res.body).to.have.property("message"); + expect(res.body.message).to.equal("state must be APPROVED or REJECTED"); + done(); + }); + }); + it("should return 401 if user is not super user", function (done) { chai .request(app) @@ -1070,6 +1154,7 @@ describe("/requests Extension", function () { done(); }); }); + }); }); From 30de6668216da9fae5dd639454d8cc208d4859d4 Mon Sep 17 00:00:00 2001 From: tejaskh3 Date: Thu, 10 Jul 2025 06:01:31 +0530 Subject: [PATCH 4/6] feat: add option to accpet and reject ooo request --- controllers/oooRequests.ts | 9 ++++---- middlewares/validators/oooRequests.ts | 4 ++++ middlewares/validators/requests.ts | 30 +++++++++++++-------------- models/requests.ts | 5 ++++- models/userStatus.js | 2 +- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/controllers/oooRequests.ts b/controllers/oooRequests.ts index d601264ce..c000ede8c 100644 --- a/controllers/oooRequests.ts +++ b/controllers/oooRequests.ts @@ -68,7 +68,7 @@ export const createOooRequestController = async ( status: REQUEST_STATE.PENDING, }); - if (latestOooRequest) { + if (latestOooRequest && latestOooRequest.status === REQUEST_STATE.PENDING ) { await addLog(logType.PENDING_REQUEST_FOUND, { userId, oooRequestId: latestOooRequest.id }, { message: REQUEST_ALREADY_PENDING } @@ -101,7 +101,7 @@ export const updateOooRequestController = async (req: UpdateRequest, res: Custom return res.boom.badRequest(requestResult.error); } const [logType, returnMessage] = - requestResult.state === REQUEST_STATE.APPROVED + requestResult.status === REQUEST_STATE.APPROVED ? [REQUEST_LOG_TYPE.REQUEST_APPROVED, REQUEST_APPROVED_SUCCESSFULLY] : [REQUEST_LOG_TYPE.REQUEST_REJECTED, REQUEST_REJECTED_SUCCESSFULLY]; @@ -116,7 +116,7 @@ export const updateOooRequestController = async (req: UpdateRequest, res: Custom body: requestResult, }; await addLog(requestLog.type, requestLog.meta, requestLog.body); - if (requestResult.state === REQUEST_STATE.APPROVED) { + if (requestResult.status === REQUEST_STATE.APPROVED) { const requestData = await getRequests({ id: requestId, type: REQUEST_TYPE.OOO }); if (requestData) { @@ -130,10 +130,9 @@ export const updateOooRequestController = async (req: UpdateRequest, res: Custom userId, message: reason, }; - + console.log("userFutureStatusData", userFutureStatusData) await createUserFutureStatus(userFutureStatusData); await addFutureStatus(userFutureStatusData); - console.log("done with the controller") } } return res.status(201).json({ diff --git a/middlewares/validators/oooRequests.ts b/middlewares/validators/oooRequests.ts index ab73929f1..04a1ab4b9 100644 --- a/middlewares/validators/oooRequests.ts +++ b/middlewares/validators/oooRequests.ts @@ -34,6 +34,10 @@ export const createOooStatusRequestValidator = async ( "string.empty": "type cannot be empty", "any.required": "type is required", }), + status: joi.string().valid(REQUEST_STATE.PENDING).required().messages({ + "string.empty": "status cannot be empty", + "any.required": "status is required", + }), }); await schema.validateAsync(req.body, { abortEarly: false }); diff --git a/middlewares/validators/requests.ts b/middlewares/validators/requests.ts index 7730329c3..6b512da82 100644 --- a/middlewares/validators/requests.ts +++ b/middlewares/validators/requests.ts @@ -50,30 +50,30 @@ export const updateRequestsMiddleware = async ( res: CustomResponse, next: NextFunction ) => { - const schema = joi - .object() - .strict() - .keys({ + const { type } = req.body; + + const baseSchema = { reason: joi.string().optional() .messages({ "string.empty": "reason cannot be empty", }), - state: joi - .string() - .valid(REQUEST_STATE.APPROVED, REQUEST_STATE.REJECTED) - .required() - .messages({ - "any.only": "state must be APPROVED or REJECTED", - }), type: joi.string().valid(REQUEST_TYPE.OOO, REQUEST_TYPE.EXTENSION, REQUEST_TYPE.ONBOARDING).required(), - comment: joi.string().optional(), - message: joi.string().optional(), - status: joi.string().valid(REQUEST_STATE.APPROVED, REQUEST_STATE.REJECTED).optional(), + }; + + const schema = joi.object().strict().keys({ + ...baseSchema, + status: type === REQUEST_TYPE.OOO ? joi.string().valid(REQUEST_STATE.PENDING, REQUEST_STATE.APPROVED, REQUEST_STATE.REJECTED).required() : joi.string().valid(REQUEST_STATE.APPROVED, REQUEST_STATE.REJECTED).optional(), + comment: type === REQUEST_TYPE.OOO + ? joi.string().required().messages({ + "any.required": "comment is required for OOO requests", + "string.empty": "comment cannot be empty for OOO requests" + }) + : joi.string().optional(), + state: type !== REQUEST_TYPE.OOO ? joi.string().valid(REQUEST_STATE.APPROVED, REQUEST_STATE.REJECTED).required() : joi.string().valid(REQUEST_STATE.APPROVED, REQUEST_STATE.REJECTED).optional(), }); try { await schema.validateAsync(req.body, { abortEarly: false }); - console.log("it is going to next") next(); } catch (error) { const errorMessages = error.details.map((detail:any) => detail.message); diff --git a/models/requests.ts b/models/requests.ts index 58cf15f12..4e2242817 100644 --- a/models/requests.ts +++ b/models/requests.ts @@ -33,7 +33,9 @@ export const createRequest = async (body: any) => { export const updateRequest = async (id: string, body: any, lastModifiedBy: string, type:string) => { try { + console.log("reached update request model") const existingRequestDoc = await requestModel.doc(id).get(); + console.log("existingRequestDoc", existingRequestDoc) if (!existingRequestDoc.exists) { return { error: REQUEST_DOES_NOT_EXIST, @@ -103,7 +105,8 @@ export const getRequests = async (query: any) => { requestQuery = requestQuery.where("type", "==", type); } if (state) { - requestQuery = requestQuery.where("state", "==", state); + const fieldName = (type === REQUEST_TYPE.OOO && !dev) ? "status" : "state"; + requestQuery = requestQuery.where(fieldName, "==", state); } requestQuery = requestQuery.orderBy("createdAt", "desc"); diff --git a/models/userStatus.js b/models/userStatus.js index 2c0b041c3..98eaef073 100644 --- a/models/userStatus.js +++ b/models/userStatus.js @@ -699,7 +699,7 @@ const addFutureStatus = async (futureStatusData) => { futureStatus: futureStatusData, }; await userStatusModel.doc(docId).update(newStatusData); - console.log("updated future status"); + console.log("updated future status in second model"); return { id: docId, userStatusExists: true, data: newStatusData }; } catch (error) { logger.error(`error in updating User Status Document ${error}`); From f3c9a9feed8f652d74dd00d3315d2dcda1e31fdd Mon Sep 17 00:00:00 2001 From: tejaskh3 Date: Sun, 13 Jul 2025 23:50:16 +0530 Subject: [PATCH 5/6] remove: comments --- controllers/oooRequests.ts | 1 - middlewares/validators/requests.ts | 3 ++- models/requests.ts | 2 -- models/userFutureStatus.ts | 3 --- models/userStatus.js | 2 -- test/fixtures/oooRequest/oooRequest.ts | 3 ++- test/integration/requests.test.ts | 14 +++++++++++++- test/unit/middlewares/oooRequests.test.ts | 7 +++++-- 8 files changed, 22 insertions(+), 13 deletions(-) diff --git a/controllers/oooRequests.ts b/controllers/oooRequests.ts index c000ede8c..dcb657631 100644 --- a/controllers/oooRequests.ts +++ b/controllers/oooRequests.ts @@ -130,7 +130,6 @@ export const updateOooRequestController = async (req: UpdateRequest, res: Custom userId, message: reason, }; - console.log("userFutureStatusData", userFutureStatusData) await createUserFutureStatus(userFutureStatusData); await addFutureStatus(userFutureStatusData); } diff --git a/middlewares/validators/requests.ts b/middlewares/validators/requests.ts index 6b512da82..fa5f91aa8 100644 --- a/middlewares/validators/requests.ts +++ b/middlewares/validators/requests.ts @@ -51,7 +51,7 @@ export const updateRequestsMiddleware = async ( next: NextFunction ) => { const { type } = req.body; - + console.log("body", req.body) const baseSchema = { reason: joi.string().optional() .messages({ @@ -78,6 +78,7 @@ export const updateRequestsMiddleware = async ( } catch (error) { const errorMessages = error.details.map((detail:any) => detail.message); logger.error(`Error while validating request payload : ${errorMessages}`); + console.log("error", error) res.boom.badRequest(errorMessages); } }; diff --git a/models/requests.ts b/models/requests.ts index 4e2242817..0dd8fcb57 100644 --- a/models/requests.ts +++ b/models/requests.ts @@ -33,9 +33,7 @@ export const createRequest = async (body: any) => { export const updateRequest = async (id: string, body: any, lastModifiedBy: string, type:string) => { try { - console.log("reached update request model") const existingRequestDoc = await requestModel.doc(id).get(); - console.log("existingRequestDoc", existingRequestDoc) if (!existingRequestDoc.exists) { return { error: REQUEST_DOES_NOT_EXIST, diff --git a/models/userFutureStatus.ts b/models/userFutureStatus.ts index 269de9841..b1e003ba4 100644 --- a/models/userFutureStatus.ts +++ b/models/userFutureStatus.ts @@ -10,14 +10,11 @@ import * as admin from "firebase-admin"; */ export const createUserFutureStatus = async (body: UserFutureStatusType) => { try { - console.log("reached create user future status") - console.log("body", body) const statusBody: UserFutureStatusType = { createdAt: Date.now(), ...body, }; const resultDoc = await userFutureStatusModel.add(statusBody); - console.log("updated user future status") return { id: resultDoc.id, ...body, diff --git a/models/userStatus.js b/models/userStatus.js index 98eaef073..0a250a814 100644 --- a/models/userStatus.js +++ b/models/userStatus.js @@ -677,7 +677,6 @@ const cancelOooStatus = async (userId) => { const addFutureStatus = async (futureStatusData) => { try { - console.log("reached add future status"); const userStatusDocs = await userStatusModel.where("userId", "==", futureStatusData.userId).limit(1).get(); const [userStatusDoc] = userStatusDocs.docs; let docId; @@ -699,7 +698,6 @@ const addFutureStatus = async (futureStatusData) => { futureStatus: futureStatusData, }; await userStatusModel.doc(docId).update(newStatusData); - console.log("updated future status in second model"); return { id: docId, userStatusExists: true, data: newStatusData }; } catch (error) { logger.error(`error in updating User Status Document ${error}`); diff --git a/test/fixtures/oooRequest/oooRequest.ts b/test/fixtures/oooRequest/oooRequest.ts index 30b72d2a0..02ec536e3 100644 --- a/test/fixtures/oooRequest/oooRequest.ts +++ b/test/fixtures/oooRequest/oooRequest.ts @@ -16,7 +16,8 @@ export const validOooStatusRequests = { type: "OOO", from: Date.now() + 1 * 24 * 60 * 60 * 1000, until: Date.now() + 5 * 24 * 60 * 60 * 1000, - reason: "Out of office for personal reasons." + reason: "Out of office for personal reasons.", + status: REQUEST_STATE.PENDING, }; export const createdOOORequest = { diff --git a/test/integration/requests.test.ts b/test/integration/requests.test.ts index 7de653e0e..e31ad0ac4 100644 --- a/test/integration/requests.test.ts +++ b/test/integration/requests.test.ts @@ -562,7 +562,19 @@ describe("/requests OOO", function () { done(); }); }); - + it("should return 400 if request is already approved", function (done) { + chai + .request(app) + .put(`/requests/${approvedOooRequestId}`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send(validOooStatusUpdate) + .end(function (err, res) { + expect(res).to.have.status(400); + expect(res.body).to.have.property("message"); + expect(res.body.message).to.equal(REQUEST_ALREADY_APPROVED); + done(); + }); + }); }); describe("GET /requests", function () { diff --git a/test/unit/middlewares/oooRequests.test.ts b/test/unit/middlewares/oooRequests.test.ts index 11272e860..86e3c3081 100644 --- a/test/unit/middlewares/oooRequests.test.ts +++ b/test/unit/middlewares/oooRequests.test.ts @@ -64,17 +64,20 @@ describe("OOO Status Request Validators", function () { from: null, until: null, reason: "", + status: "INVALID" }, }; try { await createOooStatusRequestValidator(req as any, res as any, nextSpy); } catch (error) { expect(error).to.be.an.instanceOf(Error); - expect(error.details.length).to.equal(4); + expect(error.details.length).to.equal(5); expect(error.details[0].message).to.equal(`"from" must be a number`); - expect(error.details[1].message).to.equal(`"until" must be a number`); + expect(error.details[1].message).to.equal(`"until" must be a number`); expect(error.details[2].message).to.equal('reason cannot be empty'); expect(error.details[3].message).to.equal('"type" must be [OOO]'); + expect(error.details[4].message).to.equal('"status" must be [PENDING]'); + } }); From 7e7633ae275a6301703b01f4d189b275a288db65 Mon Sep 17 00:00:00 2001 From: tejaskh3 Date: Sun, 13 Jul 2025 23:58:39 +0530 Subject: [PATCH 6/6] fix: test cases --- controllers/auth.js | 28 +++++++++++++------------- middlewares/validators/requests.ts | 2 -- test/fixtures/oooRequest/oooRequest.ts | 4 ++-- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/controllers/auth.js b/controllers/auth.js index 42168665b..6b1bf4cd6 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -172,20 +172,20 @@ const githubAuthCallback = (req, res, next) => { updated_at: null, }; - // if (!userData.email) { - // const githubBaseUrl = config.get("githubApi.baseUrl"); - // const res = await fetch(`${githubBaseUrl}/user/emails`, { - // headers: { - // Authorization: `token ${accessToken}`, - // }, - // }); - // const emails = await res.json(); - // const primaryEmails = emails.filter((item) => item.primary); - - // if (primaryEmails.length > 0) { - // userData.email = primaryEmails[0].email; - // } - // } + if (!userData.email) { + const githubBaseUrl = config.get("githubApi.baseUrl"); + const res = await fetch(`${githubBaseUrl}/user/emails`, { + headers: { + Authorization: `token ${accessToken}`, + }, + }); + const emails = await res.json(); + const primaryEmails = emails.filter((item) => item.primary); + + if (primaryEmails.length > 0) { + userData.email = primaryEmails[0].email; + } + } const { userId, incompleteUserDetails, role } = await users.addOrUpdate(userData); diff --git a/middlewares/validators/requests.ts b/middlewares/validators/requests.ts index fa5f91aa8..cec3e56fc 100644 --- a/middlewares/validators/requests.ts +++ b/middlewares/validators/requests.ts @@ -51,7 +51,6 @@ export const updateRequestsMiddleware = async ( next: NextFunction ) => { const { type } = req.body; - console.log("body", req.body) const baseSchema = { reason: joi.string().optional() .messages({ @@ -78,7 +77,6 @@ export const updateRequestsMiddleware = async ( } catch (error) { const errorMessages = error.details.map((detail:any) => detail.message); logger.error(`Error while validating request payload : ${errorMessages}`); - console.log("error", error) res.boom.badRequest(errorMessages); } }; diff --git a/test/fixtures/oooRequest/oooRequest.ts b/test/fixtures/oooRequest/oooRequest.ts index 02ec536e3..a2c4fe49f 100644 --- a/test/fixtures/oooRequest/oooRequest.ts +++ b/test/fixtures/oooRequest/oooRequest.ts @@ -71,8 +71,8 @@ export const updateOooRejectedRequests = { }; export const validOooStatusUpdate ={ - state: REQUEST_STATE.APPROVED, - reason: "Welcome back! Enjoy the conference.", + status: REQUEST_STATE.APPROVED, + comment: "Welcome back! Enjoy the conference.", type:REQUEST_TYPE.OOO }