From 94f8ff1f0c6d97e2bbb2276e00bfc1803607ce9a Mon Sep 17 00:00:00 2001 From: Artem Gruzdev Date: Tue, 12 Sep 2023 22:51:32 +0600 Subject: [PATCH] [~] change backend contact --- .../data/repository/BookingRepositoryImpl.kt | 74 ++++++++++--------- .../domain/entity/BookingInteractor.kt | 19 ++--- .../domain/repository/BookingRepository.kt | 11 +-- .../domain/useCase/AboutEmployeeInteractor.kt | 20 +++-- .../domain/useCase/GetBookingsUseCase.kt | 21 +++--- .../store/AboutEmployeeStoreFactory.kt | 22 +++--- .../ui/main/store/MainStoreFactory.kt | 16 +++- .../band/effective/office/network/api/Api.kt | 6 +- .../office/network/api/impl/ApiImpl.kt | 8 +- .../office/network/api/impl/ApiMock.kt | 9 ++- 10 files changed, 118 insertions(+), 88 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/BookingRepositoryImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/BookingRepositoryImpl.kt index c8813623..60cb0a0b 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/BookingRepositoryImpl.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/BookingRepositoryImpl.kt @@ -31,6 +31,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime import kotlinx.datetime.atTime class BookingRepositoryImpl( @@ -39,6 +40,7 @@ class BookingRepositoryImpl( ) : BookingRepository { private var user: User? = null + init { CoroutineScope(Dispatchers.IO).launch { val currentUserResponse = profileRepository.getUser() @@ -75,7 +77,7 @@ class BookingRepositoryImpl( val bookingDTO = bookingInfo.toDTOModel( userDTO = emptyUserDTO( id = bookingInfo.ownerId, - email = user?.email?:"", + email = user?.email ?: "", name = user?.userName.orEmpty() ), workspaceDTO = emptyWorkSpaceDTO(bookingInfo.workSpaceId), @@ -119,11 +121,14 @@ class BookingRepositoryImpl( workspaceDTO = emptyWorkSpaceDTO(creatingBookModel.workSpaceId), recurrence = recurrence ) - when(val creating= api.createBooking(bookingDTO)){ + when (val creating = api.createBooking(bookingDTO)) { is Either.Error -> { - println("Error create booking: ${creating.error}" + - "BooKingDTO: $bookingDTO") + println( + "Error create booking: ${creating.error}" + + "BooKingDTO: $bookingDTO" + ) } + is Either.Success -> println("Creating ok") } } @@ -136,53 +141,52 @@ class BookingRepositoryImpl( } override suspend fun getBookingsForUser( - ownerId: String, - bookingsFilter: BookingsFilter - ): Flow>, List>> = flow { - val response = api.getBookingsByUser(ownerId) - .convert(oldValue = lastResponse.value, filter = bookingsFilter) - lastResponse.update { response } - emit(response) - } - - - override suspend fun getBookingsByDate( ownerId: String?, - date: LocalDate, + beginDate: LocalDateTime, + endDate: LocalDateTime, bookingsFilter: BookingsFilter - ): Flow>, List>> = flow { + ): Flow>, List>> = flow { if (ownerId == null) { - val currentUserResponse = profileRepository.getUser() + val currentUserResponse = profileRepository.getUser() // TODO (Artem Gruzdev) use saved user params currentUserResponse.collect { userResponse -> when (userResponse) { is Either.Success -> { - val bookings = api.getBookingsByUser(userResponse.data.id) - .convertWithDateFilter( - oldValue = lastResponse.value, + val bookings = api + .getBookingsByUser( + userId = userResponse.data.id, + beginDate = localDateTimeToUnix(beginDate)!!, + endDate = localDateTimeToUnix(endDate)!! + ) + .convert( filter = bookingsFilter, - dateFilter = date + oldValue = lastResponse.value ) lastResponse.update { bookings } emit(bookings) } + is Either.Error -> { // TODO add implemetation for error } } } - } - else { - val bookings = api.getBookingsByUser(ownerId) - .convertWithDateFilter( - oldValue = lastResponse.value, + } else { + val bookings = api + .getBookingsByUser( + userId = ownerId, + beginDate = localDateTimeToUnix(beginDate)!!, + endDate = localDateTimeToUnix(endDate)!! + ) + .convert( filter = bookingsFilter, - dateFilter = date + oldValue = lastResponse.value ) lastResponse.update { bookings } emit(bookings) } } + private fun Either>.convert( filter: BookingsFilter, oldValue: Either>, @@ -203,18 +207,20 @@ class BookingRepositoryImpl( ) private fun placeFilter(filter: BookingsFilter, list: List) = - list.filter {booking -> + list.filter { booking -> when { filter.workPlace && filter.meetRoom -> true filter.workPlace -> booking.workspace.tag == "regular" filter.meetRoom -> booking.workspace.tag == "meeting" - else -> {false} + else -> { + false + } } } private fun Either>.convertWithDateFilter( filter: BookingsFilter, - oldValue: Either>,List>, + oldValue: Either>, List>, dateFilter: LocalDate ) = map(errorMapper = { error -> @@ -231,10 +237,11 @@ class BookingRepositoryImpl( .toDomainZone() .filter { println("repository: ${it.dateOfStart.date} == ${dateFilter}") - it.dateOfStart.date == dateFilter - } + it.dateOfStart.date == dateFilter + } } ) + private fun getRecurrenceModal( bookingPeriod: BookingPeriod?, typeEndPeriod: TypeEndPeriodBooking? @@ -256,6 +263,7 @@ class BookingRepositoryImpl( until = when (typeEndPeriod) { is TypeEndPeriodBooking.DatePeriodEnd -> localDateTimeToUnix(typeEndPeriod.date.atTime(hour = 0, minute = 0)) + else -> null }, byDay = when (bookingPeriod) { diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/entity/BookingInteractor.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/entity/BookingInteractor.kt index d8fc2e1b..1755e22c 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/entity/BookingInteractor.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/entity/BookingInteractor.kt @@ -23,19 +23,16 @@ class BookingInteractor( private val workspaceUseCase: WorkspacesUseCase, private val repository: BookingRepository // todo replace this ) { - suspend fun getForUser(ownerId:String): Flow>, List>> = - getBookingsUseCase.getBookingsForUser( - ownerId = ownerId, - bookingsFilter = BookingsFilter(meetRoom = true, workPlace = true) - ) - - - suspend fun getByDate( - date: LocalDate, + suspend fun getForUser( + ownerId:String? = null, + beginDateTime: LocalDateTime, + endDateTime: LocalDateTime, bookingsFilter: BookingsFilter ): Flow>, List>> = - getBookingsUseCase.getBookingsByDate( - date = date, + getBookingsUseCase.getBookingsForUser( + ownerId = ownerId, + beginDateTime = beginDateTime, + endDateTime = endDateTime, bookingsFilter = bookingsFilter ) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/BookingRepository.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/BookingRepository.kt index 242159bf..024c8e85 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/BookingRepository.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/BookingRepository.kt @@ -8,7 +8,7 @@ import band.effective.office.elevator.domain.models.TypeEndPeriodBooking import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.network.model.Either import kotlinx.coroutines.flow.Flow -import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime interface BookingRepository { suspend fun changeBooking( @@ -22,13 +22,10 @@ interface BookingRepository { suspend fun createBook(creatingBookModel: CreatingBookModel) suspend fun getBookingsForUser( - ownerId: String, - bookingsFilter: BookingsFilter - ): Flow>, List>> - - suspend fun getBookingsByDate( ownerId: String? = null, - date: LocalDate, + beginDate: LocalDateTime, + endDate: LocalDateTime, bookingsFilter: BookingsFilter ): Flow>, List>> + } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AboutEmployeeInteractor.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AboutEmployeeInteractor.kt index d7ab11d9..a2caa657 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AboutEmployeeInteractor.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AboutEmployeeInteractor.kt @@ -10,9 +10,9 @@ import band.effective.office.elevator.ui.models.ReservedSeat import band.effective.office.network.model.Either import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime class AboutEmployeeInteractor( private val employeeRepository: EmployeeRepository, @@ -22,20 +22,18 @@ class AboutEmployeeInteractor( suspend fun getBookingsForUser( ownerId:String, bookingsFilter: BookingsFilter, - coroutineScope: CoroutineScope + beginDateTime: LocalDateTime, + endDateTime: LocalDateTime, ): Flow>, List>> = bookingRepository - .getBookingsForUser(ownerId = ownerId, bookingsFilter = bookingsFilter) + .getBookingsForUser( + ownerId = ownerId, + endDate = endDateTime, + beginDate = beginDateTime, + bookingsFilter = bookingsFilter + ) .map() - suspend fun getBookingsByDate( - date: LocalDate, - ownerId: String, - bookingsFilter: BookingsFilter, - ): Flow>, List>> = - bookingRepository - .getBookingsByDate(ownerId = ownerId , date = date, bookingsFilter = bookingsFilter) - .map() private fun Flow>, List>>.map() = this.map{ response -> diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/GetBookingsUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/GetBookingsUseCase.kt index 139c1a52..c73730b4 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/GetBookingsUseCase.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/GetBookingsUseCase.kt @@ -10,27 +10,26 @@ import band.effective.office.network.model.Either import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime class GetBookingsUseCase( private val repository: BookingRepository ) { suspend fun getBookingsForUser( - ownerId:String, + ownerId:String? = null, + beginDateTime: LocalDateTime, + endDateTime: LocalDateTime, bookingsFilter: BookingsFilter, ): Flow>, List>> = repository - .getBookingsForUser(ownerId = ownerId, bookingsFilter = bookingsFilter) + .getBookingsForUser( + ownerId = ownerId, + beginDate = beginDateTime, + endDate = endDateTime, + bookingsFilter = bookingsFilter + ) .map () - - suspend fun getBookingsByDate( - date: LocalDate, - bookingsFilter: BookingsFilter, - ): Flow>, List>> = - repository - .getBookingsByDate(date = date, bookingsFilter = bookingsFilter) - .map() - private fun Flow>, List>>.map() = this.map{ response -> when(response) { diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt index f4b02038..1e60c8ea 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt @@ -18,11 +18,15 @@ import com.arkivanov.mvikotlin.core.store.StoreFactory import com.arkivanov.mvikotlin.core.utils.ExperimentalMviKotlinApi import com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor import com.arkivanov.mvikotlin.extensions.coroutines.coroutineBootstrapper +import com.commandiron.wheel_picker_compose.utils.Max +import com.commandiron.wheel_picker_compose.utils.Min import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.LocalTime import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -184,10 +188,11 @@ class AboutEmployeeStoreFactory( scope.launch(Dispatchers.IO) { aboutEmployeeInteractor - .getBookingsByDate( - date = date, - ownerId = ownerId, + .getBookingsForUser( bookingsFilter = bookingsFilter, + ownerId = ownerId, + beginDateTime = LocalDateTime(date = date, time = LocalTime.Min), + endDateTime = LocalDateTime(date = date, time = LocalTime.Max), ) .collect { newList -> withContext(Dispatchers.Main) { @@ -216,21 +221,20 @@ class AboutEmployeeStoreFactory( date: LocalDate, employee: User, bookingsFilter: BookingsFilter - ){ - + ) { scope.launch(Dispatchers.IO) { aboutEmployeeInteractor - .getBookingsByDate( - date = date, - ownerId = employee.id, + .getBookingsForUser( bookingsFilter = bookingsFilter, + ownerId = employee.id, + beginDateTime = LocalDateTime(date = date, time = LocalTime.Min), + endDateTime = LocalDateTime(date = date, time = LocalTime.Max), ).collect { newList -> withContext(Dispatchers.Main) { when (newList) { is Either.Error -> { //TODO show error on UI } - is Either.Success -> { dispatch( Msg.ProfileData( diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt index 6b961578..7e0ed4e4 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt @@ -16,6 +16,8 @@ import com.arkivanov.mvikotlin.core.store.StoreFactory import com.arkivanov.mvikotlin.core.utils.ExperimentalMviKotlinApi import com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor import com.arkivanov.mvikotlin.extensions.coroutines.coroutineBootstrapper +import com.commandiron.wheel_picker_compose.utils.Max +import com.commandiron.wheel_picker_compose.utils.Min import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.format import io.github.aakira.napier.Napier @@ -25,6 +27,8 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.LocalTime import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -236,7 +240,11 @@ internal class MainStoreFactory( scope.launch(Dispatchers.IO) { bookingInteractor - .getByDate(date = date, bookingsFilter = bookingsFilter) + .getForUser( + beginDateTime = LocalDateTime(date = date, time = LocalTime.Min), + endDateTime = LocalDateTime(date = date, time = LocalTime.Max), + bookingsFilter = bookingsFilter + ) .collect { bookings -> withContext(Dispatchers.Main) { when (bookings) { @@ -266,7 +274,11 @@ internal class MainStoreFactory( scope.launch { withContext(Dispatchers.IO) { bookingInteractor - .getByDate(date = date, bookingsFilter = bookingsFilter) + .getForUser( + beginDateTime = LocalDateTime(date = date, time = LocalTime.Min), + endDateTime = LocalDateTime(date = date, time = LocalTime.Max), + bookingsFilter = bookingsFilter + ) .collect { bookings -> withContext(Dispatchers.Main) { when (bookings) { diff --git a/contract/src/commonMain/kotlin/band/effective/office/network/api/Api.kt b/contract/src/commonMain/kotlin/band/effective/office/network/api/Api.kt index b6576653..222ed11c 100644 --- a/contract/src/commonMain/kotlin/band/effective/office/network/api/Api.kt +++ b/contract/src/commonMain/kotlin/band/effective/office/network/api/Api.kt @@ -50,7 +50,11 @@ interface Api { /**Get user's bookings * @param userId user id whose booking need get * @return list bookings current user*/ - suspend fun getBookingsByUser(userId: String): Either> + suspend fun getBookingsByUser( + userId: String, + beginDate: Long, + endDate: Long + ): Either> /**Get bookings in workspace * @param workspaceId workspace id to be reserved diff --git a/contract/src/commonMain/kotlin/band/effective/office/network/api/impl/ApiImpl.kt b/contract/src/commonMain/kotlin/band/effective/office/network/api/impl/ApiImpl.kt index cb8b24e8..805a5943 100644 --- a/contract/src/commonMain/kotlin/band/effective/office/network/api/impl/ApiImpl.kt +++ b/contract/src/commonMain/kotlin/band/effective/office/network/api/impl/ApiImpl.kt @@ -97,12 +97,18 @@ class ApiImpl : Api { } } - override suspend fun getBookingsByUser(userId: String): Either> = + override suspend fun getBookingsByUser( + userId: String, + beginDate: Long, + endDate: Long + ): Either> = client.securityResponse( urlString = "$baseUrl/bookings", ) { url { parameters.append("user_id", userId) + parameters.append("range_from", beginDate.toString()) + parameters.append("range_to", endDate.toString()) } } diff --git a/contract/src/commonMain/kotlin/band/effective/office/network/api/impl/ApiMock.kt b/contract/src/commonMain/kotlin/band/effective/office/network/api/impl/ApiMock.kt index db352f88..6fcd2fc1 100644 --- a/contract/src/commonMain/kotlin/band/effective/office/network/api/impl/ApiMock.kt +++ b/contract/src/commonMain/kotlin/band/effective/office/network/api/impl/ApiMock.kt @@ -90,10 +90,15 @@ class ApiMock(private val realApi: Api, mockFactory: MockFactory) : Api { realResponse = realApi.getBooking(id = id) ) - override suspend fun getBookingsByUser(userId: String): Either> = + override suspend fun getBookingsByUser(userId: String, beginDate: Long, endDate: Long): Either> = response( mock = bookings.value.filter { it.owner.id == userId }, - realResponse = realApi.getBookingsByUser(userId = userId) + realResponse = realApi + .getBookingsByUser( + userId = userId, + beginDate = beginDate, + endDate = endDate + ) ) override suspend fun getBookingsByWorkspaces(workspaceId: String): Either> = -- GitLab