Skip to content

Commit

Permalink
refactor: separate validation and update logic in service file
Browse files Browse the repository at this point in the history
  • Loading branch information
pankajjs committed Jan 16, 2025
1 parent bd71a2b commit e310f96
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 60 deletions.
81 changes: 21 additions & 60 deletions controllers/onboardingExtension.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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");

/**
Expand Down Expand Up @@ -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: {
Expand Down
112 changes: 112 additions & 0 deletions services/onboardingExtension.ts
Original file line number Diff line number Diff line change
@@ -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;
}
}

0 comments on commit e310f96

Please sign in to comment.