package Ġcom . x app h ire 1 3 . database Ċ Ċ import Ġcom . google . cloud . firestore . Document Reference Ċ import Ġcom . google . cloud . firestore . Document Snapshot Ċ import Ġcom . google . cloud . firestore . Fire store Ċ import Ġcom . x app h ire 1 3 . extensions . as Deferred Ċ import Ġcom . x app h ire 1 3 . extensions . await Ċ import Ġcom . x app h ire 1 3 . models . Frequency Ċ import Ġcom . x app h ire 1 3 . models . Group Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . await All Ċ Ċ class ĠGroup Store ( db : ĠFire store ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġgroups Collection Ġ= Ġdb . collection (" groups ") ĊĠĠĠ Ġprivate Ġval Ġusers Collection Ġ= Ġdb . collection (" users ") ĊĊĠĠĠ Ġsuspend Ġfun Ġlist Groups (): ĠList < Group > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . groups Collection . list Documents (). map Ġ{ Ġit . get (). as Deferred () Ġ}. await All (). map Ġ{ Ġit . to Group () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Group ( id : ĠString ): ĠGroup ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġthis . groups Collection . document ( id ). get (). await ( Dispatch ers . IO ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( document . exists ()) Ġdocument . to Group () Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġadd User To Group ( groupId : ĠString , ĠuserId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġgroups Collection . document ( groupId ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġusers Collection . document ( userId ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġmake Ġconcurrent Ġsafe ĊĠĠĠĠĠĠĠ Ġval Ġexisting Users Ġ= Ġ( group . get (). await (). get (" users ") Ġas ? ĠList <* >) ?. filter Is Instance < Document Reference >() Ġ?: Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġgroup . update (" users ", Ġexisting Users . filter Ġ{ Ġit . id Ġ!== Ġuser . id Ġ}. plus ( user )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠDocument Snapshot . to Group (): ĠGroup Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGroup ( id Ġ= Ġthis . id , Ġuser Ids Ġ= Ġ( this . get (" users ") Ġas ? ĠList <* >) ?. filter Is Instance < Document Reference >() ?. map Ġ{ Ġit . id Ġ} Ġ?: Ġempty List (), Ġfrequency Ġ= Ġthis . getString (" frequency ") ?. let Ġ{ ĠFrequency . valueOf ( it ) Ġ} Ġ?: ĠFrequency . DA IL Y , Ġname Ġ= Ġthis . getString (" name ") Ġ?: Ġ"") ĊĠĠĠ Ġ} Ċ } Ċ