Git Product home page Git Product logo

reactive-hotel-application's People

Contributors

rezozo avatar

Watchers

 avatar

reactive-hotel-application's Issues

Ендпоинты должны быть реактивными


Желательно делать все ендпоинты реактивными. Спринг может и сам оборачивать их в Mono.just, но может не всегда так делать, в зависиости от того, какие есть зависимости в проекте. Лучше дополнительно ему указать, что это реактивный ендпоинт.

Использование блокирующих операций

https://github.com/Rezozo/reactive-hotel-application/blob/55629b7ae059f6d0dfd42625f2ebefbccde79302/src/main/kotlin/com/hotel/app/controller/BookingController.kt#LL39C47-L39C47
Не стоит использовать блокирующие операции в реакторе, а .toFuture().get() блокирующая операция, хоть и скрывает это. Пропадает смысл реактивности.
Можно немного переделать метод BookingService#getCost, что бы он принимал в качестве аргументов price, arrivalDate и departureDate и заполнять цену после создания Booking.
Также можно избавиться от вложенности flatMap'ов, воспользовавшись методом Mono.Zip и скопмить ему все методы, которые можно сделать параллельно

Order direction в String

https://github.com/Rezozo/reactive-hotel-application/blob/55629b7ae059f6d0dfd42625f2ebefbccde79302/src/main/java/com/hotel/app/repository/ReviewRepository.java#LL32C36-L32C36
Не стоит лишний раз использовать стринг. У тебя всего 3 возможных состояния, ASC,DESC и UNDEFINED, так, что напрашивается енам. Более того, у спринга уже есть все это, смотри Pageable
И еще, спринг дата умеет сам генерить запросы. Т.е. если ты создашь метод Flux<ReviewInfoDto> findAllByRate(long rate,Pageable page) спринг сам создаст нужный запрос и добавит к нему пагинацию. Также можно сделать и Flux<ReviewInfoDto> findAllByRate(long rate,Sort sort)

Тестирование на вызов метода

when(bookingService.getArrivalDates(room.getId())).thenReturn(Flux.just(arrival.plusWeeks(2)));

Что бы не дублировать when(bookingService.getArrivalDates(room.getId()) и verify(bookingService).getArrivalDates(room.getId()) можно сделать when(bookingService.getArrivalDates(eq(room.getId())), таким образом мок сработает только если аргуемент равен нужному значению. Если произошел вызов с другим аргументом, то мокито выдаст ошибку, что мок не был использован. К тому же, в реакторе вызов метода не означает, что его результат будет потреблен

Бессмысленный вызов метода

https://github.com/Rezozo/reactive-hotel-application/blob/55629b7ae059f6d0dfd42625f2ebefbccde79302/src/main/kotlin/com/hotel/app/controller/ProfileController.kt#LL25C1-L25C1
customerService.updateCustomer возвращает мону, которая не будет вызываться, так как на нее некто не подписан. Мона срабатывает только тогда, когда у нее есть хотя бы 1 подписчик. Как правило спринг сам это разруливает и подписывается на контроллере. Внутри контроллеров у спринга уже нет власти и ты должен ему помочь. Т.е. сделать что-то вроде

 usersService.updateById(customer.id, customer.email, customer.fullName)
.then(customerService.updateCustomer(customer))
.thenReturn(ResponseEntity.ok("Success"))

или даже

 Mono.Zip(usersService.updateById(customer.id, customer.email, customer.fullName),
                 customerService.updateCustomer(customer))
                 (unused,unused2)->ResponseEntity.ok("Success"))

Лишний Mono

override fun generateToken(extraClaims: Map<String, Any>, userDetails: UserDetails): Mono<String> {

Если можно обойтись без реактора, то лучше так и сделать. Реактор несколько усложняет код, и его имеет смысл использовать только там, нде это необходимо. В этом классе почти во всех методах можно обойтись без Mono

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.