Browse Source

Added separate token storage implementation

Vadik Sirekanyan 7 years ago
parent
commit
bff2c831aa

+ 1 - 0
app/src/main/java/com/sirekanyan/knigopis/App.kt

@@ -6,6 +6,7 @@ import com.sirekanyan.knigopis.dependency.*
 class App : Application() {
     val config by lazy(::provideConfig)
     val resourceProvider by lazy(::provideResources)
+    val tokenStorage by lazy(::provideTokenStorage)
     val authRepository by lazy(::provideAuthRepository)
     val bookRepository by lazy(::provideBookRepository)
     val userRepository by lazy(::provideUserRepository)

+ 4 - 1
app/src/main/java/com/sirekanyan/knigopis/dependency/app.kt

@@ -29,8 +29,11 @@ fun App.provideConfig(): Configuration =
 fun App.provideResources(): ResourceProvider =
     ResourceProviderImpl(this)
 
+fun App.provideTokenStorage(): TokenStorage =
+    TokenStorageImpl(this)
+
 fun App.provideAuthRepository(): AuthRepository =
-    AuthRepositoryImpl(this, endpoint)
+    AuthRepositoryImpl(endpoint, tokenStorage)
 
 fun App.provideBookRepository(): BookRepository {
     val planned = PlannedBookOrganizerImpl(resourceProvider, config)

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

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

+ 1 - 1
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -60,7 +60,7 @@ class MainPresenterImpl(
     }
 
     override fun resume() {
-        auth.loadAccessToken().bind({
+        auth.authorize().bind({
             refreshButtons()
             if (userLoggedIn) {
                 userLoggedIn = false

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

@@ -4,9 +4,9 @@ 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 com.sirekanyan.knigopis.repository.TokenStorage
 import io.reactivex.Completable
 import io.reactivex.Observable
 import io.reactivex.Single
@@ -25,7 +25,7 @@ interface ProfileInteractor {
 class ProfileInteractorImpl(
     private val api: Endpoint,
     private val bookRepository: BookRepository,
-    private val authRepository: AuthRepository
+    private val tokenStorage: TokenStorage
 ) : ProfileInteractor {
 
     override fun getProfile(): Single<User> =
@@ -51,7 +51,7 @@ class ProfileInteractorImpl(
             .io2main()
 
     override fun logout() {
-        authRepository.clear()
+        tokenStorage.clearTokens()
     }
 
 }

+ 8 - 32
app/src/main/java/com/sirekanyan/knigopis/repository/AuthRepository.kt

@@ -1,53 +1,33 @@
 package com.sirekanyan.knigopis.repository
 
-import android.content.Context
 import com.sirekanyan.knigopis.common.extensions.io2main
 import io.reactivex.Completable
 
-private const val PREFS_NAME = "knigopis"
-private const val TOKEN_KEY = "token"
-private const val ACCESS_TOKEN_KEY = "access_token"
-private const val USER_PROFILE = "user_profile"
-
 interface AuthRepository {
     fun isAuthorized(): Boolean
-    fun loadAccessToken(): Completable
-    fun getAccessToken(): String
-    fun getUserProfile(): String?
     fun saveToken(token: String)
-    fun clear()
+    fun authorize(): Completable
 }
 
 class AuthRepositoryImpl(
-    context: Context,
-    private val api: Endpoint
+    private val api: Endpoint,
+    private val storage: TokenStorage
 ) : AuthRepository {
 
-    private val preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
-
     override fun isAuthorized(): Boolean =
-        preferences.contains(ACCESS_TOKEN_KEY)
-
-    override fun getAccessToken(): String =
-        preferences.getString(ACCESS_TOKEN_KEY, "")
-
-    override fun getUserProfile(): String? =
-        preferences.getString(USER_PROFILE, null)
+        storage.accessToken != null
 
     override fun saveToken(token: String) {
-        preferences.edit().putString(TOKEN_KEY, token).apply()
+        storage.token = token
     }
 
-    override fun loadAccessToken(): Completable {
-        val token = preferences.getString(TOKEN_KEY, null)
+    override fun authorize(): Completable {
+        val token = storage.token
         return if (token != null && !isAuthorized()) {
             api.getCredentials(token)
                 .io2main()
                 .doOnSuccess {
-                    preferences.edit()
-                        .putString(ACCESS_TOKEN_KEY, it.accessToken)
-                        .putString(USER_PROFILE, it.user.fixedProfile)
-                        .apply()
+                    storage.accessToken = it.accessToken
                 }
                 .toCompletable()
         } else {
@@ -55,8 +35,4 @@ class AuthRepositoryImpl(
         }
     }
 
-    override fun clear() {
-        preferences.edit().remove(TOKEN_KEY).remove(ACCESS_TOKEN_KEY).apply()
-    }
-
 }

+ 31 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/TokenStorage.kt

@@ -0,0 +1,31 @@
+package com.sirekanyan.knigopis.repository
+
+import android.content.Context
+
+private const val PREFS_NAME = "knigopis"
+private const val TOKEN_KEY = "token"
+private const val ACCESS_TOKEN_KEY = "access_token"
+
+interface TokenStorage {
+    var token: String?
+    var accessToken: String?
+    fun clearTokens()
+}
+
+class TokenStorageImpl(context: Context) : TokenStorage {
+
+    private val preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
+
+    override var token: String?
+        get() = preferences.getString(TOKEN_KEY, null)
+        set(value) = preferences.edit().putString(TOKEN_KEY, value).apply()
+
+    override var accessToken: String?
+        get() = preferences.getString(ACCESS_TOKEN_KEY, null)
+        set(value) = preferences.edit().putString(ACCESS_TOKEN_KEY, value).apply()
+
+    override fun clearTokens() {
+        preferences.edit().remove(TOKEN_KEY).remove(ACCESS_TOKEN_KEY).apply()
+    }
+
+}