package Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . controllers Ċ Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . lib . Product Specification Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . lib . Product Spec ifications Builder Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . lib . Search Criteria Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . listeners . new Products Topic Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . models . Business Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . models . New Product Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . models . Product Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . models . Update Product Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . models . d tos . Products Response Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . services . Bulk Create Processor Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . services . Business Service Ċ import Ġar . edu . un q . ar qs 1 . M erc ad illo Lib re Back . services . Product Service Ċ import Ġorg . springframework . data . jpa . domain . Specification Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . kafka . core . Kafka Template Ċ import Ġorg . springframework . security . core . annotation . Authentication Principal Ċ import Ġorg . springframework . validation . annotation . Validated Ċ import Ġorg . springframework . web . bind . annotation .* Ċ import Ġorg . springframework . web . multipart . Multipart File Ċ import Ġjava . util . regex . Pattern Ċ import Ġjavax . validation . Valid Ċ Ċ @ RestController Ċ @ RequestMapping ("/ v 1 / products ") Ċ @ Validated Ċ class ĠProducts Controller ( ĊĠĠĠ Ġprivate Ġval Ġproducts Service : ĠProduct Service , ĊĠĠĠ Ġprivate Ġval Ġbusiness Service : ĠBusiness Service , ĊĠĠĠ Ġprivate Ġval Ġbulk Create Processor : ĠBulk Create Processor Ċ ) Ġ{ ĊĠĠĠ Ġ@ PostMapping ĊĠĠĠ Ġfun Ġadd Product ( ĊĠĠĠĠĠĠĠ Ġ@ Authentication Principal Ġbusiness : ĠBusiness , ĊĠĠĠĠĠĠĠ Ġ@ RequestBody Ġ@ Valid Ġnew Product : ĠNew Product ĊĠĠĠ Ġ): ĠResponseEntity < Product > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbusiness Service . get Business ById ( business . id !! ). map Ġ{ Ġbusiness Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Ġ= Ġnew Product . to Product ( business ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . ok ( products Service . add Product ( product )) ĊĠĠĠĠĠĠĠ Ġ}. orElse ( Response Entity . not Found (). build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Delete Mapping ("/ { id }") ĊĠĠĠ Ġfun Ġdelete Product ( ĊĠĠĠĠĠĠĠ Ġ@ Authentication Principal Ġbusiness : ĠBusiness , ĊĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" id ") ĠproductId : ĠLong ĊĠĠĠ Ġ): ĠResponseEntity < Nothing > Ġ= ĊĠĠĠĠĠĠĠ Ġproducts Service . get Product ById ( productId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġproduct Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( product . seller . id Ġ== Ġbusiness . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġproduct Ġ-> Ġproducts Service . delete Product ( product ?. id !! ). orElse ( null ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠResponseEntity . ok ( null ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse ( Response Entity . not Found (). build ()) ĊĊĠĠĠ Ġ@ Put Mapping ("/ { id }") ĊĠĠĠ Ġfun Ġupdate Product ( ĊĠĠĠĠĠĠĠ Ġ@ Authentication Principal Ġbusiness : ĠBusiness , ĊĠĠĠĠĠĠĠ Ġ@ PathVariable ( value Ġ= Ġ" id ") ĠproductId : ĠLong , ĊĠĠĠĠĠĠĠ Ġ@ RequestBody Ġ@ Valid Ġupdate Product : ĠUpdate Product ĊĠĠĠ Ġ): ĠResponseEntity < Product > Ġ= ĊĊĠĠĠĠĠĠĠ Ġproducts Service . get Product ById ( productId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġproduct Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( product . seller . id Ġ== Ġbusiness . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġproduct Ġ-> Ġproducts Service . update Product ( product ?. id !! , Ġupdate Product ). orElse ( null ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġproduct Ġ-> ĠResponseEntity . ok ( product ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse ( Response Entity . not Found (). build ()) ĊĊĠĠĠ Ġ@ GetMapping ("/ { id }") ĊĠĠĠ Ġfun Ġget Product (@ PathVariable ( value Ġ= Ġ" id ") ĠproductId : ĠLong ): ĠResponseEntity < Product > Ġ= ĊĠĠĠĠĠĠĠ Ġproducts Service . get Product ById ( productId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġproduct Ġ-> ĠResponseEntity . ok ( product ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse ( Response Entity . not Found (). build ()) ĊĊĠĠĠ Ġ@ GetMapping ĊĠĠĠ Ġfun Ġall Products ( ĊĠĠĠĠĠĠĠ Ġ@ RequestParam ( value Ġ= Ġ" filters ", Ġrequired Ġ= Ġfalse ) Ġfilters Param : ĠArray < String > ?, ĊĠĠĠĠĠĠĠ Ġ@ RequestParam ( value Ġ= Ġ" search ", Ġrequired Ġ= Ġfalse ) Ġsearch Param : ĠString ? ĊĠĠĠ Ġ): ĠResponseEntity < Products Response > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfilters Ġ= Ġfilters Param Ġ?: Ġempty Array () ĊĠĠĠĠĠĠĠ Ġval Ġfilters Builder Ġ= ĠProduct Spec ifications Builder () ĊĠĠĠĠĠĠĠ Ġfilters . map Ġ{ Ġfilter Ġ-> ĠSEARCH _ CR ITER IA _ PATTERN . matcher ( filter ) Ġ}. forEach Ġ{ Ġmatcher Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilters Builder . with ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Criteria ( matcher . group ( 1 ), Ġmatcher . group ( 2 ), Ġmatcher . group ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfilters Specification Ġ= Ġfilters Builder . build () ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch Specification Ġ= Ġsearch Param ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSpecification . where ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct Specification ( Search Criteria (" description ", Ġ" :", Ġsearch Param )). or ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct Specification ( Search Criteria (" name ", Ġ" :", Ġsearch Param )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġspecification Ġ= Ġsearch Specification ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilters Specification ?. let Ġ{ Ġfilters Specification . and ( search Specification ) Ġ} Ġ?: Ġsearch Specification ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfilters Specification ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . ok ( Products Response ( products Ġ= Ġproducts Service . products ( specification ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ PostMapping ("/ bulk Create ") ĊĠĠĠ Ġfun Ġbulk Create (@ Authentication Principal Ġbusiness : ĠBusiness , Ġ@ RequestParam (" file ") Ġfile : ĠMultip art File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbulk Create Processor . process ( business , Ġfile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠSEARCH _ CR ITER IA _ PATTERN : ĠPattern Ġ= ĠPattern . compile (" (. +) ([ : <> ]) (. + )") ĊĠĠĠ Ġ} Ċ } Ċ