data + domain

This commit is contained in:
imglmd
2025-12-02 10:04:08 +03:00
parent 309436d3d9
commit dd25a33b22
5 changed files with 91 additions and 6 deletions

View File

@@ -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<BookingData> {
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<Unit> {
return NetworkDataSource.createBooking(code, date, placeId)
}
}

View File

@@ -5,12 +5,18 @@ 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.get 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.HttpStatusCode
import io.ktor.http.contentType
import io.ktor.serialization.kotlinx.json.json 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 ru.myitschool.work.core.Constants 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.data.dto.UserInfoResponse
import ru.myitschool.work.domain.MyResult import ru.myitschool.work.domain.MyResult
@@ -60,5 +66,40 @@ object NetworkDataSource {
MyResult.Error("Сетевая ошибка") MyResult.Error("Сетевая ошибка")
} }
} }
suspend fun getAvailableForBooking(code: String): MyResult<AvailableBookingResponse> = 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<Unit> = 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" private fun getUrl(code: String, targetUrl: String) = "${Constants.HOST}/api/$code$targetUrl"
} }

View File

@@ -0,0 +1,22 @@
package ru.myitschool.work.domain.booking
import ru.myitschool.work.data.dto.AvailablePlace
data class BookingData(
val dateToPlaces: Map<String, List<AvailablePlace>>
){
fun getSortedDatesWithPlaces(): List<String> {
return dateToPlaces.keys
.filter { dateToPlaces[it]?.isNotEmpty() == true }
.sorted()
}
fun getPlacesForDate(date: String): List<AvailablePlace> {
return dateToPlaces[date] ?: emptyList()
}
fun hasAvailableDates(): Boolean {
return dateToPlaces.any { it.value.isNotEmpty() }
}
}

View File

@@ -17,6 +17,7 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import ru.myitschool.work.ui.auth.AuthScreen 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.ui.main.MainScreen
import ru.myitschool.work.util.DataStoreManager import ru.myitschool.work.util.DataStoreManager
@@ -49,11 +50,7 @@ fun AppNavHost(
MainScreen(navController = navController) MainScreen(navController = navController)
} }
composable<Screen.Book> { composable<Screen.Book> {
Box( BookingScreen(navController = navController)
contentAlignment = Alignment.Center
) {
Text(text = "Hello")
}
} }
} }
} }

View File

@@ -12,6 +12,6 @@ data class MainState(
data class BookingDisplayItem( data class BookingDisplayItem(
val date: String, // dd.MM.yyyy val date: String, // dd.MM.yyyy
val place: String, val place: String,
val originalDate: String val originalDate: String //для сортировки
) )