/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠAlex i ĠBre Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġtech . alex ib . y aba . server . feature . transaction Ċ Ċ import Ġgraphql . schema . Data Fetcher Ċ import Ġgraphql . schema . Data Fetching Environment Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . toList Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġtech . alex ib . y aba . domain . item . ItemId Ċ import Ġtech . alex ib . y aba . domain . user . UserId Ċ import Ġtech . alex ib . y aba . server . feature . account . Account Dto Ċ import Ġtech . alex ib . y aba . server . feature . account . AccountId Ċ import Ġtech . alex ib . y aba . server . feature . item . Item Dto Ċ import Ġtech . alex ib . y aba . server . feature . user . User Dto Ċ import Ġtech . alex ib . y aba . server . graphql . util . Coroutine DataLoader Ċ import Ġtech . alex ib . y aba . server . graphql . util . getValue From DataLoader Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ Ċ @ Component Ċ class ĠTransaction DataLoader ( private Ġval Ġrepository : ĠTransaction Repository ) Ġ: ĊĠĠĠ ĠCor outine DataLoader < UUID , ĠTransaction Dto >() Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġbatch Load ( keys : ĠList < UUID >): ĠList < Transaction Dto > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrepository . findById ( keys ). map Ġ{ Ġit . to Dto () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠTransactions By AccountId DataLoader ( private Ġval Ġrepository : ĠTransaction Repository ) Ġ: ĊĠĠĠ ĠCor outine DataLoader < UUID , ĠList < Transaction Dto >>() Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġbatch Load ( keys : ĠList < UUID >): ĠList < List < Transaction Dto >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġkeys . map Ġ{ Ġuuid Ġ-> Ġrepository . findBy AccountId ( AccountId ( uuid )). toList (). map Ġ{ Ġit . to Dto () Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠTransactions By ItemId DataLoader ( private Ġval Ġrepository : ĠTransaction Repository ) Ġ: ĊĠĠĠ ĠCor outine DataLoader < UUID , ĠList < Transaction Dto >>() Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġbatch Load ( keys : ĠList < UUID >): ĠList < List < Transaction Dto >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġkeys . map Ġ{ Ġuuid Ġ-> Ġrepository . findBy ItemId ( ItemId ( uuid )). toList (). map Ġ{ Ġit . to Dto () Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠTransactions By UserId DataLoader ( private Ġval Ġrepository : ĠTransaction Repository ) Ġ: ĊĠĠĠ ĠCor outine DataLoader < UUID , ĠList < Transaction Dto >>() Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġbatch Load ( keys : ĠList < UUID >): ĠList < List < Transaction Dto >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġkeys . map Ġ{ Ġuuid Ġ-> Ġrepository . findBy UserId ( UserId ( uuid )). map Ġ{ Ġit . to Dto () Ġ}. toList () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠTransactions By UserId Data Fetcher Ġ: ĠData Fetcher < Comp letableFuture < List < Transaction Dto >>> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget ( environment : ĠData Fetching Environment ): ĠCompletableFuture < List < Transaction Dto >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġenvironment . getSource < User Dto >(). id ĊĠĠĠĠĠĠĠ Ġreturn Ġenvironment . getValue From DataLoader ( Transactions By UserId DataLoader :: class , ĠuserId ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠTransactions By AccountId Data Fetcher Ġ: ĠData Fetcher < Comp letableFuture < List < Transaction Dto >>> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget ( environment : ĠData Fetching Environment ): ĠCompletableFuture < List < Transaction Dto >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠaccountId Ġ= Ġenvironment . getSource < Account Dto >(). id ĊĠĠĠĠĠĠĠ Ġval Ġhidden Ġ= Ġenvironment . getSource < Account Dto >(). hidden ĊĠĠĠĠĠĠĠ Ġreturn Ġenvironment . getValue From DataLoader ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransactions By AccountId DataLoader :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! hidden ) ĠaccountId Ġelse ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠTransaction By ItemId Data Fetcher Ġ: ĠData Fetcher < Comp letableFuture < List < Transaction Dto >>> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget ( environment : ĠData Fetching Environment ): ĠCompletableFuture < List < Transaction Dto >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠitemId Ġ= Ġenvironment . getSource < Item Dto >(). id ĊĠĠĠĠĠĠĠ Ġreturn Ġenvironment . getValue From DataLoader ( Transactions By ItemId DataLoader :: class , ĠitemId ) ĊĠĠĠ Ġ} Ċ } Ċ