package Ġcom . ant ong on char ov . demo . sur veys . api Ċ Ċ import Ġcom . ant ong on char ov . demo . sur veys . logger Ċ import Ġcom . ant ong on char ov . demo . sur veys . model . User Preferences Ċ import Ġcom . ant ong on char ov . demo . sur veys . model . dto . User Preferences Request Ċ import Ġcom . ant ong on char ov . demo . sur veys . persistence . Tag Repository Ċ import Ġcom . ant ong on char ov . demo . sur veys . persistence . User Preferences Repository Ċ import Ġcom . ant ong on char ov . demo . sur veys . security . RequestContext Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . web . bind . annotation . GetMapping Ċ import Ġorg . springframework . web . bind . annotation . PostMapping Ċ import Ġorg . springframework . web . bind . annotation . RequestBody Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ Ċ @ RestController Ċ class ĠUser Preferences Controller ( ĊĠĠĠ Ġprivate Ġval Ġuser Preferences Repository : ĠUser Preferences Repository , ĊĠĠĠ Ġprivate Ġval Ġtag Repository : ĠTag Repository Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġlog Ġby Ġlogger () ĊĊĠĠĠ Ġ@ GetMapping ("/ preferences ") ĊĠĠĠ Ġfun Ġget Preferences (): ĠResponseEntity < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" GET Ġ/ preferences ") ĊĠĠĠĠĠĠĠ Ġval Ġfind For CurrentUser Ġ= Ġuser Preferences Repository . find For CurrentUser () ĊĠĠĠĠĠĠĠ Ġreturn Ġfind For CurrentUser ?. let Ġ{ ĠResponseEntity . ok (). body ( it ) Ġ} Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . not Found (). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ PostMapping ("/ preferences ") ĊĠĠĠ Ġfun Ġsave Preferences (@ RequestBody Ġpreferences Request : ĠUser Preferences Request ): ĠResponseEntity < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" POST Ġ/ preferences Ġ> Ġ$ preferences Request ") ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Preferences Ġ= Ġuser Preferences Repository . find For CurrentUser () Ġ?: ĠUser Preferences () ĊĊĠĠĠĠĠĠĠ Ġcurrent Preferences . user Ġ= ĠRequest Context . user ĊĠĠĠĠĠĠĠ Ġcurrent Preferences . display Unt agged Ġ= Ġpreferences Request . display Unt agged ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Layout Ġ= Ġcurrent Preferences . main Page Layout ĊĠĠĠĠĠĠĠ Ġif Ġ( current Layout . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġstraightforward Ġcase , Ġwhen Ġcurrent Ġpreferences Ġare Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtags Ġ= Ġtag Repository . findBy ShortName In ( preferences Request . main Page Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( tagName Ġin Ġpreferences Request . main Page Layout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Layout . add ( tags . find Ġ{ Ġit . short Name Ġ== ĠtagName Ġ} !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelete Ġthose Ġnot Ġin Ġnew Ġpreferences ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Layout . filter Ġ{ Ġ! preferences Request . main Page Layout . contains ( it . short Name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġcurrent Layout . remove ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġor Ġreorder Ġthose Ġin Ġthe Ġpreferences ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences Request . main Page Layout . with Index (). forEach Ġ{ Ġ( index , ĠtagName ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġamong Ġexisting Ġtag Ġpreferences Ġor Ġfetch Ġfrom ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġcurrent Layout . find Ġ{ Ġt Ġ-> Ġt . short Name Ġ== ĠtagName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ Ġcurrent Layout . remove ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġtag Repository . findBy ShortName ( tagName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġput Ġinto Ġright Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag ?. let Ġ{ Ġcurrent Layout . add ( index , Ġtag ) Ġ} Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . bad Request (). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġuser Preferences Repository . save ( current Preferences ) ĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . ok (). build () ĊĠĠĠ Ġ} Ċ Ċ }