package Ġm rs . app . reservation Ċ Ċ import Ġm rs . domain . model . Reser vable Room Ċ import Ġm rs . domain . model . Reser vable Room Id Ċ import Ġm rs . domain . model . Reservation Ċ import Ġm rs . domain . service . reservation . Already Reserved Exception Ċ import Ġm rs . domain . service . reservation . Reservation Service Ċ import Ġm rs . domain . service . reservation . Unavailable Reservation Exception Ċ import Ġm rs . domain . service . room . Room Service Ċ import Ġm rs . domain . service . user . Reservation UserDetails Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . format . annotation . DateTime Format Ċ import Ġorg . springframework . security . access . Access Denied Exception Ċ import Ġorg . springframework . security . core . annotation . Authentication Principal Ċ import Ġorg . springframework . stereotype . Controller Ċ import Ġorg . springframework . ui . Model Ċ import Ġorg . springframework . validation . Binding Result Ċ import Ġorg . springframework . validation . annotation . Validated Ċ import Ġorg . springframework . web . bind . annotation .* Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . Local Time Ċ Ċ /** Ċ Ġ* Ġä¼ļ èŃ ° å®¤ äºĪ ç´Ħ çĶ» éĿ¢ ãģ® ãĤ³ ãĥ³ãĥĪ ãĥŃ ãĥ¼ãĥ © ãĤ¯ãĥ©ãĤ¹ ãĢĤ Ċ Ġ*/ Ċ @ Controller Ċ @ RequestMapping (" re servations /{ date }/{ roomId }") Ċ class ĠReser v ations Controller Ġ{ ĊĠĠĠ Ġ/** Ġä¼ļ èŃ ° å®¤ æĥħåł± åıĸå¾Ĺ ãĤµãĥ¼ãĥĵãĤ¹ ãĤ¯ãĥ©ãĤ¹ Ġ Ġ*/ ĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroom Service : ĠRoom Service ĊĊĠĠĠ Ġ/** Ġä¼ļ èŃ ° å®¤ äºĪ ç´Ħ ãĤµãĥ¼ãĥĵãĤ¹ ãĤ¯ãĥ©ãĤ¹ Ġ Ġ*/ ĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġreservation Service : ĠReser vation Service ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĥķãĤ © ãĥ¼ãĥł ä½ľæĪĲ ãĢĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Model Attribute ĊĠĠĠ Ġfun Ġsetup Form (): ĠReser vation Form Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġform Ġ= ĠReser vation Form () ĊĠĠĠĠĠĠĠ Ġ// Ġãĥĩ ãĥķãĤ© ãĥ« ãĥĪ åĢ¤ ĊĠĠĠĠĠĠĠ Ġform . startTime Ġ= ĠLocal Time . of ( 9 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġform . endTime Ġ= ĠLocal Time . of ( 1 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġform ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ äºĪ ç´Ħ ãĥķãĤ© ãĥ¼ãĥł çĶ» éĿ¢ ãģ¸ éģ · ç§» ãģĻãĤĭ ãĢĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdate Ġ äºĪ ç´Ħ å¸ĮæľĽ æĹ¥ æĻĤ ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id Ġ éĥ¨ å± ĭ ID ĊĠĠĠĠ Ġ* Ġ@ param Ġmodel Ġ çĶ» éĿ¢ ãĥ¢ ãĥĩ ãĥ« ĊĠĠĠĠ Ġ* Ġ@ return Ġ éģ · ç§» åħĪ URL ( äºĪ ç´Ħ ãĥķãĤ© ãĥ¼ãĥł çĶ» éĿ¢ ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ RequestMapping ( method Ġ= Ġ[ Request Method . GET ]) ĊĠĠĠ Ġfun Ġreserve Form (@ DateTime Format ( iso Ġ= ĠDateTime Format . ISO . DATE ) Ġ@ PathVariable (" date ") Ġdate : ĠLocalDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable (" roomId ") Ġroom Id : ĠInt , Ġmodel : ĠModel ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre servable Room Id Ġ= ĠReser vable Room Id ( roomId , Ġdate ) ĊĠĠĠĠĠĠĠ Ġval Ġre servations Ġ= Ġreservation Service . find Reser v ations ( re servable Room Id ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 4 æĻĤéĸĵ ãĤĴ 3 0 åĪĨ æ¯ İ ãģ« åĪĨ ãģĳ ãģ¦ ä½ľæĪĲ ãģĹãģŁ Local Time ãĤª ãĥĸãĤ¸ãĤ§ãĤ¯ãĥĪ ãĤĴ ä¿ĿæĮģ ãģĻãĤĭ ãĥªãĤ¹ãĥĪ ãĤĴä½ľæĪĲ ĊĠĠĠĠĠĠĠ Ġval Ġtime List Ġ= Ġgenerate Sequence ( Local Time . of ( 0 , Ġ 0 )) Ġ{ Ġit . plus Minutes ( 3 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 2 4 Ġ* Ġ 2 ). toList () ĊĊĠĠĠĠĠĠĠ Ġmodel . addAttribute (" room ", Ġroom Service . find Meeting Room ( roomId )) ĊĠĠĠĠĠĠĠ Ġmodel . addAttribute (" re servations ", Ġre servations ) ĊĠĠĠĠĠĠĠ Ġmodel . addAttribute (" time List ", Ġtime List ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ" reservation / reserve Form " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ äºĪ ç´Ħ åĩ¦çĲĨ ãĢĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġform ĊĠĠĠĠ Ġ* Ġ@ param Ġresult ĊĠĠĠĠ Ġ* Ġ@ return Ġãĥĳ ãĤ¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ RequestMapping ( method Ġ= Ġ[ Request Method . POST ]) ĊĠĠĠ Ġfun Ġreserve (@ Validated Ġform : ĠReser vation Form , Ġbinding Result : ĠBinding Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Authentication Principal Ġuser Details : ĠReser vation UserDetails , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ DateTime Format ( iso Ġ= ĠDateTime Format . ISO . DATE ) Ġ@ PathVariable (" date ") Ġdate : ĠLocalDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable (" roomId ") Ġroom Id : ĠInt , Ġmodel : ĠModel ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠãĤ¨ ãĥ© ãĥ¼ ãģĮãģĤãĤĭ ãģĭ ãĥģ ãĤ§ ãĥĥãĤ¯ ĊĠĠĠĠĠĠĠ Ġif Ġ( binding Result . has Errors ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ¨ ãĥ© ãĥ¼ ãģĮãģĤãĤĭ åł´åĲĪãģ¯ äºĪ ç´Ħ åĩ¦çĲĨ ãĤĴ å®Ł æĸ½ ãģĽ ãģļ ãĢģ ãĥķãĤ© ãĥ¼ãĥł è¡¨ç¤º çĶ» éĿ¢ ãģ¸ éģ · ç§» ãģķ ãģĽ ãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreserve Form ( date , Ġroom Id , Ġmodel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ äºĪ ç´Ħ éĸ¢ éĢ£ ãĤ¨ ãĥ³ ãĥĨãĤ£ ãĥĨãĤ£ ä½ľæĪĲ ĊĠĠĠĠĠĠĠ Ġval Ġre servable Room Ġ= ĠReser vable Room ( Reser vable Room Id ( roomId , Ġdate )) ĊĠĠĠĠĠĠĠ Ġval Ġreservation Ġ= ĠReser vation () ĊĠĠĠĠĠĠĠ Ġreservation . startTime Ġ= Ġform . startTime ĊĠĠĠĠĠĠĠ Ġreservation . endTime Ġ= Ġform . endTime ĊĠĠĠĠĠĠĠ Ġreservation . re servable Room Ġ= Ġre servable Room ĊĠĠĠĠĠĠĠ Ġreservation . user Ġ= Ġuser Details . user ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ äºĪ ç´Ħ åĩ¦çĲĨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreservation Service . reserve ( reservation ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUn available Reservation Exception , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAlready Reserved Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ äºĪ ç´Ħ ä¸įåı¯ ãĢģ ãĤĤ ãģĹãģ ı ãģ¯ äºĪ ç´Ħ æ¸ Ī ãģ¿ ãģ® åł´åĲĪãģ¯ ãĢģ ãĤ¨ãĥ© ãĥ¼ãĥ ¡ ãĥĥãĤ»ãĥ¼ãĤ¸ ãĤĴ è¡¨ç¤º ãģĹãģ¦ çĶ» éĿ¢ ãģ« æĪ » ãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . addAttribute (" error ", Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreserve Form ( date , Ġroom Id , Ġmodel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ" redirect :/ re servations /{ date }/{ roomId }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ Ń ãĥ£ ãĥ³ ãĤ» ãĥ« åĩ¦çĲĨ ãĢĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġreservation Id ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id ĊĠĠĠĠ Ġ* Ġ@ param Ġdate ĊĠĠĠĠ Ġ* Ġ@ param Ġmodel ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ RequestMapping ( method Ġ= Ġ[ Request Method . POST ], Ġparams Ġ= Ġ[" cancel "]) ĊĠĠĠ Ġfun Ġcancel (@ RequestParam (" reservation Id ") Ġreservation Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ PathVariable (" roomId ") Ġroom Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ DateTime Format ( iso Ġ= ĠDateTime Format . ISO . DATE ) Ġ@ PathVariable (" date ") Ġdate : ĠLocalDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel : ĠModel ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ Ń ãĥ£ ãĥ³ ãĤ» ãĥ« åĩ¦çĲĨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreservation Ġ= Ġreservation Service . findOne ( reservation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreservation Service . cancel ( reservation ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAccess Denied Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . addAttribute (" error ", Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreserve Form ( date , Ġroom Id , Ġmodel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ" redirect :/ re servations /{ date }/{ roomId }" ĊĠĠĠ Ġ} Ċ }