@@ -498,6 +498,193 @@ async function resetPasswordController(req, res, next) {
498498 }
499499}
500500
501+ async function siginWithMFAController ( req , res , next ) {
502+ try {
503+ const userService = new UserService ( ) ;
504+ const { token } = req . body ;
505+ const mfaSessionToken = req . cookies . mfaToken ;
506+ if ( ! mfaSessionToken ) {
507+ return res . status ( 401 ) . json ( {
508+ error : STATUS_CODES [ 401 ] ,
509+ message : "MFA token not found" ,
510+ statusCode : 401 ,
511+ } ) ;
512+ }
513+
514+ // check if mfaSessionToken is valid
515+
516+ const user = await userService . getUserById ( mfaSessionToken . userId ) ;
517+ if ( ! user ) {
518+ return res . status ( 404 ) . json ( {
519+ error : STATUS_CODES [ 404 ] ,
520+ message : Messages . USER_NOT_FOUND ,
521+ statusCode : 404 ,
522+ } ) ;
523+ }
524+
525+ const isVerified = await userService . mfaLogin ( user , token ) ;
526+ if ( ! isVerified ) {
527+ return res . status ( 400 ) . json ( {
528+ error : STATUS_CODES [ 400 ] ,
529+ message : "Invalid token" ,
530+ statusCode : 400 ,
531+ } ) ;
532+ }
533+
534+ // set session
535+
536+ return res . status ( 200 ) . json ( { statusCode : 200 } ) ;
537+ } catch ( error ) {
538+ next ( error ) ;
539+ }
540+ }
541+
542+ async function enableMFAController ( req , res , next ) {
543+ try {
544+ const userService = new UserService ( ) ;
545+ const { userId } = req . userData ;
546+ const user = await userService . getUserById ( userId ) ;
547+ if ( ! user ) {
548+ return res . status ( 404 ) . json ( {
549+ error : STATUS_CODES [ 404 ] ,
550+ message : Messages . USER_NOT_FOUND ,
551+ statusCode : 404 ,
552+ } ) ;
553+ }
554+
555+ const { qrCode } = await userService . enableMfa ( user ) ;
556+ if ( ! qrCode ) {
557+ return res . status ( 500 ) . json ( {
558+ error : STATUS_CODES [ 500 ] ,
559+ message : "Failed to enable MFA" ,
560+ statusCode : 500 ,
561+ } ) ;
562+ }
563+
564+ return res . status ( 200 ) . json ( {
565+ statusCode : 200 ,
566+ data : { qrCode } ,
567+ } ) ;
568+ } catch ( error ) {
569+ res . status ( error . statusCode || 500 ) . json ( {
570+ error : STATUS_CODES [ error . statusCode ] || STATUS_CODES [ 500 ] ,
571+ message : error . message ,
572+ statusCode : error . statusCode || 500 ,
573+ } ) ;
574+ next ( error ) ;
575+ }
576+ }
577+
578+ async function verifyMFAController ( req , res , next ) {
579+ try {
580+ const userService = new UserService ( ) ;
581+ const { token } = req . body ;
582+ const { userId } = req . userData ;
583+ const user = await userService . getUserById ( userId ) ;
584+ if ( ! user ) {
585+ return res . status ( 404 ) . json ( {
586+ error : STATUS_CODES [ 404 ] ,
587+ message : Messages . USER_NOT_FOUND ,
588+ statusCode : 404 ,
589+ } ) ;
590+ }
591+
592+ const isVerified = await userService . verifyMfa ( user , token ) ;
593+ if ( ! isVerified ) {
594+ return res . status ( 400 ) . json ( {
595+ error : STATUS_CODES [ 400 ] ,
596+ message : "Invalid token" ,
597+ statusCode : 400 ,
598+ } ) ;
599+ }
600+
601+ return res . status ( 200 ) . json ( { statusCode : 200 } ) ;
602+ } catch ( error ) {
603+ res . status ( error . statusCode || 500 ) . json ( {
604+ error : STATUS_CODES [ error . statusCode ] || STATUS_CODES [ 500 ] ,
605+ message : error . message ,
606+ statusCode : error . statusCode || 500 ,
607+ } ) ;
608+ next ( error ) ;
609+ }
610+ }
611+
612+ async function cancelMFAController ( req , res , next ) {
613+ try {
614+ const userService = new UserService ( ) ;
615+ const { userId } = req . userData ;
616+ const user = await userService . getUserById ( userId ) ;
617+ if ( ! user ) {
618+ return res . status ( 404 ) . json ( {
619+ error : STATUS_CODES [ 404 ] ,
620+ message : Messages . USER_NOT_FOUND ,
621+ statusCode : 404 ,
622+ } ) ;
623+ }
624+
625+ const isDisabled = await userService . disableMfa ( user ) ;
626+ if ( ! isDisabled ) {
627+ return res . status ( 500 ) . json ( {
628+ error : STATUS_CODES [ 500 ] ,
629+ message : "Failed to disable MFA" ,
630+ statusCode : 500 ,
631+ } ) ;
632+ }
633+
634+ return res . status ( 200 ) . json ( { statusCode : 200 } ) ;
635+ } catch ( error ) {
636+ res . status ( error . statusCode || 500 ) . json ( {
637+ error : STATUS_CODES [ error . statusCode ] || STATUS_CODES [ 500 ] ,
638+ message : error . message ,
639+ statusCode : error . statusCode || 500 ,
640+ } ) ;
641+ next ( error ) ;
642+ }
643+ }
644+
645+ async function disableMFAController ( req , res , next ) {
646+ try {
647+ const userService = new UserService ( ) ;
648+ const { password } = req . body ;
649+ const { userId } = req . userData ;
650+ const user = await userService . getUserById ( userId ) ;
651+ if ( ! user ) {
652+ return res . status ( 404 ) . json ( {
653+ error : STATUS_CODES [ 404 ] ,
654+ message : Messages . USER_NOT_FOUND ,
655+ statusCode : 404 ,
656+ } ) ;
657+ }
658+
659+ const matchPassword = await user . matchPassword ( password ) ;
660+ if ( ! matchPassword ) {
661+ return res . status ( 404 ) . json ( {
662+ error : STATUS_CODES [ 404 ] ,
663+ message : Messages . INCORRECT_EMAIL_PASS ,
664+ statusCode : 404 ,
665+ } ) ;
666+ }
667+
668+ const isDisabled = await userService . disableMfa ( user ) ;
669+ if ( ! isDisabled ) {
670+ return res . status ( 500 ) . json ( {
671+ error : STATUS_CODES [ 500 ] ,
672+ message : "Failed to disable MFA" ,
673+ statusCode : 500 ,
674+ } ) ;
675+ }
676+
677+ return res . status ( 200 ) . json ( { statusCode : 200 } ) ;
678+ } catch ( error ) {
679+ res . status ( error . statusCode || 500 ) . json ( {
680+ error : STATUS_CODES [ error . statusCode ] || STATUS_CODES [ 500 ] ,
681+ message : error . message ,
682+ statusCode : error . statusCode || 500 ,
683+ } ) ;
684+ next ( error ) ;
685+ }
686+ }
687+
501688function validateSessionController ( req , res ) {
502689 return res . status ( 200 ) . json ( { statusCode : 200 , userData : req . userData } ) ;
503690}
@@ -511,4 +698,9 @@ module.exports = {
511698 resetPasswordSessionController,
512699 resetPasswordController,
513700 validateSessionController,
701+ siginWithMFAController,
702+ enableMFAController,
703+ verifyMFAController,
704+ cancelMFAController,
705+ disableMFAController,
514706} ;
0 commit comments