Code Monkey home page Code Monkey logo

reactive-hotel-application's Introduction

Reactive-hotel-application🚀


File Tree Diagram

├───src
│   ├───main
│   │   ├───java
│   │   │   └───com
│   │   │       └───hotel
│   │   │           └───app
│   │   │               │   ReactiveHotelApplication.java
│   │   │               │
│   │   │               ├───config
│   │   │               │   │   AuthenticationManager.java
│   │   │               │   │   SecurityConfig.java
│   │   │               │   │   SecurityContext.java
│   │   │               │   │
│   │   │               │   ├───request
│   │   │               │   │       AuthenticationRequest.java
│   │   │               │   │       RegisterRequest.java
│   │   │               │   │
│   │   │               │   └───response
│   │   │               │           AuthenticationResponse.java
│   │   │               │
│   │   │               ├───controller
│   │   │               │       AuthController.java
│   │   │               │       HomeController.java
│   │   │               │
│   │   │               ├───dto
│   │   │               │       BookingInfoDto.java
│   │   │               │       ReviewInfoDto.java
│   │   │               │       RoomInfoDto.java
│   │   │               │
│   │   │               ├───enums
│   │   │               │       Role.java
│   │   │               │
│   │   │               ├───exceptions
│   │   │               │       ArrivalException.java
│   │   │               │       DatePastException.java
│   │   │               │       MaxPeriodException.java
│   │   │               │       ReviewExistException.java
│   │   │               │       RoomOccupiedException.java
│   │   │               │
│   │   │               ├───handler
│   │   │               │       Handler.java
│   │   │               │
│   │   │               ├───kafka
│   │   │               │   │   MessageRequest.java
│   │   │               │   │
│   │   │               │   ├───config
│   │   │               │   │       KafkaConsumerConfig.java
│   │   │               │   │       KafkaProducerConfig.java
│   │   │               │   │       KafkaTopicConfig.java
│   │   │               │   │
│   │   │               │   └───service
│   │   │               │           KafkaConsumerService.java
│   │   │               │           KafkaProducerService.java
│   │   │               │
│   │   │               ├───models
│   │   │               │       Booking.java
│   │   │               │       Customer.java
│   │   │               │       Review.java
│   │   │               │       Room.java
│   │   │               │       RoomType.java
│   │   │               │       Users.java
│   │   │               │
│   │   │               ├───repository
│   │   │               │       BookingRepository.java
│   │   │               │       CustomerRepository.java
│   │   │               │       ReviewRepository.java
│   │   │               │       RoomRepository.java
│   │   │               │       RoomTypeRepository.java
│   │   │               │       UsersRepository.java
│   │   │               │
│   │   │               ├───service
│   │   │               │   │   RoomService.java
│   │   │               │   │   RoomTypeService.java
│   │   │               │   │   UsersService.java
│   │   │               │   │
│   │   │               │   └───impl
│   │   │               │           RoomServiceImpl.java
│   │   │               │           RoomTypeServiceImpl.java
│   │   │               │           UsersServiceImpl.java
│   │   │               │
│   │   │               └───validate
│   │   │                   │   EmailValidator.java
│   │   │                   │   PhoneNumberValidator.java
│   │   │                   │
│   │   │                   └───impl
│   │   │                           EmailValidatorImpl.java
│   │   │                           PhoneNumberValidatorImpl.java
│   │   │
│   │   ├───kotlin
│   │   │   └───com
│   │   │       └───hotel
│   │   │           └───app
│   │   │               ├───config
│   │   │               │       BookingConfig.kt
│   │   │               │       CustomerConfig.kt
│   │   │               │       ReviewConfig.kt
│   │   │               │       UsersConfig.kt
│   │   │               │
│   │   │               ├───controller
│   │   │               │       AdminController.kt
│   │   │               │       BookingController.kt
│   │   │               │       ManagerController.kt
│   │   │               │       ProfileController.kt
│   │   │               │       ReviewController.kt
│   │   │               │
│   │   │               ├───fcm
│   │   │               │   ├───config
│   │   │               │   │       FCMInitializer.kt
│   │   │               │   │
│   │   │               │   ├───models
│   │   │               │   │       PushRequest.kt
│   │   │               │   │       PushResponse.kt
│   │   │               │   │
│   │   │               │   └───service
│   │   │               │           FCMService.kt
│   │   │               │           PushService.kt
│   │   │               │
│   │   │               ├───service
│   │   │               │   │   BookingService.kt
│   │   │               │   │   CustomerService.kt
│   │   │               │   │   JwtService.kt
│   │   │               │   │   ReviewService.kt
│   │   │               │   │
│   │   │               │   └───impl
│   │   │               │           AuthenticationServiceImpl.kt
│   │   │               │           BookingServiceImpl.kt
│   │   │               │           CustomerServiceImpl.kt
│   │   │               │           JwtServiceImpl.kt
│   │   │               │           ReviewServiceImpl.kt
│   │   │               │
│   │   │               └───validate
│   │   │                       BookingValidate.kt
│   │   │
│   │   └───resources
│   │           application.properties
│   │
│   └───test
│       └───java
│           └───com
│               └───hotel
│                   └───app
│                       └───reactivehotelapplication
│                           │   ReactiveHotelApplicationTests.java
│                           │
│                           ├───controller
│                           │       AuthControllerTests.java
│                           │       BookingControllerTests.java
│                           │       HomeControllerTests.java
│                           │       ProfileControllerTests.java
│                           │       ReviewControllerTests.java
│                           │
│                           └───validate
│                                   BookingValidateTest.java
│                                   RegisterValidateTest.java

reactive-hotel-application's People

Contributors

rezozo avatar

Watchers

 avatar

reactive-hotel-application's Issues

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


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

Лишний Mono

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

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

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

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"))

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

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())), таким образом мок сработает только если аргуемент равен нужному значению. Если произошел вызов с другим аргументом, то мокито выдаст ошибку, что мок не был использован. К тому же, в реакторе вызов метода не означает, что его результат будет потреблен

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)

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

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 и скопмить ему все методы, которые можно сделать параллельно

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.