@@ -3,57 +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 ,
11
+ UNAUTHORIZED_TO_CREATE_OOO_REQUEST ,
12
+ REQUEST_ALREADY_PENDING ,
13
+ USER_STATUS_NOT_FOUND ,
14
+ OOO_STATUS_ALREADY_EXIST ,
12
15
} from "../constants/requests" ;
13
16
import { statusState } from "../constants/userStatus" ;
17
+ import { logType } from "../constants/logs" ;
14
18
import { addLog } from "../models/logs" ;
15
- import { createRequest , getRequestByKeyValues , getRequests , updateRequest } from "../models/requests" ;
19
+ import { getRequestByKeyValues , getRequests , updateRequest } from "../models/requests" ;
16
20
import { createUserFutureStatus } from "../models/userFutureStatus" ;
17
- import { addFutureStatus } from "../models/userStatus" ;
21
+ import { getUserStatus , addFutureStatus } from "../models/userStatus" ;
22
+ import { createOooRequest , validateUserStatus } from "../services/oooRequest" ;
18
23
import { CustomResponse } from "../typeDefinitions/global" ;
19
- import { OooRequestCreateRequest , OooStatusRequest } from "../types/oooRequest" ;
24
+ import { OooRequestCreateRequest , OooRequestResponse , OooStatusRequest } from "../types/oooRequest" ;
20
25
import { UpdateRequest } from "../types/requests" ;
21
26
22
- export const createOooRequestController = async ( req : OooRequestCreateRequest , res : CustomResponse ) => {
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 > => {
42
+
23
43
const requestBody = req . body ;
24
- 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" ;
25
47
26
- if ( ! userId ) {
27
- 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 ) ;
28
52
}
29
53
30
54
try {
31
- const latestOooRequest :OooStatusRequest = await getRequestByKeyValues ( { requestedBy : userId , type : REQUEST_TYPE . OOO , state : REQUEST_STATE . PENDING } ) ;
55
+ const userStatus = await getUserStatus ( userId ) ;
56
+ const validationResponse = await validateUserStatus ( userId , userStatus ) ;
32
57
33
- if ( latestOooRequest && latestOooRequest . state === REQUEST_STATE . PENDING ) {
34
- return res . boom . badRequest ( REQUEST_ALREADY_PENDING ) ;
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
+ }
35
65
}
36
66
37
- const requestResult = await createRequest ( { requestedBy : userId , ...requestBody } ) ;
67
+ const latestOooRequest : OooStatusRequest = await getRequestByKeyValues ( {
68
+ userId,
69
+ type : REQUEST_TYPE . OOO ,
70
+ status : REQUEST_STATE . PENDING ,
71
+ } ) ;
38
72
39
- const requestLog = {
40
- type : REQUEST_LOG_TYPE . REQUEST_CREATED ,
41
- meta : {
42
- requestId : requestResult . id ,
43
- action : LOG_ACTION . CREATE ,
44
- userId : userId ,
45
- createdAt : Date . now ( ) ,
46
- } ,
47
- body : requestResult ,
48
- } ;
49
- await addLog ( requestLog . type , requestLog . meta , requestLog . body ) ;
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 ) ;
79
+ }
80
+
81
+ await createOooRequest ( requestBody , username , userId ) ;
50
82
51
83
return res . status ( 201 ) . json ( {
52
84
message : REQUEST_CREATED_SUCCESSFULLY ,
53
- data : {
54
- id : requestResult . id ,
55
- ...requestResult ,
56
- } ,
57
85
} ) ;
58
86
} catch ( err ) {
59
87
logger . error ( ERROR_WHILE_CREATING_REQUEST , err ) ;
0 commit comments