package Ġio . ktor . samples . k weet Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . fre emark er .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . locations .* Ċ import Ġio . ktor . locations . post Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ import Ġio . ktor . samples . k weet . dao .* Ċ import Ġio . ktor . samples . k weet . model .* Ċ import Ġio . ktor . sessions .* Ċ Ċ /** Ċ Ġ* ĠRegister Ġroutes Ġfor Ġuser Ġregistration Ġin Ġthe Ġ[ Register ] Ġroute Ġ(/ register ) Ċ Ġ*/ Ċ fun ĠRoute . register ( dao : ĠDA OF acade , Ġhash Function : Ġ( String ) Ġ-> ĠString ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA ĠPOST Ġrequest Ġto Ġthe Ġ[ Register ] Ġroute , Ġwill Ġtry Ġto Ġcreate Ġa Ġnew Ġuser . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġthe Ġuser Ġis Ġalready Ġlogged , Ġit Ġredirects Ġto Ġthe Ġ[ User Page ] Ġpage . ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġnot Ġspecified Ġthe ĠuserId , Ġpassword , ĠdisplayName Ġor Ġemail , Ġit Ġwill Ġredirect Ġto Ġthe Ġ[ Register ] Ġform Ġpage . ĊĠĠĠĠ Ġ* Ġ- ĠThen Ġit Ġwill Ġvalidate Ġthe Ġspecified Ġparameters , Ġredirect ing Ġdisplaying Ġan Ġerror Ġto Ġthe Ġ[ Register ] Ġpage . ĊĠĠĠĠ Ġ* Ġ- ĠOn Ġsuccess , Ġit Ġgenerates Ġa Ġnew Ġ[ User ]. ĠBut Ġinstead Ġof Ġstoring Ġthe Ġpassword Ġplain Ġtext , ĊĠĠĠĠ Ġ* ĠĠ Ġit Ġstores Ġa Ġhash Ġof Ġthe Ġpassword . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpost < Register > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġcurrent Ġfrom Ġsession Ġdata Ġif Ġany ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcall . sessions . get < K weet Session >() ?. let Ġ{ Ġdao . user ( it . userId ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġuser Ġalready Ġlogged Ġin ? Ġredirect Ġto Ġuser Ġpage . ĊĠĠĠĠĠĠĠ Ġif Ġ( user Ġ!= Ġnull ) Ġreturn @ post Ġcall . redirect ( User Page ( user . userId )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġreceive Ġpost Ġdata ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġuse Ġcon neg Ġwhen Ġit 's Ġready Ġand Ġ` call . receive < Register > ()` ĊĠĠĠĠĠĠĠ Ġval Ġregistration Ġ= Ġcall . receive < Parameters >() ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġregistration [" userId "] Ġ?: Ġreturn @ post Ġcall . redirect ( it ) ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġregistration [" password "] Ġ?: Ġreturn @ post Ġcall . redirect ( it ) ĊĠĠĠĠĠĠĠ Ġval ĠdisplayName Ġ= Ġregistration [" displayName "] Ġ?: Ġreturn @ post Ġcall . redirect ( it ) ĊĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġregistration [" email "] Ġ?: Ġreturn @ post Ġcall . redirect ( it ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġprepare Ġlocation Ġclass Ġfor Ġerror Ġif Ġany ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠRegister ( userId , ĠdisplayName , Ġemail ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword . length Ġ< Ġ 6 Ġ-> Ġcall . redirect ( error . copy ( error Ġ= Ġ" Password Ġshould Ġbe Ġat Ġleast Ġ 6 Ġcharacters Ġlong ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId . length Ġ< Ġ 4 Ġ-> Ġcall . redirect ( error . copy ( error Ġ= Ġ" Login Ġshould Ġbe Ġat Ġleast Ġ 4 Ġcharacters Ġlong ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! userName Valid ( userId ) Ġ-> Ġcall . redirect ( error . copy ( error Ġ= Ġ" Login Ġshould Ġbe Ġconsists Ġof Ġdigits , Ġletters , Ġdots Ġor Ġunders cores ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . user ( userId ) Ġ!= Ġnull Ġ-> Ġcall . redirect ( error . copy ( error Ġ= Ġ" User Ġwith Ġthe Ġfollowing Ġlogin Ġis Ġalready Ġregistered ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġhash Function ( password ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew User Ġ= ĠUser ( userId , Ġemail , ĠdisplayName , Ġhash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdao . createUser ( new User ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠThis Ġis Ġsecurity Ġissue Ġthat Ġallows Ġto Ġenumerate / verify Ġregistered Ġusers . ĠDo Ġnot Ġdo Ġthis Ġin Ġreal Ġapp Ġ:) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdao . user ( userId ) Ġ!= Ġnull Ġ-> Ġcall . redirect ( error . copy ( error Ġ= Ġ" User Ġwith Ġthe Ġfollowing Ġlogin Ġis Ġalready Ġregistered ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdao . user By Email ( email ) Ġ!= Ġnull Ġ-> Ġcall . redirect ( error . copy ( error Ġ= Ġ" User Ġwith Ġthe Ġfollowing Ġemail Ġ$ email Ġis Ġalready Ġregistered ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . log . error (" Failed Ġto Ġregister Ġuser ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . redirect ( error . copy ( error Ġ= Ġ" Failed Ġto Ġregister ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . sessions . set ( K weet Session ( new User . userId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . redirect ( User Page ( new User . userId )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA ĠGET Ġrequest Ġwould Ġshow Ġthe Ġregistration Ġform Ġ( with Ġan Ġerror Ġif Ġspecified Ġby Ġthe ĠURL Ġin Ġthe Ġcase Ġthere Ġwas Ġan Ġerror Ġin Ġthe Ġform Ġprocessing ) ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġuser Ġis Ġalready Ġlogged , Ġit Ġredirects Ġthe Ġclient Ġto Ġthe Ġ[ User Page ] Ġinstead . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġget < Register > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcall . sessions . get < K weet Session >() ?. let Ġ{ Ġdao . user ( it . userId ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( user Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . redirect ( User Page ( user . userId )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFree Marker Content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" register . ft l ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" page User " Ġto ĠUser ( it . userId , Ġit . email , Ġit . displayName , Ġ""), Ġ" error " Ġto Ġit . error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ