generated from RealDevSquad/website-template
-
Notifications
You must be signed in to change notification settings - Fork 280
Expand file tree
/
Copy pathoooRequests.ts
More file actions
150 lines (136 loc) · 5.05 KB
/
oooRequests.ts
File metadata and controls
150 lines (136 loc) · 5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import {
REQUEST_LOG_TYPE,
LOG_ACTION,
REQUEST_CREATED_SUCCESSFULLY,
ERROR_WHILE_CREATING_REQUEST,
REQUEST_STATE,
REQUEST_TYPE,
ERROR_WHILE_UPDATING_REQUEST,
REQUEST_APPROVED_SUCCESSFULLY,
REQUEST_REJECTED_SUCCESSFULLY,
UNAUTHORIZED_TO_CREATE_OOO_REQUEST,
REQUEST_ALREADY_PENDING,
USER_STATUS_NOT_FOUND,
OOO_STATUS_ALREADY_EXIST,
} from "../constants/requests";
import { statusState } from "../constants/userStatus";
import { logType } from "../constants/logs";
import { addLog } from "../models/logs";
import { getRequestByKeyValues, getRequests, updateRequest } from "../models/requests";
import { createUserFutureStatus } from "../models/userFutureStatus";
import { getUserStatus, addFutureStatus } from "../models/userStatus";
import { createOooRequest, validateUserStatus } from "../services/oooRequest";
import { CustomResponse } from "../typeDefinitions/global";
import { OooRequestCreateRequest, OooRequestResponse, OooStatusRequest } from "../types/oooRequest";
import { UpdateRequest } from "../types/requests";
/**
* Controller to handle the creation of OOO requests.
*
* This function processes the request to create an OOO request,
* validates the user status, checks existing requests,
* and stores the new request in the database with logging.
*
* @param {OooRequestCreateRequest} req - The Express request object containing the body with OOO details.
* @param {CustomResponse} res - The Express response object used to send back the response.
* @returns {Promise<OooRequestResponse>} Resolves to a response with the success or an error message.
*/
export const createOooRequestController = async (
req: OooRequestCreateRequest,
res: OooRequestResponse
): Promise<OooRequestResponse> => {
const requestBody = req.body;
const { id: userId, username } = req.userData;
const isUserPartOfDiscord = req.userData.roles.in_discord;
const dev = req.query.dev === "true";
if (!dev) return res.boom.notImplemented("Feature not implemented");
if (!isUserPartOfDiscord) {
return res.boom.forbidden(UNAUTHORIZED_TO_CREATE_OOO_REQUEST);
}
try {
const userStatus = await getUserStatus(userId);
const validationResponse = await validateUserStatus(userId, userStatus);
if (validationResponse) {
if (validationResponse.error === USER_STATUS_NOT_FOUND) {
return res.boom.notFound(validationResponse.error);
}
if (validationResponse.error === OOO_STATUS_ALREADY_EXIST) {
return res.boom.forbidden(validationResponse.error);
}
}
const latestOooRequest: OooStatusRequest = await getRequestByKeyValues({
requestedBy: userId,
type: REQUEST_TYPE.OOO,
status: REQUEST_STATE.PENDING,
});
if (latestOooRequest) {
await addLog(logType.PENDING_REQUEST_FOUND,
{ userId, oooRequestId: latestOooRequest.id },
{ message: REQUEST_ALREADY_PENDING }
);
return res.boom.conflict(REQUEST_ALREADY_PENDING);
}
await createOooRequest(requestBody, username, userId);
return res.status(201).json({
message: REQUEST_CREATED_SUCCESSFULLY,
});
} catch (err) {
logger.error(ERROR_WHILE_CREATING_REQUEST, err);
return res.boom.badImplementation(ERROR_WHILE_CREATING_REQUEST);
}
};
export const updateOooRequestController = async (req: UpdateRequest, res: CustomResponse) => {
const requestBody = req.body;
const userId = req?.userData?.id;
const requestId = req.params.id;
if (!userId) {
return res.boom.unauthorized();
}
try {
const requestResult = await updateRequest(requestId, requestBody, userId, REQUEST_TYPE.OOO);
if ("error" in requestResult) {
return res.boom.badRequest(requestResult.error);
}
const [logType, returnMessage] =
requestResult.state === REQUEST_STATE.APPROVED
? [REQUEST_LOG_TYPE.REQUEST_APPROVED, REQUEST_APPROVED_SUCCESSFULLY]
: [REQUEST_LOG_TYPE.REQUEST_REJECTED, REQUEST_REJECTED_SUCCESSFULLY];
const requestLog = {
type: logType,
meta: {
requestId: requestId,
action: LOG_ACTION.UPDATE,
userId: userId,
createdAt: Date.now(),
},
body: requestResult,
};
await addLog(requestLog.type, requestLog.meta, requestLog.body);
if (requestResult.state === REQUEST_STATE.APPROVED) {
const requestData = await getRequests({ id: requestId });
if (requestData) {
const { from, until, requestedBy, message } = requestData as any;
const userFutureStatusData = {
requestId,
status: REQUEST_TYPE.OOO,
state: statusState.UPCOMING,
from,
endsOn: until,
userId: requestedBy,
message,
};
await createUserFutureStatus(userFutureStatusData);
await addFutureStatus(userFutureStatusData);
}
}
return res.status(201).json({
message: returnMessage,
data: {
id: requestResult.id,
...requestResult,
},
});
} catch (err) {
logger.error(ERROR_WHILE_UPDATING_REQUEST, err);
return res.boom.badImplementation(ERROR_WHILE_UPDATING_REQUEST);
}
};