/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠThe ĠBook Lab ĠAuthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġnl . t ude lf t . book lab . backend . api . v 1 Ċ Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . auth . oauth 2 . scoped Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . request . receive Ċ import Ġio . ktor . response . respond Ċ import Ġio . ktor . routing . Route Ċ import Ġio . ktor . routing . application Ċ import Ġio . ktor . routing . post Ċ import Ġnl . t ude lf t . book lab . backend . services . catalog ue . Catalog ue Service Ċ import Ġnl . t ude lf t . book lab . backend . services . collection . Book Collection Service Ċ import Ġnl . t ude lf t . book lab . backend . spring . inject Ċ import Ġnl . t ude lf t . book lab . recomm ender . Recomm ender Ċ Ċ /** Ċ Ġ* ĠDefine Ġthe Ġendpoints Ġfor Ġthe Ġrecommendation Ġsystem . Ċ Ġ*/ Ċ fun ĠRoute . recommend ation () Ġ{ ĊĠĠĠ Ġval Ġrecomm ender : ĠRecomm ender Ġ= Ġapplication . inject () ĊĠĠĠ Ġval Ġcollections : ĠBook Collection Service Ġ= Ġapplication . inject () ĊĠĠĠ Ġval Ġcatalog ue : ĠCatalog ue Service Ġ= Ġapplication . inject () ĊĊĠĠĠ Ġscoped (" recommend ation ") Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtry Ġ{ Ġcall . receive < Recommendation Request >() Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= Ġif Ġ( input ?. candidates Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġparse Books ( catalog ue , Ġinput . candidates ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvalid Ġ= Ġres . entries . find Ġ{ Ġit . value Ġ== Ġnull Ġ} ?. key ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invalid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . BadRequest , ĠInvalid Request (" The Ġbook Ġ'$ invalid ' Ġcould Ġnot Ġbe Ġfound Ġin Ġthe Ġcatalog ue .")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . values . filter NotNull (). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġinput Ġcollection Ġeither Ġbased Ġon Ġinput Ġbooks Ġor Ġon Ġa Ġuser Ġcollection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġif Ġ( input ?. collection Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġparse Books ( catalog ue , Ġinput . collection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvalid Ġ= Ġres . entries . find Ġ{ Ġit . value Ġ== Ġnull Ġ} ?. key ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invalid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . BadRequest , ĠInvalid Request (" The Ġbook Ġ'$ invalid ' Ġcould Ġnot Ġbe Ġfound Ġin Ġthe Ġcatalog ue .")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . values . filter NotNull (). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcall . parameters [" collection "] ?. toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid ?. let Ġ{ Ġcollections . findById ( it )?. books ?. toSet () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidates Ġ== Ġnull Ġ|| Ġcollection Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . BadRequest , ĠInvalid Request (" The Ġrequest Ġwas Ġof Ġinvalid Ġformat .")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecommendations Ġ= Ġrecomm ender . recommend ( collection , Ġcandidates . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( Success ( recommend ations , Ġmeta Ġ= Ġmap Of (" count " Ġto Ġrecommendations . size ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhandle Ġ{ Ġcall . respond ( HttpStatusCode . Method Not Allowed , ĠMethod Not Allowed ()) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġrequest Ġfor Ġgenerating Ġrecommendations Ġfor Ġa Ġbook Ġcollection . Ċ Ġ*/ Ċ data Ġclass ĠRecommend ation Request ( val Ġcollection : ĠList < String > ?, Ġval Ġcandidates : ĠList < String >) Ċ