Я разрабатываю экран входа в свое приложение для Android с чистой архитектурой.
При успешном использовании логина мне необходимо сохранить токен в общих настройках.
И на заставке мне нужно проверить, вошел ли пользователь в систему или нет
Поэтому мой вопрос в том, где идеальное место:
я должен сохранить токен в LoginUseCase (слой домена)
class LoginUseCase(private val userRepository: UserRepository, private val schedulerProvider: SchedulerProvider) {
fun execute(username: String, password: String): Single<Token> {
return userRepository.login(username, password)
.andThen(userRepository.saveToken(.....)
.subscribeOn(schedulerProvider.getIOScheduler())
.observeOn(schedulerProvider.getUIScheduler())
}
}
Или я должен сделать токен сохранения как UseCase и сохранить токен в слое презентатора
class LoginPresenter(private val view: LoginContract.View,
private val setLoginStateUseCase: SetLoginStateUseCase,
private val loginUseCase: LoginUseCase,
private val schedulerProvider: SchedulerProvider): LoginContract.Presenter {
private val compositeDisposable = CompositeDisposable()
override fun performLogin(username: String, password: String) {
if (username.isNullOrEmpty() || password.isNullOrEmpty()) {
view.onShowLoginError("Field should not be empty")
} else {
view.showLoading()
val disposable = loginUseCase.execute(username, password)
.subscribeOn(schedulerProvider.getIOScheduler())
.observeOn(schedulerProvider.getUIScheduler())
.andThen(setLoginStateUseCase.execute())
.subscribe({
view.hideLoading()
view.onLoginSuccess()
}, {error ->
view.hideLoading()
view.onShowLoginError(error.localizedMessage)
})
compositeDisposable.add(disposable)
}
}
Тот же вопрос с проверкой пользователя залогинен или нет. Должен ли я сделать это действие вариантом использования?
На мой взгляд, имеет смысл выполнять эту операцию в случае использования доменного уровня. Представьте, что у вас есть другой модуль в том же проекте для телевизионного приложения. Вполне вероятно, что LoginPresenter
может отличаться от модуля мобильного приложения, однако вы можете использовать тот же самый вариант использования. Таким образом, вам не нужно знать о каждом LoginPresenter
вы реализуете, чтобы сохранить токен после выполнения LoginPresenter
использования.
С другой стороны, я бы посоветовал взглянуть на то, как люди Google сталкиваются с процессом входа в систему, используя шаблон делегата в своем приложении ввода-вывода Google. Это очень распространенный currentUser
использования currentUser
наблюдаемого в вашем приложении, что дает вам множество преимуществ. Например, хотя я бы не назвал его эталонным проектом с чистой чистой архитектурой, ребята из kickstarter разработали интересную архитектуру MVVM+RxJava
с использованием парадигмы currentUser, о которой я говорил, на которую тоже стоит взглянуть.