瀏覽代碼

Added model mapping and fixed book organizers

Vadik Sirekanyan 7 年之前
父節點
當前提交
2c93cd515b

+ 8 - 7
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserInteractor.kt

@@ -1,10 +1,11 @@
 package com.sirekanyan.knigopis.feature.user
 
 import com.sirekanyan.knigopis.common.io2main
+import com.sirekanyan.knigopis.model.BookHeaderModel
+import com.sirekanyan.knigopis.model.BookModel
+import com.sirekanyan.knigopis.model.toBookModel
 import com.sirekanyan.knigopis.repository.KAuth
 import com.sirekanyan.knigopis.repository.api.Endpoint
-import com.sirekanyan.knigopis.repository.model.Book
-import com.sirekanyan.knigopis.repository.model.BookHeader
 import io.reactivex.Completable
 import io.reactivex.Single
 
@@ -16,7 +17,7 @@ interface UserInteractor {
 
     fun isSubscribed(userId: String): Single<Boolean>
 
-    fun getBooks(userId: String): Single<List<Pair<Book, BookHeader>>>
+    fun getBooks(userId: String): Single<List<BookModel>>
 
 }
 
@@ -40,7 +41,7 @@ class UserInteractorImpl(
             .map { subscriptions -> subscriptions.any { it.subUser.id == userId } }
             .io2main()
 
-    override fun getBooks(userId: String): Single<List<Pair<Book, BookHeader>>> =
+    override fun getBooks(userId: String): Single<List<BookModel>> =
         api.getUserBooks(userId)
             .map { books ->
                 books.groupBy { it.readYear }
@@ -48,9 +49,9 @@ class UserInteractorImpl(
                         year2.compareTo(year1)
                     })
                     .flatMap { (year, books) ->
-                        val header = BookHeader(year, books.size)
-                        val items = books.map { it to header }
-                        listOf(header to header, *items.toTypedArray())
+                        val header = BookHeaderModel(year, books.size)
+                        val items = books.map { it.toBookModel(header.group) }
+                        listOf(header, *items.toTypedArray())
                     }
             }
             .io2main()

+ 62 - 0
app/src/main/java/com/sirekanyan/knigopis/model/mappers.kt

@@ -0,0 +1,62 @@
+package com.sirekanyan.knigopis.model
+
+import android.text.SpannableString
+import android.text.format.DateUtils
+import android.text.style.SuperscriptSpan
+import com.sirekanyan.knigopis.repository.api.createBookImageUrl
+import com.sirekanyan.knigopis.repository.model.FinishedBook
+import com.sirekanyan.knigopis.repository.model.PlannedBook
+import com.sirekanyan.knigopis.repository.model.note.Note
+import com.sirekanyan.knigopis.repository.model.subscription.Subscription
+
+fun PlannedBook.toBookModel(group: BookGroupModel) =
+    BookDataModel(
+        id,
+        group,
+        title,
+        author,
+        false,
+        priority,
+        null,
+        notes
+    )
+
+fun FinishedBook.toBookModel(group: BookGroupModel) =
+    BookDataModel(
+        id,
+        group,
+        title,
+        author,
+        true,
+        100,
+        DateModel(readYear, readMonth, readDay),
+        notes
+    )
+
+fun Subscription.toUserModel() =
+    UserModel(
+        subUser.id,
+        subUser.name,
+        subUser.avatar,
+        subUser.booksCount.takeIf { it > 0 }?.toString(),
+        newBooksCount.takeIf { it > 0 }?.let { count ->
+            val str = "+$count"
+            SpannableString(str).also {
+                it.setSpan(SuperscriptSpan(), 0, str.length, 0)
+            }
+        },
+        subUser.profiles
+    )
+
+fun Note.toNoteModel() =
+    NoteModel(
+        id,
+        title,
+        author,
+        createBookImageUrl(title),
+        notes,
+        DateUtils.getRelativeTimeSpanString(fixedCreatedAt.time).toString(),
+        user.id,
+        user.name,
+        user.avatarUrl
+    )

+ 18 - 17
app/src/main/java/com/sirekanyan/knigopis/repository/BookOrganizer.kt

@@ -2,18 +2,19 @@ package com.sirekanyan.knigopis.repository
 
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.ResourceProvider
-import com.sirekanyan.knigopis.repository.model.Book
-import com.sirekanyan.knigopis.repository.model.BookHeader
+import com.sirekanyan.knigopis.model.BookHeaderModel
+import com.sirekanyan.knigopis.model.BookModel
+import com.sirekanyan.knigopis.model.toBookModel
 import com.sirekanyan.knigopis.repository.model.FinishedBook
 import com.sirekanyan.knigopis.repository.model.PlannedBook
 
-interface BookOrganizer<T : Book> {
+interface BookOrganizer<T> {
 
     fun sort(books: List<T>): List<T>
 
-    fun group(books: List<T>): List<Pair<Book, BookHeader>>
+    fun group(books: List<T>): List<BookModel>
 
-    fun organize(books: List<T>): List<Pair<Book, BookHeader>> =
+    fun organize(books: List<T>): List<BookModel> =
         group(sort(books))
 
 }
@@ -30,21 +31,21 @@ class PlannedBookOrganizerImpl(
             books.sortedByDescending(PlannedBook::updatedAt)
         }
 
-    override fun group(books: List<PlannedBook>): List<Pair<Book, BookHeader>> {
-        val result = mutableListOf<Pair<Book, BookHeader>>()
+    override fun group(books: List<PlannedBook>): List<BookModel> {
+        val result = mutableListOf<BookModel>()
         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 header = BookHeaderModel(todoHeaderTitle, doingBooks.size)
+            result.add(header)
+            result.addAll(doingBooks.map { it.toBookModel(header.group) })
         }
         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 })
+            val header = BookHeaderModel(todoHeaderTitle, todoBooks.size)
+            result.add(header)
+            result.addAll(todoBooks.map { it.toBookModel(header.group) })
         }
         return result
     }
@@ -58,7 +59,7 @@ class FinishedBookPrepareImpl(
     override fun sort(books: List<FinishedBook>): List<FinishedBook> =
         books.sortedByDescending(FinishedBook::order)
 
-    override fun group(books: List<FinishedBook>): List<Pair<Book, BookHeader>> {
+    override fun group(books: List<FinishedBook>): List<BookModel> {
         var first = true
         return books.groupBy { it.readYear }
             .toSortedMap(Comparator { year1, year2 ->
@@ -73,9 +74,9 @@ class FinishedBookPrepareImpl(
                     }
                     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())
+                val header = BookHeaderModel(headerTitle, books.size)
+                val items = books.map { it.toBookModel(header.group) }
+                listOf(header, *items.toTypedArray())
             }
     }