diff --git a/app/src/main/java/ru/myitschool/work/data/repo/BookingRepository.kt b/app/src/main/java/ru/myitschool/work/data/repo/BookingRepository.kt new file mode 100644 index 0000000..bad262c --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/repo/BookingRepository.kt @@ -0,0 +1,25 @@ +package ru.myitschool.work.data.repo + +import ru.myitschool.work.data.source.NetworkDataSource +import ru.myitschool.work.domain.MyResult +import ru.myitschool.work.domain.booking.BookingData + +object BookingRepository { + suspend fun getAvailableForBooking(code: String): MyResult { + return when (val result = NetworkDataSource.getAvailableForBooking(code)) { + is MyResult.Success -> { + val bookingData = BookingData( + dateToPlaces = result.data.dates + ) + MyResult.Success(bookingData) + } + is MyResult.Error -> { + MyResult.Error(result.error) + } + } + } + + suspend fun createBooking(code: String, date: String, placeId: Int): MyResult { + return NetworkDataSource.createBooking(code, date, placeId) + } +} \ 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 e571623..82075a3 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 @@ -5,12 +5,18 @@ 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.get +import io.ktor.client.request.post +import io.ktor.client.request.setBody +import io.ktor.http.ContentType import io.ktor.http.HttpStatusCode +import io.ktor.http.contentType import io.ktor.serialization.kotlinx.json.json import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json import ru.myitschool.work.core.Constants +import ru.myitschool.work.data.dto.AvailableBookingResponse +import ru.myitschool.work.data.dto.BookRequest import ru.myitschool.work.data.dto.UserInfoResponse import ru.myitschool.work.domain.MyResult @@ -60,5 +66,40 @@ object NetworkDataSource { MyResult.Error("Сетевая ошибка") } } + + suspend fun getAvailableForBooking(code: String): MyResult = withContext(Dispatchers.IO) { + try { + val response = client.get(getUrl(code, Constants.BOOKING_URL)) + when (response.status) { + HttpStatusCode.OK -> { + MyResult.Success(response.body()) + } + else -> { + MyResult.Error("Ошибка получения доступных мест") + } + } + } catch (e: Exception){ + MyResult.Error("Сетевая ошибка") + } + } + + suspend fun createBooking(code: String, date: String, placeId: Int): MyResult = withContext(Dispatchers.IO){ + try { + val response = client.post(getUrl(code, Constants.BOOK_URL)) { + contentType(ContentType.Application.Json) + setBody(BookRequest(date = date, placeID = placeId)) + } + when (response.status) { + HttpStatusCode.OK -> { + MyResult.Success(Unit) + } + else -> { + MyResult.Error("Ошибка бронирования") + } + } + } catch (e: Exception){ + MyResult.Error("Сетевая ошибка") + } + } private fun getUrl(code: String, targetUrl: String) = "${Constants.HOST}/api/$code$targetUrl" } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/booking/BookingData.kt b/app/src/main/java/ru/myitschool/work/domain/booking/BookingData.kt new file mode 100644 index 0000000..b51b476 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/booking/BookingData.kt @@ -0,0 +1,22 @@ +package ru.myitschool.work.domain.booking + +import ru.myitschool.work.data.dto.AvailablePlace + +data class BookingData( + val dateToPlaces: Map> +){ + fun getSortedDatesWithPlaces(): List { + return dateToPlaces.keys + .filter { dateToPlaces[it]?.isNotEmpty() == true } + .sorted() + } + + fun getPlacesForDate(date: String): List { + return dateToPlaces[date] ?: emptyList() + } + + fun hasAvailableDates(): Boolean { + return dateToPlaces.any { it.value.isNotEmpty() } + } +} + diff --git a/app/src/main/java/ru/myitschool/work/ui/NavigationGraph.kt b/app/src/main/java/ru/myitschool/work/ui/NavigationGraph.kt index 42caa9b..91ebbab 100644 --- a/app/src/main/java/ru/myitschool/work/ui/NavigationGraph.kt +++ b/app/src/main/java/ru/myitschool/work/ui/NavigationGraph.kt @@ -17,6 +17,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import ru.myitschool.work.ui.auth.AuthScreen +import ru.myitschool.work.ui.booking.BookingScreen import ru.myitschool.work.ui.main.MainScreen import ru.myitschool.work.util.DataStoreManager @@ -49,11 +50,7 @@ fun AppNavHost( MainScreen(navController = navController) } composable { - Box( - contentAlignment = Alignment.Center - ) { - Text(text = "Hello") - } + BookingScreen(navController = navController) } } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainState.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainState.kt index 2a89d45..6631059 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainState.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainState.kt @@ -12,6 +12,6 @@ data class MainState( data class BookingDisplayItem( val date: String, // dd.MM.yyyy val place: String, - val originalDate: String + val originalDate: String //для сортировки )