checkpoint 0 #5

Open
student-e-klyukin wants to merge 15 commits from WindWin-org/NTO-2026-Android-TeamTask-Template:main into main
10 changed files with 63 additions and 42 deletions
Showing only changes of commit 9e6a03a895 - Show all commits

View File

@ -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<String> {
Log.e("getTokenNDSInAR", NetworkDataSource.getToken(login, password).toString())
return NetworkDataSource.getToken(login, password)
suspend fun auth(login : String, password : String) : Result<String> {
Log.e("getTokenNDSInAR", NetworkDataSource.auth(login, password).toString())
return NetworkDataSource.auth(login, password)
}
suspend fun logout() {

View File

@ -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<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 ->
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<List<BookingData>> {
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<Boolean> {
val code = authRepository.getToken() ?: return getNoAuthResult()
val code = authRepository.auth() ?: return getNoAuthResult()
val dto = BookRequestDto(data.date, data.placeId)
return NetworkDataSource.addBook(code, dto)
}

View File

@ -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
}
}

View File

@ -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<String> = withContext(Dispatchers.IO) {
suspend fun auth(login: String, password: String): Result<String> = 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<UserDto>()
} 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"
}

View File

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

View File

@ -7,7 +7,7 @@ class GetTokenNetworkUseCase(
private val repository: AuthRepository
) {
suspend operator fun invoke(login : String, password: String): Result<String> {
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)
}
}

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
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,

View File

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

View File

@ -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
// )
// }
// )
// }
// }
// }
}