checkpoint 3

This commit is contained in:
Egor 2026-02-26 14:58:17 +03:00
parent 4c8e79a561
commit 9e6a03a895
10 changed files with 63 additions and 42 deletions

View File

@ -30,7 +30,7 @@ object AuthRepository {
/** /**
* Из памяти * Из памяти
*/ */
suspend fun getToken(): String? { suspend fun auth(): String? {
if (tokenCache == null) { if (tokenCache == null) {
tokenCache = App.context.userDataStore.data tokenCache = App.context.userDataStore.data
.firstOrNull() .firstOrNull()
@ -45,9 +45,9 @@ object AuthRepository {
/** /**
* При обращении к серверу * При обращении к серверу
*/ */
suspend fun getToken(login : String, password : String) : Result<String> { suspend fun auth(login : String, password : String) : Result<String> {
Log.e("getTokenNDSInAR", NetworkDataSource.getToken(login, password).toString()) Log.e("getTokenNDSInAR", NetworkDataSource.auth(login, password).toString())
return NetworkDataSource.getToken(login, password) return NetworkDataSource.auth(login, password)
} }
suspend fun logout() { suspend fun logout() {

View File

@ -1,5 +1,6 @@
package ru.myitschool.work.data.repo package ru.myitschool.work.data.repo
import android.util.Log
import ru.myitschool.work.data.dto.BookRequestDto import ru.myitschool.work.data.dto.BookRequestDto
import ru.myitschool.work.data.source.NetworkDataSource import ru.myitschool.work.data.source.NetworkDataSource
import ru.myitschool.work.domain.book.entities.BookRequestData import ru.myitschool.work.domain.book.entities.BookRequestData
@ -10,8 +11,10 @@ class BookRepository(
private val authRepository: AuthRepository private val authRepository: AuthRepository
) { ) {
suspend fun getInfo(): Result<MainInfoEntity> { suspend fun getInfo(): Result<MainInfoEntity> {
val code = authRepository.getToken() ?: return getNoAuthResult() val code = authRepository.auth() ?: return getNoAuthResult()
Log.e("getInfoCode", "!!!!!!!!!!!!!! getInfo ERROR $code")
return NetworkDataSource.getInfo(code).mapCatching { dto -> return NetworkDataSource.getInfo(code).mapCatching { dto ->
Log.e("getInfoCode", "!!!!!!!!!!!!!! getInfo ERROR ${dto.booking}")
MainInfoEntity( MainInfoEntity(
name = dto.name ?: error("Name is null"), name = dto.name ?: error("Name is null"),
photoUrl = dto.photoUrl ?: error("Photo url is null"), photoUrl = dto.photoUrl ?: error("Photo url is null"),
@ -26,7 +29,7 @@ class BookRepository(
} }
suspend fun getBookingInfo(): Result<List<BookingData>> { suspend fun getBookingInfo(): Result<List<BookingData>> {
val code = authRepository.getToken() ?: return getNoAuthResult() val code = authRepository.auth() ?: return getNoAuthResult()
return NetworkDataSource.getBooking(code).mapCatching { dto -> return NetworkDataSource.getBooking(code).mapCatching { dto ->
dto?.map { (date, places) -> dto?.map { (date, places) ->
BookingData( BookingData(
@ -43,7 +46,7 @@ class BookRepository(
} }
suspend fun sendBook(data: BookRequestData): Result<Boolean> { suspend fun sendBook(data: BookRequestData): Result<Boolean> {
val code = authRepository.getToken() ?: return getNoAuthResult() val code = authRepository.auth() ?: return getNoAuthResult()
val dto = BookRequestDto(data.date, data.placeId) val dto = BookRequestDto(data.date, data.placeId)
return NetworkDataSource.addBook(code, dto) return NetworkDataSource.addBook(code, dto)
} }

View File

@ -1,9 +1,14 @@
package ru.myitschool.work.data.repo package ru.myitschool.work.data.repo
import ru.myitschool.work.data.source.NetworkDataSource
object MeetingsRepository { object MeetingsRepository {
private var roomCache: String? = null private var roomCache: String? = null
fun getRoom(): String? { fun getRoom(): String? {
if (roomCache == null) {
NetworkDataSource
}
return roomCache return roomCache
} }
} }

View File

@ -1,17 +1,14 @@
package ru.myitschool.work.data.source package ru.myitschool.work.data.source
import android.accounts.NetworkErrorException
import android.util.Log import android.util.Log
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.engine.cio.CIO import io.ktor.client.engine.cio.CIO
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.request.HttpRequestData
import io.ktor.client.request.get import io.ktor.client.request.get
import io.ktor.client.request.post import io.ktor.client.request.post
import io.ktor.client.request.setBody import io.ktor.client.request.setBody
import io.ktor.client.statement.bodyAsText import io.ktor.client.statement.bodyAsText
import io.ktor.client.statement.request
import io.ktor.http.ContentType import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode import io.ktor.http.HttpStatusCode
import io.ktor.http.contentType import io.ktor.http.contentType
@ -19,7 +16,6 @@ import io.ktor.serialization.kotlinx.json.json
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonArray
import ru.myitschool.work.core.Constants import ru.myitschool.work.core.Constants
import ru.myitschool.work.data.dto.PlaceDto import ru.myitschool.work.data.dto.PlaceDto
import ru.myitschool.work.data.dto.BookRequestDto import ru.myitschool.work.data.dto.BookRequestDto
@ -40,26 +36,20 @@ object NetworkDataSource {
} }
} }
} }
suspend fun getToken(login: String, password: String): Result<String> = withContext(Dispatchers.IO) { suspend fun auth(login: String, password: String): Result<String> = withContext(Dispatchers.IO) {
return@withContext runCatching { return@withContext runCatching {
val response = client.post("${Constants.HOST}/api${Constants.AUTH_URL}") { val response = client.post("${Constants.HOST}/api${Constants.AUTH_URL}") {
contentType(ContentType.Application.Json) contentType(ContentType.Application.Json)
Log.d("bodyInToken", setBody(
"""{ """{
"login" : "$login", "login" : "$login",
"password" : "$password" "password" : "$password"
} """.trimIndent() } """.trimIndent()
) )
setBody(
"""{
"login" : "${login}",
"password" : "${password}"
} """.trimIndent()
)
} }
Log.e("getTokenInNDS", response.body()) Log.e("getTokenInNDS", response.body())
if (response.status != HttpStatusCode.OK) { if (response.status != HttpStatusCode.OK) {
Log.e("getToken", response.status.toString()) Log.e("auth", response.status.toString())
throw Exception("Неизвестная ошибка ${response.status}") throw Exception("Неизвестная ошибка ${response.status}")
} }
else if (response.status == HttpStatusCode.Unauthorized) { else if (response.status == HttpStatusCode.Unauthorized) {
@ -89,6 +79,7 @@ object NetworkDataSource {
response.body<UserDto>() response.body<UserDto>()
} else { } else {
println("!!!!!!!!!!!!!! getInfo ERROR ${response.bodyAsText()}") println("!!!!!!!!!!!!!! getInfo ERROR ${response.bodyAsText()}")
Log.e("getInfo", "!!!!!!!!!!!!!! getInfo ERROR ${response.bodyAsText()}")
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"
} }

View File

@ -6,6 +6,6 @@ class GetTokenLocalUseCase(
private val repository: AuthRepository private val repository: AuthRepository
) { ) {
suspend operator fun invoke(): String? { suspend operator fun invoke(): String? {
return repository.getToken() return repository.auth()
} }
} }

View File

@ -7,7 +7,7 @@ class GetTokenNetworkUseCase(
private val repository: AuthRepository private val repository: AuthRepository
) { ) {
suspend operator fun invoke(login : String, password: String): Result<String> { suspend operator fun invoke(login : String, password: String): Result<String> {
Log.e("GetTokenNetworkUseCase", repository.getToken(login, password).toString()) Log.e("GetTokenNetworkUseCase", repository.auth(login, password).toString())
return repository.getToken(login, password) return repository.auth(login, password)
} }
} }

View File

@ -0,0 +1,11 @@
package ru.myitschool.work.domain.meetings
data class MeetingsInfoEntity(
val id: String,
val book: List<Book>
) {
data class Book(
val date: String
)
}

View File

@ -1,5 +1,6 @@
package ru.myitschool.work.ui.screen.main package ru.myitschool.work.ui.screen.main
import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
@ -64,6 +65,7 @@ class MainViewModel : ViewModel() {
_uiState.update { _uiState.update {
getMainDataUseCase.invoke().fold( getMainDataUseCase.invoke().fold(
onSuccess = { data -> onSuccess = { data ->
Log.d("DataMain", "${data.name}, ${data.book}")
MainState.Data( MainState.Data(
name = data.name, name = data.name,
photoUrl = data.photoUrl, photoUrl = data.photoUrl,

View File

@ -9,10 +9,12 @@ sealed interface MeetingsState {
val error: String val error: String
): MeetingsState ): MeetingsState
data class Data( data class Data(
val name: String,
val books: PersistentList<Book>, val books: PersistentList<Book>,
): MeetingsState { ): MeetingsState {
data class Book( data class Book(
val date: String, val date: String,
val time: String
) )
} }
} }

View File

@ -13,8 +13,10 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.data.repo.AuthRepository
import ru.myitschool.work.data.repo.BookRepository 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.auth.LogoutUseCase
import ru.myitschool.work.domain.main.GetMainDataUseCase 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.nav.AuthScreenDestination
import ru.myitschool.work.ui.screen.main.MainAction import ru.myitschool.work.ui.screen.main.MainAction
import ru.myitschool.work.ui.screen.main.MainState import ru.myitschool.work.ui.screen.main.MainState
@ -30,7 +32,7 @@ class MeetingsViewModel: ViewModel() {
LogoutUseCase(AuthRepository) LogoutUseCase(AuthRepository)
} }
private val getMeetingsDataUseCase by lazy { private val getMeetingsDataUseCase by lazy {
GetMainDataUseCase(BookRepository(AuthRepository)) GetRoomUseCase(MeetingsRepository)
} }
init { init {
@ -40,7 +42,7 @@ class MeetingsViewModel: ViewModel() {
// is MeetingIntent.Logout -> { // is MeetingIntent.Logout -> {
// viewModelScope.launch { // viewModelScope.launch {
// logoutUseCase.invoke() // logoutUseCase.invoke()
// _actionFlow.emit(/*TODo*/) // _actionFlow.emit(/*TODO*/)
// } // }
// } // }
// is MeetingIntent.Refresh -> { // is MeetingIntent.Refresh -> {
@ -48,19 +50,24 @@ class MeetingsViewModel: ViewModel() {
// } // }
// } // }
// } // }
fun refresh() { // fun refresh() {
viewModelScope.launch { // viewModelScope.launch {
_uiState.update { MeetingsState.Loading } // _uiState.update { MeetingsState.Loading }
_uiState.update { // _uiState.update {
getMeetingsDataUseCase.invoke().fold( // getMeetingsDataUseCase.invoke().fold(
onFailure = { error -> // onFailure = { error ->
MeetingsState.Error( // MeetingsState.Error(
error = error.message?.takeIf { it.isNotBlank() } ?: "Unknown error" // error = error.message?.takeIf { it.isNotBlank() } ?: "Unknown error"
) // )
}, // },
onSuccess = TODO() // onSuccess = { data ->
) // MeetingsState.Data(
} // name = data.name,
} // books = data.book
} // )
// }
// )
// }
// }
// }
} }