package Ġio . real world . app . web . controllers Ċ Ċ import Ġio . jav al in . Context Ċ import Ġio . real world . app . domain . Article DTO Ċ import Ġio . real world . app . domain . Articles DTO Ċ import Ġio . real world . app . domain . service . Article Service Ċ Ċ class ĠArticle Controller ( private Ġval Ġarticle Service : ĠArticle Service ) Ġ{ ĊĠĠĠĠĊĠĠĠ Ġfun ĠfindBy ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġctx . query Param (" tag ") ĊĠĠĠĠĠĠĠ Ġval Ġauthor Ġ= Ġctx . query Param (" author ") ĊĠĠĠĠĠĠĠ Ġval Ġfavor ited Ġ= Ġctx . query Param (" f avor ited ") ĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġctx . query Param (" limit ") Ġ?: Ġ" 2 0 " ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġctx . query Param (" offset ") Ġ?: Ġ" 0 " ĊĠĠĠĠĠĠĠ Ġarticle Service . findBy ( tag , Ġauthor , Ġfavor ited , Ġlimit . toInt (), Ġoffset . toInt ()). also Ġ{ Ġarticles Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( Articles DTO ( articles , Ġarticles . size )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfeed ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġctx . query Param (" limit ") Ġ?: Ġ" 2 0 " ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġctx . query Param (" offset ") Ġ?: Ġ" 0 " ĊĠĠĠĠĠĠĠ Ġarticle Service . find Feed ( ctx . attribute (" email "), Ġlimit . toInt (), Ġoffset . toInt ()). also Ġ{ Ġarticles Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( Articles DTO ( articles , Ġarticles . size )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . validated Path Param (" slug ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ({ Ġit . isNotBlank () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrThrow (). also Ġ{ Ġslug Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Service . findBy Slug ( slug ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( Article DTO ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . validated Body < Article DTO >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ({ Ġ! it . article ?. title . isNull Or Blank () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ({ Ġ! it . article ?. description . isNull Or Blank () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ({ Ġ! it . article ?. body . isNull Or Blank () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrThrow (). article ?. also Ġ{ Ġarticle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Service . create ( ctx . attribute (" email "), Ġarticle ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( Article DTO ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġslug Ġ= Ġctx . validated Path Param (" slug "). get OrThrow () ĊĠĠĠĠĠĠĠ Ġctx . validated Body < Article DTO >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ({ Ġ! it . article ?. body . isNull Or Blank () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrThrow (). article ?. also Ġ{ Ġarticle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Service . update ( slug , Ġarticle ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( Article DTO ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . validated Path Param (" slug "). get OrThrow (). also Ġ{ Ġslug Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Service . delete ( slug ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfavorite ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . validated Path Param (" slug "). get OrThrow (). also Ġ{ Ġslug Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Service . favorite ( ctx . attribute (" email "), Ġslug ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( Article DTO ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun favorite ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . validated Path Param (" slug "). get OrThrow (). also Ġ{ Ġslug Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Service . un favorite ( ctx . attribute (" email "), Ġslug ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( Article DTO ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }