|
@@ -1,18 +1,25 @@
|
|
|
package com.sirekanyan.knigopis.repository
|
|
package com.sirekanyan.knigopis.repository
|
|
|
|
|
|
|
|
import com.sirekanyan.knigopis.common.NetworkChecker
|
|
import com.sirekanyan.knigopis.common.NetworkChecker
|
|
|
-import com.sirekanyan.knigopis.common.logError
|
|
|
|
|
-import com.sirekanyan.knigopis.common.logWarn
|
|
|
|
|
|
|
+import com.sirekanyan.knigopis.model.BookModel
|
|
|
import com.sirekanyan.knigopis.repository.api.Endpoint
|
|
import com.sirekanyan.knigopis.repository.api.Endpoint
|
|
|
-import com.sirekanyan.knigopis.repository.cache.BookCache
|
|
|
|
|
-import com.sirekanyan.knigopis.repository.model.*
|
|
|
|
|
|
|
+import com.sirekanyan.knigopis.repository.cache.common.CacheKey
|
|
|
|
|
+import com.sirekanyan.knigopis.repository.cache.common.CommonCache
|
|
|
|
|
+import com.sirekanyan.knigopis.repository.cache.common.genericType
|
|
|
|
|
+import com.sirekanyan.knigopis.repository.common.CommonRepository
|
|
|
|
|
+import com.sirekanyan.knigopis.repository.model.FinishedBook
|
|
|
|
|
+import com.sirekanyan.knigopis.repository.model.FinishedBookToSend
|
|
|
|
|
+import com.sirekanyan.knigopis.repository.model.PlannedBook
|
|
|
|
|
+import com.sirekanyan.knigopis.repository.model.PlannedBookToSend
|
|
|
import io.reactivex.Completable
|
|
import io.reactivex.Completable
|
|
|
|
|
+import io.reactivex.Flowable
|
|
|
|
|
+import io.reactivex.Maybe
|
|
|
import io.reactivex.Single
|
|
import io.reactivex.Single
|
|
|
import io.reactivex.rxkotlin.Singles
|
|
import io.reactivex.rxkotlin.Singles
|
|
|
|
|
|
|
|
interface BookRepository {
|
|
interface BookRepository {
|
|
|
|
|
|
|
|
- fun loadBooks(): Single<List<Pair<Book, BookHeader>>>
|
|
|
|
|
|
|
+ fun loadBooks(): Flowable<List<BookModel>>
|
|
|
|
|
|
|
|
fun saveBook(bookId: String?, book: FinishedBookToSend, done: Boolean?): Completable
|
|
fun saveBook(bookId: String?, book: FinishedBookToSend, done: Boolean?): Completable
|
|
|
|
|
|
|
@@ -22,30 +29,15 @@ interface BookRepository {
|
|
|
|
|
|
|
|
class BookRepositoryImpl(
|
|
class BookRepositoryImpl(
|
|
|
private val api: Endpoint,
|
|
private val api: Endpoint,
|
|
|
- private val cache: BookCache,
|
|
|
|
|
|
|
+ private val cache: CommonCache,
|
|
|
private val auth: KAuth,
|
|
private val auth: KAuth,
|
|
|
private val plannedBookOrganizer: BookOrganizer<PlannedBook>,
|
|
private val plannedBookOrganizer: BookOrganizer<PlannedBook>,
|
|
|
private val finishedBookPrepare: BookOrganizer<FinishedBook>,
|
|
private val finishedBookPrepare: BookOrganizer<FinishedBook>,
|
|
|
- private val networkChecker: NetworkChecker
|
|
|
|
|
-) : BookRepository {
|
|
|
|
|
|
|
+ networkChecker: NetworkChecker
|
|
|
|
|
+) : CommonRepository<List<BookModel>>(networkChecker),
|
|
|
|
|
+ BookRepository {
|
|
|
|
|
|
|
|
- override fun loadBooks(): Single<List<Pair<Book, BookHeader>>> =
|
|
|
|
|
- if (networkChecker.isNetworkAvailable()) {
|
|
|
|
|
- getFromNetwork()
|
|
|
|
|
- .doOnSuccess { saveToCache(it).blockingAwait() }
|
|
|
|
|
- .doOnError {
|
|
|
|
|
- logError("Cannot load books from network", it)
|
|
|
|
|
- logWarn("Getting cached books")
|
|
|
|
|
- }
|
|
|
|
|
- .onErrorResumeNext(findInCache())
|
|
|
|
|
- } else {
|
|
|
|
|
- findInCache()
|
|
|
|
|
- }.map { (planned, finished) ->
|
|
|
|
|
- mutableListOf<Pair<Book, BookHeader>>().apply {
|
|
|
|
|
- addAll(plannedBookOrganizer.organize(planned))
|
|
|
|
|
- addAll(finishedBookPrepare.organize(finished))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ override fun loadBooks() = observe()
|
|
|
|
|
|
|
|
override fun saveBook(bookId: String?, book: FinishedBookToSend, done: Boolean?): Completable =
|
|
override fun saveBook(bookId: String?, book: FinishedBookToSend, done: Boolean?): Completable =
|
|
|
when {
|
|
when {
|
|
@@ -69,24 +61,22 @@ class BookRepositoryImpl(
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private fun getFromNetwork(): Single<Pair<List<PlannedBook>, List<FinishedBook>>> =
|
|
|
|
|
|
|
+ override fun loadFromNetwork(): Single<List<BookModel>> =
|
|
|
Singles.zip(
|
|
Singles.zip(
|
|
|
api.getPlannedBooks(auth.getAccessToken()),
|
|
api.getPlannedBooks(auth.getAccessToken()),
|
|
|
api.getFinishedBooks(auth.getAccessToken())
|
|
api.getFinishedBooks(auth.getAccessToken())
|
|
|
)
|
|
)
|
|
|
|
|
+ .map { (planned, finished) ->
|
|
|
|
|
+ mutableListOf<BookModel>().apply {
|
|
|
|
|
+ addAll(plannedBookOrganizer.organize(planned))
|
|
|
|
|
+ addAll(finishedBookPrepare.organize(finished))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- private fun findInCache(): Single<Pair<List<PlannedBook>, List<FinishedBook>>> =
|
|
|
|
|
- Singles.zip(
|
|
|
|
|
- cache.getPlannedBooks().toSingle(),
|
|
|
|
|
- cache.getFinishedBooks().toSingle()
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ override fun findCached(): Maybe<List<BookModel>> =
|
|
|
|
|
+ cache.getFromJson(CacheKey.BOOKS, genericType<List<BookModel>>())
|
|
|
|
|
|
|
|
- private fun saveToCache(books: Pair<List<PlannedBook>, List<FinishedBook>>): Completable =
|
|
|
|
|
- books.let { (planned, finished) ->
|
|
|
|
|
- Completable.concatArray(
|
|
|
|
|
- cache.savePlannedBooks(planned),
|
|
|
|
|
- cache.saveFinishedBooks(finished)
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ override fun saveToCache(data: List<BookModel>): Completable =
|
|
|
|
|
+ cache.saveToJson(CacheKey.BOOKS, data)
|
|
|
|
|
|
|
|
}
|
|
}
|