12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970moduleCore=Sihl_coremoduleToken=Sihl_tokenmoduleUser=Sihl_usermoduleUtils=Sihl_utilsopenLwt.Syntaxletlog_src=Logs.Src.create~doc:"password reset""sihl.service.password-reset"moduleLogs=(valLogs.src_loglog_src:Logs.LOG)letkind="password_reset"moduleTokenData=structtypet={user_id:string}[@@derivingyojson,make,fields]endmoduleMake(TokenService:Token.Sig.SERVICE)(UserService:User.Sig.SERVICE):Sig.SERVICE=structletcreate_reset_tokenctx~email=let*user=UserService.find_by_email_optctx~emailinmatchuserwith|Someuser->letuser_id=User.iduserinletdata=TokenData.make~user_id|>TokenData.to_yojson|>Yojson.Safe.to_stringinlet*token=TokenService.createctx~kind~data~expires_in:Utils.Time.OneDay()inLwt.return@@Sometoken|None->Logs.warn(funm->m"PASSWORD_RESET: No user found with email %s"email);Lwt.returnNone;;letreset_passwordctx~token~password~password_confirmation=let*token=TokenService.find_optctxtokeninlettoken=Option.to_result~none:"Invalid or expired token provided"tokeninletuser_id=let(let*)=Result.bindinlet*data=Result.mapToken.datatokeninlet*token=Option.to_result~none:"Token has not user assigned"datainlet*parsed=Utils.Json.parsetokeninlet*yojson=TokenData.of_yojsonparsedinResult.ok(TokenData.user_idyojson)inmatchuser_idwith|Errormsg->Lwt.return@@Errormsg|Okuser_id->let*user=UserService.findctx~user_idinlet*result=UserService.set_passwordctx~user~password~password_confirmation()inLwt.return@@Result.map(fun_->())result;;letstartctx=Lwt.returnctxletstop_=Lwt.return()letlifecycle=Core.Container.Lifecycle.create"password-reset"~start~stop~dependencies:[TokenService.lifecycle;UserService.lifecycle];;letconfigureconfiguration=letconfiguration=Core.Configuration.makeconfigurationinCore.Container.Service.create~configurationlifecycle;;end