@@ -3,62 +3,85 @@ 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 ,
12
- } from "../constants/requests.js" ;
13
- import { statusState } from "../constants/userStatus.js" ;
14
- import { addLog } from "../models/logs.js" ;
15
- import { createRequest , getRequestByKeyValues , getRequests , updateRequest } from "../models/requests.js" ;
16
- import { createUserFutureStatus } from "../models/userFutureStatus.js" ;
17
- import { addFutureStatus } from "../models/userStatus.js" ;
18
- import { CustomResponse } from "../typeDefinitions/global.js" ;
19
- import { OooRequestCreateRequest , OooStatusRequest } from "../types/oooRequest.js" ;
20
- import { UpdateRequest } from "../types/requests.js" ;
21
- import logger from "../utils/logger.js" ;
11
+ UNAUTHORIZED_TO_CREATE_OOO_REQUEST ,
12
+ REQUEST_ALREADY_PENDING ,
13
+ USER_STATUS_NOT_FOUND ,
14
+ OOO_STATUS_ALREADY_EXIST ,
15
+ } from "../constants/requests" ;
16
+ import { statusState } from "../constants/userStatus" ;
17
+ import { logType } from "../constants/logs" ;
18
+ import { addLog } from "../models/logs" ;
19
+ import { getRequestByKeyValues , getRequests , updateRequest } from "../models/requests" ;
20
+ import { createUserFutureStatus } from "../models/userFutureStatus" ;
21
+ import { getUserStatus , addFutureStatus } from "../models/userStatus" ;
22
+ import { createOooRequest , validateUserStatus } from "../services/oooRequest" ;
23
+ import { CustomResponse } from "../typeDefinitions/global" ;
24
+ import { OooRequestCreateRequest , OooRequestResponse , OooStatusRequest } from "../types/oooRequest" ;
25
+ import { UpdateRequest } from "../types/requests" ;
26
+
27
+ /**
28
+ * Controller to handle the creation of OOO requests.
29
+ *
30
+ * This function processes the request to create an OOO request,
31
+ * validates the user status, checks existing requests,
32
+ * and stores the new request in the database with logging.
33
+ *
34
+ * @param {OooRequestCreateRequest } req - The Express request object containing the body with OOO details.
35
+ * @param {CustomResponse } res - The Express response object used to send back the response.
36
+ * @returns {Promise<OooRequestResponse> } Resolves to a response with the success or an error message.
37
+ */
38
+ export const createOooRequestController = async (
39
+ req : OooRequestCreateRequest ,
40
+ res : OooRequestResponse
41
+ ) : Promise < OooRequestResponse > => {
22
42
23
- export const createOooRequestController = async ( req : OooRequestCreateRequest , res : CustomResponse ) => {
24
43
const requestBody = req . body ;
25
- const userId = req ?. userData ?. id ;
44
+ const { id : userId , username } = req . userData ;
45
+ const isUserPartOfDiscord = req . userData . roles . in_discord ;
46
+ const dev = req . query . dev === "true" ;
26
47
27
- if ( ! userId ) {
28
- return res . boom . unauthorized ( ) ;
48
+ if ( ! dev ) return res . boom . notImplemented ( "Feature not implemented" ) ;
49
+
50
+ if ( ! isUserPartOfDiscord ) {
51
+ return res . boom . forbidden ( UNAUTHORIZED_TO_CREATE_OOO_REQUEST ) ;
29
52
}
30
53
31
54
try {
55
+ const userStatus = await getUserStatus ( userId ) ;
56
+ const validationResponse = await validateUserStatus ( userId , userStatus ) ;
57
+
58
+ if ( validationResponse ) {
59
+ if ( validationResponse . error === USER_STATUS_NOT_FOUND ) {
60
+ return res . boom . notFound ( validationResponse . error ) ;
61
+ }
62
+ if ( validationResponse . error === OOO_STATUS_ALREADY_EXIST ) {
63
+ return res . boom . forbidden ( validationResponse . error ) ;
64
+ }
65
+ }
66
+
32
67
const latestOooRequest : OooStatusRequest = await getRequestByKeyValues ( {
33
- requestedBy : userId ,
34
- type : REQUEST_TYPE . OOO ,
35
- state : REQUEST_STATE . PENDING ,
68
+ userId,
69
+ type : REQUEST_TYPE . OOO ,
70
+ status : REQUEST_STATE . PENDING ,
36
71
} ) ;
37
72
38
- if ( latestOooRequest && latestOooRequest . state === REQUEST_STATE . PENDING ) {
39
- return res . boom . badRequest ( REQUEST_ALREADY_PENDING ) ;
73
+ if ( latestOooRequest ) {
74
+ await addLog ( logType . PENDING_REQUEST_FOUND ,
75
+ { userId, oooRequestId : latestOooRequest . id } ,
76
+ { message : REQUEST_ALREADY_PENDING }
77
+ ) ;
78
+ return res . boom . conflict ( REQUEST_ALREADY_PENDING ) ;
40
79
}
41
80
42
- const requestResult = await createRequest ( { requestedBy : userId , ...requestBody } ) ;
43
-
44
- const requestLog = {
45
- type : REQUEST_LOG_TYPE . REQUEST_CREATED ,
46
- meta : {
47
- requestId : requestResult . id ,
48
- action : LOG_ACTION . CREATE ,
49
- userId : userId ,
50
- createdAt : Date . now ( ) ,
51
- } ,
52
- body : requestResult ,
53
- } ;
54
- await addLog ( requestLog . type , requestLog . meta , requestLog . body ) ;
81
+ await createOooRequest ( requestBody , username , userId ) ;
55
82
56
83
return res . status ( 201 ) . json ( {
57
84
message : REQUEST_CREATED_SUCCESSFULLY ,
58
- data : {
59
- id : requestResult . id ,
60
- ...requestResult ,
61
- } ,
62
85
} ) ;
63
86
} catch ( err ) {
64
87
logger . error ( ERROR_WHILE_CREATING_REQUEST , err ) ;
0 commit comments