From 9e6a03a8959ad7e4d80fc0e11305c6bd808fe472 Mon Sep 17 00:00:00 2001 From: Egor Date: Thu, 26 Feb 2026 14:58:17 +0300 Subject: [PATCH] checkpoint 3 --- .../work/data/repo/AuthRepository.kt | 8 ++-- .../work/data/repo/BookRepository.kt | 9 ++-- .../work/data/repo/MeetingsRepository.kt | 5 +++ .../work/data/source/NetworkDataSource.kt | 21 +++------- .../work/domain/auth/GetTokenLocalUseCase.kt | 2 +- .../domain/auth/GetTokenNetworkUseCase.kt | 4 +- .../domain/meetings/MeetingsInfoEntity.kt | 11 +++++ .../work/ui/screen/main/MainViewModel.kt | 2 + .../work/ui/screen/meetings/MeetingsState.kt | 2 + .../ui/screen/meetings/MeetingsViewModel.kt | 41 +++++++++++-------- 10 files changed, 63 insertions(+), 42 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/domain/meetings/MeetingsInfoEntity.kt diff --git a/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt b/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt index 7a5a893..f58a11f 100644 --- a/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt +++ b/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt @@ -30,7 +30,7 @@ object AuthRepository { /** * Из памяти */ - suspend fun getToken(): String? { + suspend fun auth(): String? { if (tokenCache == null) { tokenCache = App.context.userDataStore.data .firstOrNull() @@ -45,9 +45,9 @@ object AuthRepository { /** * При обращении к серверу */ - suspend fun getToken(login : String, password : String) : Result { - Log.e("getTokenNDSInAR", NetworkDataSource.getToken(login, password).toString()) - return NetworkDataSource.getToken(login, password) + suspend fun auth(login : String, password : String) : Result { + Log.e("getTokenNDSInAR", NetworkDataSource.auth(login, password).toString()) + return NetworkDataSource.auth(login, password) } suspend fun logout() { diff --git a/app/src/main/java/ru/myitschool/work/data/repo/BookRepository.kt b/app/src/main/java/ru/myitschool/work/data/repo/BookRepository.kt index 94c484d..8aaa45d 100644 --- a/app/src/main/java/ru/myitschool/work/data/repo/BookRepository.kt +++ b/app/src/main/java/ru/myitschool/work/data/repo/BookRepository.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.data.repo +import android.util.Log import ru.myitschool.work.data.dto.BookRequestDto import ru.myitschool.work.data.source.NetworkDataSource import ru.myitschool.work.domain.book.entities.BookRequestData @@ -10,8 +11,10 @@ class BookRepository( private val authRepository: AuthRepository ) { suspend fun getInfo(): Result { - val code = authRepository.getToken() ?: return getNoAuthResult() + val code = authRepository.auth() ?: return getNoAuthResult() + Log.e("getInfoCode", "!!!!!!!!!!!!!! getInfo ERROR $code") return NetworkDataSource.getInfo(code).mapCatching { dto -> + Log.e("getInfoCode", "!!!!!!!!!!!!!! getInfo ERROR ${dto.booking}") MainInfoEntity( name = dto.name ?: error("Name is null"), photoUrl = dto.photoUrl ?: error("Photo url is null"), @@ -26,7 +29,7 @@ class BookRepository( } suspend fun getBookingInfo(): Result> { - val code = authRepository.getToken() ?: return getNoAuthResult() + val code = authRepository.auth() ?: return getNoAuthResult() return NetworkDataSource.getBooking(code).mapCatching { dto -> dto?.map { (date, places) -> BookingData( @@ -43,7 +46,7 @@ class BookRepository( } suspend fun sendBook(data: BookRequestData): Result { - val code = authRepository.getToken() ?: return getNoAuthResult() + val code = authRepository.auth() ?: return getNoAuthResult() val dto = BookRequestDto(data.date, data.placeId) return NetworkDataSource.addBook(code, dto) } diff --git a/app/src/main/java/ru/myitschool/work/data/repo/MeetingsRepository.kt b/app/src/main/java/ru/myitschool/work/data/repo/MeetingsRepository.kt index 270a3ec..90ce6f5 100644 --- a/app/src/main/java/ru/myitschool/work/data/repo/MeetingsRepository.kt +++ b/app/src/main/java/ru/myitschool/work/data/repo/MeetingsRepository.kt @@ -1,9 +1,14 @@ package ru.myitschool.work.data.repo +import ru.myitschool.work.data.source.NetworkDataSource + object MeetingsRepository { private var roomCache: String? = null fun getRoom(): String? { + if (roomCache == null) { + NetworkDataSource + } return roomCache } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/source/NetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/source/NetworkDataSource.kt index c2de735..b0f5055 100644 --- a/app/src/main/java/ru/myitschool/work/data/source/NetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/source/NetworkDataSource.kt @@ -1,17 +1,14 @@ package ru.myitschool.work.data.source -import android.accounts.NetworkErrorException import android.util.Log import io.ktor.client.HttpClient import io.ktor.client.call.body import io.ktor.client.engine.cio.CIO import io.ktor.client.plugins.contentnegotiation.ContentNegotiation -import io.ktor.client.request.HttpRequestData import io.ktor.client.request.get import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.client.statement.bodyAsText -import io.ktor.client.statement.request import io.ktor.http.ContentType import io.ktor.http.HttpStatusCode import io.ktor.http.contentType @@ -19,7 +16,6 @@ import io.ktor.serialization.kotlinx.json.json import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonArray import ru.myitschool.work.core.Constants import ru.myitschool.work.data.dto.PlaceDto import ru.myitschool.work.data.dto.BookRequestDto @@ -40,26 +36,20 @@ object NetworkDataSource { } } } - suspend fun getToken(login: String, password: String): Result = withContext(Dispatchers.IO) { + suspend fun auth(login: String, password: String): Result = withContext(Dispatchers.IO) { return@withContext runCatching { val response = client.post("${Constants.HOST}/api${Constants.AUTH_URL}") { contentType(ContentType.Application.Json) - Log.d("bodyInToken", - """ { - "login" : "$login", - "password" : "$password" - } """.trimIndent() - ) setBody( """{ - "login" : "${login}", - "password" : "${password}" + "login" : "$login", + "password" : "$password" } """.trimIndent() ) } Log.e("getTokenInNDS", response.body()) if (response.status != HttpStatusCode.OK) { - Log.e("getToken", response.status.toString()) + Log.e("auth", response.status.toString()) throw Exception("Неизвестная ошибка ${response.status}") } else if (response.status == HttpStatusCode.Unauthorized) { @@ -89,6 +79,7 @@ object NetworkDataSource { response.body() } else { println("!!!!!!!!!!!!!! getInfo ERROR ${response.bodyAsText()}") + Log.e("getInfo", "!!!!!!!!!!!!!! getInfo ERROR ${response.bodyAsText()}") error(response.bodyAsText()) } } @@ -119,5 +110,5 @@ object NetworkDataSource { } } - private fun getUrl(token: String, targetUrl: String) = "${Constants.HOST}/api/$token$targetUrl" + private fun getUrl(token: String, targetUrl: String) = "${Constants.HOST}/api/$targetUrl" } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/auth/GetTokenLocalUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/auth/GetTokenLocalUseCase.kt index ff3219d..531303f 100644 --- a/app/src/main/java/ru/myitschool/work/domain/auth/GetTokenLocalUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/auth/GetTokenLocalUseCase.kt @@ -6,6 +6,6 @@ class GetTokenLocalUseCase( private val repository: AuthRepository ) { suspend operator fun invoke(): String? { - return repository.getToken() + return repository.auth() } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/auth/GetTokenNetworkUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/auth/GetTokenNetworkUseCase.kt index 87a0754..6ada6b1 100644 --- a/app/src/main/java/ru/myitschool/work/domain/auth/GetTokenNetworkUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/auth/GetTokenNetworkUseCase.kt @@ -7,7 +7,7 @@ class GetTokenNetworkUseCase( private val repository: AuthRepository ) { suspend operator fun invoke(login : String, password: String): Result { - Log.e("GetTokenNetworkUseCase", repository.getToken(login, password).toString()) - return repository.getToken(login, password) + Log.e("GetTokenNetworkUseCase", repository.auth(login, password).toString()) + return repository.auth(login, password) } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/meetings/MeetingsInfoEntity.kt b/app/src/main/java/ru/myitschool/work/domain/meetings/MeetingsInfoEntity.kt new file mode 100644 index 0000000..c31d118 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/meetings/MeetingsInfoEntity.kt @@ -0,0 +1,11 @@ +package ru.myitschool.work.domain.meetings + + +data class MeetingsInfoEntity( + val id: String, + val book: List +) { + data class Book( + val date: String + ) +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/main/MainViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/screen/main/MainViewModel.kt index d04ec0b..006f35c 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/main/MainViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/main/MainViewModel.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.ui.screen.main +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.collections.immutable.toPersistentList @@ -64,6 +65,7 @@ class MainViewModel : ViewModel() { _uiState.update { getMainDataUseCase.invoke().fold( onSuccess = { data -> + Log.d("DataMain", "${data.name}, ${data.book}") MainState.Data( name = data.name, photoUrl = data.photoUrl, diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/meetings/MeetingsState.kt b/app/src/main/java/ru/myitschool/work/ui/screen/meetings/MeetingsState.kt index fc79e03..b75ec26 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/meetings/MeetingsState.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/meetings/MeetingsState.kt @@ -9,10 +9,12 @@ sealed interface MeetingsState { val error: String ): MeetingsState data class Data( + val name: String, val books: PersistentList, ): MeetingsState { data class Book( val date: String, + val time: String ) } } diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/meetings/MeetingsViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/screen/meetings/MeetingsViewModel.kt index d3c27ba..72fbe5b 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/meetings/MeetingsViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/meetings/MeetingsViewModel.kt @@ -13,8 +13,10 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.data.repo.BookRepository +import ru.myitschool.work.data.repo.MeetingsRepository import ru.myitschool.work.domain.auth.LogoutUseCase import ru.myitschool.work.domain.main.GetMainDataUseCase +import ru.myitschool.work.domain.meetings.GetRoomUseCase import ru.myitschool.work.ui.nav.AuthScreenDestination import ru.myitschool.work.ui.screen.main.MainAction import ru.myitschool.work.ui.screen.main.MainState @@ -30,7 +32,7 @@ class MeetingsViewModel: ViewModel() { LogoutUseCase(AuthRepository) } private val getMeetingsDataUseCase by lazy { - GetMainDataUseCase(BookRepository(AuthRepository)) + GetRoomUseCase(MeetingsRepository) } init { @@ -40,7 +42,7 @@ class MeetingsViewModel: ViewModel() { // is MeetingIntent.Logout -> { // viewModelScope.launch { // logoutUseCase.invoke() -// _actionFlow.emit(/*TODo*/) +// _actionFlow.emit(/*TODO*/) // } // } // is MeetingIntent.Refresh -> { @@ -48,19 +50,24 @@ class MeetingsViewModel: ViewModel() { // } // } // } - fun refresh() { - viewModelScope.launch { - _uiState.update { MeetingsState.Loading } - _uiState.update { - getMeetingsDataUseCase.invoke().fold( - onFailure = { error -> - MeetingsState.Error( - error = error.message?.takeIf { it.isNotBlank() } ?: "Unknown error" - ) - }, - onSuccess = TODO() - ) - } - } - } +// fun refresh() { +// viewModelScope.launch { +// _uiState.update { MeetingsState.Loading } +// _uiState.update { +// getMeetingsDataUseCase.invoke().fold( +// onFailure = { error -> +// MeetingsState.Error( +// error = error.message?.takeIf { it.isNotBlank() } ?: "Unknown error" +// ) +// }, +// onSuccess = { data -> +// MeetingsState.Data( +// name = data.name, +// books = data.book +// ) +// } +// ) +// } +// } +// } } \ No newline at end of file