package Ġcom . te amp ym . online clo thing shop application . data . repository Ċ Ċ import Ġandroidx . paging . Pager Ċ import Ġandroidx . paging . Paging Config Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġcom . google . firebase . firestore . Query Ċ import Ġcom . google . firebase . firestore . Set Options Ċ import Ġcom . google . firebase . firestore . k tx . toObject Ċ import Ġcom . te amp ym . online clo thing shop application . data . di . Io Dispatcher Ċ import Ġcom . te amp ym . online clo thing shop application . data . models . Audit Trail Ċ import Ġcom . te amp ym . online clo thing shop application . data . models . User Information Ċ import Ġcom . te amp ym . online clo thing shop application . data . util . Audit Type Ċ import Ġcom . te amp ym . online clo thing shop application . data . util . USERS _ COLLECTION Ċ import Ġcom . te amp ym . online clo thing shop application . data . util . User Status Ċ import Ġcom . te amp ym . online clo thing shop application . data . util . Utils Ċ import Ġcom . te amp ym . online clo thing shop application . presentation . admin . accounts . Account Paging Source Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . tasks . await Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠAccount Repository Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġdb : ĠFirebase Fire store , ĊĠĠĠ Ġprivate Ġval Ġaudit Trail Repository : ĠAudit Trail Repository , ĊĠĠĠ Ġ@ Io Dispatcher Ġval Ġdispatcher : ĠCor outine Dispatcher Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġuser Collection Ref Ġ= Ġdb . collection ( USERS _ COLLECTION ) ĊĊĠĠĠ Ġsuspend Ġfun Ġget ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString ĊĠĠĠ Ġ): ĠUser Information ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Query Ġ= Ġuser Collection Ref . document ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Query . data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Query . toObject < User Information >() !!. copy ( userId Ġ= Ġuser Query . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcheck If User Is B anned ( userId : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserInfo Ġ= Ġget ( userId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠuserInfo . user Status Ġ== ĠUser Status . BAN N ED . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll ( query Accounts : ĠQuery ) Ġ= ĊĠĠĠĠĠĠĠ ĠP ager ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP aging Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġ 3 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefetch Distance Ġ= Ġ 3 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Place holders Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAccount Paging Source ( query Accounts ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġban User ( username : ĠString , Ġuser : ĠUser Information ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Collection Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. document ( user . userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" user Status " Ġto ĠUser Status . BAN N ED . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSet Options . merge () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudit Trail Repository . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudit Trail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ"$ username ĠB AN N ED Ġ${ user . firstName } Ġ${ user . lastName } Ġ(${ user . userId })", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠAudit Type . ACCOUNT . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġun Ban User ( username : ĠString , Ġuser : ĠUser Information ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Collection Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. document ( user . userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" user Status " Ġto ĠUser Status . ACTIVE . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSet Options . merge () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudit Trail Repository . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudit Trail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ"$ username ĠUN BAN N ED Ġ${ user . firstName } Ġ${ user . lastName } Ġ(${ user . userId })", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠAudit Type . ACCOUNT . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ ĠfirstName : ĠString , ĊĠĠĠĠĠĠĠ ĠlastName : ĠString , ĊĠĠĠĠĠĠĠ Ġbirth Date : ĠString , ĊĠĠĠĠĠĠĠ Ġavatar Url : ĠString ĊĠĠĠ Ġ): ĠUser Information ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew User Ġ= ĠUser Information ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfirstName Ġ= ĠfirstName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlastName Ġ= ĠlastName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirth Date Ġ= Ġbirth Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Url Ġ= Ġavatar Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Collection Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. document ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( new User , ĠSet Options . merge ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnew User ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠAccount ĠRepository ĊĠĠĠ Ġ// ĠUpdate Ġthe Ġuser Ġinformation ĊĠĠĠ Ġsuspend Ġfun Ġupdate ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ ĠfirstName : ĠString , ĊĠĠĠĠĠĠĠ ĠlastName : ĠString , ĊĠĠĠĠĠĠĠ Ġbirth Date : ĠString , ĊĠĠĠĠĠĠĠ Ġavatar Url : ĠString ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠisValid Ġ= ĠfirstName . isNotEmpty () Ġ&& Ġbirth Date . isNotEmpty () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠParsing Ġthe Ġdate Ġstring Ġ" 0 1 / 0 1 / 2 0 0 0 " Ġto Ġa Ġdate Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠSimpleDateFormat (" MM / dd / yyyy ", ĠLocale . EN GL ISH ). parse ( birth Date ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreating Ġan Ġinstance Ġof Ġcalendar Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Date Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġtime Ġwith Ġthe Ġdate Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar Date . time Ġ= Ġdate !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġuser Ġis Ġin Ġthe Ġright Ġage Ġto Ġuse Ġthe Ġapplication ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUser Ġshould Ġbe Ġ 1 2 Ġyears Ġold Ġand Ġabove Ġto Ġaccess Ġthis Ġapp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Calendar . getInstance (). get ( Calendar . YEAR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. minus ( calendar Date . get ( Calendar . YEAR )) Ġ>= Ġ 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġmap Ġto Ġupdate Ġfields Ġin Ġthe Ġfirebase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate User Map Ġ= Ġmap Of < String , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" avatar Url " Ġto Ġavatar Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" firstName " Ġto ĠfirstName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lastName " Ġto ĠlastName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" birth Date " Ġto Ġbirth Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" date Modified " Ġto ĠUtils . getTime In Millis UTC () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExecute Ġthe Ġquery Ġin Ġfire Store ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠI 'm Ġusing Ġk tx Ġgradle Ġlibrary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġline Ġexecutes . ĠIt Ġreflect s Ġthe Ġchanges Ġin Ġthe Ġfire Store ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Collection Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. document ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( update User Map , ĠSet Options . merge ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturns Ġfalse Ġif Ġthe Ġabove Ġoperation Ġfails ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ