package Ġcore . ems . service . article Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Ċ import Ġcore . conf . security . Easy User Ċ import Ġcore . db . Admin Ċ import Ġcore . db . Article Ċ import Ġcore . db . Article Alias Ċ import Ġcore . ems . service . cache . Cache Invalid ator Ċ import Ġcore . ems . service . assert Article Exists Ċ import Ġcore . ems . service . id To Long Or Invalid Req Ċ import Ġcore . exception . Invalid RequestException Ċ import Ġcore . exception . Req Error Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . jetbrains . ex posed . sql . insert Ċ import Ġorg . jetbrains . ex posed . sql . select Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . security . access . annotation . Sec ured Ċ import Ġorg . springframework . web . bind . annotation .* Ċ import Ġjavax . validation . Valid Ċ import Ġjavax . validation . constraints . NotBlank Ċ import Ġjavax . validation . constraints . Pattern Ċ import Ġjavax . validation . constraints . Size Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ @ RestController Ċ @ RequestMapping ("/ v 2 ") Ċ class ĠCreate Article Alias Controller Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġcache Invalid ator : ĠCache Invalid ator ĊĊĠĠĠ Ġdata Ġclass ĠReq (@ JsonProperty (" alias ", Ġrequired Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ field : NotBlank ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ field : Size ( max Ġ= Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ field : Pattern ( regexp Ġ= Ġ"\\ w *[ a - zA - Z ]\\ w * ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalias : ĠString ) ĊĊĠĠĠ Ġ@ Sec ured (" ROLE _ ADMIN ") ĊĠĠĠ Ġ@ PostMapping ("/ articles /{ article Id }/ aliases ") ĊĠĠĠ Ġfun Ġcontroller (@ Valid Ġ@ RequestBody Ġreq : ĠReq , Ġ@ PathVariable (" article Id ") Ġarticle Id String : ĠString , Ġcaller : ĠEasy User ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ"${ caller . id } Ġis Ġcreating Ġalias Ġfor Ġthe Ġarticle Ġ$ article Id String " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġarticle Id Ġ= Ġarticle Id String . id To Long Or Invalid Req () ĊĊĠĠĠĠĠĠĠ Ġassert Article Exists ( article Id ) ĊĊĠĠĠĠĠĠĠ Ġinsert Alias ( caller . id , Ġarticle Id , Ġreq . alias ) ĊĠĠĠĠĠĠĠ Ġcache Invalid ator . invalidate Article Cache () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġfun Ġinsert Alias ( created By : ĠString , Ġarticle Id : ĠLong , Ġalias : ĠString ) Ġ{ ĊĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Article Alias . select Ġ{ ĠArticle Alias . id Ġeq Ġalias Ġ}. count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid RequestException (" Article Ġalias Ġ'$ alias ' Ġis Ġalready Ġin Ġuse .", ĠReq Error . ARTIC LE _ ALIAS _ IN _ USE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠArticle Alias . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ id ] Ġ= Ġorg . jetbrains . ex posed . dao . id . Entity ID ( alias , ĠArticle Alias ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ owner ] Ġ= Ġorg . jetbrains . ex posed . dao . id . Entity ID ( created By , ĠAdmin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ article ] Ġ= Ġorg . jetbrains . ex posed . dao . id . Entity ID ( article Id , ĠArticle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ createdAt ] Ġ= ĠDateTime . now () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ