package Ġcom . save our tool . save . backend . service Ċ Ċ import Ġcom . save our tool . save . backend . repository . Ln k User Project Repository Ċ import Ġcom . save our tool . save . backend . repository . UserRepository Ċ import Ġcom . save our tool . save . backend . utils . Authentication Details Ċ import Ġcom . save our tool . save . domain . Role Ċ import Ġcom . save our tool . save . entities . Ln k User Project Ċ import Ġcom . save our tool . save . entities . Project Ċ import Ġcom . save our tool . save . entities . User Ċ import Ġcom . save our tool . save . utils . get Highest Role Ċ import Ġorg . springframework . data . domain . Page Request Ċ import Ġorg . springframework . security . core . Authentication Ċ import Ġorg . springframework . stereotype . Service Ċ Ċ /** Ċ Ġ* ĠService Ġof Ġln k User Projects Ċ Ġ*/ Ċ @ Service Ċ class ĠL nk User Project Service ( ĊĠĠĠ Ġprivate Ġval Ġln k User Project Repository : ĠL nk User Project Repository , ĊĠĠĠ Ġprivate Ġval Ġuser Repository : ĠUser Repository , ĊĠĠĠ Ġprivate Ġval Ġuser Details Service : ĠUser Details Service , Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġproject ĊĠĠĠĠ Ġ* Ġ@ return Ġall Ġusers Ġwith Ġrole Ġin Ġproject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetAll Users And Roles By Project ( project : ĠProject ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġln k User Project Repository . findBy Project ( project ). associate Ġ{ Ġit . user Ġto Ġ( it . role Ġ?: ĠRole . NONE ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId ĊĠĠĠĠ Ġ* Ġ@ param Ġproject ĊĠĠĠĠ Ġ* Ġ@ return Ġrole Ġfor Ġuser Ġin Ġ[ project ] Ġby Ġuser ĠID ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind Role By UserId And Project ( userId : ĠLong , Ġproject : ĠProject ) Ġ= Ġln k User Project Repository ĊĠĠĠĠĠĠĠ Ġ. findBy UserId And Project ( userId , Ġproject ) ĊĠĠĠĠĠĠĠ Ġ? . role ĊĠĠĠĠĠĠĠ Ġ?: ĠRole . NONE ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġrole Ġof Ġ[ user ] Ġon Ġa Ġproject Ġ[ project ] Ġto Ġ[ role ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġ[ role ] Ġis Ġ[ Role . NONE ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" K DOC _ WITHOUT _ PARAM _ TAG ", Ġ" Unsafe Call On Nullable Type ") ĊĠĠĠ Ġfun Ġset Role ( user : ĠUser , Ġproject : ĠProject , Ġrole : ĠRole ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( role Ġ== ĠRole . NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Role ĠNONE Ġshould Ġnot Ġbe Ġpresent Ġin Ġdatabase !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġln k User Project Ġ= Ġln k User Project Repository . findBy UserId And Project ( user . id !! , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . apply Ġ{ Ġthis . role Ġ= Ġrole Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠL nk User Project ( project , Ġuser , Ġrole ) ĊĠĠĠĠĠĠĠ Ġln k User Project Repository . save ( lnk User Project ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġrole Ġof Ġuser Ġwith Ġ[ userId ] Ġon Ġa Ġproject Ġwith Ġ[ projectId ] Ġto Ġ[ role ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġ[ role ] Ġis Ġ[ Role . NONE ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" K DOC _ WITHOUT _ PARAM _ TAG ", Ġ" Unsafe Call On Nullable Type ") ĊĠĠĠ Ġfun Ġset Role ById s ( userId : ĠLong , ĠprojectId : ĠLong , Ġrole : ĠRole ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( role Ġ== ĠRole . NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Role ĠNONE Ġshould Ġnot Ġbe Ġpresent Ġin Ġdatabase !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġln k User Project Repository . findBy UserId And ProjectId ( userId , ĠprojectId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . apply Ġ{ Ġthis . role Ġ= Ġrole Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġln k User Project Repository . save ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġln k User Project Repository . save ( projectId , ĠuserId , Ġrole . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġuser Ġthat Ġshould Ġbe Ġdeleted Ġfrom Ġ[ project ] ĊĠĠĠĠ Ġ* Ġ@ param Ġproject ĊĠĠĠĠ Ġ* Ġ@ return Ġnone ĊĠĠĠĠ Ġ* Ġ@ throws ĠNoSuch ElementException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Unsafe Call On Nullable Type ") ĊĠĠĠ Ġfun Ġremove Role ( user : ĠUser , Ġproject : ĠProject ) Ġ= Ġln k User Project Repository . findBy UserId And Project ( user . id !! , Ġproject ) ĊĠĠĠĠĠĠĠ Ġ? . id ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġln k User Project Repository . delete ById ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNoSuch ElementException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġdelete Ġuser Ġwith Ġname Ġ${ user . name } Ġbecause Ġhe Ġis Ġnot Ġfound Ġin Ġproject Ġ${ project . organization . name }/${ project . name }" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġcertain Ġ[ pageSize ] Ġof Ġplatform Ġusers Ġwith Ġnames Ġthat Ġstart Ġwith Ġ[ prefix ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprefix ĊĠĠĠĠ Ġ* Ġ@ param Ġproject User Ids ĊĠĠĠĠ Ġ* Ġ@ param ĠpageSize ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġall Ġsave - cloud Ġusers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Non Project Users ByName Prefix ( prefix : ĠString , Ġproject User Ids : ĠSet < Long >, ĠpageSize : ĠInt ): ĠList < User > Ġ= Ġif Ġ( pageSize Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Repository . find ByName Starting With And Id NotIn ( prefix , Ġproject User Ids , ĠPage Request . of ( 0 , ĠpageSize )). content ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĊĠĠĠĠ Ġ* Ġ@ param Ġproject User Ids ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġ[ User ] s Ġnot Ġfrom Ġproject Ġwith Ġnames Ġthat Ġexactly Ġmatch Ġ[ name ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Non Project Users ByName ( name : ĠString , Ġproject User Ids : ĠSet < Long >): ĠList < User > Ġ= Ġuser Repository . find ByName And Id NotIn ( name , Ġproject User Ids ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġproject ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġ[ User ] s Ġthat Ġare Ġconnected Ġto Ġ[ project ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetAll Users By Project ( project : ĠProject ): ĠList < User > Ġ= Ġln k User Project Repository . findBy Project ( project ). map Ġ{ Ġit . user Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġauthentication ĊĠĠĠĠ Ġ* Ġ@ param Ġproject ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġhighest Ġof Ġtwo Ġroles : Ġthe Ġone Ġin Ġ[ project ] Ġand Ġglobal Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Global Role Or Project Role ( authentication : ĠAuthentication , Ġproject : ĠProject ): ĠRole Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġself Id Ġ= Ġ( authentication . details Ġas ĠAuthentication Details ). id ĊĠĠĠĠĠĠĠ Ġval Ġself Global Role Ġ= Ġuser Details Service . getGlobal Role ( authentication ) ĊĠĠĠĠĠĠĠ Ġval Ġself Organization Role Ġ= Ġfind Role By UserId And Project ( self Id , Ġproject ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Highest Role ( self Organization Role , Ġself Global Role ) ĊĠĠĠ Ġ} Ċ } Ċ