code: Сделал api админа и его VM (вроде как)
This commit is contained in:
parent
7dcfec695d
commit
add9651561
@ -57,6 +57,7 @@ class RetrofitClient(context: Context) {
|
||||
fun getApiServiceList(): ApiServiceList {
|
||||
return retrofitWithAuth.create(ApiServiceList::class.java)
|
||||
}
|
||||
|
||||
fun getApiServiceAdmin(): ApiServiceAdmin {
|
||||
return retrofitWithAuth.create(ApiServiceAdmin::class.java)
|
||||
}
|
||||
|
@ -2,10 +2,8 @@ package ru.myitschool.work.api.admin
|
||||
|
||||
import retrofit2.Response
|
||||
import retrofit2.http.Body
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.PATCH
|
||||
import retrofit2.http.Path
|
||||
import ru.myitschool.work.api.main.UserInfo
|
||||
|
||||
interface ApiServiceAdmin {
|
||||
@PATCH("api/admin/authority/change/{login}")
|
||||
|
@ -9,6 +9,8 @@ import androidx.navigation.fragment.NavHostFragment
|
||||
import androidx.navigation.fragment.fragment
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import ru.myitschool.work.R
|
||||
import ru.myitschool.work.ui.admin.AdminDestination
|
||||
import ru.myitschool.work.ui.admin.AdminFragment
|
||||
import ru.myitschool.work.ui.login.LoginDestination
|
||||
import ru.myitschool.work.ui.login.LoginFragment
|
||||
import ru.myitschool.work.ui.main.MainDestination
|
||||
@ -36,7 +38,7 @@ class RootActivity : AppCompatActivity() {
|
||||
fragment<QrScanFragment, QrScanDestination>()
|
||||
fragment<MainFragment, MainDestination>()
|
||||
fragment<ResultFragment, ResultDestination>()
|
||||
/*fragment<AdminFragment, AdminDestination>()*/
|
||||
fragment<AdminFragment, AdminDestination>()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,6 @@
|
||||
package ru.myitschool.work.ui.admin
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data object AdminDestination
|
101
app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt
Normal file
101
app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt
Normal file
@ -0,0 +1,101 @@
|
||||
package ru.myitschool.work.ui.admin
|
||||
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import ru.myitschool.work.R
|
||||
import ru.myitschool.work.databinding.FragmentAdminBinding
|
||||
import ru.myitschool.work.ui.main.MainDestination
|
||||
import ru.myitschool.work.utils.AuthPreferences
|
||||
import ru.myitschool.work.utils.QrPreferences
|
||||
import ru.myitschool.work.utils.collectWhenStarted
|
||||
import ru.myitschool.work.utils.visibleOrGone
|
||||
|
||||
@AndroidEntryPoint
|
||||
class AdminFragment : Fragment(R.layout.fragment_admin) {
|
||||
private var _binding: FragmentAdminBinding? = null
|
||||
private val binding: FragmentAdminBinding get() = _binding!!
|
||||
private val viewModel: AdminViewModel by viewModels()
|
||||
|
||||
private lateinit var authPreferences: AuthPreferences
|
||||
private lateinit var qrPreferences: QrPreferences
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
authPreferences = AuthPreferences(requireContext())
|
||||
qrPreferences = QrPreferences(requireContext())
|
||||
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
_binding = FragmentAdminBinding.bind(view)
|
||||
|
||||
setupOpenComponents()
|
||||
observeOpenState()
|
||||
}
|
||||
|
||||
private fun setupOpenComponents() {
|
||||
binding.apply {
|
||||
block.setOnClickListener {
|
||||
authPreferences.getLogin().toString().let {
|
||||
viewModel.block(
|
||||
it,
|
||||
true
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun observeOpenState() {
|
||||
viewModel.state.collectWhenStarted(this) { state ->
|
||||
when (state) {
|
||||
is AdminViewModel.ResultState.Loading -> {
|
||||
|
||||
}
|
||||
is AdminViewModel.ResultState.Success -> {
|
||||
|
||||
|
||||
}
|
||||
is AdminViewModel.ResultState.InvalidCredentials -> {
|
||||
|
||||
}
|
||||
is AdminViewModel.ResultState.Error -> {
|
||||
|
||||
}
|
||||
AdminViewModel.ResultState.Initial -> {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun visibleAll(isVisible: Boolean) {
|
||||
binding.apply {
|
||||
}
|
||||
}
|
||||
|
||||
private fun navigateToMainScreen() {
|
||||
try {
|
||||
findNavController().apply {
|
||||
popBackStack(MainDestination, false)
|
||||
navigate(MainDestination)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e("ResultFragment", "Navigation error", e)
|
||||
Toast.makeText(context, getText(R.string.errorGoText).toString(), Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
_binding = null
|
||||
super.onDestroyView()
|
||||
}
|
||||
}
|
135
app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt
Normal file
135
app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt
Normal file
@ -0,0 +1,135 @@
|
||||
package ru.myitschool.work.ui.admin
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.launch
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import ru.myitschool.work.api.admin.AdminJson
|
||||
import ru.myitschool.work.api.admin.ApiServiceAdmin
|
||||
import ru.myitschool.work.api.list.ListInfo
|
||||
import ru.myitschool.work.api.main.ApiServiceMain
|
||||
import ru.myitschool.work.api.main.Authorities
|
||||
import ru.myitschool.work.api.main.UserInfo
|
||||
import ru.myitschool.work.ui.list.ListRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class AdminViewModel @Inject constructor(
|
||||
private val apiService: ApiServiceAdmin,
|
||||
private val apiServiceData: ApiServiceMain,
|
||||
private val listRepository: ListRepository
|
||||
) : ViewModel() {
|
||||
|
||||
private val _state = MutableStateFlow<ResultState>(ResultState.Initial)
|
||||
val state = _state.asStateFlow()
|
||||
|
||||
private val _stateData = MutableStateFlow<ResultStateData>(ResultStateData.Initial)
|
||||
val stateData = _stateData.asStateFlow()
|
||||
|
||||
fun block(login: String, authority: Boolean) {
|
||||
viewModelScope.launch {
|
||||
_state.value = ResultState.Loading
|
||||
|
||||
try {
|
||||
val response = apiService.block(
|
||||
login = login,
|
||||
data = AdminJson(
|
||||
if (authority) Authorities.ROLE_BLOCK
|
||||
else Authorities.ROLE_USER
|
||||
)
|
||||
)
|
||||
|
||||
when (response.code()) {
|
||||
200 -> {
|
||||
_state.value = ResultState.Success
|
||||
}
|
||||
403 -> {
|
||||
_state.value = ResultState.InvalidCredentials
|
||||
}
|
||||
401 -> {
|
||||
_state.value = ResultState.Error
|
||||
}
|
||||
else -> {
|
||||
_state.value = ResultState.Error
|
||||
}
|
||||
}
|
||||
} catch (t: Throwable) {
|
||||
_state.value = ResultState.Error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getUserData(login: String) {
|
||||
viewModelScope.launch {
|
||||
_stateData.value = ResultStateData.Loading
|
||||
|
||||
|
||||
apiServiceData.getDataUser(login).enqueue(object : Callback<UserInfo> {
|
||||
override fun onResponse(call: Call<UserInfo>, response: Response<UserInfo>) {
|
||||
|
||||
when {
|
||||
response.isSuccessful -> {
|
||||
val userInfo = response.body()
|
||||
_stateData.value = userInfo?.let { ResultStateData.Success(it) }!!
|
||||
}
|
||||
response.code() == 401 -> {
|
||||
_stateData.value = ResultStateData.Error("Unauthorized")
|
||||
}
|
||||
response.code() == 403 -> {
|
||||
_stateData.value = ResultStateData.Error("Block")
|
||||
}
|
||||
else -> {
|
||||
_stateData.value = ResultStateData.Error("Error")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<UserInfo>, t: Throwable) {
|
||||
_stateData.value = ResultStateData.Error("Network Error")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private val _listState = MutableStateFlow<ListState>(ListState.Loading)
|
||||
val listState: StateFlow<ListState> = _listState
|
||||
|
||||
sealed class ListState {
|
||||
data object Loading : ListState()
|
||||
data class Success(val data: List<ListInfo>) : ListState()
|
||||
data class Error(val message: String) : ListState()
|
||||
}
|
||||
|
||||
fun loadList(login: String) {
|
||||
viewModelScope.launch {
|
||||
_listState.value = ListState.Loading
|
||||
try {
|
||||
val list = listRepository.getList(login)
|
||||
_listState.value = ListState.Success(list)
|
||||
} catch (e: Exception) {
|
||||
_listState.value = ListState.Error(e.message ?: "Unknown error")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sealed class ResultState {
|
||||
data object Initial : ResultState()
|
||||
data object InvalidCredentials : ResultState()
|
||||
data object Loading : ResultState()
|
||||
data object Success : ResultState()
|
||||
data object Error : ResultState()
|
||||
}
|
||||
|
||||
sealed class ResultStateData {
|
||||
data object Initial : ResultStateData()
|
||||
data object Loading : ResultStateData()
|
||||
data class Success(val userInfo: UserInfo) : ResultStateData()
|
||||
data class Error(val message: String) : ResultStateData()
|
||||
}
|
||||
}
|
@ -12,6 +12,7 @@ import dagger.hilt.android.AndroidEntryPoint
|
||||
import ru.myitschool.work.R
|
||||
import ru.myitschool.work.api.main.Authorities
|
||||
import ru.myitschool.work.databinding.FragmentMainBinding
|
||||
import ru.myitschool.work.ui.admin.AdminDestination
|
||||
import ru.myitschool.work.ui.list.ListAdapter
|
||||
import ru.myitschool.work.ui.login.LoginDestination
|
||||
import ru.myitschool.work.ui.scan.qr.QrScanDestination
|
||||
@ -186,12 +187,12 @@ class MainFragment : Fragment(R.layout.fragment_main) {
|
||||
|
||||
|
||||
private fun navigateToAdmin() {
|
||||
try {/*
|
||||
try {
|
||||
authPreferences.clearLoginState()
|
||||
findNavController().apply {
|
||||
popBackStack(AdminDestination, false)
|
||||
navigate(AdminDestination)
|
||||
}*/
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e("MainFragment", "Error navigating to login", e)
|
||||
}
|
||||
|
@ -1,6 +0,0 @@
|
||||
package ru.myitschool.work.ui.result
|
||||
|
||||
object TextStatus {
|
||||
const val error = "Вход был отменён/Operation was cancelled"
|
||||
const val success = "Успешно/Success"
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user