package Ġorg . x ber y . art be ams . articles . service Ċ Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . cache . annotation . Cache Ev ict Ċ import Ġorg . springframework . cache . annotation . Cache able Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . x ber y . art be ams . articles . domain . Article Ċ import Ġorg . x ber y . art be ams . articles . domain . Edited Article Ċ import Ġorg . x ber y . art be ams . articles . repository . Article Category Filter Ċ import Ġorg . x ber y . art be ams . articles . repository . Article Category Repository Ċ import Ġorg . x ber y . art be ams . articles . repository . Article Repository Ċ import Ġorg . x ber y . art be ams . common . assets . domain . Asset Attributes Ċ import Ġorg . x ber y . art be ams . common . context . Operation Ctx Ċ import Ġorg . x ber y . art be ams . common . markdown . Markdown Converter Ċ import Ġorg . x ber y . art be ams . ever note . service . E ver note Api Ċ Ċ /** Ċ Ġ* Ġ@ author ĠR ade k ĠBer an Ċ Ġ*/ Ċ @ Service Ċ open Ġclass ĠArticle ServiceImpl ( ĊĠĠĠ Ġprivate Ġval Ġarticle Repository : ĠArticle Repository , ĊĠĠĠ Ġprivate Ġval Ġarticle Category Repository : ĠArticle Category Repository , ĊĠĠĠ Ġprivate Ġval Ġmarkdown Converter : ĠMarkdown Converter , ĊĠĠĠ Ġprivate Ġval Ġever note Api : ĠE ver note Api Ċ ) Ġ: ĠArticle Service Ġ{ ĊĠĠĠ Ġprotected Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger ( this :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġfind Articles (): ĠList < Article > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace (" Finding Ġarticles ") ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Repository . find Articles () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Cache Ev ict ( value Ġ= Ġ[ ĠArticle . Cache Name Ġ], Ġall Entries Ġ= Ġtrue ) ĊĠĠĠ Ġoverride Ġfun Ġsave Article ( edited : ĠEdit ed Article , Ġctx : ĠOperation Ctx ): ĠArticle ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġctx . logged User ?. id Ġ?: ĠAsset Attributes . Empty Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhtml Body Ġ= Ġmarkdown Converter . markdown To Html ( edited . body Markdown ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Article Ġ= Ġif Ġ( edited . id Ġ== ĠAsset Attributes . Empty Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Repository . create ( Article . Empty . updated With ( edited , Ġhtml Body , ĠuserId )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarticle Ġ= Ġarticle Repository . findById As Opt ( edited . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( article Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Repository . update Entity ( article . updated With ( edited , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhtml Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( updated Article Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Category Repository . update Article Categories ( updated Article . id , Ġedited . categories ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġarticle 's Ġmarkdown Ġin ĠE ver note ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Article . external Id ?. let Ġ{ Ġexternal Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( external Id Ġ!= Ġ"" Ġ&& Ġupdated Article . body Markdown . trim () Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExternal Ġid Ġis Ġset Ġand Ġalso Ġsome Ġcontent Ġthat Ġcan Ġbe Ġsynced Ġto ĠE ver note Ġwas Ġcreated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġever note Api . update Note ( external Id , Ġupdated Article . body Markdown ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Article ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Update Ġof Ġarticle Ġ${ edited . id } Ġfinished Ġwith Ġerror Ġ${ ex }", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġex ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Edited Article ( id : ĠString ): ĠEdit ed Article ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Repository . findById As Opt ( id )?. let Ġ{ Ġarticle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcategory Ids Ġ= Ġfind Article Categories ( article . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle . to Edited ( category Ids ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Cache able ( Article . Cache Name ) ĊĠĠĠ Ġoverride Ġfun ĠfindBy Slug ( slug : ĠString ): ĠArticle ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace (" Finding Ġarticle Ġby Ġslug Ġ$ slug ") ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Repository . findBy Slug ( slug ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Cache able ( Article . Cache Name ) ĊĠĠĠ Ġoverride Ġfun Ġfind Latest ( limit : ĠInt ): ĠList < Article > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace (" Finding Ġlatest Ġ$ limit Ġarticles ") ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Repository . find Latest ( limit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠfindBy CategoryId ( categoryId : ĠString , Ġlimit : ĠInt ): ĠList < Article > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Repository . findBy CategoryId ( categoryId , Ġlimit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠfindBy Query ( query : ĠString , Ġlimit : ĠInt ): ĠList < Article > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Repository . findBy Query ( query , Ġlimit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Article Categories ( article Id : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarticle Category Bindings Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Category Repository . findBy Filter ( Article Category Filter . Empty . copy ( article Id Ġ= Ġarticle Id )) ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Category Bindings . map Ġ{ Ġac Ġ-> Ġac . categoryId Ġ} ĊĠĠĠ Ġ} Ċ } Ċ