|
@@ -5,9 +5,8 @@ import io.reactivex.Single
|
|
|
import io.reactivex.rxkotlin.Singles
|
|
import io.reactivex.rxkotlin.Singles
|
|
|
import me.vadik.knigopis.api.Endpoint
|
|
import me.vadik.knigopis.api.Endpoint
|
|
|
import me.vadik.knigopis.auth.KAuth
|
|
import me.vadik.knigopis.auth.KAuth
|
|
|
-import me.vadik.knigopis.common.ResourceProvider
|
|
|
|
|
|
|
+import me.vadik.knigopis.data.BookOrganizer
|
|
|
import me.vadik.knigopis.model.*
|
|
import me.vadik.knigopis.model.*
|
|
|
-import java.util.*
|
|
|
|
|
|
|
|
|
|
interface BookRepository {
|
|
interface BookRepository {
|
|
|
|
|
|
|
@@ -22,28 +21,18 @@ interface BookRepository {
|
|
|
class BookRepositoryImpl(
|
|
class BookRepositoryImpl(
|
|
|
private val api: Endpoint,
|
|
private val api: Endpoint,
|
|
|
private val auth: KAuth,
|
|
private val auth: KAuth,
|
|
|
- private val resources: ResourceProvider,
|
|
|
|
|
- private val config: Configuration
|
|
|
|
|
|
|
+ private val plannedBookOrganizer: BookOrganizer<PlannedBook>,
|
|
|
|
|
+ private val finishedBookPrepare: BookOrganizer<FinishedBook>
|
|
|
) : BookRepository {
|
|
) : BookRepository {
|
|
|
|
|
|
|
|
override fun loadBooks(): Single<List<Pair<Book, BookHeader>>> =
|
|
override fun loadBooks(): Single<List<Pair<Book, BookHeader>>> =
|
|
|
Singles.zip(
|
|
Singles.zip(
|
|
|
- api.getPlannedBooks(auth.getAccessToken())
|
|
|
|
|
- .map {
|
|
|
|
|
- if (config.sortingMode == 0) {
|
|
|
|
|
- it.sortedByDescending(PlannedBook::priority)
|
|
|
|
|
- } else {
|
|
|
|
|
- it.sortedByDescending(PlannedBook::updatedAt)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- .map { groupPlannedBooks(it) },
|
|
|
|
|
|
|
+ api.getPlannedBooks(auth.getAccessToken()),
|
|
|
api.getFinishedBooks(auth.getAccessToken())
|
|
api.getFinishedBooks(auth.getAccessToken())
|
|
|
- .map { it.sortedByDescending(FinishedBook::order) }
|
|
|
|
|
- .map { groupFinishedBooks(it) }
|
|
|
|
|
).map { (planned, finished) ->
|
|
).map { (planned, finished) ->
|
|
|
mutableListOf<Pair<Book, BookHeader>>().apply {
|
|
mutableListOf<Pair<Book, BookHeader>>().apply {
|
|
|
- addAll(planned)
|
|
|
|
|
- addAll(finished)
|
|
|
|
|
|
|
+ addAll(plannedBookOrganizer.organize(planned))
|
|
|
|
|
+ addAll(finishedBookPrepare.organize(finished))
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -69,44 +58,4 @@ class BookRepositoryImpl(
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private fun groupPlannedBooks(books: List<PlannedBook>): List<Pair<Book, BookHeader>> {
|
|
|
|
|
- val result = mutableListOf<Pair<Book, BookHeader>>()
|
|
|
|
|
- val doingBooks = books.filterNot { it.priority == 0 }
|
|
|
|
|
- if (doingBooks.isNotEmpty()) {
|
|
|
|
|
- val todoHeaderTitle = resources.getString(R.string.books_header_doing)
|
|
|
|
|
- val doingHeader = BookHeader(todoHeaderTitle, doingBooks.size)
|
|
|
|
|
- result.add(doingHeader to doingHeader)
|
|
|
|
|
- result.addAll(doingBooks.map { it to doingHeader })
|
|
|
|
|
- }
|
|
|
|
|
- val todoBooks = books.filter { it.priority == 0 }
|
|
|
|
|
- if (todoBooks.isNotEmpty()) {
|
|
|
|
|
- val todoHeaderTitle = resources.getString(R.string.books_header_todo)
|
|
|
|
|
- val todoHeader = BookHeader(todoHeaderTitle, todoBooks.size)
|
|
|
|
|
- result.add(todoHeader to todoHeader)
|
|
|
|
|
- result.addAll(todoBooks.map { it to todoHeader })
|
|
|
|
|
- }
|
|
|
|
|
- return result
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private fun groupFinishedBooks(books: List<FinishedBook>): List<Pair<Book, BookHeader>> {
|
|
|
|
|
- var first = true
|
|
|
|
|
- return books.groupBy { it.readYear }
|
|
|
|
|
- .toSortedMap(Comparator { year1, year2 ->
|
|
|
|
|
- year2.compareTo(year1)
|
|
|
|
|
- })
|
|
|
|
|
- .flatMap { (year, books) ->
|
|
|
|
|
- val headerTitle = when {
|
|
|
|
|
- year.isEmpty() -> resources.getString(R.string.books_header_done_other)
|
|
|
|
|
- first -> {
|
|
|
|
|
- first = false
|
|
|
|
|
- resources.getString(R.string.books_header_done_first, year)
|
|
|
|
|
- }
|
|
|
|
|
- else -> resources.getString(R.string.books_header_done, year)
|
|
|
|
|
- }
|
|
|
|
|
- val header = BookHeader(headerTitle, books.size)
|
|
|
|
|
- val items = books.map { it to header }
|
|
|
|
|
- listOf(header to header, *items.toTypedArray())
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
}
|
|
}
|