day2_commit_12_MEGAFIX_MEEEEEGAAPI

This commit is contained in:
Terebov_Maksim 2025-02-19 15:01:42 +03:00
parent c5be8a2114
commit 3da4b99cc0
4 changed files with 47 additions and 24 deletions

View File

@ -3,28 +3,44 @@ package ru.myitschool.work.api
import retrofit2.Response import retrofit2.Response
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Header import retrofit2.http.PATCH
import retrofit2.http.POST import retrofit2.http.POST
import retrofit2.http.Path import retrofit2.http.Path
interface ApiService { interface ApiService {
@GET("api/{login}/auth") // Метод для аутентификации
@POST("/api/auth") // Изменено на POST и путь к аутентификации
suspend fun authenticate( suspend fun authenticate(
@Path("login") login: String, @Body payload: AuthRequest // Передаем объект с логином и паролем
@Header("Authorization") authorization: String // Добавляем заголовок Authorization
): Response<UserAuthResponse> // Возвращаем UserAuthResponse ): Response<UserAuthResponse> // Возвращаем UserAuthResponse
@GET("api/{login}/info") @GET("/api/{login}/info") // Получение информации о пользователе
suspend fun getUserInfo(@Path("login") login: String): Response<Map<String, Any>> suspend fun getUserInfo(@Path("login") login: String): Response<Map<String, Any>>
@POST("api/employee/toggleAccess") @GET("/api/employee/{login}") // Получение информации о сотруднике
suspend fun getEmployeeInfo(@Path("login") login: String): Response<EmployeeData>
@PATCH("/api/open") // Открыть дверь
suspend fun openDoor(@Body request: OpenDoorRequest): Response<String>
@POST("/api/employee/toggleAccess") // Метод для блокировки/разблокировки доступа
suspend fun toggleAccess(@Body request: ToggleAccessRequest): Response<Unit> suspend fun toggleAccess(@Body request: ToggleAccessRequest): Response<Unit>
// Метод для получения информации о сотруднике @GET("/api/workers") // Получить всех сотрудников
@GET("api/employee/{login}") suspend fun getAllWorkers(): Response<List<EmployeeData>>
suspend fun getEmployeeInfo(@Path("login") login: String): Response<EmployeeData>
} }
// Модель данных для запроса аутентификации
data class AuthRequest(
val login: String,
val password: String // Поле для пароля
)
// Модель данных для ответа аутентификации
data class UserAuthResponse(
val role: String // Добавляем поле для роли
)
// Модель данных для информации о сотруднике // Модель данных для информации о сотруднике
data class EmployeeData( data class EmployeeData(
val name: String, val name: String,
@ -34,11 +50,12 @@ data class EmployeeData(
// Модель данных для запроса блокировки/разблокировки доступа // Модель данных для запроса блокировки/разблокировки доступа
data class ToggleAccessRequest( data class ToggleAccessRequest(
val login: String, val login: String, // Логин сотрудника
val action: String // "block" или "unblock" val action: String // Действие: "block" или "unblock"
) )
// Модель данных для ответа аутентификации // Модель данных для запроса открытия двери
data class UserAuthResponse( data class OpenDoorRequest(
val role: String // Добавляем поле для роли val login: String, // Логин сотрудника
val value: Long // Код для открытия двери
) )

View File

@ -1,5 +1,5 @@
package ru.myitschool.work.core package ru.myitschool.work.core
// БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ // БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ
object Constants { object Constants {
const val SERVER_ADDRESS = "const val SERVER_ADDRESS = \"http://localhost:8090\"\n" const val SERVER_ADDRESS = "const val SERVER_ADDRESS = \"http://localhost:8080\"\n"
} }

View File

@ -13,6 +13,7 @@ import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.gson.GsonConverterFactory
import ru.myitschool.work.SessionManager import ru.myitschool.work.SessionManager
import ru.myitschool.work.api.ApiService import ru.myitschool.work.api.ApiService
import ru.myitschool.work.api.AuthRequest
import ru.myitschool.work.api.UserAuthResponse import ru.myitschool.work.api.UserAuthResponse
import ru.myitschool.work.core.Constants import ru.myitschool.work.core.Constants
import javax.inject.Inject import javax.inject.Inject
@ -36,8 +37,8 @@ class LoginViewModel @Inject constructor(
if (isValidUsername(username)) { if (isValidUsername(username)) {
viewModelScope.launch { viewModelScope.launch {
try { try {
val credentials = Credentials.basic(username, password) // Создаем Basic Auth заголовок val payload = AuthRequest(username, password) // Создаем объект запроса
val response = apiService.authenticate(username, credentials) // Передаем заголовок в запрос val response = apiService.authenticate(payload) // Вызываем метод аутентификации
if (response.isSuccessful) { if (response.isSuccessful) {
val userAuthResponse = response.body() // Получаем ответ с ролью пользователя val userAuthResponse = response.body() // Получаем ответ с ролью пользователя
userAuthResponse?.let { userAuthResponse?.let {
@ -45,13 +46,10 @@ class LoginViewModel @Inject constructor(
SessionManager.userRole = it.role // Сохраняем роль SessionManager.userRole = it.role // Сохраняем роль
} }
_state.value = LoginState(success = true, userAuthResponse = userAuthResponse) _state.value = LoginState(success = true, userAuthResponse = userAuthResponse)
} else if (response.code() == 503) { // Пример кода для техработ
_state.value = LoginState(maintenance = true)
} else { } else {
_state.value = LoginState(error = "Ошибка авторизации") _state.value = LoginState(error = "Ошибка авторизации")
} }
} catch (e: Exception) { } catch (e: Exception) {
// Логирование ошибки
e.printStackTrace() e.printStackTrace()
_state.value = LoginState(error = "Ошибка сети. Проверьте подключение к интернету.") _state.value = LoginState(error = "Ошибка сети. Проверьте подключение к интернету.")
} }

View File

@ -55,11 +55,19 @@ class QrResult : Fragment(R.layout.fragment_qr_scan_result) {
private fun sendRequestToServer(qrData: String) { private fun sendRequestToServer(qrData: String) {
lifecycleScope.launch { lifecycleScope.launch {
try { try {
val response = apiService.openDoor(SessionManager.userLogin, OpenDoorRequest(qrData)) // Проверяем, что userLogin не равен null
if (response.isSuccessful) { val login = SessionManager.userLogin
binding.result.text = "Успешно/Success" if (login != null) {
// Создаем объект OpenDoorRequest с логином и кодом
val openDoorRequest = OpenDoorRequest(login, qrData.toLong()) // Преобразуем qrData в Long, если это необходимо
val response = apiService.openDoor(openDoorRequest) // Теперь передаем только openDoorRequest
if (response.isSuccessful) {
binding.result.text = "Успешно/Success"
} else {
binding.result.text = "Что-то пошло не так/Something wrong"
}
} else { } else {
binding.result.text = "Что-то пошло не так/Something wrong" binding.result.text = "Пользователь не авторизован/Unauthorized user"
} }
} catch (e: Exception) { } catch (e: Exception) {
binding.result.text = "Что-то пошло не так/Something wrong" binding.result.text = "Что-то пошло не так/Something wrong"