Sfoglia il codice sorgente

Added interactor for profile feature

Vadik Sirekanyan 7 anni fa
parent
commit
b0785181ca

+ 6 - 12
app/src/main/java/com/sirekanyan/knigopis/dependency/profile.kt

@@ -2,17 +2,11 @@ package com.sirekanyan.knigopis.dependency
 
 import com.sirekanyan.knigopis.common.extensions.app
 import com.sirekanyan.knigopis.common.extensions.getRootView
-import com.sirekanyan.knigopis.feature.profile.ProfileActivity
-import com.sirekanyan.knigopis.feature.profile.ProfilePresenter
-import com.sirekanyan.knigopis.feature.profile.ProfilePresenterImpl
-import com.sirekanyan.knigopis.feature.profile.ProfileViewImpl
+import com.sirekanyan.knigopis.feature.profile.*
 
-fun ProfileActivity.providePresenter(): ProfilePresenter =
-    ProfilePresenterImpl(
-        this,
-        app.endpoint,
-        app.bookRepository,
-        app.authRepository
-    ).also { presenter ->
+fun ProfileActivity.providePresenter(): ProfilePresenter {
+    val interactor = ProfileInteractorImpl(app.endpoint, app.bookRepository, app.authRepository)
+    return ProfilePresenterImpl(this, interactor).also { presenter ->
         presenter.view = ProfileViewImpl(getRootView(), presenter)
-    }
+    }
+}

+ 59 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfileInteractor.kt

@@ -0,0 +1,59 @@
+package com.sirekanyan.knigopis.feature.profile
+
+import com.sirekanyan.knigopis.common.extensions.io2main
+import com.sirekanyan.knigopis.model.BookDataModel
+import com.sirekanyan.knigopis.model.dto.Profile
+import com.sirekanyan.knigopis.model.dto.User
+import com.sirekanyan.knigopis.repository.AuthRepository
+import com.sirekanyan.knigopis.repository.BookRepository
+import com.sirekanyan.knigopis.repository.Endpoint
+import io.reactivex.Completable
+import io.reactivex.Observable
+import io.reactivex.Single
+import io.reactivex.rxkotlin.Observables
+import java.util.concurrent.TimeUnit
+
+interface ProfileInteractor {
+
+    fun getProfile(): Single<User>
+    fun getBooks(): Observable<BookDataModel>
+    fun updateProfile(user: User, nickname: String): Completable
+    fun logout()
+
+}
+
+class ProfileInteractorImpl(
+    private val api: Endpoint,
+    private val bookRepository: BookRepository,
+    private val authRepository: AuthRepository
+) : ProfileInteractor {
+
+    private val accessToken get() = authRepository.getAccessToken()
+
+    override fun getProfile(): Single<User> =
+        api.getProfile(accessToken)
+            .io2main()
+
+    override fun getBooks(): Observable<BookDataModel> =
+        bookRepository.findCached()
+            .toSingle(listOf())
+            .map { it.filterIsInstance<BookDataModel>() }
+            .map { it.shuffled() }
+            .flatMapObservable {
+                Observables.zip(
+                    Observable.fromIterable(it),
+                    Observable.interval(5, TimeUnit.MILLISECONDS)
+                )
+            }
+            .map { (book) -> book }
+            .io2main()
+
+    override fun updateProfile(user: User, nickname: String): Completable =
+        api.updateProfile(user.id, accessToken, Profile(nickname, user.fixedProfile))
+            .io2main()
+
+    override fun logout() {
+        authRepository.clear()
+    }
+
+}

+ 8 - 33
app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfilePresenter.kt

@@ -3,19 +3,11 @@ package com.sirekanyan.knigopis.feature.profile
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.BasePresenter
 import com.sirekanyan.knigopis.common.Presenter
-import com.sirekanyan.knigopis.common.extensions.io2main
 import com.sirekanyan.knigopis.common.extensions.toast
 import com.sirekanyan.knigopis.common.functions.logError
 import com.sirekanyan.knigopis.model.BookDataModel
-import com.sirekanyan.knigopis.model.dto.Profile
 import com.sirekanyan.knigopis.model.dto.User
-import com.sirekanyan.knigopis.repository.AuthRepository
-import com.sirekanyan.knigopis.repository.BookRepository
-import com.sirekanyan.knigopis.repository.Endpoint
-import io.reactivex.Observable
-import io.reactivex.rxkotlin.Observables
 import java.util.*
-import java.util.concurrent.TimeUnit
 
 interface ProfilePresenter : Presenter {
 
@@ -32,9 +24,7 @@ interface ProfilePresenter : Presenter {
 
 class ProfilePresenterImpl(
     private val router: ProfilePresenter.Router,
-    private val api: Endpoint,
-    private val bookRepository: BookRepository,
-    private val authRepository: AuthRepository
+    private val interactor: ProfileInteractor
 ) : BasePresenter<ProfileView>(),
     ProfilePresenter,
     ProfileView.Callbacks {
@@ -87,13 +77,12 @@ class ProfilePresenterImpl(
     }
 
     override fun onLogoutOptionClicked() {
-        authRepository.clear()
+        interactor.logout()
         router.exit()
     }
 
     private fun refreshProfile() {
-        api.getProfile(authRepository.getAccessToken())
-            .io2main()
+        interactor.getProfile()
             .bind({ user ->
                 this.user = user
                 view.setNickname(user.nickname.orEmpty())
@@ -105,26 +94,16 @@ class ProfilePresenterImpl(
     }
 
     private fun refreshCounters() {
-        bookRepository.findCached()
-            .toSingle(listOf())
-            .map { it.filterIsInstance<BookDataModel>() }
-            .map { it.shuffled() }
-            .flatMapObservable {
-                Observables.zip(
-                    Observable.fromIterable(it),
-                    Observable.interval(5, TimeUnit.MILLISECONDS)
-                )
-            }
-            .io2main()
+        interactor.getBooks()
             .doOnSubscribe {
                 doneList.clear()
                 doingList.clear()
                 todoList.clear()
             }
-            .bind({ (book) ->
+            .bind({ book ->
                 addBookToList(book)
             }, {
-                logError("cannot get cached books", it)
+                logError("cannot get profile books", it)
             })
     }
 
@@ -146,12 +125,8 @@ class ProfilePresenterImpl(
     }
 
     private fun updateNickname(nickname: String) {
-        val id = user?.id ?: return
-        api.updateProfile(
-            id,
-            authRepository.getAccessToken(),
-            Profile(nickname, user?.fixedProfile.orEmpty())
-        ).io2main()
+        val user = user ?: return
+        interactor.updateProfile(user, nickname)
             .bind({
                 view.setNickname(nickname)
                 view.quitEditMode()