@@ -3,12 +3,15 @@ import {
3
3
LOG_ACTION ,
4
4
REQUEST_CREATED_SUCCESSFULLY ,
5
5
ERROR_WHILE_CREATING_REQUEST ,
6
- REQUEST_ALREADY_PENDING ,
7
6
REQUEST_STATE ,
8
7
REQUEST_TYPE ,
9
8
ERROR_WHILE_UPDATING_REQUEST ,
10
9
REQUEST_APPROVED_SUCCESSFULLY ,
11
10
REQUEST_REJECTED_SUCCESSFULLY ,
11
+ UNAUTHORIZED_TO_CREATE_OOO_REQUEST ,
12
+ REQUEST_ALREADY_PENDING ,
13
+ USER_STATUS_NOT_FOUND ,
14
+ OOO_STATUS_ALREADY_EXIST ,
12
15
UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST ,
13
16
ERROR_WHILE_ACKNOWLEDGING_REQUEST ,
14
17
REQUEST_DOES_NOT_EXIST ,
@@ -17,50 +20,74 @@ import {
17
20
REQUEST_ALREADY_REJECTED ,
18
21
} from "../constants/requests" ;
19
22
import { statusState } from "../constants/userStatus" ;
23
+ import { logType } from "../constants/logs" ;
20
24
import { addLog } from "../models/logs" ;
21
- import { createRequest , getRequestByKeyValues , getRequests , updateRequest } from "../models/requests" ;
25
+ import { getRequestByKeyValues , getRequests , updateRequest } from "../models/requests" ;
22
26
import { createUserFutureStatus } from "../models/userFutureStatus" ;
23
- import { addFutureStatus } from "../models/userStatus" ;
24
- import { acknowledgeOOORequest } from "../services/oooRequest" ;
27
+ import { getUserStatus , addFutureStatus } from "../models/userStatus" ;
28
+ import { createOooRequest , validateUserStatus , acknowledgeOooRequest } from "../services/oooRequest" ;
25
29
import { CustomResponse } from "../typeDefinitions/global" ;
26
- import { AcknowledgeOOORequest , OooRequestCreateRequest , OooRequestResponse , OooStatusRequest } from "../types/oooRequest" ;
30
+ import { AcknowledgeOooRequest , OooRequestCreateRequest , OooRequestResponse , OooStatusRequest } from "../types/oooRequest" ;
27
31
import { UpdateRequest } from "../types/requests" ;
28
32
29
- export const createOooRequestController = async ( req : OooRequestCreateRequest , res : CustomResponse ) => {
33
+ /**
34
+ * Controller to handle the creation of OOO requests.
35
+ *
36
+ * This function processes the request to create an OOO request,
37
+ * validates the user status, checks existing requests,
38
+ * and stores the new request in the database with logging.
39
+ *
40
+ * @param {OooRequestCreateRequest } req - The Express request object containing the body with OOO details.
41
+ * @param {CustomResponse } res - The Express response object used to send back the response.
42
+ * @returns {Promise<OooRequestResponse> } Resolves to a response with the success or an error message.
43
+ */
44
+ export const createOooRequestController = async (
45
+ req : OooRequestCreateRequest ,
46
+ res : OooRequestResponse
47
+ ) : Promise < OooRequestResponse > => {
48
+
30
49
const requestBody = req . body ;
31
- const userId = req ?. userData ?. id ;
50
+ const { id : userId , username } = req . userData ;
51
+ const isUserPartOfDiscord = req . userData . roles . in_discord ;
52
+ const dev = req . query . dev === "true" ;
32
53
33
- if ( ! userId ) {
34
- return res . boom . unauthorized ( ) ;
54
+ if ( ! dev ) return res . boom . notImplemented ( "Feature not implemented" ) ;
55
+
56
+ if ( ! isUserPartOfDiscord ) {
57
+ return res . boom . forbidden ( UNAUTHORIZED_TO_CREATE_OOO_REQUEST ) ;
35
58
}
36
59
37
60
try {
38
- const latestOooRequest :OooStatusRequest = await getRequestByKeyValues ( { requestedBy : userId , type : REQUEST_TYPE . OOO , state : REQUEST_STATE . PENDING } ) ;
61
+ const userStatus = await getUserStatus ( userId ) ;
62
+ const validationResponse = await validateUserStatus ( userId , userStatus ) ;
39
63
40
- if ( latestOooRequest && latestOooRequest . status === REQUEST_STATE . PENDING ) {
41
- return res . boom . badRequest ( REQUEST_ALREADY_PENDING ) ;
64
+ if ( validationResponse ) {
65
+ if ( validationResponse . error === USER_STATUS_NOT_FOUND ) {
66
+ return res . boom . notFound ( validationResponse . error ) ;
67
+ }
68
+ if ( validationResponse . error === OOO_STATUS_ALREADY_EXIST ) {
69
+ return res . boom . forbidden ( validationResponse . error ) ;
70
+ }
42
71
}
43
72
44
- const requestResult = await createRequest ( { requestedBy : userId , ...requestBody } ) ;
73
+ const latestOooRequest : OooStatusRequest = await getRequestByKeyValues ( {
74
+ userId,
75
+ type : REQUEST_TYPE . OOO ,
76
+ status : REQUEST_STATE . PENDING ,
77
+ } ) ;
78
+
79
+ if ( latestOooRequest ) {
80
+ await addLog ( logType . PENDING_REQUEST_FOUND ,
81
+ { userId, oooRequestId : latestOooRequest . id } ,
82
+ { message : REQUEST_ALREADY_PENDING }
83
+ ) ;
84
+ return res . boom . conflict ( REQUEST_ALREADY_PENDING ) ;
85
+ }
45
86
46
- const requestLog = {
47
- type : REQUEST_LOG_TYPE . REQUEST_CREATED ,
48
- meta : {
49
- requestId : requestResult . id ,
50
- action : LOG_ACTION . CREATE ,
51
- userId : userId ,
52
- createdAt : Date . now ( ) ,
53
- } ,
54
- body : requestResult ,
55
- } ;
56
- await addLog ( requestLog . type , requestLog . meta , requestLog . body ) ;
87
+ await createOooRequest ( requestBody , username , userId ) ;
57
88
58
89
return res . status ( 201 ) . json ( {
59
90
message : REQUEST_CREATED_SUCCESSFULLY ,
60
- data : {
61
- id : requestResult . id ,
62
- ...requestResult ,
63
- } ,
64
91
} ) ;
65
92
} catch ( err ) {
66
93
logger . error ( ERROR_WHILE_CREATING_REQUEST , err ) ;
@@ -131,12 +158,12 @@ export const updateOooRequestController = async (req: UpdateRequest, res: Custom
131
158
/**
132
159
* Acknowledges an Out-of-Office (OOO) request
133
160
*
134
- * @param {AcknowledgeOOORequest } req - The request object.
161
+ * @param {AcknowledgeOooRequest } req - The request object.
135
162
* @param {OooRequestResponse } res - The response object.
136
163
* @returns {Promise<OooRequestResponse> } Resolves with success or failure.
137
164
*/
138
- export const acknowledgeOOORequestController = async (
139
- req : AcknowledgeOOORequest ,
165
+ export const acknowledgeOooRequestController = async (
166
+ req : AcknowledgeOooRequest ,
140
167
res : OooRequestResponse ,
141
168
)
142
169
: Promise < OooRequestResponse > => {
@@ -156,7 +183,7 @@ export const acknowledgeOOORequestController = async (
156
183
157
184
try {
158
185
159
- const response = await acknowledgeOOORequest ( requestId , requestBody , superUserId ) ;
186
+ const response = await acknowledgeOooRequest ( requestId , requestBody , superUserId ) ;
160
187
161
188
if ( response . error === REQUEST_DOES_NOT_EXIST ) {
162
189
return res . boom . notFound ( REQUEST_DOES_NOT_EXIST ) ;
0 commit comments