From 507e076ecad3dcfe20731625c590b0fdb07f3dda Mon Sep 17 00:00:00 2001 From: Nymos Date: Wed, 19 Feb 2025 11:38:13 +0300 Subject: [PATCH] Add retrofit Integrate login endpoint --- .../models/{LoginData.kt => LoginResult.kt} | 2 +- .../com/nto/data/repository/DataRepository.kt | 4 +-- .../nto/data/repository/DataRepositoryImpl.kt | 18 ++++++------- .../java/com/nto/data/utils/RetrofitApi.kt | 8 +++--- .../nto/domain/repository/DomainRepository.kt | 4 +-- .../domain/repository/DomainRepositoryImpl.kt | 14 +++++------ .../com/nto/domain/usecase/LoginUseCase.kt | 9 +++---- .../screens/loginScreen/LoginViewModel.kt | 25 ++++++++++++++++--- presentation/src/main/res/values/strings.xml | 2 +- 9 files changed, 49 insertions(+), 37 deletions(-) rename data/src/main/java/com/nto/data/models/{LoginData.kt => LoginResult.kt} (77%) diff --git a/data/src/main/java/com/nto/data/models/LoginData.kt b/data/src/main/java/com/nto/data/models/LoginResult.kt similarity index 77% rename from data/src/main/java/com/nto/data/models/LoginData.kt rename to data/src/main/java/com/nto/data/models/LoginResult.kt index c0b4225..2e9b5e9 100644 --- a/data/src/main/java/com/nto/data/models/LoginData.kt +++ b/data/src/main/java/com/nto/data/models/LoginResult.kt @@ -1,6 +1,6 @@ package com.nto.data.models -data class LoginData( +data class LoginResult( val successful: Boolean, val message: String? ) \ No newline at end of file diff --git a/data/src/main/java/com/nto/data/repository/DataRepository.kt b/data/src/main/java/com/nto/data/repository/DataRepository.kt index 20bfea6..b6cfa73 100644 --- a/data/src/main/java/com/nto/data/repository/DataRepository.kt +++ b/data/src/main/java/com/nto/data/repository/DataRepository.kt @@ -1,7 +1,7 @@ package com.nto.data.repository -import com.nto.data.models.LoginData +import com.nto.data.models.LoginResult interface DataRepository { - suspend fun login(email: String, password: String): LoginData + suspend fun auth(login: String, password: String): LoginResult } \ No newline at end of file diff --git a/data/src/main/java/com/nto/data/repository/DataRepositoryImpl.kt b/data/src/main/java/com/nto/data/repository/DataRepositoryImpl.kt index 1cfa144..f324921 100644 --- a/data/src/main/java/com/nto/data/repository/DataRepositoryImpl.kt +++ b/data/src/main/java/com/nto/data/repository/DataRepositoryImpl.kt @@ -1,21 +1,17 @@ package com.nto.data.repository -import com.nto.data.models.LoginData +import com.nto.data.models.LoginResult import com.nto.data.utils.Provider +import okhttp3.Credentials import javax.inject.Inject class DataRepositoryImpl @Inject constructor() : DataRepository { - override suspend fun login(email: String, password: String): LoginData { - val result = Provider.provideRetrofit().login( - email, password + override suspend fun auth(login: String, password: String): LoginResult { + val result = Provider.provideRetrofit().auth( + Credentials.basic(login, password) ).execute() - if (result.isSuccessful) { - val body = result.body() - if (body != null) { - return body - } - } - return LoginData(false, result.message()) + + return LoginResult(result.isSuccessful, result.message()) } } \ No newline at end of file diff --git a/data/src/main/java/com/nto/data/utils/RetrofitApi.kt b/data/src/main/java/com/nto/data/utils/RetrofitApi.kt index 025adfb..ab6fec8 100644 --- a/data/src/main/java/com/nto/data/utils/RetrofitApi.kt +++ b/data/src/main/java/com/nto/data/utils/RetrofitApi.kt @@ -1,11 +1,11 @@ package com.nto.data.utils -import com.nto.data.models.LoginData +import okhttp3.ResponseBody import retrofit2.Call import retrofit2.http.GET -import retrofit2.http.Query +import retrofit2.http.Header interface RetrofitApi { - @GET("login") - fun login(@Query("email") email: String, @Query("password") password: String): Call + @GET("auth") + fun auth(@Header("Authorization") token: String): Call } \ No newline at end of file diff --git a/domain/src/main/java/com/nto/domain/repository/DomainRepository.kt b/domain/src/main/java/com/nto/domain/repository/DomainRepository.kt index 220e078..ce85d79 100644 --- a/domain/src/main/java/com/nto/domain/repository/DomainRepository.kt +++ b/domain/src/main/java/com/nto/domain/repository/DomainRepository.kt @@ -1,7 +1,7 @@ package com.nto.domain.repository -import com.nto.data.models.LoginData +import com.nto.data.models.LoginResult interface DomainRepository { - suspend fun login(email: String, password: String): LoginData + suspend fun auth(email: String, password: String): LoginResult } \ No newline at end of file diff --git a/domain/src/main/java/com/nto/domain/repository/DomainRepositoryImpl.kt b/domain/src/main/java/com/nto/domain/repository/DomainRepositoryImpl.kt index 90c3884..62bfef4 100644 --- a/domain/src/main/java/com/nto/domain/repository/DomainRepositoryImpl.kt +++ b/domain/src/main/java/com/nto/domain/repository/DomainRepositoryImpl.kt @@ -1,22 +1,20 @@ package com.nto.domain.repository -import com.nto.data.models.LoginData +import com.nto.data.models.LoginResult import com.nto.data.repository.DataRepositoryImpl import java.io.IOException -import java.security.MessageDigest import javax.inject.Inject class DomainRepositoryImpl @Inject constructor(private val dataRepositoryImpl: DataRepositoryImpl) : DomainRepository { - override suspend fun login(email: String, password: String): LoginData { + override suspend fun auth(email: String, password: String): LoginResult { return try { - dataRepositoryImpl.login( - email = email, - password = MessageDigest.getInstance("SHA-256").digest(password.toByteArray()) - .toString() + dataRepositoryImpl.auth( + login = email, + password = password ) } catch (e: IOException) { - LoginData(false, "IO exception was thrown: ${e.message}") + LoginResult(false, "IO exception was thrown: ${e.message}") } } } \ No newline at end of file diff --git a/domain/src/main/java/com/nto/domain/usecase/LoginUseCase.kt b/domain/src/main/java/com/nto/domain/usecase/LoginUseCase.kt index 1601108..41aa8de 100644 --- a/domain/src/main/java/com/nto/domain/usecase/LoginUseCase.kt +++ b/domain/src/main/java/com/nto/domain/usecase/LoginUseCase.kt @@ -1,16 +1,15 @@ package com.nto.domain.usecase -import com.nto.data.models.LoginData +import com.nto.data.models.LoginResult import com.nto.domain.repository.DomainRepositoryImpl import javax.inject.Inject class LoginUseCase @Inject constructor(private val domainRepositoryImpl: DomainRepositoryImpl) { fun checkCredentials(email: String, password: String): Boolean { - val emailRegex = Regex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}\$") - return password.isNotBlank() && emailRegex.matches(email) + return password.isNotBlank() && email.isNotBlank() } - suspend fun login(email: String, password: String): LoginData { - return domainRepositoryImpl.login(email, password) + suspend fun auth(email: String, password: String): LoginResult { + return domainRepositoryImpl.auth(email, password) } } \ No newline at end of file diff --git a/presentation/src/main/java/com/nto/presentation/screens/loginScreen/LoginViewModel.kt b/presentation/src/main/java/com/nto/presentation/screens/loginScreen/LoginViewModel.kt index 275adf8..86c2d36 100644 --- a/presentation/src/main/java/com/nto/presentation/screens/loginScreen/LoginViewModel.kt +++ b/presentation/src/main/java/com/nto/presentation/screens/loginScreen/LoginViewModel.kt @@ -1,18 +1,24 @@ package com.nto.presentation.screens.loginScreen +import android.content.Context +import android.widget.Toast import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavHostController +import com.nto.data.utils.Destinations +import com.nto.domain.usecase.LoginUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.invoke import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class LoginViewModel @Inject constructor(): ViewModel(){ +class LoginViewModel @Inject constructor(private val useCase: LoginUseCase, @ApplicationContext private val context: Context) : ViewModel() { private val _state = MutableStateFlow(LoginScreenState()) val state: StateFlow @@ -29,12 +35,25 @@ class LoginViewModel @Inject constructor(): ViewModel(){ } private fun checkInput() { - //TODO: domain level + val state = _state.value + val result = useCase.checkCredentials(state.email, state.password) + _state.tryEmit(_state.value.copy(disabled = !result)) } fun login(navController: NavHostController) { viewModelScope.launch(Dispatchers.IO) { - //TODO: domain level + val state = _state.value + val result = useCase.auth(state.email, state.password) + if (result.message != null) { + Dispatchers.Main { + Toast.makeText(context, result.message, Toast.LENGTH_LONG).show() + } + } + if (result.successful) { + Dispatchers.Main { + navController.navigate(Destinations.Profile.toString()) + } + } } } } \ No newline at end of file diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index c52bec1..54b8a3b 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -5,7 +5,7 @@ Пароль Войдите в свой аккаунт чтобы продолжить Вход - pivanov + \@pivanov ********** Профиль Вход по коду