package Ġdo ist . ff s . routes Ċ Ċ import Ġdo ist . ff s . auth . Authorization Exception Ċ import Ġdo ist . ff s . auth . User Principal Ċ import Ġdo ist . ff s . db . Permission Ċ import Ġdo ist . ff s . db . Role Ċ import Ġdo ist . ff s . db . capt uring Last Insert Id Ċ import Ġdo ist . ff s . db . members Ċ import Ġdo ist . ff s . db . organizations Ċ import Ġdo ist . ff s . endpoints . Organizations Ċ import Ġdo ist . ff s . ext . authorize For Organization Ċ import Ġdo ist . ff s . ext . authorize ForUser Ċ import Ġdo ist . ff s . ext . href Ċ import Ġdo ist . ff s . ext . optional Route Ċ import Ġdo ist . ff s . plugins . database Ċ import Ġio . ktor . http . HttpHeaders Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . server . application . Application Ċ import Ġio . ktor . server . application . call Ċ import Ġio . ktor . server . auth . authenticate Ċ import Ġio . ktor . server . auth . principal Ċ import Ġio . ktor . server . plugins . NotFoundException Ċ import Ġio . ktor . server . request . receive Parameters Ċ import Ġio . ktor . server . resources . delete Ċ import Ġio . ktor . server . resources . get Ċ import Ġio . ktor . server . resources . post Ċ import Ġio . ktor . server . resources . put Ċ import Ġio . ktor . server . response . header Ċ import Ġio . ktor . server . response . respond Ċ import Ġio . ktor . server . routing . Route Ċ import Ġio . ktor . server . routing . routing Ċ import Ġio . ktor . server . util . get OrFail Ċ import Ġroutes . PATH _ LATE ST Ċ Ċ fun ĠApplication . install Organization Routes () Ġ= Ġrouting Ġ{ ĊĠĠĠ Ġoptional Route ( PATH _ LATE ST ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauthenticate (" session ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Organization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Organizations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Organization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Organization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Organization () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd User () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate User () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove User () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġnew Ġorganization . ĠThe Ġrequesting Ġuser Ġbecomes Ġan Ġadmin . Ċ Ġ*/ Ċ private Ġfun ĠRoute . create Organization () Ġ= Ġpost < Organizations > Ġ{ ĊĠĠĠ Ġval ĠuserId Ġ= Ġcall . principal < User Principal >() ?. id Ġ?: Ġthrow ĠAuthorization Exception () ĊĠĠĠ Ġval Ġname Ġ= Ġcall . receive Parameters (). get OrFail ( Organizations . NAME ) ĊĊĠĠĠ Ġval Ġid Ġ= Ġdatabase . run Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction With Result < Long > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapturing Last Insert Id Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorganizations . insert ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmembers . insert ( user _ id Ġ= ĠuserId , Ġorganization _ id Ġ= Ġit , Ġrole Ġ= ĠRole . ADMIN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcall . response . header ( HttpHeaders . Location , Ġhref ( Organizations . ById ( id Ġ= Ġid ))) ĊĠĠĠ Ġcall . respond ( HttpStatusCode . Created ) Ċ } Ċ Ċ /** Ċ Ġ* ĠLists Ġorganizations Ġfor Ġthe Ġcurrent Ġuser . Ċ Ġ*/ Ċ private Ġfun ĠRoute . get Organizations () Ġ= Ġget < Organizations > Ġ{ ĊĠĠĠ Ġval ĠuserId Ġ= Ġcall . principal < User Principal >() ?. id Ġ?: Ġthrow ĠAuthorization Exception () ĊĠĠĠ Ġauthorize ForUser ( id Ġ= ĠuserId ) ĊĊĠĠĠ Ġval Ġorganizations Ġ= Ġdatabase . members . select Organization By UserId ( ĊĠĠĠĠĠĠĠ Ġuser _ id Ġ= ĠuserId ĊĠĠĠ Ġ). execute As List () ĊĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġorganizations ) Ċ } Ċ Ċ /** Ċ Ġ* ĠGet Ġan Ġexisting Ġorganization . Ċ Ġ*/ Ċ private Ġfun ĠRoute . get Organization () Ġ= Ġget < Organizations . ById > Ġ{ Ġ(_, Ġid ) Ġ-> ĊĠĠĠ Ġauthorize For Organization ( id , ĠPermission . READ ) ĊĊĠĠĠ Ġval Ġorganization Ġ= Ġdatabase . organizations . select ( id Ġ= Ġid ). execute As One OrNull () ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNotFound Exception () ĊĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġorganization ) Ċ } Ċ Ċ /** Ċ Ġ* ĠUpdate Ġan Ġorganization . Ċ Ġ*/ Ċ private Ġfun ĠRoute . update Organization () Ġ= Ġput < Organizations . ById > Ġ{ Ġ(_, Ġid ) Ġ-> ĊĠĠĠ Ġauthorize For Organization ( id , ĠPermission . WRITE ) ĊĊĠĠĠ Ġval Ġparams Ġ= Ġcall . receive Parameters () ĊĠĠĠ Ġval Ġname Ġ= Ġparams [ Organizations . NAME ] ĊĊĠĠĠ Ġdatabase . organizations . run Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorganization Ġ= Ġselect ( id Ġ= Ġid ). execute As One OrNull () Ġ?: Ġthrow ĠNotFound Exception () ĊĠĠĠĠĠĠĠ Ġupdate ( id Ġ= Ġid , Ġname Ġ= Ġname Ġ?: Ġorganization . name ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġcall . respond ( HttpStatusCode . No Content ) Ċ } Ċ Ċ /** Ċ Ġ* ĠDelete Ġan Ġorganization . Ċ Ġ*/ Ċ private Ġfun ĠRoute . delete Organization () Ġ= Ġdelete < Organizations . ById > Ġ{ Ġ(_, Ġid ) Ġ-> ĊĠĠĠ Ġauthorize For Organization ( id , ĠPermission . DELETE ) ĊĊĠĠĠ Ġdatabase . organizations . delete ( id Ġ= Ġid ) ĊĠĠĠ Ġcall . respond ( HttpStatusCode . No Content ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAdd Ġuser Ġto Ġan Ġorganization . Ċ Ġ*/ Ċ private Ġfun ĠRoute . add User () Ġ= Ġpost < Organizations . ById . Members . ById > Ġ{ Ġ( endpoint , ĠuserId ) Ġ-> ĊĠĠĠ Ġval Ġid Ġ= Ġendpoint . parent . id ĊĠĠĠ Ġauthorize For Organization ( id , ĠPermission . DELETE ) ĊĊĠĠĠ Ġval Ġparams Ġ= Ġcall . receive Parameters () ĊĠĠĠ Ġval Ġrole Ġ= ĠRole . valueOf ( params . get OrFail ( Organizations . ById . Members . ROLE ). uppercase ()) ĊĊĠĠĠ Ġdatabase . members . insert ( user _ id Ġ= ĠuserId , Ġorganization _ id Ġ= Ġid , Ġrole Ġ= Ġrole ) ĊĠĠĠ Ġcall . respond ( HttpStatusCode . Created ) Ċ } Ċ Ċ /** Ċ Ġ* ĠUpdate Ġuser Ġrole Ġwithin Ġorganization . Ċ Ġ*/ Ċ private Ġfun ĠRoute . update User () Ġ= Ġput < Organizations . ById . Members . ById > Ġ{ Ġ( endpoint , ĠuserId ) Ġ-> ĊĠĠĠ Ġval Ġid Ġ= Ġendpoint . parent . id ĊĠĠĠ Ġauthorize For Organization ( id , ĠPermission . DELETE ) ĊĊĠĠĠ Ġval Ġparams Ġ= Ġcall . receive Parameters () ĊĠĠĠ Ġval Ġrole Ġ= ĠRole . valueOf ( params . get OrFail ( Organizations . ById . Members . ROLE ). uppercase ()) ĊĊĠĠĠ Ġdatabase . members . update ( user _ id Ġ= ĠuserId , Ġorganization _ id Ġ= Ġid , Ġrole Ġ= Ġrole ) ĊĠĠĠ Ġcall . respond ( HttpStatusCode . No Content ) Ċ } Ċ Ċ /** Ċ Ġ* ĠRemove Ġuser Ġfrom Ġorganization . Ċ Ġ*/ Ċ private Ġfun ĠRoute . remove User () Ġ= Ġdelete < Organizations . ById . Members . ById > Ġ{ Ġ( endpoint , ĠuserId ) Ġ-> ĊĠĠĠ Ġval Ġid Ġ= Ġendpoint . parent . id ĊĠĠĠ Ġauthorize For Organization ( id , ĠPermission . DELETE ) ĊĊĠĠĠ Ġdatabase . members . delete ( user _ id Ġ= ĠuserId , Ġorganization _ id Ġ= Ġid ) ĊĠĠĠ Ġcall . respond ( HttpStatusCode . No Content ) Ċ } Ċ