@ file : Suppress (" Long Parameter List ") Ċ Ċ package Ġcom . hy pto . iam . server . service Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . hy pto . iam . server . configs . AppConfig Ċ import Ġcom . hy pto . iam . server . db . repositories . Organization Repo Ċ import Ġcom . hy pto . iam . server . db . repositories . User Repo Ċ import Ġcom . hy pto . iam . server . db . tables . po jos . Users Ċ import Ġcom . hy pto . iam . server . exceptions . Entity NotFoundException Ċ import Ġcom . hy pto . iam . server . exceptions . Internal Exception Ċ import Ġcom . hy pto . iam . server . extensions . to User Status Ċ import Ġcom . hy pto . iam . server . idp . Identity Group Ċ import Ġcom . hy pto . iam . server . idp . Identity Provider Ċ import Ġcom . hy pto . iam . server . idp . NextToken Ċ import Ġcom . hy pto . iam . server . idp . Password Credentials Ċ import Ġcom . hy pto . iam . server . idp . RequestContext Ċ import Ġcom . hy pto . iam . server . idp . User Already Exist Exception Ċ import Ġcom . hy pto . iam . server . models . Base Success Response Ċ import Ġcom . hy pto . iam . server . models . Pagination Options Ċ import Ġcom . hy pto . iam . server . models . Update UserRequest Ċ import Ġcom . hy pto . iam . server . models . User Ċ import Ġcom . hy pto . iam . server . security . Authentication Exception Ċ import Ġcom . hy pto . iam . server . utils . Iam Resources Ċ import Ġcom . hy pto . iam . server . utils . Resource H rn Ċ import Ġio . ktor . server . plugins . BadRequest Exception Ċ import Ġjava . time . LocalDateTime Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . k oin . core . component . inject Ċ Ċ class ĠUsers ServiceImpl Ġ: ĠK oin Component , ĠUsers Service Ġ{ ĊĠĠĠ Ġprivate Ġval Ġuser Repo : ĠUser Repo Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġorganization Repo : ĠOrganization Repo Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġidentity Provider : ĠIdentity Provider Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġgson : ĠGson Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġapp Config : ĠApp Config Ġby Ġinject () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcreate User ( ĊĠĠĠĠĠĠĠ Ġorganization Id : ĠString , ĊĠĠĠĠĠĠĠ Ġcredentials : ĠPassword Credentials , ĊĠĠĠĠĠĠĠ Ġcreated By : ĠString ?, ĊĠĠĠĠĠĠĠ Ġverified : ĠBoolean ĊĠĠĠ Ġ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" Invalid Ġorganization Ġid Ġname . ĠUnable Ġto Ġcreate Ġa Ġuser ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( User Repo . exists By Email ( credentials . email , Ġorganization Id , Ġapp Config . app . unique Users Ac ross Organizations )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUser Already Exist Exception (" Email Ġ- Ġ${ credentials . email } Ġalready Ġregistered . ĠUnable Ġto Ġcreate Ġuser ") ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġuser H rn Ġ= ĠResource H rn ( organization Id , Ġ"", ĠI am Resources . USER , Ġcredentials . userName ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġidentity Provider . createUser ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Context ( organization Id Ġ= Ġorganization Id , Ġrequested Principal Ġ= Ġcreated By Ġ?: Ġ" unknown Ġuser ", Ġverified ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Group , Ġcredentials ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġuser Repo . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUsers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser H rn . toString (), Ġcredentials . email , ĠUser . Status . enabled . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorganization Id , ĠLocalDateTime . now (), ĠLocalDateTime . now (), Ġverified , Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠgetUser ( user H rn , Ġuser ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetUser ( organization Id : ĠString , ĠuserName : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" Invalid Ġorganization Ġid Ġname . ĠUnable Ġto Ġget Ġuser ") ĊĠĠĠĠĠĠĠ Ġval Ġuser H rn Ġ= ĠResource H rn ( organization Id , Ġ"", ĠI am Resources . USER , ĠuserName ) ĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġidentity Provider . getUser ( identity Group , ĠuserName ) ĊĠĠĠĠĠĠĠ Ġreturn ĠgetUser ( user H rn , Ġuser ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetUser By Email ( ĊĠĠĠĠĠĠĠ Ġorganization Id : ĠString ?, ĊĠĠĠĠĠĠĠ Ġemail : ĠString ĊĠĠĠ Ġ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorg Id Ġ= Ġif Ġ( app Config . app . unique Users Ac ross Organizations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Record Ġ= Ġuser Repo . findBy Email ( email ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" User Ġwith Ġemail Ġ- Ġ$ email Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Record . organization Id ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorganization Id Ġ?: Ġthrow ĠEntity NotFoundException (" Organization Ġid Ġis Ġrequired ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( org Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" Invalid Ġorganization Ġid Ġname . ĠUnable Ġto Ġget Ġuser ") ĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġidentity Provider . getUser By Email ( identity Group , Ġemail ) ĊĠĠĠĠĠĠĠ Ġreturn ĠgetUser ( Resource H rn ( org Id , Ġ"", ĠI am Resources . USER , Ġuser . username ), Ġuser ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠsetUser Password ( ĊĠĠĠĠĠĠĠ Ġorganization Id : ĠString , ĊĠĠĠĠĠĠĠ ĠuserName : ĠString , ĊĠĠĠĠĠĠĠ Ġpassword : ĠString ĊĠĠĠ Ġ): ĠBase Success Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" Invalid Ġorganization Ġid Ġname . ĠUnable Ġto Ġset Ġuser Ġpassword ") ĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġidentity Provider . setUser Password ( identity Group , ĠuserName , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBase Success Response ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġlist Users ( ĊĠĠĠĠĠĠĠ Ġorganization Id : ĠString , ĊĠĠĠĠĠĠĠ Ġnext Token : ĠString ?, ĊĠĠĠĠĠĠĠ ĠpageSize : ĠInt ? ĊĠĠĠ Ġ): ĠTrip le < List < User >, ĠNext Token ?, ĠPagination Options > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" Invalid Ġorganization Ġid Ġname . ĠUnable Ġto Ġget Ġuser ") ĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġ( users , Ġnext Token ) Ġ= Ġidentity Provider . list Users ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Group Ġ= Ġidentity Group , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Token Ġ= Ġnext Token , Ġlimit Ġ= ĠpageSize ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpage Context Ġ= ĠPagination Options ( pageSize ) ĊĠĠĠĠĠĠĠ Ġval Ġexternal User Type Users Ġ= Ġusers . map Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser H rn Ġ= ĠResource H rn ( organization Id , Ġ"", ĠI am Resources . USER , Ġuser . username ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser ( user H rn , Ġuser ) ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( external User Type Users , Ġnext Token , Ġpage Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetUser ( ĊĠĠĠĠĠĠĠ Ġuser H rn : ĠResource H rn , ĊĠĠĠĠĠĠĠ Ġuser : Ġcom . hy pto . iam . server . idp . User ĊĠĠĠ Ġ) Ġ= ĠUser ( ĊĠĠĠĠĠĠĠ Ġhr n Ġ= Ġuser H rn . toString (), ĊĠĠĠĠĠĠĠ Ġusername Ġ= Ġuser . username , ĊĠĠĠĠĠĠĠ Ġorganization Id Ġ= Ġuser H rn . organization , ĊĠĠĠĠĠĠĠ Ġemail Ġ= Ġuser . email , ĊĠĠĠĠĠĠĠ Ġstatus Ġ= Ġif Ġ( user . isEnabled ) ĠUser . Status . enabled Ġelse ĠUser . Status . disabled , ĊĠĠĠĠĠĠĠ Ġverified Ġ= Ġuser . verified , ĊĠĠĠĠĠĠĠ Ġphone Ġ= Ġuser . phoneNumber , ĊĠĠĠĠĠĠĠ Ġcreated By Ġ= Ġuser . created By , ĊĠĠĠĠĠĠĠ Ġlogin Access Ġ= Ġuser . login Access ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate User ( ĊĠĠĠĠĠĠĠ Ġorganization Id : ĠString , ĊĠĠĠĠĠĠĠ ĠuserName : ĠString , ĊĠĠĠĠĠĠĠ Ġphone : ĠString , ĊĠĠĠĠĠĠĠ Ġstatus : ĠUpdate UserRequest . Status ?, ĊĠĠĠĠĠĠĠ Ġverified : ĠBoolean ? ĊĠĠĠ Ġ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" Invalid Ġorganization Ġid Ġname . ĠUnable Ġto Ġget Ġuser ") ĊĠĠĠĠĠĠĠ Ġval Ġuser H rn Ġ= ĠResource H rn ( organization Id , Ġ"", ĠI am Resources . USER , ĠuserName ) ĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Status Ġ= Ġstatus ?. to User Status () ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġidentity Provider . update User ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Group Ġ= Ġidentity Group , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= ĠuserName , Ġphone Ġ= Ġphone , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġuser Status , Ġverified Ġ= Ġverified ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġuser Repo . update ( user H rn . toString (), Ġuser Status , Ġverified ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" User Ġnot Ġfound ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠgetUser ( user H rn , Ġuser ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete User ( organization Id : ĠString , ĠuserName : ĠString ): ĠBase Success Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" Invalid Ġorganization Ġid Ġname . ĠUnable Ġto Ġdelete Ġuser ") ĊĠĠĠĠĠĠĠ Ġval Ġuser H rn Ġ= ĠResource H rn ( organization Id , Ġ"", ĠI am Resources . USER , ĠuserName ) ĊĠĠĠĠĠĠĠ Ġif Ġ( org . root User H rn Ġ== Ġuser H rn . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception (" Cannot Ġdelete ĠRoot ĠUser ") ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġidentity Provider . delete User ( identity Group , ĠuserName ) ĊĊĠĠĠĠĠĠĠ Ġuser Repo . delete ( user H rn . toString ()) Ġ?: Ġthrow ĠEntity NotFoundException (" User Ġnot Ġfound ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBase Success Response ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġauthenticate ( organization Id : ĠString , ĠuserName : ĠString , Ġpassword : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠEntity NotFoundException (" Invalid Ġorganization Ġid Ġname . ĠUnable Ġto Ġauthenticate Ġuser ") ĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġidentity Provider . authenticate ( identity Group , ĠuserName , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġval Ġuser H rn Ġ= ĠResource H rn ( organization Id , Ġ"", ĠI am Resources . USER , ĠuserName ) ĊĠĠĠĠĠĠĠ Ġreturn ĠgetUser ( user H rn , Ġuser ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġauthenticate ( email : ĠString , Ġpassword : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Record Ġ= Ġuser Repo . findBy Email ( email ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAuthentication Exception (" Invalid Ġusername Ġand Ġpassword Ġcombination ") ĊĠĠĠĠĠĠĠ Ġval Ġorg Ġ= Ġorganization Repo . findById ( user Record . organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInternal Exception (" Internal Ġerror Ġwhile Ġtrying Ġto Ġauthenticate Ġthe Ġidentity .") ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Group Ġ= Ġgson . fromJson ( org . metadata . data (), ĠIdentity Group :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġidentity Provider . authenticate ( identity Group , Ġemail , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġval Ġuser H rn Ġ= ĠResource H rn ( user Record . organization Id , Ġ"", ĠI am Resources . USER , Ġuser . username ) ĊĠĠĠĠĠĠĠ Ġreturn ĠgetUser ( user H rn , Ġuser ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠService Ġwhich Ġholds Ġlogic Ġrelated Ġto ĠUser Ġoperations Ċ Ġ*/ Ċ interface ĠUsers Service Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġcreate User ( ĊĠĠĠĠĠĠĠ Ġorganization Id : ĠString , ĊĠĠĠĠĠĠĠ Ġcredentials : ĠPassword Credentials , ĊĠĠĠĠĠĠĠ Ġcreated By : ĠString ?, ĊĠĠĠĠĠĠĠ Ġverified : ĠBoolean ĊĠĠĠ Ġ): ĠUser ĊĊĠĠĠ Ġsuspend Ġfun ĠgetUser ( organization Id : ĠString , ĠuserName : ĠString ): ĠUser ĊĠĠĠ Ġsuspend Ġfun Ġlist Users ( organization Id : ĠString , Ġnext Token : ĠString ?, ĠpageSize : ĠInt ?): ĊĠĠĠĠĠĠĠ ĠTrip le < List < User >, ĠNext Token ?, ĠPagination Options > ĊĊĠĠĠ Ġsuspend Ġfun Ġupdate User ( ĊĠĠĠĠĠĠĠ Ġorganization Id : ĠString , ĊĠĠĠĠĠĠĠ ĠuserName : ĠString , ĊĠĠĠĠĠĠĠ Ġphone : ĠString , ĊĠĠĠĠĠĠĠ Ġstatus : ĠUpdate UserRequest . Status ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġverified : ĠBoolean ? ĊĠĠĠ Ġ): ĠUser ĊĊĠĠĠ Ġsuspend Ġfun Ġdelete User ( organization Id : ĠString , ĠuserName : ĠString ): ĠBase Success Response ĊĠĠĠ Ġsuspend Ġfun Ġauthenticate ( organization Id : ĠString , ĠuserName : ĠString , Ġpassword : ĠString ): ĠUser ĊĠĠĠ Ġsuspend Ġfun Ġauthenticate ( email : ĠString , Ġpassword : ĠString ): ĠUser ĊĠĠĠ Ġsuspend Ġfun ĠgetUser By Email ( organization Id : ĠString ?, Ġemail : ĠString ): ĠUser ĊĠĠĠ Ġsuspend Ġfun ĠsetUser Password ( organization Id : ĠString , ĠuserName : ĠString , Ġpassword : ĠString ): ĠBase Success Response Ċ } Ċ