package Ġcom . conf in ap pt il us . conf in pin board . datas ources . impl Ċ Ċ import Ġcom . conf in ap pt il us . conf in pin board . commons . extensions . is Available Ċ import Ġcom . conf in ap pt il us . conf in pin board . commons . extensions . safe Call Ċ import Ġcom . conf in ap pt il us . conf in pin board . datas ources . Response State Ċ import Ġcom . conf in ap pt il us . conf in pin board . datas ources . map pers . Anno uncement Mapper Ċ import Ġcom . conf in ap pt il us . conf in pin board . datas ources . models . Anno uncement Response Model Ċ import Ġcom . conf in ap pt il us . conf in pin board . domain . models . Anno uncement Model Ċ import Ġcom . conf in ap pt il us . conf in pin board . repositories . datas ources . Anno unce ments DataSource Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġcom . google . firebase . firestore . Query Snapshot Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ class ĠAnno unce ments DataSource Impl ( ĊĠĠĠ Ġprivate Ġval Ġdatabase : ĠFirebase Fire store , ĊĠĠĠ Ġprivate Ġval Ġmapper : ĠAnno uncement Mapper Ċ ) Ġ: ĠAnno unce ments DataSource Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġadd Anno uncement ( announcement : ĠAnno uncement Model ): ĠResponse State < String > Ġ= ĊĠĠĠĠĠĠĠ Ġsafe Call Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Remove Explicit Type Arguments ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Coroutine < String > Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . collection ( COLLECTION _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( mapper . map Domain To Response ( announcement )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġref Ġ-> Ġcont . resume ( ref . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġerror Ġ-> Ġcont . resume With Exception ( error ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Anno unce ments ( ĊĠĠĠĠĠĠĠ Ġids : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġsearch Term : ĠString , ĊĠĠĠĠĠĠĠ Ġcategories : ĠList < Anno uncement Model . Category > ĊĠĠĠ Ġ): ĠResponse State < List < Anno uncement Model >> Ġ= ĊĠĠĠĠĠĠĠ Ġsafe Call Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Remove Explicit Type Arguments ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Coroutine < List < Anno uncement Model >> Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . collection ( COLLECTION _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġdocuments Snapshots Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannounce ments Ġ= Ġget Anno unce ments From Documents ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocuments Snapshots , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġids , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategories ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( announce ments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġerror Ġ-> Ġcont . resume With Exception ( error ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Anno unce ments From Documents ( ĊĠĠĠĠĠĠĠ Ġdocuments Snapshots : ĠQuery Snapshot , ĊĠĠĠĠĠĠĠ Ġids : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġsearch Term : ĠString , ĊĠĠĠĠĠĠĠ Ġcategories : ĠList < Anno uncement Model . Category > ĊĠĠĠ Ġ): ĠList < Anno uncement Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġannounce ments Ġ= Ġdocuments Snapshots . to Objects ( Anno uncement Response Model :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexists Content ( it . title , Ġit . description , Ġit . place ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġcheck Availability ( it . end Timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . start Timestamp Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmapper . map Response To Domain ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( search Term . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannounce ments Ġ= Ġannounce ments . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . title . contains ( search Term , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . description . contains ( search Term , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannounce ments Ġ= Ġannounce ments . filter Ġ{ Ġids . contains ( it . id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( categories . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannounce ments Ġ= Ġannounce ments . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains Filter Categories ( categories , Ġit . categories ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġannounce ments ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcontains Filter Categories ( ĊĠĠĠĠĠĠĠ Ġfilter Categories : ĠList < Anno uncement Model . Category >, ĊĠĠĠĠĠĠĠ Ġanno uncement Categories : ĠList < Anno uncement Model . Category > ĊĠĠĠ Ġ) Ġ: ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġanno uncement Categories . first OrNull Ġ{ Ġfilter Categories . contains ( it ) Ġ} ?. let Ġ{ Ġtrue Ġ} Ġ?: Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġexists Content ( title : ĠString ?, Ġdescription : ĠString ?, Ġplace : ĠString ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġtitle Ġ!= Ġnull Ġ&& Ġtitle . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġdescription Ġ!= Ġnull Ġ&& Ġdescription . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġplace Ġ!= Ġnull Ġ&& Ġplace . isNotEmpty () ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Availability ( end Timestamp : ĠLong ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġend Timestamp Ġ!= Ġnull Ġ&& Ġis Available ( end Timestamp ) ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOL LECTION _ NAME Ġ= Ġ" announce ments " ĊĠĠĠ Ġ} Ċ } Ċ