generated from Real-Dev-Squad/website-template
-
Notifications
You must be signed in to change notification settings - Fork 201
/
oooRequests.ts
122 lines (111 loc) · 3.88 KB
/
oooRequests.ts
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
import {
REQUEST_LOG_TYPE,
LOG_ACTION,
REQUEST_CREATED_SUCCESSFULLY,
ERROR_WHILE_CREATING_REQUEST,
REQUEST_ALREADY_PENDING,
REQUEST_STATE,
REQUEST_TYPE,
ERROR_WHILE_UPDATING_REQUEST,
REQUEST_APPROVED_SUCCESSFULLY,
REQUEST_REJECTED_SUCCESSFULLY,
} from "../constants/requests";
import { statusState } from "../constants/userStatus";
import { addLog } from "../models/logs";
import { createRequest, getRequestByKeyValues, getRequests, updateRequest } from "../models/requests";
import { createUserFutureStatus } from "../models/userFutureStatus";
import { addFutureStatus } from "../models/userStatus";
import { CustomResponse } from "../typeDefinitions/global";
import { OooRequestCreateRequest, OooStatusRequest } from "../types/oooRequest";
import { UpdateRequest } from "../types/requests";
export const createOooRequestController = async (req: OooRequestCreateRequest, res: CustomResponse) => {
const requestBody = req.body;
const userId = req?.userData?.id;
if (!userId) {
return res.boom.unauthorized();
}
try {
const latestOooRequest:OooStatusRequest = await getRequestByKeyValues({ requestedBy: userId, type: REQUEST_TYPE.OOO , state: REQUEST_STATE.PENDING });
if (latestOooRequest && latestOooRequest.state === REQUEST_STATE.PENDING) {
return res.boom.badRequest(REQUEST_ALREADY_PENDING);
}
const requestResult = await createRequest({ requestedBy: userId, ...requestBody });
const requestLog = {
type: REQUEST_LOG_TYPE.REQUEST_CREATED,
meta: {
requestId: requestResult.id,
action: LOG_ACTION.CREATE,
createdBy: userId,
createdAt: Date.now(),
},
body: requestResult,
};
await addLog(requestLog.type, requestLog.meta, requestLog.body);
return res.status(201).json({
message: REQUEST_CREATED_SUCCESSFULLY,
data: {
id: requestResult.id,
...requestResult,
},
});
} 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,
createdBy: 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);
}
};