Add retrofit
Integrate login endpoint
This commit is contained in:
parent
b319718ac6
commit
507e076eca
@ -1,6 +1,6 @@
|
||||
package com.nto.data.models
|
||||
|
||||
data class LoginData(
|
||||
data class LoginResult(
|
||||
val successful: Boolean,
|
||||
val message: String?
|
||||
)
|
@ -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
|
||||
}
|
@ -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())
|
||||
}
|
||||
|
||||
}
|
@ -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>
|
||||
}
|
@ -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
|
||||
}
|
@ -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}")
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user