From 9a23befe71f6a2317efe9d3e0f00773db64e6d05 Mon Sep 17 00:00:00 2001 From: Terebov_Maksim Date: Thu, 20 Feb 2025 12:47:53 +0300 Subject: [PATCH 1/3] day3_commit2_temp --- app/src/main/java/ru/myitschool/work/ui/Main/MainFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b862949..6a3c96b 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 @@ -54,7 +54,7 @@ class MainFragment : Fragment(R.layout.fragment_main) { val login = SessionManager.userLogin ?: return@launch val authHeader = SessionManager.getAuthHeader() val response = apiService.getUserInfo(login, authHeader) - +//. if (response.isSuccessful) { val employeeData = response.body() employeeData?.let { From cabbe30c42a3342ffa468d4bc3270785194cc773 Mon Sep 17 00:00:00 2001 From: Terebov_Maksim Date: Thu, 20 Feb 2025 15:36:25 +0300 Subject: [PATCH 2/3] day3_commit2_qr_mini_fix_and_photo_img --- .kotlin/errors/errors-1740053232762.log | 82 +++++++++++++++++++ .../java/ru/myitschool/work/api/ApiService.kt | 18 ++-- .../myitschool/work/ui/Main/MainFragment.kt | 55 ++++++++----- .../myitschool/work/ui/qr/result/QrResult.kt | 51 ++++++------ 4 files changed, 149 insertions(+), 57 deletions(-) create mode 100644 .kotlin/errors/errors-1740053232762.log diff --git a/.kotlin/errors/errors-1740053232762.log b/.kotlin/errors/errors-1740053232762.log new file mode 100644 index 0000000..51f29bd --- /dev/null +++ b/.kotlin/errors/errors-1740053232762.log @@ -0,0 +1,82 @@ +kotlin version: 2.0.21 +error message: Daemon compilation failed: null +java.lang.Exception + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:69) + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:65) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:240) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:195) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:128) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:170) + at org.gradle.internal.Factories$1.create(Factories.java:31) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:267) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:131) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:136) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:165) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:134) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) + at java.base/java.lang.Thread.run(Unknown Source) +Caused by: java.nio.file.DirectoryNotEmptyException: C:\Users\User\AppData\Local\Temp\kotlin-backups1146231745401124119 + at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source) + at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(Unknown Source) + at java.base/java.nio.file.Files.delete(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash$lambda$11$lambda$10$lambda$9(CompilationTransaction.kt:244) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) + at java.base/java.util.ArrayList.forEach(Unknown Source) + at java.base/java.util.stream.SortedOps$RefSortingSink.end(Unknown Source) + at java.base/java.util.stream.Sink$ChainedReference.end(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) + at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.close(CompilationTransaction.kt:254) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally(IncrementalCompilerRunner.kt:747) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:120) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:675) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92) + at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1660) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) + at java.base/java.lang.reflect.Method.invoke(Unknown Source) + at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.Transport.serviceCall(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) + ... 3 more + + diff --git a/app/src/main/java/ru/myitschool/work/api/ApiService.kt b/app/src/main/java/ru/myitschool/work/api/ApiService.kt index c49b33a..74d9a0d 100644 --- a/app/src/main/java/ru/myitschool/work/api/ApiService.kt +++ b/app/src/main/java/ru/myitschool/work/api/ApiService.kt @@ -1,11 +1,9 @@ package ru.myitschool.work.api -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.POST import retrofit2.http.Path import retrofit2.http.Query @@ -27,8 +25,12 @@ interface ApiService { @GET("/api/employee/{login}") // Получение информации о сотруднике suspend fun getEmployeeInfo(@Path("login") login: String): Response - @PATCH("/api/open") // Открыть дверь - suspend fun openDoor(@Body request: OpenDoorRequest): Response // Измените Response на Response + @POST("api/{username}/open") + suspend fun openDoor( + @Path("username") username: String, + @Header("Authorization") authHeader: String, // Добавляем заголовок + @Body request: OpenDoorRequest + ): Response @POST("/api/employee/toggleAccess") // Метод для блокировки/разблокировки доступа suspend fun toggleAccess(@Body request: ToggleAccessRequest): Response @@ -41,7 +43,8 @@ interface ApiService { data class EmployeeData( val name: String, val position: String, - val lastVisit: String + val lastVisit: String, + val avatarUrl: String? // Добавьте это поле ) // Модель данных для запроса блокировки/разблокировки доступа @@ -51,7 +54,4 @@ data class ToggleAccessRequest( ) // Модель данных для запроса открытия двери -data class OpenDoorRequest( - val login: String, // Логин сотрудника - val value: Long // Код для открытия двери -) \ No newline at end of file +data class OpenDoorRequest(val value: Long) \ 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 125932c..d5aef9e 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 @@ -1,12 +1,14 @@ package ru.myitschool.work.ui.main 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.setFragmentResultListener import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import com.bumptech.glide.Glide import kotlinx.coroutines.launch import ru.myitschool.work.R import ru.myitschool.work.api.ApiService @@ -72,32 +74,41 @@ class MainFragment : Fragment(R.layout.fragment_main) { private fun fetchUserInfo() { lifecycleScope.launch { val login = SessionManager.userLogin ?: return@launch - val authHeader = SessionManager.getAuthHeader() - val response = apiService.getUserInfo(login, authHeader) -//. - if (response.isSuccessful) { - val employeeData = response.body() - employeeData?.let { - binding.fullname.text = it.name - binding.position.text = it.position - binding.lastEntry.text = it.lastVisit - binding.photo.visibility = View.VISIBLE - binding.fullname.visibility = View.VISIBLE - binding.position.visibility = View.VISIBLE - binding.lastEntry.visibility = View.VISIBLE + val authHeader = SessionManager.getAuthHeader() ?: return@launch - // Показываем кнопку "Сканировать QR-код" после успешного получения данных - binding.scanQrCode?.visibility = View.VISIBLE + try { + val response = apiService.getUserInfo(login, authHeader) + + if (response.isSuccessful) { + val employeeData = response.body() + employeeData?.let { + binding.fullname.text = it.name + binding.position.text = it.position + binding.lastEntry.text = it.lastVisit + + // Загрузка аватара + if (it.avatarUrl != null) { // Предполагается, что у вас есть поле avatarUrl + // Используйте библиотеку, такую как Glide или Picasso, для загрузки изображения + Glide.with(this@MainFragment) + .load(it.avatarUrl) + .into(binding.photo) + binding.photo.visibility = View.VISIBLE + } else { + binding.photo.visibility = View.GONE // Скрыть, если URL нет + } + + // Показываем кнопку "Сканировать QR-код" после успешного получения данных + binding.scanQrCode?.visibility = View.VISIBLE + } + } else { + binding.error.text = "Ошибка получения данных: ${response.message()}" + binding.error.visibility = View.VISIBLE } - } else { - binding.error.text = "Ошибка получения данных" + } catch (e: Exception) { + Log.e("MainFragment", "Error fetching user info", e) + binding.error.text = "Ошибка сети: ${e.message}" binding.error.visibility = View.VISIBLE } } } - - override fun onDestroyView() { - _binding = null - super.onDestroyView() - } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResult.kt b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResult.kt index 98b74e8..8ed2c6f 100644 --- a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResult.kt +++ b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResult.kt @@ -5,7 +5,6 @@ import androidx.navigation.fragment.findNavController import ru.myitschool.work.SessionManager import ru.myitschool.work.api.OpenDoorRequest import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -15,14 +14,14 @@ import kotlinx.coroutines.launch import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import ru.myitschool.work.R +import android.util.Base64 +import android.util.Log import ru.myitschool.work.api.ApiService import ru.myitschool.work.core.Constants import ru.myitschool.work.databinding.FragmentQrScanResultBinding class QrResult : Fragment(R.layout.fragment_qr_scan_result) { - private var _binding: FragmentQrScanResultBinding? = null - private val binding get() = _binding!! - + private lateinit var binding: FragmentQrScanResultBinding private lateinit var apiService: ApiService override fun onCreateView( @@ -30,7 +29,7 @@ class QrResult : Fragment(R.layout.fragment_qr_scan_result) { container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentQrScanResultBinding.inflate(inflater, container, false) + binding = FragmentQrScanResultBinding.inflate(inflater, container, false) apiService = Retrofit.Builder() .baseUrl(Constants.SERVER_ADDRESS) .addConverterFactory(GsonConverterFactory.create()) @@ -43,12 +42,8 @@ class QrResult : Fragment(R.layout.fragment_qr_scan_result) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - // Получаем данные из аргументов val qrData = QrScanDestination.getDataIfExist(requireArguments()) - Log.d("QrResult", "QR Data: $qrData") // Логируем полученные данные - if (qrData != null) { - binding.result.text = "Результат сканирования: $qrData" // Отображаем результат сканирования sendRequestToServer(qrData) } else { binding.result.text = "Вход был отменён/Operation was cancelled" @@ -62,27 +57,31 @@ class QrResult : Fragment(R.layout.fragment_qr_scan_result) { private fun sendRequestToServer(qrData: String) { lifecycleScope.launch { try { - val login = SessionManager.userLogin - if (login != null) { - val openDoorRequest = OpenDoorRequest(login, qrData.toLong()) // Преобразуем qrData в Long - val response = apiService.openDoor(openDoorRequest) - if (response.isSuccessful) { - binding.result.text = "Успешно/Success" - } else { - binding.result.text = "Что-то пошло не так/Something went wrong: ${response.message()}" - } + val qrValue = qrData.toLong() // Преобразуем данные QR-кода в Long + val login = SessionManager.userLogin ?: "default_login" // Замените на ваш логин + val password = "password123" // Замените на ваш пароль + val authHeader = "Basic " + Base64.encodeToString("$login:$password".toByteArray(), Base64.NO_WRAP) + + // Логируем данные перед отправкой + Log.d("QrResult", "Sending request with QR value: $qrValue and authHeader: $authHeader") + + val response = apiService.openDoor(login, authHeader, OpenDoorRequest(qrValue)) + + // Логируем код ответа и тело ответа + Log.d("QrResult", "Response code: ${response.code()}") + Log.d("QrResult", "Response body: ${response.body()}") + + if (response.code() == 200) { + binding.result.text = "Door Opened" // Сообщение о том, что дверь открыта } else { - binding.result.text = "Пользователь не авторизован/Unauthorized user" + binding.result.text = "Door Closed" // Сообщение о том, что дверь закрыта } + } catch (e: NumberFormatException) { + binding.result.text = "Некорректные данные QR-кода" } catch (e: Exception) { - binding.result.text = "Что-то пошло не так/Something went wrong: ${e.message}" - Log.e("QrResult", "Error sending request to server", e) + binding.result.text = "Что-то пошло не так: ${e.message}" + Log.e("QrResult", "Error: ${e.message}", e) // Логируем ошибку } } } - - override fun onDestroyView() { - _binding = null - super.onDestroyView() - } } \ No newline at end of file From ebc2f1675be0dfc3f0427f030f8739cb5ca72c87 Mon Sep 17 00:00:00 2001 From: Terebov_Maksim Date: Thu, 20 Feb 2025 15:46:37 +0300 Subject: [PATCH 3/3] day3_commit2_front_nice_backendDIIE --- .../main/java/ru/myitschool/work/ui/Main/MainFragment.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 d5aef9e..f385357 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 @@ -86,11 +86,15 @@ class MainFragment : Fragment(R.layout.fragment_main) { binding.position.text = it.position binding.lastEntry.text = it.lastVisit + // Логируем URL аватара + Log.d("MainFragment", "Avatar URL: ${it.avatarUrl}") + // Загрузка аватара - if (it.avatarUrl != null) { // Предполагается, что у вас есть поле avatarUrl - // Используйте библиотеку, такую как Glide или Picasso, для загрузки изображения + if (it.avatarUrl != null) { Glide.with(this@MainFragment) .load(it.avatarUrl) + .placeholder(R.drawable.ic_refresh) // Замените на ваш ресурс-заполнитель + .error(R.drawable.ic_close) // Замените на ваш ресурс ошибки .into(binding.photo) binding.photo.visibility = View.VISIBLE } else {