From e310f964f5a86402dd928491f25968c58fb22743 Mon Sep 17 00:00:00 2001 From: Pankaj Sha Date: Fri, 17 Jan 2025 03:24:57 +0530 Subject: [PATCH] refactor: separate validation and update logic in service file --- controllers/onboardingExtension.ts | 81 ++++++--------------- services/onboardingExtension.ts | 112 +++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 60 deletions(-) create mode 100644 services/onboardingExtension.ts diff --git a/controllers/onboardingExtension.ts b/controllers/onboardingExtension.ts index f1f945cb3..c938d3f8a 100644 --- a/controllers/onboardingExtension.ts +++ b/controllers/onboardingExtension.ts @@ -1,11 +1,8 @@ import { ERROR_WHILE_CREATING_REQUEST, ERROR_WHILE_UPDATING_REQUEST, - INVALID_REQUEST_DEADLINE, - INVALID_REQUEST_TYPE, LOG_ACTION, ONBOARDING_REQUEST_CREATED_SUCCESSFULLY, - PENDING_REQUEST_UPDATED, REQUEST_ALREADY_PENDING, REQUEST_APPROVED_SUCCESSFULLY, REQUEST_DOES_NOT_EXIST, @@ -36,7 +33,7 @@ import { import { convertDateStringToMilliseconds, getNewDeadline } from "../utils/requests"; import { convertDaysToMilliseconds } from "../utils/time"; import firestore from "../utils/firestore"; -import { logType } from "../constants/logs"; +import { updateOnboardingExtensionRequest, validateOnboardingExtensionUpdateRequest } from "../services/onboardingExtension"; const requestModel = firestore.collection("requests"); /** @@ -235,66 +232,30 @@ export const updateOnboardingExtensionRequestController = async ( try{ const extensionRequestDoc = await requestModel.doc(id).get(); + const validationResponse = await validateOnboardingExtensionUpdateRequest( + extensionRequestDoc, + id, + isSuperuser, + lastModifiedBy, + body.newEndsOn, + ) - if(!extensionRequestDoc.exists){ - await addLog(logType.REQUEST_DOES_NOT_EXIST, { id }, { message: REQUEST_DOES_NOT_EXIST }); - return res.boom.notFound(REQUEST_DOES_NOT_EXIST); - } - - const extensionRequest = extensionRequestDoc.data() as OnboardingExtension; - - if(!isSuperuser && lastModifiedBy !== extensionRequest.userId) { - await addLog(logType.UNAUTHORIZED_TO_UPDATE_REQUEST, - { lastModifiedBy, userId: extensionRequest.userId }, - { message: UNAUTHORIZED_TO_UPDATE_REQUEST } - ); - return res.boom.forbidden(UNAUTHORIZED_TO_UPDATE_REQUEST); - } - - if(extensionRequest.type !== REQUEST_TYPE.ONBOARDING) { - await addLog(logType.INVALID_REQUEST_TYPE, - { type: extensionRequest.type }, - { message: INVALID_REQUEST_TYPE } - ); - return res.boom.badRequest(INVALID_REQUEST_TYPE); + if ('error' in validationResponse){ + if(validationResponse.error === REQUEST_DOES_NOT_EXIST){ + return res.boom.notFound(validationResponse.error); + } + if(validationResponse.error === UNAUTHORIZED_TO_UPDATE_REQUEST){ + return res.boom.forbidden(UNAUTHORIZED_TO_UPDATE_REQUEST); + } + return res.boom.badRequest(validationResponse.error); } - if(extensionRequest.state != REQUEST_STATE.PENDING){ - await addLog(logType.PENDING_REQUEST_CAN_BE_UPDATED, - { state: extensionRequest.state }, - { message:PENDING_REQUEST_UPDATED } - ); - return res.boom.badRequest(PENDING_REQUEST_UPDATED); - } - - if(extensionRequest.oldEndsOn >= body.newEndsOn) { - await addLog(logType.INVALID_REQUEST_DEADLINE, - { oldEndsOn: extensionRequest.oldEndsOn, newEndsOn: body.newEndsOn }, - { message: INVALID_REQUEST_DEADLINE } - ); - return res.boom.badRequest(INVALID_REQUEST_DEADLINE); - } - - const requestBody = { - ...body, + const requestBody = await updateOnboardingExtensionRequest( + extensionRequestDoc, + body, lastModifiedBy, - updatedAt: Date.now(), - } - - await requestModel.doc(id).update(requestBody); - - const requestLog = { - type: REQUEST_LOG_TYPE.REQUEST_UPDATED, - meta: { - requestId: extensionRequestDoc.id, - action: LOG_ACTION.UPDATE, - createdBy: lastModifiedBy, - }, - body: requestBody, - }; - - await addLog(requestLog.type, requestLog.meta, requestLog.body); - + ) + return res.status(200).json({ message: REQUEST_UPDATED_SUCCESSFULLY, data: { diff --git a/services/onboardingExtension.ts b/services/onboardingExtension.ts new file mode 100644 index 000000000..530a93904 --- /dev/null +++ b/services/onboardingExtension.ts @@ -0,0 +1,112 @@ +import { logType } from "../constants/logs"; +import { + INVALID_REQUEST_DEADLINE, + INVALID_REQUEST_TYPE, + LOG_ACTION, + PENDING_REQUEST_UPDATED, + REQUEST_DOES_NOT_EXIST, + REQUEST_LOG_TYPE, + REQUEST_STATE, + REQUEST_TYPE, + UNAUTHORIZED_TO_UPDATE_REQUEST +} from "../constants/requests"; +import { OnboardingExtension, UpdateOnboardingExtensionRequestBody } from "../types/onboardingExtension"; +import { addLog } from "./logService"; +import firestore from "../utils/firestore"; +const requestModel = firestore.collection("requests"); + +export const validateOnboardingExtensionUpdateRequest = async ( + extensionRequestDoc, + id: string, + isSuperuser: boolean, + lastModifiedBy: string, + newEndsOn: number +) => { + try{ + + if(!extensionRequestDoc.exists){ + await addLog(logType.REQUEST_DOES_NOT_EXIST, { id }, { message: REQUEST_DOES_NOT_EXIST }); + return { + error: REQUEST_DOES_NOT_EXIST, + } + } + + const extensionRequest = extensionRequestDoc.data() as OnboardingExtension; + + if(!isSuperuser && lastModifiedBy !== extensionRequest.userId) { + await addLog(logType.UNAUTHORIZED_TO_UPDATE_REQUEST, + { lastModifiedBy, userId: extensionRequest.userId }, + { message: UNAUTHORIZED_TO_UPDATE_REQUEST } + ); + return { + error: UNAUTHORIZED_TO_UPDATE_REQUEST + }; + } + + if(extensionRequest.type !== REQUEST_TYPE.ONBOARDING) { + await addLog(logType.INVALID_REQUEST_TYPE, + { type: extensionRequest.type }, + { message: INVALID_REQUEST_TYPE } + ); + + return { + error: INVALID_REQUEST_TYPE + }; + } + + if(extensionRequest.state != REQUEST_STATE.PENDING){ + await addLog(logType.PENDING_REQUEST_CAN_BE_UPDATED, + { state: extensionRequest.state }, + { message:PENDING_REQUEST_UPDATED } + ); + return { + error: PENDING_REQUEST_UPDATED + }; + } + + if(extensionRequest.oldEndsOn >= newEndsOn) { + await addLog(logType.INVALID_REQUEST_DEADLINE, + { oldEndsOn: extensionRequest.oldEndsOn, newEndsOn: newEndsOn }, + { message: INVALID_REQUEST_DEADLINE } + ); + return { + error: INVALID_REQUEST_DEADLINE + }; + } + }catch(error){ + logger.error("Error while validating onboarding extension update request", error); + throw error; + } +} + +export const updateOnboardingExtensionRequest = async ( + extensionRequestDoc, + body: UpdateOnboardingExtensionRequestBody, + lastModifiedBy: string) => { + try{ + const requestBody = { + ...body, + lastModifiedBy, + updatedAt: Date.now(), + } + + await requestModel.doc(extensionRequestDoc.id).update(requestBody); + + const requestLog = { + type: REQUEST_LOG_TYPE.REQUEST_UPDATED, + meta: { + requestId: extensionRequestDoc.id, + action: LOG_ACTION.UPDATE, + createdBy: lastModifiedBy, + }, + body: requestBody, + }; + + await addLog(requestLog.type, requestLog.meta, requestLog.body); + + return requestBody; + }catch(error){ + logger.error("Error while updating onboarding extension request", error); + throw error; + } +} \ No newline at end of file