// ĠSPDX - File Copyright Text : Ġ 2 0 2 0 ĠL ars ĠG ey er - B la ume iser Ġ< lar s @ lg bl a ume iser . de > Ċ // ĠSPDX - License - Identifier : ĠMIT Ċ package Ġde . lg bl a ume iser . pt m . service Ċ Ċ import Ġat . fav re . lib . crypto . bcrypt . BC rypt Ċ import Ġde . lg bl a ume iser . pt m . service . model . User Ċ import Ġde . lg bl a ume iser . pt m . service . store . Store Ċ import Ġjava . util .* Ċ Ċ class ĠUserService ( ĊĠĠĠ Ġprivate Ġval Ġstore : ĠStore < User >, ĊĠĠĠ Ġprivate Ġval Ġactivities : ĠActivity Service , ĊĠĠĠ Ġprivate Ġval Ġbook ings : ĠBook ing Service Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġadd User ( ĊĠĠĠĠĠĠĠ Ġusername : ĠString , ĊĠĠĠĠĠĠĠ Ġpassword : ĠString , ĊĠĠĠĠĠĠĠ Ġemail : ĠString , ĊĠĠĠĠĠĠĠ Ġquestion : ĠString , ĊĠĠĠĠĠĠĠ Ġanswer : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( retrieve User Record ( username ) Ġ== Ġnull ) Ġ{ Ġ" A Ġuser Ġwith Ġusername Ġ$ username Ġalready Ġexists " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġstore . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġencrypt ( password ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġemail , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquestion Ġ= Ġquestion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanswer Ġ= Ġencrypt ( answer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( user . id Ġ== Ġ 1 L ) Ġ// ĠFirst Ġuser Ġgets Ġadmin Ġrights ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore . update ( username , Ġuser . copy ( admin Ġ= Ġtrue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Password ( username : ĠString , Ġanswer : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġretrieve Existing User Record ( username ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! BC rypt . verify er (). verify ( answer . toCharArray (), Ġuser . answer ). verified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal AccessException (" Given Ġanswer Ġdoes Ġnot Ġmatch Ġstored Ġanswer , Ġgiven : Ġ$ answer ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Password Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġstore . update ( username , Ġuser . copy ( password Ġ= Ġencrypt ( new Password ))) ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Password ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetUser ( username : ĠString , Ġpassword : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġauthenticate OrThrow ( username , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġreturn Ġretrieve Existing User Record ( username ). copy ( password Ġ= Ġ" xxx ", Ġanswer Ġ= Ġ" xxx ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġauthenticate User ( username : ĠString , Ġpassword : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠBC rypt . verify er (). verify ( password . toCharArray (), Ġretrieve Existing User Record ( username ). password ). verified ĊĊĠĠĠ Ġprivate Ġfun Ġauthenticate OrThrow ( username : ĠString , Ġpassword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! authenticate User ( username , Ġpassword )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal AccessException (" User Ġnot Ġauthenticated ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange User ( ĊĠĠĠĠĠĠĠ Ġusername : ĠString , ĊĠĠĠĠĠĠĠ Ġpassword : ĠString , ĊĠĠĠĠĠĠĠ Ġnew Password : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġemail : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġquestion : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġanswer : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ= Ġretrieve Existing User Record ( username ). let Ġ{ ĊĠĠĠĠĠĠĠ Ġauthenticate OrThrow ( username , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġstore . update ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġit . username , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġnew Password ?. let Ġ{ Ġencrypt ( new Password ) Ġ} Ġ?: Ġit . password , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġemail Ġ?: Ġit . email , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquestion Ġ= Ġquestion Ġ?: Ġit . question , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanswer Ġ= Ġanswer ?. let Ġ{ Ġencrypt ( answer ) Ġ} Ġ?: Ġit . answer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete User ( username : ĠString , Ġpassword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauthenticate OrThrow ( username , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġactivities . get Activities ( username ). forEach Ġ{ Ġactivities . delete Activity ( username , Ġit . id ) Ġ} ĊĠĠĠĠĠĠĠ Ġbook ings . get Book ings ( username ). forEach Ġ{ Ġbook ings . delete Booking ( username , Ġit . id ) Ġ} ĊĠĠĠĠĠĠĠ Ġretrieve Existing User Record ( username ). let Ġ{ Ġstore . delete ( username , Ġit . id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve User Record ( user : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġstore . retrieve By Property ( user , Ġ" username ", ĠlistOf ( user )). first OrNull () ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Existing User Record ( user : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġretrieve User Record ( user ) Ġ?: Ġthrow ĠIllegalArgumentException (" User Ġ$ user Ġnot Ġfound Ġin Ġdatabase ") ĊĊĠĠĠ Ġprivate Ġfun Ġencrypt ( password : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠBC rypt . with Defaults (). hash ToString ( 1 2 , Ġpassword . toCharArray ()) Ġ?: Ġ"" Ċ }