@@ -9,15 +9,21 @@ import {
99 ERROR_WHILE_UPDATING_REQUEST ,
1010 REQUEST_APPROVED_SUCCESSFULLY ,
1111 REQUEST_REJECTED_SUCCESSFULLY ,
12+ REQUEST_DOES_NOT_EXIST ,
13+ UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST ,
14+ REQUEST_ALREADY_APPROVED ,
15+ REQUEST_ALREADY_REJECTED ,
1216} from "../constants/requests" ;
1317import { statusState } from "../constants/userStatus" ;
1418import { addLog } from "../models/logs" ;
1519import { createRequest , getRequestByKeyValues , getRequests , updateRequest } from "../models/requests" ;
1620import { createUserFutureStatus } from "../models/userFutureStatus" ;
1721import { addFutureStatus } from "../models/userStatus" ;
1822import { CustomResponse } from "../typeDefinitions/global" ;
19- import { OooRequestCreateRequest , OooStatusRequest } from "../types/oooRequest" ;
23+ import { AcknowledgeOOORequest , AcknowledgeOOORequestBody , OooRequestCreateRequest , OooRequestResponse , OooStatusRequest } from "../types/oooRequest" ;
2024import { UpdateRequest } from "../types/requests" ;
25+ import firestore from "../utils/firestore" ;
26+ const requestModel = firestore . collection ( "requests" ) ;
2127
2228export const createOooRequestController = async ( req : OooRequestCreateRequest , res : CustomResponse ) => {
2329 const requestBody = req . body ;
@@ -30,7 +36,7 @@ export const createOooRequestController = async (req: OooRequestCreateRequest, r
3036 try {
3137 const latestOooRequest :OooStatusRequest = await getRequestByKeyValues ( { requestedBy : userId , type : REQUEST_TYPE . OOO , state : REQUEST_STATE . PENDING } ) ;
3238
33- if ( latestOooRequest && latestOooRequest . state === REQUEST_STATE . PENDING ) {
39+ if ( latestOooRequest && latestOooRequest . status === REQUEST_STATE . PENDING ) {
3440 return res . boom . badRequest ( REQUEST_ALREADY_PENDING ) ;
3541 }
3642
@@ -120,3 +126,98 @@ export const updateOooRequestController = async (req: UpdateRequest, res: Custom
120126 return res . boom . badImplementation ( ERROR_WHILE_UPDATING_REQUEST ) ;
121127 }
122128} ;
129+
130+ export const acknowledgeOOORequestController = async (
131+ req : AcknowledgeOOORequest ,
132+ res : OooRequestResponse )
133+ : Promise < OooRequestResponse > => {
134+
135+ const dev = req . query . dev === "true" ;
136+
137+ if ( ! dev ) return res . boom . notImplemented ( "Feature not implemented" ) ;
138+
139+ const requestBody = req . body ;
140+ const userId = req ?. userData ?. id ;
141+ const requestId = req . params . id ;
142+ const isSuperuser = req ?. userData ?. roles ?. super_user === true ;
143+
144+ if ( isSuperuser === false ) {
145+ return res . boom . unauthorized ( UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST ) ;
146+ }
147+
148+ try {
149+ const request = await requestModel . doc ( requestId ) . get ( ) ;
150+
151+ if ( ! request . exists ) {
152+ return res . boom . notFound ( REQUEST_DOES_NOT_EXIST ) ;
153+ }
154+
155+ const requestData = request . data ( ) ;
156+
157+ if ( requestData . status === REQUEST_STATE . APPROVED ) {
158+ return res . boom . badRequest ( REQUEST_ALREADY_APPROVED ) ;
159+ }
160+ else if ( requestData . status === REQUEST_STATE . REJECTED ) {
161+ return res . boom . badRequest ( REQUEST_ALREADY_REJECTED ) ;
162+ }
163+
164+ if ( requestData . type === REQUEST_TYPE . OOO ) {
165+
166+ requestBody . type = REQUEST_TYPE . OOO ;
167+
168+ const requestResult = await updateRequest ( requestId , requestBody , userId , REQUEST_TYPE . OOO ) ;
169+ if ( "error" in requestResult ) {
170+ return res . boom . badRequest ( requestResult . error ) ;
171+ }
172+ const [ logType , returnMessage ] =
173+ requestResult . status === REQUEST_STATE . APPROVED
174+ ? [ REQUEST_LOG_TYPE . REQUEST_APPROVED , REQUEST_APPROVED_SUCCESSFULLY ]
175+ : [ REQUEST_LOG_TYPE . REQUEST_REJECTED , REQUEST_REJECTED_SUCCESSFULLY ] ;
176+
177+ const requestLog = {
178+ type : logType ,
179+ meta : {
180+ requestId : requestId ,
181+ action : LOG_ACTION . UPDATE ,
182+ userId : userId ,
183+ createdAt : Date . now ( ) ,
184+ } ,
185+ body : requestResult ,
186+ } ;
187+ await addLog ( requestLog . type , requestLog . meta , requestLog . body ) ;
188+ if ( requestResult . status === REQUEST_STATE . APPROVED ) {
189+ const requestData = await getRequests ( { id : requestId } ) ;
190+
191+ if ( requestData ) {
192+ const { from, until, requestedBy, comment } = requestData as any ;
193+ const userFutureStatusData = {
194+ requestId,
195+ status : REQUEST_TYPE . OOO ,
196+ state : statusState . UPCOMING ,
197+ from,
198+ endsOn : until ,
199+ userId : requestedBy ,
200+ message : comment ,
201+ } ;
202+ await createUserFutureStatus ( userFutureStatusData ) ;
203+ await addFutureStatus ( userFutureStatusData ) ;
204+ }
205+
206+ return res . status ( 201 ) . json ( {
207+ message : REQUEST_APPROVED_SUCCESSFULLY ,
208+ } ) ;
209+ }
210+ return res . status ( 201 ) . json ( {
211+ message : REQUEST_REJECTED_SUCCESSFULLY ,
212+ } ) ;
213+
214+ } else {
215+ return res . boom . notImplemented ( "Feature not implemented" ) ;
216+ }
217+ }
218+ catch ( error ) {
219+ logger . error ( ERROR_WHILE_UPDATING_REQUEST , error ) ;
220+ return res . boom . badImplementation ( ERROR_WHILE_UPDATING_REQUEST ) ;
221+ }
222+
223+ }
0 commit comments