/* Ċ Ġ* ĠLicense : ĠMIT Ċ Ġ* ĠCopyright Ġ( c ) Ġ ĠP ela ĠC rist ian Ġ 2 0 1 9 . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" unused ") Ċ Ċ package Ġcom . cr sk dev . bib l ere ader plus . data Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . paging . DataSource Ċ import Ġandroidx . room . Room Ċ import Ġcom . cr sk dev . bib l ere ader plus . data . internal . room .* Ċ import Ġcom . cr sk dev . bib l ere ader plus . domain . entity .* Ċ import Ġcom . cr sk dev . bib l ere ader plus . domain . gateway . Document Repository Ċ import Ġcom . cr sk dev . bib l ere ader plus . presentation . util . arch . to Channel Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠC rist ian ĠP ela Ġon Ġ 2 1 . 0 1 . 2 0 1 9 . Ċ Ġ*/ Ċ class ĠRoom Document Repository Impl ( context : ĠContext ) Ġ: ĠDocument Repository Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdb Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Room . database Builder ( context , ĠDocument Database :: class . java , Ġ" bible - db "). build () ĊĠĠĠĠĠĠĠ ĠRoom . in Memory Database Builder ( context , ĠDocument Database :: class . java ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġread Dao Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . read DAO () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtag Dao Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . tag DAO () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun Transaction ( block : ĠDocument Repository . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( db . in Transaction ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . set Transaction Successful () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . end Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave ( reads : ĠList < Read >) Ġ{ ĊĠĠĠĠĠĠĠ Ġread Dao . insert ( reads . map Ġ{ Ġit . to Db () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread (): ĠDataSource . Factory < Int , ĠRead > Ġ= ĊĠĠĠĠĠĠĠ Ġread Dao . observe Reads (). map By Page Ġ{ Ġp Ġ-> Ġp . map Ġ{ Ġit . to Domain () Ġ} Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontents (): ĠList < Read . Content > Ġ= ĊĠĠĠĠĠĠĠ Ġread Dao . contents (). map Ġ{ Ġit . to Domain () Ġas ĠRead . Content Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfilter Contents ( contains : ĠString ): ĠList < Read . Content > Ġ= ĊĠĠĠĠĠĠĠ Ġread Dao . contents ("% contains % "). map Ġ{ Ġit . to Domain () Ġas ĠRead . Content Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Ver set ( id : ĠInt ): ĠSelected Ver set ? Ġ= ĊĠĠĠĠĠĠĠ Ġread Dao . get Ver set ( id )?. to Selected Ver set () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġobserve Ver set ( id : ĠInt , Ġobserver : Ġ( Selected Ver set ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Dao . observe Ver set ( id ). to Channel Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( v db Ġin Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġv db ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ( v db . to Selected Ver set ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfavorite Action ( add : ĠBoolean , Ġid : ĠInt , Ġmodified At : ĠModified At ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! add ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . removeAll Tags From F avorites ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Dao . get Read ( id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Favorite Ġ= Ġadd ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . modified At Ġ= Ġmodified At . date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Dao . update Read ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Dao . update Favorite ( id , Ġadd , Ġmodified At . date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( x : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfavorite Action Batch ( add : ĠBoolean , Ġvar arg Ġids : ĠPair < Int , ĠModified At >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pair Ġin Ġids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! add ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . removeAll Tags From F avorites ( pair . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Dao . update Favorite ( pair . first , Ġadd , Ġpair . second . date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfavor ites ( filter : ĠF avorite Filter ): ĠDataSource . Factory < Int , ĠRead . Ver set > Ġ= ĊĠĠĠ Ġ// TODO Ġfilter Ġuse Ġcases ĊĠĠĠĠĠĠĠ Ġread Dao . observe Reads Favorite (). map By Page Ġ{ Ġp Ġ-> Ġp . map Ġ{ Ġit . to Domain () Ġas ĠRead . Ver set Ġ} Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġtags Ob serve ( contains : ĠString ?, Ġobserver : Ġ( Set < Tag >) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . observe Tags (). to Channel Ġ{ Ġch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( tags Ġin Ġch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ( tags . map Ġ{ Ġit . to Domain () Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtag Favorite Ver set ( add : ĠBoolean , Ġver setId : ĠInt , Ġtag Id : ĠString , Ġmodified At : ĠModified At ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtag Favorite Ver set Batch ( add , Ġver setId , Ġmodified At , Ġtag Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtag Favorite Ver set Batch ( add : ĠBoolean , Ġver setId : ĠInt , Ġmodified At : ĠModified At , Ġvar arg Ġtag Ids : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġtag Ids . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVer setTag DB (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ver setId Ġ= Ġver setId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tag Id Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Action ( true , Ġver setId , Ġmodified At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . add Tag To F avorites ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġtag Ids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . remove Tag From F avorites ( id , Ġver setId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtag Delete ( id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtag Dao . delete ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtag Rename ( id : ĠString , ĠnewName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . getTag ( id ). apply Ġ{ Ġname Ġ= ĠnewName Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . update ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtag Color ( id : ĠString , Ġcolor : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . getTag ( id ). apply Ġ{ Ġthis . color Ġ= Ġcolor Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Dao . update ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtag Create ( var arg Ġnew Tags : ĠTag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtag Dao . insert ( new Tags . map Ġ{ Ġit . to Db () Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ************************ ***** MAP PER S ************************ **** ĊĠĠĠ Ġprivate Ġfun ĠRead . to Db () Ġ= ĠRead DB (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġthis @ to Db ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġr . id ĊĠĠĠĠĠĠĠ Ġmodified At Ġ= Ġr . modified At . date ĊĠĠĠĠĠĠĠ Ġwhen Ġ( r ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRead . Content . Book Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠRead DB . TYPE _ BOOK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabbre viation Ġ= Ġr . abbre viation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġr . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRead . Content . Chapter Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠRead DB . TYPE _ CH AP TER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook Id Ġ= Ġr . key . book Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġr . number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter Number Ġ= Ġr . number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġr . book Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRead . Ver set Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠRead DB . TYPE _ VER SET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook Id Ġ= Ġr . key . book Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter Id Ġ= Ġr . key . chapter Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġr . number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter Number Ġ= Ġr . chapter Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabbre viation Ġ= Ġr . book Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġr . content . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRead DB . to Domain (): ĠRead Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRead DB . TYPE _ BOOK Ġ-> ĠRead . Content . Book ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabbre viation Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModified At ( modified At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRead DB . TYPE _ CH AP TER Ġ-> ĠRead . Content . Chapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChapter Key ( id , Ġbook Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModified At ( modified At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRead DB . TYPE _ VER SET Ġ-> ĠRead . Ver set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVer set Key ( id , Ġbook Id , Ġchapter Id , Ġ""), Ġnumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġabbre viation Ġ?: Ġ"", Ġchapter Number , Ġcontent Ġ?: Ġ"", Ġis Favorite , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModified At ( modified At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" Unknown Ġread Ġdb Ġtype ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠVer set DB . to Selected Ver set (): ĠSelected Ver set Ġ= ĊĠĠĠĠĠĠĠ ĠSelected Ver set ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVer set Key ( id , Ġbook Id , Ġchapter Id , Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabbre viation Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchapter Number , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Favorite , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtags ?. map Ġ{ ĠTag ( it . id , Ġit . name , Ġit . color ) Ġ} Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun ĠTag DB . to Domain (): ĠTag Ġ= ĠTag ( id , Ġname , Ġcolor ) ĊĊĠĠĠ Ġprivate Ġfun ĠTag . to Db () Ġ= ĠTag DB (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġthis @ to Db . id ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġthis @ to Db . name ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġthis @ to Db . color ĊĠĠĠ Ġ} Ċ }