package Ġcom . team click er . auth service . controllers Ċ Ċ import Ġcom . team click er . auth service . dao . Role . ADMIN Ċ import Ġcom . team click er . auth service . dao . Role . USER Ċ import Ġcom . team click er . auth service . dao . Sp EL Role ._ ADMIN Ċ import Ġcom . team click er . auth service . dao . User Account Deletion DAO Ċ import Ġcom . team click er . auth service . dao . UserRole DAO Ċ import Ġcom . team click er . auth service . dto . Account Response DTO Ċ import Ġcom . team click er . auth service . dto . Account Update Roles DTO Ċ import Ġcom . team click er . auth service . exceptions . Entity DoesNotExist Exception Ċ import Ġcom . team click er . auth service . exceptions . Invalid Credentials Exception Ċ import Ġcom . team click er . auth service . exceptions . Unauthorized RequestException Ċ import Ġcom . team click er . auth service . map pers . User Account DAO To Account Response DTO Ċ import Ġcom . team click er . auth service . repositories . User Account Repository Ċ import Ġcom . team click er . auth service . security . JWT Data Ċ import Ġio . swagger . annotations . ApiOperation Ċ import Ġio . swagger . annotations . ApiResponse Ċ import Ġio . swagger . annotations . Api Responses Ċ import Ġmu . K Logging Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . security . access . pre post . Pre Authorize Ċ import Ġorg . springframework . web . bind . annotation .* Ċ import Ġjava . util .* Ċ import Ġjavax . validation . Valid Ċ Ċ @ Cross Origin Ċ @ RestController Ċ @ RequestMapping ("/ api / auth / accounts ") Ċ class ĠAccount Controller ( ĊĠĠĠ Ġprivate Ġval Ġuser Account Repository : ĠUser Account Repository , ĊĠĠĠ Ġprivate Ġval Ġuser Account DAO To Account Response DTO : ĠUser Account DAO To Account Response DTO Ċ ) Ġ{ ĊĊĠĠĠ Ġ@ ApiOperation ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ" Deletes Ġuser Ġaccount ", Ġnotes Ġ= Ġ""" Ċ Every Ġauthenticated Ġuser Ġcan Ġdelete Ġhis Ġown Ġaccount . Ċ Only ĠADMIN Ġcan Ġdelete Ġany Ġuser Ġaccount . ĊĠĠĠ Ġ""" ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Api Responses ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 2 0 0 , Ġmessage Ġ= Ġ" Account Ġdeleted Ġsuccessfully "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 1 , Ġmessage Ġ= Ġ" Invalid Ġcredentials "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 3 , Ġmessage Ġ= Ġ" Unauthorized Ġrequest "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 1 1 , Ġmessage Ġ= Ġ" User Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ] ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Pre Authorize (" is Authenticated () ") ĊĠĠĠ Ġ@ Delete Mapping ("/ { accountId }/ delete ") ĊĠĠĠ Ġfun Ġdelete Account (@ PathVariable ĠaccountId : ĠString , Ġjwt : ĠJWT Data ): ĠResponseEntity < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjwt .` is `( ADMIN ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Deleting Ġaccount Ġ$ accountId Ġas Ġ$ ADMIN (${ jwt . accountId })" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjwt .` is `( USER ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accountId Ġ!= Ġjwt . accountId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Credentials Exception (" Cannot Ġdelete Ġaccount Ġof Ġanother Ġuser ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġuser Account Repository . findById ( accountId ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! account . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Trying Ġto Ġdelete Ġa Ġuser , Ġbut Ġthe Ġuser Ġdoes Ġnot Ġexist . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Potential Ġfix : ĠClear Ġuser Ġtoken Ġafter Ġaccount Ġdeletion . """. trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEntity DoesNotExist Exception (" User Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaccount . get (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . deletion Ġ= ĠUser Account Deletion DAO (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . createdAt Ġ= ĠDate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser Account Repository . save ( account . get ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity ( HttpStatus . OK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ ApiOperation ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ" Un de letes Ġuser Ġaccount ", Ġnotes Ġ= Ġ""" Ċ Only ĠADMIN Ġcan Ġun delete Ġany Ġuser Ġaccount ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Api Responses ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 2 0 0 , Ġmessage Ġ= Ġ" Account Ġun deleted Ġsuccessfully "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 1 , Ġmessage Ġ= Ġ" Invalid Ġcredentials "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 3 , Ġmessage Ġ= Ġ" Unauthorized Ġrequest "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 1 1 , Ġmessage Ġ= Ġ" User Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ] ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Pre Authorize (" has Authority ($_ ADMIN )") ĊĠĠĠ Ġ@ PostMapping ("/ { accountId }/ un delete ") ĊĠĠĠ Ġfun Ġun delete Account (@ PathVariable ĠaccountId : ĠString , Ġjwt : ĠJWT Data ): ĠResponseEntity < Void > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġuser Account Repository . findById No Constraints ( accountId ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! account . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" Trying Ġto Ġun delete Ġa Ġuser , Ġbut Ġthe Ġuser Ġdoes Ġnot Ġexist ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEntity DoesNotExist Exception (" User Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġaccount . get (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . deletion Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser Account Repository . save ( account . get ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity ( HttpStatus . OK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ ApiOperation ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ" Updates Ġuser Ġroles ", Ġnotes Ġ= Ġ""" Ċ Only ĠADMIN Ġcan Ġupdate Ġany Ġuser Ġroles ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Api Responses ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 2 0 0 , Ġmessage Ġ= Ġ" Roles Ġchanged Ġsuccessfully "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 0 , Ġmessage Ġ= Ġ" Invalid Ġrequest Ġbody "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 3 , Ġmessage Ġ= Ġ" Unauthorized Ġrequest "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 1 1 , Ġmessage Ġ= Ġ" User Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ] ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Pre Authorize (" has Any Authority ($_ ADMIN )") ĊĠĠĠ Ġ@ Put Mapping ("/ { accountId }/ roles ") ĊĠĠĠ Ġfun Ġupdate Roles ( ĊĠĠĠĠĠĠĠ Ġ@ RequestBody Ġ@ Valid Ġbody : ĠAccount Update Roles DTO , ĊĠĠĠĠĠĠĠ Ġ@ PathVariable ĠaccountId : ĠString ĊĠĠĠ Ġ): ĠResponseEntity < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Account Ġ= Ġuser Account Repository . findById ( accountId ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! user Account . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEntity DoesNotExist Exception (" User Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser Account . get (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . roles Ġ= Ġbody . roles . map Ġ{ ĠUser Role DAO ( it ) Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġuser Account Repository . save ( user Account . get ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity ( HttpStatus . OK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ ApiOperation ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ" Lists Ġall Ġusers ", Ġnotes Ġ= Ġ""" Ċ Only ĠADMIN Ġcan Ġsee Ġa Ġlist Ġof Ġusers ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Api Responses ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 2 0 0 , Ġmessage Ġ= Ġ" Ok "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 3 , Ġmessage Ġ= Ġ" Unauthorized Ġrequest ") ĊĠĠĠĠĠĠĠ Ġ] ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Pre Authorize (" has Any Authority ($_ ADMIN )") ĊĠĠĠ Ġ@ GetMapping ("") ĊĠĠĠ Ġfun Ġlist Users (): ĠResponseEntity < List < Account Response DTO >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . ok ( user Account Repository . findAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġuser Account DAO To Account Response DTO . parse ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ ApiOperation ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ" Gets Ġa Ġuser ", Ġnotes Ġ= Ġ""" Ċ User Ġcan Ġonly Ġfetch Ġhimself Ċ ADMIN Ġcan Ġfetch Ġeveryone ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Api Responses ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 2 0 0 , Ġmessage Ġ= Ġ" Ok "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 1 , Ġmessage Ġ= Ġ" Invalid Ġcredentials "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 0 3 , Ġmessage Ġ= Ġ" Unauthorized Ġrequest "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse ( code Ġ= Ġ 4 1 1 , Ġmessage Ġ= Ġ" User Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ] ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Pre Authorize (" is Authenticated () ") ĊĠĠĠ Ġ@ GetMapping ("/ { accountId }") ĊĠĠĠ Ġfun ĠgetUser (@ PathVariable ĠaccountId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjwt : ĠJWT Data ): ĠResponseEntity < Account Response DTO > Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjwt .` is `( ADMIN ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Deleting Ġaccount Ġ$ accountId Ġas Ġ$ ADMIN (${ jwt . accountId })" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjwt .` is `( USER ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accountId Ġ!= Ġjwt . accountId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Credentials Exception (" Cannot Ġdelete Ġaccount Ġof Ġanother Ġuser ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġuser Account Repository . findById ( accountId ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! account . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Trying Ġto Ġget Ġa Ġuser , Ġbut Ġthe Ġuser Ġdoes Ġnot Ġexist . """. trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEntity DoesNotExist Exception (" User Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . ok ( user Account DAO To Account Response DTO . parse ( account . get ())) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ċ }