package Ġcom . example . project _ auction . repository Ċ Ċ import Ġcom . example . project _ auction . data . Product Auction DTO Ċ import Ġcom . example . project _ auction . data . Product Trade DTO Ċ import Ġcom . example . project _ auction . data . User DTO Ċ import Ġcom . example . project _ auction . util . http . Http Api Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . channels . await Close Ċ import Ġkotlinx . coroutines . channels . try Send Blocking Ċ import Ġkotlinx . coroutines . flow . callback Flow Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ Ċ class ĠA uction Repository Ġ{ ĊĊĠĠĠ Ġval Ġdb Ġ= ĠFirebase Fire store . getInstance () ĊĠĠĠ Ġval Ġauth Ġ= ĠFirebase Auth . getInstance () ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġval Ġauction Repository Ġ= ĠA uction Repository () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ê²½ ë§¤ ê¸ Ģ Ġê°Ģ ìł¸ ìĺ¤ ê¸° Ġmap ( document Ġkey , document Ġvalue ) ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġload Auction Data ( page Ġ: ĠInt , ĠorderBy Ġ: ĠInt , Ġuid Ġ: ĠString Ġ, Ġsort Key Ġ: ĠString Ġ, Ġcategory Ġ: ĠString ) Ġ= Ġcallback Flow < Product Auction DTO . Product Response DTO ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Listener Ġ= ĠHttp Api (). get Auction Product ( page , orderBy , uid , sort Key , category ). enqueue ( object Ġ: ĠCallback < Product Auction DTO . Product Response DTO >{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Product Auction DTO . Product Response DTO >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Product Auction DTO . Product Response DTO > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( response . body () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Product Auction DTO . Product Response DTO >, Ġt : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġawait Close Ġ{ Ġevent Listener Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ê±° ëŀĺ ê¸ Ģ Ġê°Ģ ìł¸ ìĺ¤ ê¸° Ġmap ( document Ġkey , Ġdocument Ġvalue ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġload Trade Data ( page : ĠInt Ġ, ĠorderBy : ĠInt Ġ, Ġuid : ĠString Ġ, Ġsort Key : ĠString Ġ, Ġend Flag Ġ: ĠBoolean , Ġcategory Ġ: ĠString ) Ġ= Ġcallback Flow < Product Trade DTO . Product Response DTO ? >{ ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Listener Ġ= ĠHttp Api (). get Trade Product ( page Ġ, ĠorderBy Ġ, Ġuid Ġ, Ġsort Key , Ġend Flag , Ġcategory ). enqueue ( object Ġ: ĠCallback < Product Trade DTO . Product Response DTO >{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Product Trade DTO . Product Response DTO >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Product Trade DTO . Product Response DTO > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( response . body () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Product Trade DTO . Product Response DTO >, Ġt : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠĠĠĠĠ Ġawait Close Ġ{ Ġevent Listener Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ê²½ ë§¤ Ġì°¸ ìĹ¬ ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġjoin Auction ( uid Ġ: ĠString , ĠproductId Ġ: ĠString ) Ġ= Ġcallback Flow < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Reference Product Ġ= Ġdb . collection (" product Auction "). document ( productId ) ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Reference User Ġ= Ġdb . collection (" User "). where EqualTo (" uid ", uid ) ĊĠĠĠĠĠĠĠ Ġdatabase Reference User . get (). add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Successful ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . result . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it [" uid "] Ġ== Ġuid ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . run Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Product Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ê²½ ë§¤ Ġê¸ Ģ ìĹĲ Ġì°¸ ìĹ¬ ìŀĲ Ġuid Ġìĺ ¬ ë¦¬ ê¸° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking (" TS _ PRODUCT _ START ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġproduct Ġ= Ġtransaction Product . get ( transaction Reference Product ). toObject ( Product Auction DTO :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct !!. join Count Ġ= Ġproduct !!. join Count Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct . join ers . put ( uid , true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Product . set ( transaction Reference Product , product ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking (" TS _ PRODUCT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Transaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . run Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction User Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Reference User Ġ= Ġdb . collection (" User "). document ( it . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking (" TS _ USER _ START ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġuser Ġ= Ġtransaction User . get ( transaction Reference User ). toObject ( User DTO :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser !!. join Auction !!. put ( productId , true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . join Auction Count Ġ= Ġuser . join Auction Count !! Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction User . set ( transaction Reference User , user ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking (" TS _ USER ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Transaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking (" TS _ USER _ SUCCESS ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" aaaaaaaa aaaa ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking (" TS _ USER _ FAIL Ġ: Ġ${ it . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" bbbb bbbb bbbb ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Canceled Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" cccc cccc cccc ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġawait Close Ġ{ Ġ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ëĤ´ Ġê²½ ë§¤ ê¸ Ģ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġget My Auction Product ( uid Ġ: ĠString ) Ġ= Ġcallback Flow < Map < String , Product Auction DTO > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Listener Ġ= Ġdb . collection (" product Auction "). where EqualTo (" uid ", uid ). get (). add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isEmpty ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmap Ġ: ĠMutable Map < String , Product Auction DTO > Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put ( it . id , it . toObject ( Product Auction DTO :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. run Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġawait Close Ġ{ Ġevent Listener Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġ// ëĤ´ ê°Ģ Ġì°¸ ìĹ¬ íķľ Ġê²½ ë§¤ ê¸ Ģ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġget My Bid ded Product ( uid Ġ: ĠString ) Ġ= Ġcallback Flow < Map < String , Product Auction DTO >? >{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Listener Ġ= Ġdb . collection (" product Auction "). where EqualTo (" join ers ." Ġ+ Ġuid Ġ, Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get (). add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdata Ġ: ĠMutable Map < String , Product Auction DTO > Ġ= Ġhash Map Of () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . put ( it . id , it . toObject ( Product Auction DTO :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. run Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġawait Close Ġ{ Ġevent Listener Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ëĤ´ ĠíĮ Ĳ ë§¤ ê¸ Ģ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġget My Trade Product ( uid Ġ: ĠString ) Ġ= Ġcallback Flow < Map < String , Product Trade DTO > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Listener Ġ= Ġdb . collection (" Product Trade "). where EqualTo (" uid ", uid ). get (). add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isEmpty ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmap Ġ: ĠMutable Map < String , Product Trade DTO > Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put ( it . id , it . toObject ( Product Trade DTO :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ callback Flow . try Send Blocking ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. run Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġawait Close Ġ{ Ġevent Listener Ġ} ĊĠĠĠ Ġ} Ċ Ċ }