Add retrofit

Integrate login endpoint
This commit is contained in:
Nymos 2025-02-19 11:38:13 +03:00
parent b319718ac6
commit 507e076eca
9 changed files with 49 additions and 37 deletions

View File

@ -1,6 +1,6 @@
package com.nto.data.models
data class LoginData(
data class LoginResult(
val successful: Boolean,
val message: String?
)

View File

@ -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
}

View File

@ -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())
}
}

View File

@ -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<LoginData>
@GET("auth")
fun auth(@Header("Authorization") token: String): Call<ResponseBody>
}

View File

@ -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
}

View File

@ -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}")
}
}
}

View File

@ -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)
}
}

View File

@ -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<LoginScreenState>
@ -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())
}
}
}
}
}

View File

@ -5,7 +5,7 @@
<string name="text_password">Пароль</string>
<string name="greeting_login_description">Войдите в свой аккаунт чтобы продолжить</string>
<string name="greeting_login">Вход</string>
<string name="placholder_login" translatable="false">pivanov</string>
<string name="placholder_login" translatable="false">\@pivanov</string>
<string name="placeholder_password" translatable="false">**********</string>
<string name="title_profile">Профиль</string>
<string name="label_qr_login">Вход по коду</string>