package Ġch . der lin . bb data . output . api . objects čĊč Ċ /** čĊ Ġ* Ġdate : Ġ 2 0 . 1 1 . 1 9 čĊ Ġ* Ġ@ author ĠLuc y ĠL inder Ġ< luc y . der lin @ gmail . com > čĊ Ġ*/ čĊč Ċ import Ġch . der lin . bb data . Constants č Ċ import Ġch . der lin . bb data . common .* č Ċ import Ġch . der lin . bb data . common . exceptions . Item NotFoundException č Ċ import Ġch . der lin . bb data . common . exceptions . Wrong Params Exception č Ċ import Ġch . der lin . bb data . output . api . Common Responses č Ċ import Ġch . der lin . bb data . output . api . Simple Modification Status Response č Ċ import Ġch . der lin . bb data . output . api . object _ groups . Object Group č Ċ import Ġch . der lin . bb data . output . api . types . Unit Repository č Ċ import Ġch . der lin . bb data . output . api . user _ groups . User Group Access Manager č Ċ import Ġch . der lin . bb data . output . security . Protected č Ċ import Ġch . der lin . bb data . output . security . Security Constants č Ċ import Ġch . der lin . bb data . output . security . UserId č Ċ import Ġio . swagger . v 3 . o as . annotations . Operation č Ċ import Ġio . swagger . v 3 . o as . annotations . tags . Tag č Ċ import Ġorg . springframework . cache . annotation . Cache Ev ict č Ċ import Ġorg . springframework . data . domain . Page able č Ċ import Ġorg . springframework . http . Response Entity č Ċ import Ġorg . springframework . transaction . annotation . Transactional č Ċ import Ġorg . springframework . web . bind . annotation .* č Ċ import Ġjavax . validation . Valid č Ċ import Ġjavax . validation . constraints . NotEmpty č Ċ import Ġjavax . validation . constraints . NotNull č Ċ import Ġjavax . validation . constraints . Size čĊč Ċ @ RestController č Ċ @ RequestMapping ("/ objects ") č Ċ @ Tag ( name Ġ= Ġ" Objects ", Ġdescription Ġ= Ġ" Manage Ġobjects ") č Ċ class ĠObjects Controller ( private Ġval Ġobjects Access Manager : ĠObjects Access Manager , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġuser Group Access Manager : ĠUser Group Access Manager , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġunit Repository : ĠUnit Repository ) Ġ{ čĊčĊĠĠĠ Ġclass ĠNew Object Ġ{ čĊĠĠĠĠĠĠĠ Ġ@ NotNull čĊĠĠĠĠĠĠĠ Ġ@ Size ( min Ġ= ĠObjects . NAME _ MIN , Ġmax Ġ= ĠObjects . NAME _ MAX ) čĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠ Ġ@ Size ( max Ġ= ĠBe ans . DESCRIPTION _ MAX ) čĊĠĠĠĠĠĠĠ Ġval Ġdescription : ĠString ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠ Ġ@ NotNull čĊĠĠĠĠĠĠĠ Ġval Ġowner : ĠInt ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠ Ġ@ NotEmpty čĊĠĠĠĠĠĠĠ Ġval Ġunit Symbol : ĠString Ġ= Ġ"" čĊčĊĠĠĠĠĠĠĠ Ġval Ġtags : ĠList < String >? Ġ= Ġnull čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġclass ĠEdit ableObject Fields Ġ{ čĊĠĠĠĠĠĠĠ Ġ@ Size ( min Ġ= ĠObjects . NAME _ MIN , Ġmax Ġ= ĠObjects . NAME _ MAX ) čĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠ Ġ@ Size ( max Ġ= ĠBe ans . DESCRIPTION _ MAX ) čĊĠĠĠĠĠĠĠ Ġval Ġdescription : ĠString ? Ġ= Ġnull čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Protected ( Security Constants . SCOPE _ WRITE ) čĊĠĠĠ Ġ@ Transactional čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Create Ġa Ġnew Ġobject .< br >" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"_ NOTE _: Ġsince Ġusers Ġcan Ġbe Ġ_ admins _ Ġof Ġmultiple Ġuser Ġgroups , Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" you Ġneed Ġto Ġexplicitly Ġpass Ġthe ĠID Ġof Ġthe Ġuser Ġgroup Ġthat Ġwill Ġown Ġthe Ġobject Ġvia Ġ` owner `. ") čĊĠĠĠ Ġ@ Put Mapping ("") čĊĠĠĠ Ġfun Ġnew Object (@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ RequestBody Ġ@ Valid Ġnew Object : ĠNew Object čĊĠĠĠ Ġ): ĠObjects Ġ= Ġnew Object Bulk ( userId , ĠValid ated List ( new Object ))[ 0 ] čĊčĊčĊĠĠĠ Ġ@ Protected ( Security Constants . SCOPE _ WRITE ) čĊĠĠĠ Ġ@ Transactional čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Create Ġnew Ġobjects Ġin Ġbulk .< br >" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġis Ġsimilar Ġto ĠPUT Ġ/ objects , Ġbut Ġaccepts Ġan Ġarray Ġof Ġobjects Ġto Ġcreate . Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"** RE STRI CTION **: Ġall Ġobjects ĠMUST Ġhave Ġthe ĠS AME ĠOWNER .") čĊĠĠĠ Ġ@ Put Mapping ("/ bulk ") čĊĠĠĠ Ġfun Ġnew Object Bulk (@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Valid Ġ@ NotNull Ġ@ RequestBody Ġnew Objects List : ĠValid ated List < New Object > čĊĠĠĠ Ġ): ĠList < Objects > Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġnew Objects Ġ= Ġnew Objects List . values čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( new Objects . any Ġ{ Ġit . owner Ġ!= Ġnew Objects [ 0 ]. owner Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠWrong Params Exception (" cannot Ġcreate Ġobjects Ġin Ġbulk Ġwith Ġdifferent Ġowners ") čĊčĊĠĠĠĠĠĠĠ Ġval Ġuser Group Ġ= Ġuser Group Access Manager . get Accessible Group ( userId , Ġnew Objects [ 0 ]. owner !! , Ġadmin Ġ= Ġtrue ). orElse Throw Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem NotFoundException (" User Group Ġ(' ${ new Objects [ 0 ]. owner }', Ġadmin = true )") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġobjects Ġ= Ġobjects Access Manager . object Repository . save All ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Objects . map Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObjects ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġit . name , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġit . description , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunit Ġ= Ġunit Repository . findById ( it . unit Symbol ). orElse Throw Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrong Params Exception (" Object Ġ'${ it . name } ': Ġunit Ġ'${ it . unit Symbol }' Ġdoes Ġnot Ġexist .") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Ġ= Ġuser Group čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) čĊčĊčĊĠĠĠĠĠĠĠ Ġif Ġ( new Objects . any Ġ{ Ġit . tags Ġ!= Ġnull Ġ}) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Objects . zip ( objects ). forEach Ġ{ Ġ( new Obj , Ġobj ) Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Obj . tags ?. forEach Ġ{ Ġobj . add Tag ( it ) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobjects Access Manager . object Repository . save All ( objects ) čĊčĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobjects čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Protected ( Security Constants . SCOPE _ WRITE ) čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Edit Ġan Ġobject Ġyou Ġown , Ġsuch Ġas Ġits Ġname Ġand Ġdescription .") čĊĠĠĠ Ġ@ PostMapping ("/ { objectId }") čĊĠĠĠ Ġfun Ġedit Object ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" objectId ") Ġid : ĠLong , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Valid Ġ@ NotNull Ġ@ RequestBody Ġeditable Fields : ĠEdit ableObject Fields čĊĠĠĠ Ġ): ĠObjects ? Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġobjects Access Manager . findById ( id , ĠuserId , Ġwritable Ġ= Ġtrue ). orElse Throw Ġ{ ĠItem NotFoundException (" object ") Ġ} čĊĠĠĠĠĠĠĠ Ġeditable Fields . name ?. let Ġ{ Ġobj . name Ġ= Ġit Ġ} čĊĠĠĠĠĠĠĠ Ġeditable Fields . description ?. let Ġ{ Ġobj . description Ġ= Ġit Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġobjects Access Manager . object Repository . save And Flush ( obj ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Protected čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Get Ġthe Ġlist Ġof Ġobjects .< br >" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Use Ġ` writable = true ` Ġto Ġget Ġonly Ġobjects Ġyou Ġown Ġ( h ence Ġhave Ġright Ġto Ġedit ). Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Use Ġ` tags = tag 1 [, tag N ]` Ġto Ġfilter Ġthe Ġlist Ġby Ġtags . Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Use Ġ` search = substring ` Ġto Ġlook Ġfor Ġ` substring ` Ġin Ġthe Ġobject Ġnames .< br >" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Note : Ġyou Ġcan Ġalso Ġpag inate Ġand Ġsort Ġthe Ġresults Ġas Ġdescribed Ġbelow . ĠDon 't Ġspecify Ġ` size ` Ġfor Ġno Ġpagination Ġ( default ). ") čĊĠĠĠ Ġ@ Page able As QueryParam čĊĠĠĠ Ġ@ GetMapping ("") čĊĠĠĠ Ġfun Ġget Objects ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ RequestParam ( name Ġ= Ġ" writable ", Ġrequired Ġ= Ġfalse , ĠdefaultValue Ġ= Ġ" false ") Ġwritable : ĠBoolean , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ RequestParam ( name Ġ= Ġ" tags ", Ġrequired Ġ= Ġfalse , ĠdefaultValue Ġ= Ġ"") Ġun parsed Tags : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ RequestParam ( name Ġ= Ġ" search ", Ġrequired Ġ= Ġfalse , ĠdefaultValue Ġ= Ġ"") Ġsearch : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Hidden Param Ġpage able : ĠPage able čĊĠĠĠ Ġ): ĠList < Objects > Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġtags Ġ= Ġun parsed Tags . split ("," ). map Ġ{ Ġs Ġ-> Ġs . trim () Ġ}. filter Ġ{ Ġs Ġ-> Ġs . length Ġ> Ġ 0 Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( tags . size Ġ> Ġ 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects Access Manager . findAll By Tag ( tags , ĠuserId , Ġwritable , Ġsearch , Ġpage able ) čĊĠĠĠĠĠĠĠ Ġelse čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects Access Manager . findAll ( userId , Ġwritable , Ġsearch , Ġpage able ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Protected čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Get Ġan Ġobject Ġdetails .") čĊĠĠĠ Ġ@ GetMapping ("/ { objectId }") čĊĠĠĠ Ġfun ĠgetObject ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" objectId ") Ġid : ĠLong čĊĠĠĠ Ġ): ĠObjects ? Ġ= Ġobjects Access Manager . findById ( id , ĠuserId , Ġwritable Ġ= Ġfalse ). orElse Throw Ġ{ ĠItem NotFoundException (" object ") Ġ} čĊčĊĠĠĠ Ġ@ Protected čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Get Ġall Ġobject Ġgroups Ġan Ġobject Ġbelongs Ġto .") čĊĠĠĠ Ġ@ GetMapping ("/ { objectId }/ object Groups ") čĊĠĠĠ Ġfun Ġget Groups Of Object ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" objectId ") Ġid : ĠLong čĊĠĠĠ Ġ): ĠList < Object Group >? Ġ= Ġobjects Access Manager . findById ( id , ĠuserId , Ġwritable Ġ= Ġfalse ). orElse Throw Ġ{ ĠItem NotFoundException (" object ") Ġ}. getObject Groups () čĊčĊĠĠĠ Ġ// Ġ======== ĠTAG S čĊčĊĠĠĠ Ġ@ Protected ( Security Constants . SCOPE _ WRITE ) čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Add Ġtag ( s ) Ġto Ġan Ġobject Ġyou Ġown . ĠUse Ġ`, ` Ġto Ġspecify Ġmultiple Ġtags , Ġe . g . Ġ` tags = one , two `. Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" If Ġall Ġtags Ġare Ġalready Ġpresent , Ġit Ġsimply Ġreturns ĠNOT ĠMO DI FIED .") čĊĠĠĠ Ġ@ Simple Modification Status Response čĊĠĠĠ Ġ@ Put Mapping ("{ objectId }/ tags ") čĊĠĠĠ Ġfun Ġadd Tags ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" objectId ") Ġid : ĠLong , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ RequestParam ( name Ġ= Ġ" tags ", Ġrequired Ġ= Ġtrue ) Ġtags : ĠList < String >): ĠResponseEntity < String > Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Or Delete Tags ( userId , Ġid , Ġtags , Ġadd Ġ= Ġtrue ) čĊčĊĠĠĠ Ġ@ Protected ( Security Constants . SCOPE _ WRITE ) čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Remove Ġtag ( s ) Ġfrom Ġan Ġobject Ġyou Ġown . ĠUse Ġ`, ` Ġto Ġspecify Ġmultiple Ġtags , Ġe . g . Ġ` tags = one , two `. Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" If Ġno Ġtags Ġis Ġalready Ġpresent , Ġit Ġsimply Ġreturns ĠNOT ĠMO DI FIED .") čĊĠĠĠ Ġ@ Simple Modification Status Response čĊĠĠĠ Ġ@ Delete Mapping ("{ objectId }/ tags ") čĊĠĠĠ Ġfun Ġremove Tags ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" objectId ") Ġid : ĠLong , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ RequestParam ( name Ġ= Ġ" tags ", Ġrequired Ġ= Ġtrue ) Ġtags : ĠList < String >): ĠResponseEntity < String > Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Or Delete Tags ( userId , Ġid , Ġtags , Ġdelete Ġ= Ġtrue ) čĊčĊčĊĠĠĠ Ġprivate Ġfun Ġadd Or Delete Tags ( userId : ĠInt , Ġid : ĠLong , Ġtags : ĠList < String >, čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd : ĠBoolean Ġ= Ġfalse , Ġdelete : ĠBoolean Ġ= Ġfalse ): ĠResponseEntity < String > Ġ{ čĊĠĠĠĠĠĠĠ Ġassert ( add Ġ|| Ġdelete ) čĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġobjects Access Manager . findById ( id , ĠuserId , Ġwritable Ġ= Ġtrue ). orElse Throw Ġ{ ĠItem NotFoundException (" object ") Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġstatuses Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delete ) Ġtags . map Ġ{ Ġobj . remove Tag ( it ) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtags . map Ġ{ Ġobj . add Tag ( it ) Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( statuses . any Ġ{ Ġx Ġ-> Ġx Ġ}) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects Access Manager . object Repository . save ( obj ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCommon Responses . ok () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġreturn ĠCommon Responses . not Mod if ed () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// Ġ======== ĠENABLE / DISABLE čĊčĊĠĠĠ Ġ@ Protected ( Security Constants . SCOPE _ WRITE ) čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Enable Ġan Ġobject Ġyou Ġown . ĠIf Ġthe Ġobject Ġis Ġalready Ġenabled , Ġit Ġsimply Ġreturns ĠNOT ĠMO DI FIED .") čĊĠĠĠ Ġ@ Cache Ev ict ( Constants . META _ CACHE , Ġall Entries Ġ= Ġtrue ) čĊĠĠĠ Ġ@ Simple Modification Status Response čĊĠĠĠ Ġ@ PostMapping ("{ objectId }/ enable ") čĊĠĠĠ Ġfun Ġenable Object ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" objectId ") Ġid : ĠLong ): ĠResponseEntity < String > Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Disable ( userId , Ġid , Ġdisabled Ġ= Ġfalse ) čĊčĊĠĠĠ Ġ@ Protected ( Security Constants . SCOPE _ WRITE ) čĊĠĠĠ Ġ@ Operation ( description Ġ= Ġ" Disable Ġan Ġobject Ġyou Ġown . ĠIf Ġthe Ġobject Ġis Ġalready Ġdisabled , Ġit Ġsimply Ġreturns ĠNOT ĠMO DI FIED . Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" When Ġan Ġobject Ġgets Ġdisabled , Ġall Ġits Ġtokens Ġare Ġdeleted Ġand Ġit Ġcannot Ġreceive Ġnew Ġvalues Ġ( no Ġnew Ġmeasures ). ") čĊĠĠĠ Ġ@ Cache Ev ict ( Constants . META _ CACHE , Ġall Entries Ġ= Ġtrue ) čĊĠĠĠ Ġ@ Simple Modification Status Response čĊĠĠĠ Ġ@ PostMapping ("{ objectId }/ disable ") čĊĠĠĠ Ġfun Ġdisable Object ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ UserId ĠuserId : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" objectId ") Ġid : ĠLong ): ĠResponseEntity < String > Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Disable ( userId , Ġid , Ġdisabled Ġ= Ġtrue ) čĊčĊĠĠĠ Ġprivate Ġfun Ġenable Disable ( userId : ĠInt , Ġid : ĠLong , Ġdisabled : ĠBoolean ): ĠResponseEntity < String > Ġ{ čĊĠĠĠĠĠĠĠ Ġ// Ġnote : Ġthe Ġdeletion Ġof Ġtokens Ġwhen Ġthe Ġobject Ġis Ġdisabled Ġis Ġdone Ġin Ġa ĠMySQL Ġtrigger , Ġobjects _ A UPD čĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġobjects Access Manager . findById ( id , ĠuserId , Ġwritable Ġ= Ġtrue ). orElse Throw Ġ{ ĠItem NotFoundException (" object ") Ġ} čĊĠĠĠĠĠĠĠ Ġif Ġ( obj . disabled Ġ!= Ġdisabled ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . disabled Ġ= Ġdisabled čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects Access Manager . object Repository . save ( obj ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCommon Responses . ok () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn ĠCommon Responses . not Mod if ed () čĊĠĠĠ Ġ} čĊč Ċ }