package Ġcom . ib ash k imi . wheel . firestore . core Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . paging . DataSource Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . firestore . Query Ċ import Ġcom . ib ash k imi . wheel . core . Direction Ċ import Ġcom . ib ash k imi . wheel . core . User Ċ import Ġcom . ib ash k imi . wheel . core . data . User DataSource Ċ import Ġcom . ib ash k imi . wheel . core . model . core . Connection Ċ import Ġcom . ib ash k imi . wheel . core . model . core . Event Ċ import Ġcom . ib ash k imi . wheel . firestore .* Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġjava . util .* ĊĊ Ċ @ Experimental Cor outines Api Ċ class ĠFire store User Manager Ġ: ĠBase Fire store Manager (), ĠUser DataSource Ġ{ ĊĊĠĠĠ Ġ// ĠUsers ĊĊĠĠĠ Ġoverride Ġval Ġcurrent UserId : ĠString ? Ġget () Ġ= ĠcurrentUser ?. uid ĊĊĠĠĠ Ġoverride Ġfun Ġcreate User (): ĠFlow < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFirebase Auth . getInstance (). currentUser !! ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠDate () ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" created " Ġto Ġnow , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" displayName " Ġto Ġuser . displayName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" email " Ġto Ġuser . email , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" imageUrl " Ġto Ġuser . photoUrl . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" phoneNumber " Ġto Ġuser . phoneNumber , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" last Login " Ġto Ġnow , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" private Account " Ġto Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdb . collection (" users "). document ( current UserId !! ). write Flow ( map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetUser ( userId : ĠString ): ĠFlow < User ?> Ġ= ĊĠĠĠĠĠĠĠ Ġdb . collection (" users "). document ( userId ). as Flow (). map Ġ{ Ġit . to User () Ġ} ĊĊĠĠĠ Ġ// override Ġfun ĠgetAll Users (): ĠFlow < List < User >> Ġ= Ġdb . collection (" users "). as Flow (). map Ġ{ Ġit . to UserList () Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Users ( ĊĠĠĠĠĠĠĠ Ġlimit : ĠLong , ĊĠĠĠĠĠĠĠ Ġdirection : ĠDirection , ĊĠĠĠĠĠĠĠ Ġcontinuation : ĠAny ? ĊĠĠĠ Ġ): ĠFlow < List < User >> Ġ= ĊĠĠĠĠĠĠĠ Ġdb . collection (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy (" created ", Ġdirection . to Fire store Direction ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Continuation ( continu ation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. limit ( limit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to UserList () Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Users Paged (): ĠDataSource . Factory < Any , ĠUser > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġdb . collection (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy (" created ", ĠQuery . Direction . DESC ENDING ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFire store DataSource Factory ( query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Ġ{ Ġquery Ġ-> Ġquery . to User () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠDataSource . Factory < Any , ĠUser > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠConnection s ĊĊĠĠĠ Ġoverride Ġfun Ġget Connection ( from UserId : ĠString , Ġto UserId : ĠString ): ĠFlow < Connection ?> Ġ= ĊĠĠĠĠĠĠĠ Ġ( if Ġ( from UserId Ġ< Ġto UserId ) Ġ"$ from UserId $ to UserId " Ġelse Ġ"$ to UserId $ from UserId "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . collection (" connections "). document ( it ) ĊĠĠĠĠĠĠĠ Ġ}. as Flow (). map Ġ{ Ġit . to Connection () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Connections ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġlimit : ĠLong , ĊĠĠĠĠĠĠĠ Ġdirection : ĠDirection , ĊĠĠĠĠĠĠĠ Ġcontinuation : ĠAny ? ĊĠĠĠ Ġ): ĠFlow < List < Connection >> Ġ= Ġdb . collection (" connections ") ĊĠĠĠĠĠĠĠ Ġ. orderBy (" created ", Ġdirection . to Fire store Direction ()) ĊĠĠĠĠĠĠĠ Ġ. with Continuation ( continu ation ) ĊĠĠĠĠĠĠĠ Ġ. limit ( limit ) ĊĠĠĠĠĠĠĠ Ġ. as Flow () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Connection List () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Connections Paged (): ĠDataSource . Factory < Any , ĠConnection > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġdb . collection (" connections ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy (" created ", ĠQuery . Direction . DESC ENDING ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFire store DataSource Factory ( query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Ġ{ Ġquery Ġ-> Ġquery . to Connection () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠDataSource . Factory < Any , ĠConnection > ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġinsert Connection ( connection : ĠConnection ): ĠFlow < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġconnection . from UserId ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġconnection . to UserId ĊĠĠĠĠĠĠĠ Ġval Ġconnection Id Ġ= Ġif Ġ( from Ġ< Ġto ) Ġ"$ from $ to " Ġelse Ġ"$ to $ from " ĊĠĠĠĠĠĠĠ Ġreturn Ġdb . collection (" connections "). document ( connection Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. write Flow ( connection . toMap ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Connection ( connection : ĠConnection ): ĠFlow < Unit > Ġ= ĊĠĠĠĠĠĠĠ Ġdb . collection (" connections "). document ( connection . uid !! ). delete (). as Flow () ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Connection ( connection : ĠConnection ): ĠFlow < String > Ġ= ĊĠĠĠĠĠĠĠ Ġdb . collection (" connections "). document ( connection . uid !! ). write Flow ( connection . toMap ()) ĊĊĠĠĠ Ġ// ĠEvents ĊĊĠĠĠ Ġoverride Ġfun Ġinsert Event ( event : ĠEvent ): ĠFlow < String > Ġ= ĊĠĠĠĠĠĠĠ Ġdb . collection (" events "). document (). write Flow ( event . toMap ()) ĊĊĠĠĠ Ġoverride Ġfun Ġget Event ( eventId : ĠString ): ĠFlow < Event ?> Ġ= ĊĠĠĠĠĠĠĠ Ġdb . collection (" events "). document ( eventId ). as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Event () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Latest Ġ{ Ġit . to Full Event Flow () Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠEvent . to Full Event Flow (): ĠFlow < Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġevent Ġ= Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . New Follow Request Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser ( event . from UserId ). combine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent UserId !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . from UserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġuser , Ġconnection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . from User Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . connection Ġ= Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. take ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . Follow Accepted Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser ( event . from UserId ). combine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent UserId !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . from UserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġuser , Ġconnection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . from User Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . connection Ġ= Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. take ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠEvent . to Full Event () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġevent Ġ= Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . New Follow Request Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser ( event . from UserId ). combine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent UserId !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . from UserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġuser , Ġconnection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . from User Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . connection Ġ= Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . Follow Accepted Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser ( event . from UserId ). combine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent UserId !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . from UserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġuser , Ġconnection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . from User Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . connection Ġ= Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. take ( 1 ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Fire store User Manager ", Ġ" Collected ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d (" Fire store User Manager ", Ġ" Exit ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Event ( event : ĠEvent ): ĠFlow < Unit > Ġ= ĊĠĠĠĠĠĠĠ Ġdb . collection (" events "). document ( event . uid ). delete (). as Flow () ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Event ( event : ĠEvent ): ĠFlow < String > Ġ= ĊĠĠĠĠĠĠĠ Ġdb . collection (" events "). document ( event . uid ). write Flow ( event . toMap ()) ĊĊĠĠĠ Ġoverride Ġfun Ġget Events ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġlimit : ĠLong , ĊĠĠĠĠĠĠĠ Ġdirection : ĠDirection , ĊĠĠĠĠĠĠĠ Ġcontinuation : ĠAny ? ĊĠĠĠ Ġ): ĠFlow < List < Event >> Ġ= Ġdb . collection (" events ") ĊĠĠĠĠĠĠĠ Ġ. where EqualTo (" userId ", ĠuserId ) ĊĠĠĠĠĠĠĠ Ġ. orderBy (" created ", Ġdirection . to Fire store Direction ()) ĊĠĠĠĠĠĠĠ Ġ. with Continuation ( continu ation ) ĊĠĠĠĠĠĠĠ Ġ. limit ( limit ) ĊĠĠĠĠĠĠĠ Ġ. as Flow () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġsnapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġsnapshot . to Event List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . map Ġ{ Ġit . to Full Event Flow (). collect Ġ{ Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġget Events Paged ( userId : ĠString ): ĠDataSource . Factory < Any , ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġdb . collection (" events ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. where EqualTo (" userId ", ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy (" created ", ĠQuery . Direction . DESC ENDING ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFire store DataSource Factory ( query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Ġ{ Ġquery Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġquery . to Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . to Full Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠDataSource . Factory < Any , ĠEvent > ĊĠĠĠ Ġ} Ċ }