From eae3035683972d56e0284912e93ee3bf5c35e150 Mon Sep 17 00:00:00 2001 From: shipovnikaaa Date: Wed, 19 Feb 2025 18:59:56 +0300 Subject: [PATCH] basic auth - mne ploho --- .../myitschool/work/data/remote/LoginApi.kt | 18 ++++++++--- .../work/ui/login/LoginViewModel.kt | 8 ++++- .../work/ui/main/MainDestination.kt | 2 +- .../myitschool/work/ui/main/MainFragment.kt | 31 ++++++++++--------- .../myitschool/work/ui/main/MainViewModel.kt | 10 ++++-- 5 files changed, 46 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/ru/myitschool/work/data/remote/LoginApi.kt b/app/src/main/java/ru/myitschool/work/data/remote/LoginApi.kt index 16edc8e..2a5284d 100644 --- a/app/src/main/java/ru/myitschool/work/data/remote/LoginApi.kt +++ b/app/src/main/java/ru/myitschool/work/data/remote/LoginApi.kt @@ -4,16 +4,24 @@ import okhttp3.ResponseBody import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET +import retrofit2.http.Header import retrofit2.http.PATCH import retrofit2.http.Path +import retrofit2.http.Query interface LoginApi { - @GET("{login}/auth") - suspend fun auth(@Path("login") login: String): Response + @GET("auth") + suspend fun auth( + @Header("Authorization") authHeader: String, + @Query("login") login: String + ): Response - @GET("{login}/info") - suspend fun info(@Path("login") login: String): PersonInfoDto + @GET("info") + suspend fun info( + @Header("Authorization") authHeader: String, + @Query("login") login: String + ): Response @PATCH("{login}/open") suspend fun open(@Path("login") login: String, @Body request: OpenWithCodeRequest): Response -} \ No newline at end of file +} diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt index 649efc8..09a19d6 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt @@ -5,6 +5,8 @@ import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.gson.GsonBuilder +import createAuthHeader +import createRetrofit import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow @@ -30,6 +32,9 @@ class LoginViewModel @Inject constructor( private val _savedUsername = MutableStateFlow(null) val savedUsername = _savedUsername.asStateFlow() + private val retrofit = createRetrofit("your_username", "your_password") + val loginApi = retrofit.create(LoginApi::class.java) + private val _stateP = MutableStateFlow(PasswordState()) val stateP = _stateP.asStateFlow() @@ -57,7 +62,8 @@ class LoginViewModel @Inject constructor( fun tryLogin(username: String, password : String, onSuccess: () -> Unit) { viewModelScope.launch { try { - val resp = api.auth(username) + val authHeader = createAuthHeader(username = username, password = password) + val resp = loginApi.auth(authHeader, username) if (resp.code() != 200) { throw HttpException(resp) } diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt index 97505b7..b7fd712 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt @@ -3,4 +3,4 @@ package ru.myitschool.work.ui.main import kotlinx.serialization.Serializable @Serializable -data class MainDestination(val username: String) \ No newline at end of file +data class MainDestination(val username: String, val password: String) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt index ee4deca..24e58c0 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt @@ -29,22 +29,25 @@ class MainFragment: Fragment(R.layout.fragment_main) { val username = findNavController().currentBackStackEntry?.toRoute()?.username username?.let { user -> - viewModel.loadPersonInfo(user) - binding.refresh.setOnClickListener { viewModel.loadPersonInfo(user) } - binding.logout.setOnClickListener { - viewModel.logout { - findNavController().apply { - popBackStack(true) - navigate(LoginDestination) + val password = findNavController().currentBackStackEntry?.toRoute()?.password + password?.let { password -> + viewModel.loadPersonInfo(user, password) + binding.refresh.setOnClickListener { viewModel.loadPersonInfo(user) } + binding.logout.setOnClickListener { + viewModel.logout { + findNavController().apply { + popBackStack(true) + navigate(LoginDestination) + } } } - } - binding.scan.setOnClickListener { - findNavController().navigate(QrResultDestination(user)) - findNavController().navigate(QrScanDestination) - } - binding.admin.setOnClickListener{ - findNavController().navigate(AdminDestination(user)) + binding.scan.setOnClickListener { + findNavController().navigate(QrResultDestination(user)) + findNavController().navigate(QrScanDestination) + } + binding.admin.setOnClickListener { + findNavController().navigate(AdminDestination(user)) + } } } subscribe() diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt index 80fec6e..4627999 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt @@ -5,6 +5,8 @@ import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.gson.GsonBuilder +import createAuthHeader +import createRetrofit import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow @@ -31,10 +33,14 @@ class MainViewModel @Inject constructor( private val dfo = SimpleDateFormat("yyyy-MM-dd HH:mm") private val dfi= SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") - fun loadPersonInfo(username: String) { + private val retrofit = createRetrofit("your_username", "your_password") + private val loginApi = retrofit.create(LoginApi::class.java) + + fun loadPersonInfo(username: String, password : String) { viewModelScope.launch { try { - val info = api.info(username) + val authHeader = createAuthHeader(username = username, password) + val info = loginApi.auth(authHeader, username) _state.update { MainState( fullName = info.name,