package Ġat . kan z ler . coding comp etition backend . service Ċ Ċ import Ġat . kan z ler . coding comp etition backend . dto . Change Password Dto Ċ import Ġat . kan z ler . coding comp etition backend . dto . Forgot Password Dto Ċ import Ġat . kan z ler . coding comp etition backend . dto . Reset Password Dto Ċ import Ġat . kan z ler . coding comp etition backend . dto . User Dto Ċ import Ġat . kan z ler . coding comp etition backend . entity . Password Reset Token Ċ import Ġat . kan z ler . coding comp etition backend . entity . User Ċ import Ġat . kan z ler . coding comp etition backend . entity . Verification Token Ċ import Ġat . kan z ler . coding comp etition backend . event . Send Token Email Event Ċ import Ġat . kan z ler . coding comp etition backend . mapper . User Converter Ċ import Ġat . kan z ler . coding comp etition backend . repository . Password Reset Token Repository Ċ import Ġat . kan z ler . coding comp etition backend . repository . UserRepository Ċ import Ġat . kan z ler . coding comp etition backend . repository . Verification Token Repository Ċ import Ġorg . map struct . factory . Map pers Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . web . servlet . context . Servlet WebServer ApplicationContext Ċ import Ġorg . springframework . context . Application Event Publisher Ċ import Ġorg . springframework . security . crypto . password . Password Encoder Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . web . servlet . support . Servlet Uri Components Builder Ċ import Ġjava . net . Inet Address Ċ import Ġjava . util .* Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġkotlin . NoSuch ElementException ĊĊ Ċ @ Service Ċ class ĠUser ServiceImpl ( ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġuser Repository : ĠUser Repository , ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġpassword Encoder : ĠPassword Encoder , ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġverification Token Repository : ĠVerification Token Repository , ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġpassword Reset Token Repository : ĠPassword Reset Token Repository , ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġpublisher : ĠApplication Event Publisher , Ċ ) Ġ: ĠUserService Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠLOGGER : ĠLogger Ġ= ĠLoggerFactory . getLogger ( User ServiceImpl :: class . java ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġuser Converter Ġ= ĠMap pers . get Mapper ( User Converter :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġregister User ( user Dto : ĠUser Dto ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// set Ġdefault Ġvalues ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser Converter . convertTo User ( user Dto ); ĊĠĠĠĠĠĠĠ Ġuser . password Ġ= Ġpassword Encoder . encode ( user . password ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( user Repository . findBy Username ( user . username !! ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Username Ġalready Ġexists ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// save Ġverification Ġtoken Ġ& Ġuser ĊĠĠĠĠĠĠĠ Ġuser Repository . save ( user ) ĊĠĠĠĠĠĠĠ Ġval Ġverification Token Ġ= Ġcreate Verification Token ( user ) ĊĊĠĠĠĠĠĠĠ Ġpublish Token Event ( verification Token ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Verification Token ( user : ĠUser ): ĠVerification Token Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġverification Token Ġ= ĠVerification Token ( user , ĠUUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠ ĠLOGGER . info (" Saving Ġverification Ġtoken Ġ$ verification Token "); ĊĠĠĠĠĠĠĠ Ġreturn Ġverification Token Repository . save ( verification Token ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate Verification Token ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġverification Token Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverification Token Repository . findBy Token ( token ) Ġ?: Ġthrow ĠNoSuch ElementException (" No Ġtoken Ġfound Ġfor Ġ$ token "); ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( verification Token . expiration Time !! ). is Before ( java . time . LocalDateTime . now ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Token Ġexpired "); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġverification Token . user Ġ?: Ġthrow ĠNoSuch ElementException (" No Ġuser Ġfound Ġfor Ġ$ token "); ĊĠĠĠĠĠĠĠ Ġuser . enabled Ġ= Ġtrue ; ĊĠĠĠĠĠĠĠ Ġuser Repository . save ( user ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate New Verification Token ( old Token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġverification Token Ġ= Ġverification Token Repository . findBy Token ( old Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNoSuch ElementException (" No Ġtoken Ġfound Ġfor Ġ$ old Token "); ĊĊĠĠĠĠĠĠĠ Ġverification Token . expiration Time Ġ= ĠVerification Token . generate Expiration Time (); ĊĠĠĠĠĠĠĠ Ġverification Token . token Ġ= ĠUUID . randomUUID (). toString (); ĊĊĠĠĠĠĠĠĠ Ġpublish Token Event ( verification Token ) ĊĠĠĠĠĠĠĠ Ġverification Token Repository . save ( verification Token ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpublish Token Event ( token : ĠVerification Token ) Ġ= ĊĠĠĠĠĠĠĠ Ġpublisher . publish Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSend Token Email Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . user Ġ?: Ġthrow ĠNoSuch ElementException (" User Ġnot Ġfound "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ getApplication Url () }/ api / v 1 / auth / verify Registration ? token =${ token . token }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠ Ġoverride Ġfun Ġforgot Password ( password Dto : ĠF orgot Password Dto ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser Repository . findBy Email ( password Dto . email ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNoSuch ElementException (" No Ġuser Ġfound Ġfor Ġemail Ġ${ password Dto . email }"); ĊĊĠĠĠĠĠĠĠ Ġval Ġpassword Reset Token Ġ= ĠPassword Reset Token ( user , ĠUUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠ Ġpassword Reset Token Repository . save ( password Reset Token ) ĊĠĠĠĠĠĠĠ Ġpublisher . publish Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSend Token Email Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ getApplication Url () }/ api / v 1 / auth / save Password ? token =${ password Reset Token . token }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Password ( token : ĠString , Ġreset Password : ĠReset Password Dto ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpassword Token Ġ= Ġpassword Reset Token Repository . findBy Token ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNoSuch ElementException (" No Ġtoken Ġfound Ġfor Ġ$ token "); ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( password Token . expiration Time !! ). is Before ( java . time . LocalDateTime . now ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Token Ġexpired "); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġpassword Token . user Ġ?: Ġthrow ĠNoSuch ElementException (" No Ġuser Ġfound Ġfor Ġ$ token "); ĊĠĠĠĠĠĠĠ Ġuser . password Ġ= Ġpassword Encoder . encode ( reset Password . password ) ĊĠĠĠĠĠĠĠ Ġuser Repository . save ( user ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchange Password ( password Dto : ĠChange Password Dto ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser Repository . findBy Username ( password Dto . username ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNoSuch ElementException (" No Ġuser Ġfound Ġfor Ġusername Ġ${ password Dto . username }"); ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! password Encoder . matches ( password Dto . old Password , Ġuser . password )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Old Ġpassword Ġis Ġincorrect "); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser . password Ġ= Ġpassword Encoder . encode ( password Dto . new Password ) ĊĠĠĠĠĠĠĠ Ġuser Repository . save ( user ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Application Url (): ĠString Ġ= ĊĠĠĠĠĠĠĠ ĠServlet Uri Components Builder . from Current Context Path (). build (). to Uri String (); Ċ }