Skip to content

Commit c2fe99a

Browse files
committed
feat: added controller for handling the create onboarding extension request feature
1 parent 59a8fb9 commit c2fe99a

File tree

2 files changed

+116
-1
lines changed

2 files changed

+116
-1
lines changed

controllers/onboardingExtension.ts

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import {
2+
ERROR_WHILE_CREATING_REQUEST,
3+
LOG_ACTION,
4+
REQUEST_ALREADY_PENDING,
5+
REQUEST_LOG_TYPE,
6+
REQUEST_STATE,
7+
REQUEST_TYPE,
8+
} from "../constants/requests";
9+
import { userState } from "../constants/userStatus";
10+
import { addLog } from "../models/logs";
11+
import { createRequest, getRequestByKeyValues } from "../models/requests";
12+
import { fetchUser } from "../models/users";
13+
import { getUserStatus } from "../models/userStatus";
14+
import { User } from "../typeDefinitions/users";
15+
import { OnboardingExtension, OnboardingExtensionCreateRequest, OnboardingExtensionResponse } from "../types/onboardingExtension";
16+
17+
export const createOnboardingExtensionRequestController = async (req: OnboardingExtensionCreateRequest, res: OnboardingExtensionResponse) => {
18+
try {
19+
20+
const data = req.body;
21+
const {user, userExists} = await fetchUser({discordId: data.userId});
22+
23+
if(!userExists) {
24+
return res.boom.notFound("User not found");
25+
}
26+
27+
const { id: userId, discordId: userDiscordId, discordJoinedAt, username} = user as User;
28+
const { data: userStatus } = await getUserStatus(userId);
29+
30+
if(!userStatus || userStatus.currentStatus.state != userState.ONBOARDING){
31+
return res.boom.badRequest("User does not have onboarding status");
32+
}
33+
34+
const requestedUserResponse = await fetchUser({discordId: data.requestedBy});
35+
36+
if(!requestedUserResponse.userExists) {
37+
return res.boom.notFound("User not found");
38+
}
39+
40+
const {roles, discordId: requestedUserDiscordId} = requestedUserResponse.user as User;
41+
42+
if(!(roles?.super_user || (requestedUserDiscordId === userDiscordId))){
43+
return res.boom.unauthorized("Only super user and onboarding user are authorized to create an onboarding extension request");
44+
}
45+
46+
const latestExtensionRequest: OnboardingExtension = await getRequestByKeyValues({
47+
userId: userId,
48+
type: REQUEST_TYPE.ONBOARDING
49+
});
50+
51+
if(latestExtensionRequest && latestExtensionRequest.state === REQUEST_STATE.PENDING){
52+
return res.boom.badRequest(REQUEST_ALREADY_PENDING);
53+
}
54+
55+
const thirtyOneDaysInMillisecond = 31*24*60*60*1000;
56+
const discordJoinedDateInMillisecond = new Date(discordJoinedAt).getTime();
57+
const numberOfDaysInMillisecond = Math.floor(data.numberOfDays)*24*60*60*1000;
58+
59+
let requestNumber: number;
60+
let oldEndsOn: number;
61+
let newEndsOn: number;
62+
63+
if(!latestExtensionRequest){
64+
requestNumber = 1;
65+
oldEndsOn = discordJoinedDateInMillisecond + thirtyOneDaysInMillisecond;
66+
}else if(latestExtensionRequest.state === REQUEST_STATE.REJECTED) {
67+
requestNumber = latestExtensionRequest.requestNumber + 1;
68+
oldEndsOn = latestExtensionRequest.oldEndsOn;
69+
}else{
70+
requestNumber = latestExtensionRequest.requestNumber + 1;
71+
oldEndsOn = latestExtensionRequest.newEndsOn;
72+
}
73+
74+
newEndsOn = oldEndsOn + numberOfDaysInMillisecond;
75+
76+
const onboardingExtension = await createRequest({
77+
type: REQUEST_TYPE.ONBOARDING,
78+
state: REQUEST_STATE.PENDING,
79+
userId: userId,
80+
requestedBy: username,
81+
oldEndsOn: oldEndsOn,
82+
newEndsOn: newEndsOn,
83+
reason: data.reason,
84+
requestNumber: requestNumber,
85+
});
86+
87+
const onboardingExtensionLog = {
88+
type: REQUEST_LOG_TYPE.REQUEST_CREATED,
89+
meta: {
90+
requestId: onboardingExtension.id,
91+
action: LOG_ACTION.CREATE,
92+
userId: userId,
93+
createdAt: Date.now(),
94+
},
95+
body: onboardingExtension,
96+
};
97+
98+
await addLog(onboardingExtensionLog.type, onboardingExtensionLog.meta, onboardingExtensionLog.body);
99+
100+
return res.status(201).json({
101+
message: "Onboarding extension request created successfully!",
102+
data: {
103+
id: onboardingExtension.id,
104+
...onboardingExtension,
105+
}
106+
});
107+
}catch (err) {
108+
logger.error(ERROR_WHILE_CREATING_REQUEST, err);
109+
return res.boom.badImplementation(ERROR_WHILE_CREATING_REQUEST);
110+
}
111+
};

controllers/requests.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import { createTaskExtensionRequest, updateTaskExtensionRequest } from "./extens
1313
import { UpdateRequest } from "../types/requests";
1414
import { TaskRequestRequest } from "../types/taskRequests";
1515
import { createTaskRequestController } from "./taskRequestsv2";
16+
import { OnboardingExtensionCreateRequest, OnboardingExtensionResponse } from "../types/onboardingExtension";
17+
import { createOnboardingExtensionRequestController } from "./onboardingExtension";
1618

1719
export const createRequestController = async (
18-
req: OooRequestCreateRequest | ExtensionRequestRequest | TaskRequestRequest,
20+
req: OooRequestCreateRequest | ExtensionRequestRequest | TaskRequestRequest | OnboardingExtensionCreateRequest,
1921
res: CustomResponse
2022
) => {
2123
const type = req.body.type;
@@ -26,6 +28,8 @@ export const createRequestController = async (
2628
return await createTaskExtensionRequest(req as ExtensionRequestRequest, res as ExtensionRequestResponse);
2729
case REQUEST_TYPE.TASK:
2830
return await createTaskRequestController(req as TaskRequestRequest, res as CustomResponse);
31+
case REQUEST_TYPE.ONBOARDING:
32+
return await createOnboardingExtensionRequestController(req as OnboardingExtensionCreateRequest, res as OnboardingExtensionResponse);
2933
default:
3034
return res.boom.badRequest("Invalid request type");
3135
}

0 commit comments

Comments
 (0)