package Ġdev . z lag i . application . controller Ċ Ċ import Ġdev . z lag i . application . auth . Password Encrypt or Contract Ċ import Ġdev . z lag i . application . auth . Token Provider Ċ import Ġdev . z lag i . application . exception . BadRequest Exception Ċ import Ġdev . z lag i . application . exception . Unauthorized Activity Exception Ċ import Ġdev . z lag i . application . model . request . SignIn Request Ċ import Ġdev . z lag i . application . model . request . SignUp Request Ċ import Ġdev . z lag i . application . model . request . Update Password Request Ċ import Ġdev . z lag i . application . model . response . Auth Response Ċ import Ġdev . z lag i . application . utils . is Alpha Numeric Ċ import Ġdev . z lag i . application . utils . is Email Valid Ċ import Ġdev . z lag i . data . dao . Token Dao Ċ import Ġdev . z lag i . data . dao . User Dao Ċ import Ġdev . z lag i . data . model . Blog DataModel Ċ import Ġdev . z lag i . data . model . User Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . k oin . core . component . inject Ċ import Ġjava . text . SimpleDateFormat Ċ Ċ abstract Ġclass ĠBaseController Ġ: ĠK oin Component Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġuser Dao Ġby Ġinject < User Dao >() ĊĠĠĠ Ġprivate Ġval Ġrefresh Tokens Dao Ġby Ġinject < Token Dao >() ĊĠĠĠ Ġprivate Ġval Ġpassword Encryption Ġby Ġinject < Password Encrypt or Contract >() ĊĠĠĠ Ġprivate Ġval Ġtoken Provider Ġby Ġinject < Token Provider >() ĊĠĠĠ Ġprivate Ġval Ġsimple DateFormat Ġ= ĠSimpleDateFormat ("' Date : Ġ' yyyy - MM - dd ' ĠTime : Ġ' HH : mm : ss ") ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate SignIn Fields OrThrow Exception ( ĊĠĠĠĠĠĠĠ Ġsign In Request : ĠSign In Request ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( signIn Request . email . isBlank () Ġor Ġ( signIn Request . password . isBlank ())) Ġ-> Ġ" Credentials Ġfields Ġshould Ġnot Ġbe Ġblank " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(! signIn Request . email . is Email Valid ()) Ġ-> Ġ" Email Ġinvalid " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( signIn Request . password . length Ġ! in Ġ( 8 .. 5 0 )) Ġ-> Ġ" Password Ġshould Ġbe Ġof Ġmin Ġ 8 Ġand Ġmax Ġ 5 0 Ġcharacter Ġin Ġlength " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate SignUp Fields OrThrow Exception ( ĊĠĠĠĠĠĠĠ Ġsign Up Request : ĠSign Up Request ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( sign Up Request . email . isBlank () Ġor Ġ( sign Up Request . username . isBlank ()) Ġor Ġ( sign Up Request . password . isBlank ()) Ġor Ġ( sign Up Request . confirm Password . isBlank ())) Ġ-> Ġ" Fields Ġshould Ġnot Ġbe Ġblank " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(! sign Up Request . email . is Email Valid ()) Ġ-> Ġ" Email Ġinvalid " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(! sign Up Request . username . is Alpha Numeric ()) Ġ-> Ġ" No Ġspecial Ġcharacters Ġallowed Ġin Ġusername " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( sign Up Request . username . length Ġ! in Ġ( 4 .. 3 0 )) Ġ-> Ġ" Username Ġshould Ġbe Ġof Ġmin Ġ 4 Ġand Ġmax Ġ 3 0 Ġcharacter Ġin Ġlength " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( sign Up Request . password . length Ġ! in Ġ( 8 .. 5 0 )) Ġ-> Ġ" Password Ġshould Ġbe Ġof Ġmin Ġ 8 Ġand Ġmax Ġ 5 0 Ġcharacter Ġin Ġlength " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( sign Up Request . confirm Password . length Ġ! in Ġ( 8 .. 5 0 )) Ġ-> Ġ" Password Ġshould Ġbe Ġof Ġmin Ġ 8 Ġand Ġmax Ġ 5 0 Ġcharacter Ġin Ġlength " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( sign Up Request . password Ġ!= Ġsign Up Request . confirm Password ) Ġ-> Ġ" Password s Ġdo Ġnot Ġmatch " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Reset Password Fields OrThrow Exception ( email : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( email . isBlank ()) Ġ-> Ġ" Email Ġfield Ġshould Ġnot Ġbe Ġblank " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Update Password Fields OrThrow Exception ( ĊĠĠĠĠĠĠĠ Ġupdate Password Request : ĠUpdate Password Request ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( update Password Request . current Password . isBlank () Ġ|| Ġupdate Password Request . new Password . isBlank () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġupdate Password Request . confirm New Password . isBlank ()) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Password Ġfield Ġshould Ġnot Ġbe Ġblank " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Password Request . new Password Ġ!= Ġupdate Password Request . confirm New Password Ġ-> Ġ" Password s Ġdo Ġnot Ġmatch " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Password Request . new Password . length Ġ! in Ġ( 8 .. 5 0 ) Ġ-> Ġ" Password Ġshould Ġbe Ġof Ġmin Ġ 8 Ġand Ġmax Ġ 5 0 Ġcharacter Ġin Ġlength " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Password Request . confirm New Password . length Ġ! in Ġ( 8 .. 5 0 ) Ġ-> Ġ" Password Ġshould Ġbe Ġof Ġmin Ġ 8 Ġand Ġmax Ġ 5 0 Ġcharacter Ġin Ġlength " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Token Parameters OrThrow Exception ( token : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġnull ) Ġthrow ĠBadRequest Exception (" Missing Ġtoken Ġquery Ġparameter ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate RefreshToken Fields OrThrow Exception ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( token . isBlank ()) Ġ-> Ġ" Authentication Ġfailed : ĠToken Ġfield Ġshould Ġnot Ġbe Ġblank " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Sign Out Fields OrThrow Exception ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( token . isBlank ()) Ġ-> Ġ" Authentication Ġfailed : ĠToken Ġfield Ġshould Ġnot Ġbe Ġblank " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Refresh TokenType ( token Type : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( token Type Ġ!= Ġ" refresh Token ") Ġthrow ĠBadRequest Exception (" Authentication Ġfailed : ĠInvalid Ġtoken Ġtype ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate AccessToken Type ( token Type : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( token Type Ġ!= Ġ" accessToken ") Ġthrow ĠBadRequest Exception (" Authentication Ġfailed : ĠInvalid Ġtoken Ġtype ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġverify Token Rev ocation ( token : ĠString , ĠuserId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( refresh Tokens Dao . exists ( userId , Ġtoken )) Ġthrow ĠUnauthorized Activity Exception (" Authentication Ġfailed : ĠToken Ġhas Ġbeen Ġrev oked ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġverify Password OrThrow Exception ( password : ĠString , Ġuser : ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuser . password ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! password Encryption . validate Password ( password , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnauthorized Activity Exception (" Authentication Ġfailed : ĠInvalid Ġcredentials ") ĊĠĠĠĠĠĠĠ Ġ} ?: Ġthrow ĠUnauthorized Activity Exception (" Authentication Ġfailed : ĠInvalid Ġcredentials ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġstore Token ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsimple DateFormat Ġ= ĠSimpleDateFormat ("' Date : Ġ' yyyy - MM - dd ' ĠTime : Ġ' HH : mm : ss ") ĊĠĠĠĠĠĠĠ Ġval Ġexpiration Time Ġ= Ġtoken Provider . getToken Expiration ( token ) ĊĠĠĠĠĠĠĠ Ġval Ġconverted Expiration Time Ġ= Ġsimple DateFormat . format ( expiration Time ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Provider . verify Token ( token )?. let Ġ{ ĠuserId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Dao . findBy ID ( userId )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Tokens Dao . store ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverted Expiration Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠUnauthorized Activity Exception (" Authentication Ġfailed : ĠInvalid Ġcredentials ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠUnauthorized Activity Exception (" Authentication Ġfailed : ĠInvalid Ġcredentials ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ua e : ĠUnauthorized Activity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Response . un authorized ( ua e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġdelete Expired Tokens ( userId : ĠInt , ĠcurrentTime : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Tokens Dao . getAll ById ( userId ). let Ġ{ Ġtokens Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . expiration Time Ġ< ĠcurrentTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Tokens Dao . delete ById ( it . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Create Blog Fields ( blog Id : ĠInt ?, Ġtitle : ĠString , Ġdescription : ĠString , Ġcreation Time : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblog Id Ġ== Ġnull Ġ-> Ġ" Blog Ġid Ġshould Ġnot Ġbe Ġnull Ġor Ġempty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . count () Ġ< Ġ 3 Ġ-> Ġ" Title Ġmust Ġbe Ġat Ġleast Ġ 3 Ġcharacters " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription . count () Ġ< Ġ 7 Ġ-> Ġ" Description Ġmust Ġbe Ġat Ġleast Ġ 8 Ġcharacters " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Time . isBlank () Ġ-> Ġ" Creation Ġtime Ġmust Ġnot Ġbe Ġblank " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Update Blog Fields ( blog Id : ĠInt ?, Ġtitle : ĠString , Ġdescription : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblog Id Ġ== Ġnull Ġ-> Ġ" Blog Ġid Ġshould Ġnot Ġbe Ġnull Ġor Ġempty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . count () Ġ< Ġ 3 Ġ-> Ġ" Title Ġmust Ġbe Ġat Ġleast Ġ 3 Ġcharacters " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription . count () Ġ< Ġ 7 Ġ-> Ġ" Description Ġmust Ġbe Ġat Ġleast Ġ 8 Ġcharacters " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġverify Email ( email : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! user Dao . is Email Available ( email )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception (" Authentication Ġfailed : ĠEmail Ġis Ġalready Ġtaken ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Encrypted Password ( password : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpassword Encryption . encrypt Password ( password ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Converted Token Expiration Time ( token : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpiration Time Ġ= Ġtoken Provider . getToken Expiration ( token ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsimple DateFormat . format ( expiration Time ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Converted Current Time (): ĠString Ġ= Ġsimple DateFormat . format (( System . currentTimeMillis ())) ĊĊĠĠĠ Ġinternal Ġfun Ġget TokenType ( token : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtoken Provider . verify TokenType ( token ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcheck Page Number ( page : ĠInt , Ġb logs : ĠList < List < Blog DataModel >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(!( page Ġ> Ġ 0 Ġ&& Ġpage Ġ<= Ġb logs . size )) Ġthrow ĠBadRequest Exception (" Invalid Ġpage ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcalculate Page ( ĊĠĠĠĠĠĠĠ Ġb logs : ĠList < List < Blog DataModel >>, ĊĠĠĠĠĠĠĠ Ġpage : ĠInt ĊĠĠĠ Ġ): ĠMap < String , ĠInt ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġif Ġ( page Ġ== Ġ 1 ) Ġnull Ġelse Ġpage Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġif Ġ( page Ġ== Ġb logs . size ) Ġnull Ġelse Ġpage Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" previous " Ġto Ġprevious , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" next " Ġto Ġnext ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġprovide B logs ( ĊĠĠĠĠĠĠĠ Ġb logs : ĠList < List < Blog DataModel >>, ĊĠĠĠĠĠĠĠ Ġpage : ĠInt ĊĠĠĠ Ġ): ĠList < Blog DataModel > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġb logs [ page Ġ- Ġ 1 ] ĊĠĠĠ Ġ} Ċ Ċ }