1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465moduleCore=Sihl_coremoduleToken=Sihl_tokenmoduleUser=Sihl_usermoduleUtils=Sihl_utilsopenLwt.Syntaxletlog_src=Logs.Src.create"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_token~email=let*user=UserService.find_by_email_opt~emailinmatchuserwith|Someuser->letuser_id=User.iduserinletdata=TokenData.make~user_id|>TokenData.to_yojson|>Yojson.Safe.to_stringinlet*token=TokenService.create~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_password~token~password~password_confirmation=let*token=TokenService.find_opttokeninlettoken=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.find~user_idinlet*result=UserService.set_password~user~password~password_confirmation()inLwt.return@@Result.map(fun_->())result;;letstart()=Lwt.return()letstop_=Lwt.return()letlifecycle=Core.Container.Lifecycle.create"password-reset"~start~stop~dependencies:[TokenService.lifecycle;UserService.lifecycle];;letregister()=Core.Container.Service.createlifecycleend