From 44fac9c936280f12926bb4fa83eb9754db31a606 Mon Sep 17 00:00:00 2001 From: Mohamed Taman Date: Thu, 9 Apr 2020 12:33:53 +0200 Subject: [PATCH 1/3] Add custom banners to microservices --- .../src/main/resources/banner.txt | 13 +++++++++++++ product-service/src/main/resources/banner.txt | 13 +++++++++++++ .../src/main/resources/banner.txt | 13 +++++++++++++ review-service/src/main/resources/banner.txt | 13 +++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 product-composite-service/src/main/resources/banner.txt create mode 100644 product-service/src/main/resources/banner.txt create mode 100644 recommendation-service/src/main/resources/banner.txt create mode 100644 review-service/src/main/resources/banner.txt diff --git a/product-composite-service/src/main/resources/banner.txt b/product-composite-service/src/main/resources/banner.txt new file mode 100644 index 00000000..dc04004f --- /dev/null +++ b/product-composite-service/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + _____ _ _ __ _______ _____ _ _____ _ ______ + / ____(_) (_) \ \ / /_ _| / ____| (_) / ____| | \ \ \ \ +| (___ _ _ __ _ _ _ ___ \ V / | | ______ | (___ _ __ _ __ _ _ __ __ _ _ _ | (___ | |_ ___ _ __ ___ \ \ \ \ + \___ \| | '__| | | | / __| > < | | |______| \___ \| '_ \| '__| | '_ \ / _` | | | | \___ \| __/ _ \| '__/ _ \ > > > > + ____) | | | | | |_| \__ \/ . \ _| |_ ____) | |_) | | | | | | | (_| | |_| | ____) | || (_) | | | __// / / / +|_____/|_|_| |_|\__,_|___/_/ \_\_____| |_____/| .__/|_| |_|_| |_|\__, |\__, | |_____/ \__\___/|_| \___/_/_/_/ + | | __/ | __/ | + |_| |___/ |___/ + +:: ${application.title} (Microservice) :: v${application.version} :: Built with Spring Boot :: v${spring-boot.version} + + diff --git a/product-service/src/main/resources/banner.txt b/product-service/src/main/resources/banner.txt new file mode 100644 index 00000000..dc04004f --- /dev/null +++ b/product-service/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + _____ _ _ __ _______ _____ _ _____ _ ______ + / ____(_) (_) \ \ / /_ _| / ____| (_) / ____| | \ \ \ \ +| (___ _ _ __ _ _ _ ___ \ V / | | ______ | (___ _ __ _ __ _ _ __ __ _ _ _ | (___ | |_ ___ _ __ ___ \ \ \ \ + \___ \| | '__| | | | / __| > < | | |______| \___ \| '_ \| '__| | '_ \ / _` | | | | \___ \| __/ _ \| '__/ _ \ > > > > + ____) | | | | | |_| \__ \/ . \ _| |_ ____) | |_) | | | | | | | (_| | |_| | ____) | || (_) | | | __// / / / +|_____/|_|_| |_|\__,_|___/_/ \_\_____| |_____/| .__/|_| |_|_| |_|\__, |\__, | |_____/ \__\___/|_| \___/_/_/_/ + | | __/ | __/ | + |_| |___/ |___/ + +:: ${application.title} (Microservice) :: v${application.version} :: Built with Spring Boot :: v${spring-boot.version} + + diff --git a/recommendation-service/src/main/resources/banner.txt b/recommendation-service/src/main/resources/banner.txt new file mode 100644 index 00000000..dc04004f --- /dev/null +++ b/recommendation-service/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + _____ _ _ __ _______ _____ _ _____ _ ______ + / ____(_) (_) \ \ / /_ _| / ____| (_) / ____| | \ \ \ \ +| (___ _ _ __ _ _ _ ___ \ V / | | ______ | (___ _ __ _ __ _ _ __ __ _ _ _ | (___ | |_ ___ _ __ ___ \ \ \ \ + \___ \| | '__| | | | / __| > < | | |______| \___ \| '_ \| '__| | '_ \ / _` | | | | \___ \| __/ _ \| '__/ _ \ > > > > + ____) | | | | | |_| \__ \/ . \ _| |_ ____) | |_) | | | | | | | (_| | |_| | ____) | || (_) | | | __// / / / +|_____/|_|_| |_|\__,_|___/_/ \_\_____| |_____/| .__/|_| |_|_| |_|\__, |\__, | |_____/ \__\___/|_| \___/_/_/_/ + | | __/ | __/ | + |_| |___/ |___/ + +:: ${application.title} (Microservice) :: v${application.version} :: Built with Spring Boot :: v${spring-boot.version} + + diff --git a/review-service/src/main/resources/banner.txt b/review-service/src/main/resources/banner.txt new file mode 100644 index 00000000..dc04004f --- /dev/null +++ b/review-service/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + _____ _ _ __ _______ _____ _ _____ _ ______ + / ____(_) (_) \ \ / /_ _| / ____| (_) / ____| | \ \ \ \ +| (___ _ _ __ _ _ _ ___ \ V / | | ______ | (___ _ __ _ __ _ _ __ __ _ _ _ | (___ | |_ ___ _ __ ___ \ \ \ \ + \___ \| | '__| | | | / __| > < | | |______| \___ \| '_ \| '__| | '_ \ / _` | | | | \___ \| __/ _ \| '__/ _ \ > > > > + ____) | | | | | |_| \__ \/ . \ _| |_ ____) | |_) | | | | | | | (_| | |_| | ____) | || (_) | | | __// / / / +|_____/|_|_| |_|\__,_|___/_/ \_\_____| |_____/| .__/|_| |_|_| |_|\__, |\__, | |_____/ \__\___/|_| \___/_/_/_/ + | | __/ | __/ | + |_| |___/ |___/ + +:: ${application.title} (Microservice) :: v${application.version} :: Built with Spring Boot :: v${spring-boot.version} + + From 6d004602ffb787e3b826bf766b5249d3a9e6e07f Mon Sep 17 00:00:00 2001 From: Mohamed Taman Date: Fri, 10 Apr 2020 13:22:50 +0200 Subject: [PATCH 2/3] Add new system diagram - Show dockerized services. - Show new System layers. - Show used databases. --- README.md | 5 ++--- docs/stage1/app_ms_landscape.png | Bin 230918 -> 171405 bytes 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b2523b27..2379f06f 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,7 @@ ------ I am developing this project as stages, and all such stages are documented under project - **Springy Store μServices** [wiki page](https://github.com/mohamed-taman/Springy-Store - -Microservices/wiki). Each of such stage will be a release in its owen, so you can go back and + **Springy Store μServices** [wiki page](https://github.com/mohamed-taman/Springy-Store-Microservices/wiki). Each of such stage will be a release in its owen, so you can go back and forward between releases to see the differences and how adding things solve specific problems we face. @@ -45,7 +44,7 @@ The following topics are going to be covered in this 1st stage (other stages top ### Required software -The following software pieces are initially required: +The following are the initially required software pieces: 1. **Git**: it can be downloaded and installed from https://git-scm.com/downloads. diff --git a/docs/stage1/app_ms_landscape.png b/docs/stage1/app_ms_landscape.png index 6ed5030d9136e7f1cb74d16221708a9c1f8c7478..cc3287492d8e3bdcb971bd290ab0d004cefe9c59 100644 GIT binary patch literal 171405 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

eUATRK5!w6 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 literal 230918 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

+Fp_b{@#@LjneA-8-Jb5KYUmWWVC|K~%Fjh(7 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 O>$0XUyimjP@&5n^8Jr0K From 311b1c9e110dcf17020631cee9a01fe9a24da8b7 Mon Sep 17 00:00:00 2001 From: Mohamed Taman Date: Sun, 12 Apr 2020 18:06:46 +0200 Subject: [PATCH 3/3] Updating MServices to use persistence layer (resolves #31, resolves #32, resolves #33, resolves #34, resolves #35, resolves #36, resolves #37, resolves #38, resolves #39) - Add dependencies, persistence layer, and test classes to product MService. - Add dependencies, persistence layer, and test classes to review MService. - Add dependencies, persistence layer, and test classes to recommendation MService. - Extend store MService to add all CRUD functionalities. - Refactor `product-composite` service to be `store-service`. - Add swagger API to Readme.md file. - Update base entry URL to be `store/api/v1/products`. - Arrange all dependencies to remove duplicates between services and shared libraries. - Update docker-compose file with latest MySQL, MongoDB database configurations. --- README.md | 103 ++++---- docker-compose.yml | 44 +++- pom.xml | 3 +- .../ProductCompositeServiceImpl.java | 85 ------- .../ProductCompositeIntegration.java | 157 ------------ ...oductCompositeServiceApplicationTests.java | 103 -------- product-service/pom.xml | 17 ++ .../store/ps/ProductServiceApplication.java | 9 +- .../ms/store/ps/controller/ProductMapper.java | 20 ++ .../ps/controller/ProductServiceImpl.java | 46 +++- .../store/ps/persistence/ProductEntity.java | 32 +++ .../ps/persistence/ProductRepository.java | 12 + .../src/main/resources/application.yaml | 11 +- .../com/siriusxi/ms/store/ps/MapperTests.java | 36 +++ .../ms/store/ps/PersistenceTests.java | 157 ++++++++++++ .../ps/ProductServiceApplicationTests.java | 128 +++++++--- recommendation-service/pom.xml | 17 ++ .../rs/RecommendationServiceApplication.java | 9 +- .../rs/controller/RecommendationMapper.java | 28 +++ .../controller/RecommendationServiceImpl.java | 51 +++- .../rs/persistence/RecommendationEntity.java | 40 +++ .../persistence/RecommendationRepository.java | 11 + .../src/main/resources/application.yaml | 13 +- .../com/siriusxi/ms/store/rs/MapperTests.java | 73 ++++++ .../ms/store/rs/PersistenceTests.java | 125 ++++++++++ ...RecommendationServiceApplicationTests.java | 153 ++++++++---- review-service/pom.xml | 24 ++ .../store/revs/ReviewServiceApplication.java | 11 +- .../store/revs/controller/ReviewMapper.java | 27 ++ .../revs/controller/ReviewServiceImpl.java | 65 +++-- .../store/revs/persistence/ReviewEntity.java | 35 +++ .../revs/persistence/ReviewRepository.java | 14 ++ .../src/main/resources/application.yaml | 19 +- .../siriusxi/ms/store/revs/MapperTests.java | 73 ++++++ .../ms/store/revs/PersistenceTests.java | 125 ++++++++++ .../revs/ReviewServiceApplicationTests.java | 155 ++++++++---- setup.sh | 8 +- store-api/pom.xml | 10 - .../ms/store/api/composite/StoreService.java | 104 ++++++++ .../{product => }/dto/ProductAggregate.java | 7 +- .../dto/RecommendationSummary.java | 4 +- .../{product => }/dto/ReviewSummary.java | 4 +- .../{product => }/dto/ServiceAddresses.java | 3 +- .../product/ProductCompositeService.java | 38 --- .../ms/store/api/core/product/Product.java | 10 +- .../api/core/product/ProductService.java | 49 +++- .../core/recommendation/Recommendation.java | 12 +- .../recommendation/RecommendationService.java | 51 ++-- .../ms/store/api/core/review/Review.java | 14 +- .../store/api/core/review/ReviewService.java | 38 ++- store-build-chassis/pom.xml | 34 ++- store-service-chassis/pom.xml | 18 +- .../Dockerfile | 0 .../pom.xml | 6 +- .../ms/store/pcs/StoreServiceApplication.java | 5 +- .../store/pcs/config/StoreConfiguration.java | 8 +- .../pcs/controller/StoreServiceImpl.java | 127 ++++++++++ .../pcs/integration/StoreIntegration.java | 234 ++++++++++++++++++ ...itional-spring-configuration-metadata.json | 20 ++ .../src/main/resources/application.yaml | 39 +-- .../src/main/resources/banner.txt | 0 .../pcs/StoreServiceApplicationTests.java | 146 +++++++++++ store-utils/pom.xml | 39 +-- test-em-all.sh | 59 ++++- 64 files changed, 2375 insertions(+), 743 deletions(-) delete mode 100644 product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/controller/ProductCompositeServiceImpl.java delete mode 100644 product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/integration/ProductCompositeIntegration.java delete mode 100644 product-composite-service/src/test/java/com/siriusxi/ms/store/pcs/ProductCompositeServiceApplicationTests.java create mode 100644 product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductMapper.java create mode 100644 product-service/src/main/java/com/siriusxi/ms/store/ps/persistence/ProductEntity.java create mode 100644 product-service/src/main/java/com/siriusxi/ms/store/ps/persistence/ProductRepository.java create mode 100644 product-service/src/test/java/com/siriusxi/ms/store/ps/MapperTests.java create mode 100644 product-service/src/test/java/com/siriusxi/ms/store/ps/PersistenceTests.java create mode 100644 recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationMapper.java create mode 100644 recommendation-service/src/main/java/com/siriusxi/ms/store/rs/persistence/RecommendationEntity.java create mode 100644 recommendation-service/src/main/java/com/siriusxi/ms/store/rs/persistence/RecommendationRepository.java create mode 100644 recommendation-service/src/test/java/com/siriusxi/ms/store/rs/MapperTests.java create mode 100644 recommendation-service/src/test/java/com/siriusxi/ms/store/rs/PersistenceTests.java create mode 100644 review-service/src/main/java/com/siriusxi/ms/store/revs/controller/ReviewMapper.java create mode 100644 review-service/src/main/java/com/siriusxi/ms/store/revs/persistence/ReviewEntity.java create mode 100644 review-service/src/main/java/com/siriusxi/ms/store/revs/persistence/ReviewRepository.java create mode 100644 review-service/src/test/java/com/siriusxi/ms/store/revs/MapperTests.java create mode 100644 review-service/src/test/java/com/siriusxi/ms/store/revs/PersistenceTests.java create mode 100644 store-api/src/main/java/com/siriusxi/ms/store/api/composite/StoreService.java rename store-api/src/main/java/com/siriusxi/ms/store/api/composite/{product => }/dto/ProductAggregate.java (72%) rename store-api/src/main/java/com/siriusxi/ms/store/api/composite/{product => }/dto/RecommendationSummary.java (72%) rename store-api/src/main/java/com/siriusxi/ms/store/api/composite/{product => }/dto/ReviewSummary.java (71%) rename store-api/src/main/java/com/siriusxi/ms/store/api/composite/{product => }/dto/ServiceAddresses.java (82%) delete mode 100644 store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/ProductCompositeService.java rename {product-composite-service => store-service}/Dockerfile (100%) rename {product-composite-service => store-service}/pom.xml (87%) rename product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/ProductCompositeServiceApplication.java => store-service/src/main/java/com/siriusxi/ms/store/pcs/StoreServiceApplication.java (78%) rename product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/config/ProductCompositeConfiguration.java => store-service/src/main/java/com/siriusxi/ms/store/pcs/config/StoreConfiguration.java (92%) create mode 100644 store-service/src/main/java/com/siriusxi/ms/store/pcs/controller/StoreServiceImpl.java create mode 100644 store-service/src/main/java/com/siriusxi/ms/store/pcs/integration/StoreIntegration.java rename {product-composite-service => store-service}/src/main/resources/META-INF/additional-spring-configuration-metadata.json (75%) rename {product-composite-service => store-service}/src/main/resources/application.yaml (59%) rename {product-composite-service => store-service}/src/main/resources/banner.txt (100%) create mode 100644 store-service/src/test/java/com/siriusxi/ms/store/pcs/StoreServiceApplicationTests.java diff --git a/README.md b/README.md index 2379f06f..f67118e7 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,11 @@ I am developing this project as stages, and all such stages are documented under For example; in the first stage (1st release) I just created project structure, basic services' skeleton, integration between them, and finally write integration testing as well as semi-automated testing for the whole services' functionality. -At 1st stage the **recommendation** and **review** microservices generate local in-memory data and **product composite service** calls the other three services (*product*, *recommendation*, and *review*) statically to generate client aggregate response for a specific product. Therefore, in: +At 1st stage the **Recommendation** and **Review** microservices generate local in-memory data + and **Store Service** calls the other three services (*Product*, *Recommendation*, and *Review*) statically to generate client aggregate response for a specific product. Therefore, in: -- The second stage I will introduce **database integration**, then in -- The third stage I will introduce **Dockerization** of our services and **docker-compose**, and in +- The second stage I will introduce **database integration**, then in (***done***) +- The third stage I will introduce **Dockerization** of our services and **docker-compose**, and in (***done***) - The fourth stage I will introduce **service discovery**, and so on. ## Getting started @@ -32,13 +33,13 @@ The following topics are going to be covered in this 1st stage (other stages top - Introducing the microservice landscape. - Generating skeleton microservices. - Adding RESTful APIs. -- Adding a **product composite**, **product**, **recommendation**, and **review** microservices. +- Adding a **Store**, **Product**, **Recommendation**, and **Review** microservices. - Adding error handling. - Testing the APIs manually. - Adding automated tests of microservices in isolation. - Adding semi-automated tests to a microservice landscape. -### System Boundary - μServices Landscape +### System Boundary - μServices Landscape (Release 3) ![System Boundary](docs/stage1/app_ms_landscape.png) @@ -56,6 +57,8 @@ The following are the initially required software pieces: 5. Spring Boot Initializer: This *Initializer* generates *spring* boot project with just what you need to start quickly! start from here https://start.spring.io/. +6. **Docker Desktop**: The fastest way to containerize applications on your desktop, and you can download it from here [https://www.docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop) + > For each future stage, I will list the newly required software. Follow the installation guide for each software website and check your software versions from the command line to verify that they are installed correctly. @@ -84,7 +87,9 @@ To build and run test cases for each service & shared modules in the project we > This done only for the first time or any new version of shared modules. -To build and install `store-utils`, `store-api`, `store-chassis` libraries, from the root folder `springy-store-microservices` run the following commands: +To build and install `store-build-chassis`, `store-utils`, `store-api`, `store-chassis` libraries +, from the root + folder `springy-store-microservices` run the following commands: ```bash mohamed.taman@DTLNV8 ~/springy-store-microservices @@ -97,16 +102,16 @@ Now you should expect output like this: Installing all Springy store core shared modules ................................................ -1- Installing [build parent] module... +1- Installing [Parent Build Chassis] module... Done successfully. -2- Installing shared [Utilities] module... +2- Installing shared [Services Utilities] module... Done successfully. -3- Installing shared [APIs] module... +3- Installing shared [Services APIs] module... Done successfully. -4- Installing [service parent] module... +4- Installing [Services Parent Chassis] module... Done successfully. Woohoo, building & installing all project modules are finished successfully. @@ -119,7 +124,7 @@ Now it is time to build our **4 microservices** and run each service integration ```bash mohamed.taman@DTLNV8 ~/springy-store-microservices -λ ./mvnw clean verify +λ ./mvnw clean verify -Ddockerfile.skip ``` All build commands and test suite for each microservice should run successfully, and the final output should be like this: @@ -137,7 +142,7 @@ All build commands and test suite for each microservice should run successfully, [INFO] Springy Store APIs ................................. SUCCESS [ 3.920 s] [INFO] Springy Store Utils ................................ SUCCESS [ 1.508 s] [INFO] Springy Store Chassis .............................. SUCCESS [ 0.608 s] -[INFO] Product Composite Service .......................... SUCCESS [ 4.073 s] +[INFO] Store Service ...................................... SUCCESS [ 4.073 s] [INFO] Product Service .................................... SUCCESS [ 2.710 s] [INFO] Review Service ..................................... SUCCESS [ 2.633 s] [INFO] Recommendation Service ............................. SUCCESS [ 2.615 s] @@ -151,22 +156,36 @@ All build commands and test suite for each microservice should run successfully, ``` ### Running Them All -Now it's the time to run all of them, and it's very simple just run the following two commands: +Now it's the time to run all of them, and it's very simple just run the following *docker compose* commands: ```bash mohamed.taman@DTLNV8 ~/springy-store-microservices -λ ./run-em-all.sh +λ docker-compose -p ssm up -d +``` + +All the **services** and **databases** will run in parallel in detached mode (option `-d`), and their output will be printed to the console as the following: + +```bash +Creating network "ssm_default" with the default driver +Creating ssm_mysql_1 ... done +Creating ssm_mongodb_1 ... done +Creating ssm_store_1 ... done +Creating ssm_review_1 ... done +Creating ssm_product_1 ... done +Creating ssm_recommendation_1 ... done ``` -All the services will run in parallel, and their output will be printed to the console. +### Access Store APIs +You can manually test `Store Service` APIs through out its **Swagger** interface at the following + URL [http://localhost:8080/swagger-ui.html](http://localhost:8080/swagger-ui.html). ### Testing Them All -Now it's time to test all functionality of the application as one part. To do so just run +Now it's time to test all the application functionality as one part. To do so just run the following automation test script: ```bash mohamed.taman@DTLNV8 ~/springy-store-microservices -λ PORT=9080 ./test-em-all.sh +λ ./test-em-all.sh ``` The result should be something like this: @@ -174,14 +193,18 @@ The result should be something like this: ```bash Starting [Springy Store] full functionality testing.... +Start: Sun, Apr 12, 2020 2:34:19 PM HOST=localhost -PORT=9080 +PORT=8080 +Wait for: curl -X DELETE http://localhost:8080/store/api/v1/products/13... Ok +Test OK (HTTP Code: 200) +Test OK (HTTP Code: 200) +Test OK (HTTP Code: 200) Test OK (HTTP Code: 200) Test OK (actual value: 1) Test OK (actual value: 3) Test OK (actual value: 3) -Test OK (HTTP Code: 404, {"httpStatus":"NOT_FOUND","message":"No product found for productId: 13 -","path":"/v1/product-composite/13","time":"2020-04-01@14:51:48.812+0200"}) +Test OK (HTTP Code: 404, {"httpStatus":"NOT_FOUND","message":"No product found for productId: 13","path":"/store/api/v1/products/13","time":"2020-04-12@12:34:25.144+0000"}) Test OK (HTTP Code: 200) Test OK (actual value: 113) Test OK (actual value: 0) @@ -190,12 +213,11 @@ Test OK (HTTP Code: 200) Test OK (actual value: 213) Test OK (actual value: 3) Test OK (actual value: 0) -Test OK (HTTP Code: 422, {"httpStatus":"UNPROCESSABLE_ENTITY","message":"Invalid productId: -1 -","path":"/v1/product-composite/-1","time":"2020-04-01@14:51:49.763+0200"}) +Test OK (HTTP Code: 422, {"httpStatus":"UNPROCESSABLE_ENTITY","message":"Invalid productId: -1","path":"/store/api/v1/products/-1","time":"2020-04-12@12:34:26.243+0000"}) Test OK (actual value: "Invalid productId: -1") -Test OK (HTTP Code: 400, {"timestamp":"2020-04-01T12:51:49.965+0000","path":"/v1/product-composite -/invalidProductId","status":400,"error":"Bad Request","message":"Type mismatch."}) +Test OK (HTTP Code: 400, {"timestamp":"2020-04-12T12:34:26.471+00:00","path":"/store/api/v1/products/invalidProductId","status":400,"error":"Bad Request","message":"Type mismatch.","requestId":"044dcdf2-13"}) Test OK (actual value: "Type mismatch.") +End: Sun, Apr 12, 2020 2:34:26 PM ``` ### Closing The Story @@ -205,30 +227,25 @@ Finally, to close the story, we will need to shut down Microservices manually se ```bash mohamed.taman@DTLNV8 ~/springy-store-microservices -λ ./stop-em-all.sh +λ docker-compose -p ssm down ``` And the output should be as the following: ```bash -Stopping [Springy Store] μServices .... ---------------------------------------- - -Stopping Microservice at port 9080 .... -{"message":"Shutting down, bye..."} -Microservice at port 9080 stopped successfully .... - -Stopping Microservice at port 9081 .... -{"message":"Shutting down, bye..."} -Microservice at port 9081 stopped successfully .... - -Stopping Microservice at port 9082 .... -{"message":"Shutting down, bye..."} -Microservice at port 9082 stopped successfully .... - -Stopping Microservice at port 9083 .... -{"message":"Shutting down, bye..."} -Microservice at port 9083 stopped successfully .... +Stopping ssm_recommendation_1 ... done +Stopping ssm_product_1 ... done +Stopping ssm_review_1 ... done +Stopping ssm_mongodb_1 ... done +Stopping ssm_store_1 ... done +Stopping ssm_mysql_1 ... done +Removing ssm_recommendation_1 ... done +Removing ssm_product_1 ... done +Removing ssm_review_1 ... done +Removing ssm_mongodb_1 ... done +Removing ssm_store_1 ... done +Removing ssm_mysql_1 ... done +Removing network ssm_default ``` ### The End diff --git a/docker-compose.yml b/docker-compose.yml index 9e3972c9..aaba381c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,28 +1,58 @@ -version: '2.1' +version: '3.7' ## Latest version works with Docker Engine release 18.06.0+ services: product: build: product-service - mem_limit: 350m environment: - SPRING_PROFILES_ACTIVE=docker + depends_on: + - mongodb recommendation: build: recommendation-service - mem_limit: 350m environment: - SPRING_PROFILES_ACTIVE=docker + depends_on: + - mongodb review: build: review-service - mem_limit: 350m environment: - SPRING_PROFILES_ACTIVE=docker + depends_on: + - mysql - product-composite: - build: product-composite-service - mem_limit: 350m + store: + build: store-service ports: - "8080:8080" environment: - SPRING_PROFILES_ACTIVE=docker + + # $ mongo + mongodb: + image: mongo:4.2.5-bionic + ports: + - "27017-27019:27017-27019" + healthcheck: + test: echo 'db.runCommand("ping").ok' | mongo mongo:27017/test --quiet 1 + interval: 10s + timeout: 10s + retries: 5 + start_period: 40s + + # $ mysql -uroot -h127.0.0.1 -p + mysql: + image: mysql:8.0.19 + ports: + - "3306:3306" + environment: + - MYSQL_ROOT_PASSWORD=rootpwd + - MYSQL_DATABASE=review-db + - MYSQL_USER=user + - MYSQL_PASSWORD=pwd + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-uuser", "-ppwd", "-h", "localhost"] + interval: 10s + timeout: 5s + retries: 10 diff --git a/pom.xml b/pom.xml index 9ebd5f3d..b02a4ce5 100644 --- a/pom.xml +++ b/pom.xml @@ -16,12 +16,11 @@ true - - product-composite-service product-service review-service recommendation-service + store-service store-api store-utils store-build-chassis diff --git a/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/controller/ProductCompositeServiceImpl.java b/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/controller/ProductCompositeServiceImpl.java deleted file mode 100644 index 01724914..00000000 --- a/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/controller/ProductCompositeServiceImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.siriusxi.ms.store.pcs.controller; - -import com.siriusxi.ms.store.api.composite.product.ProductCompositeService; -import com.siriusxi.ms.store.api.composite.product.dto.ProductAggregate; -import com.siriusxi.ms.store.api.composite.product.dto.RecommendationSummary; -import com.siriusxi.ms.store.api.composite.product.dto.ReviewSummary; -import com.siriusxi.ms.store.api.composite.product.dto.ServiceAddresses; -import com.siriusxi.ms.store.api.core.product.Product; -import com.siriusxi.ms.store.api.core.recommendation.Recommendation; -import com.siriusxi.ms.store.api.core.review.Review; -import com.siriusxi.ms.store.pcs.integration.ProductCompositeIntegration; -import com.siriusxi.ms.store.util.exceptions.NotFoundException; -import com.siriusxi.ms.store.util.http.ServiceUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.stream.Collectors; - -@RestController -public class ProductCompositeServiceImpl implements ProductCompositeService { - - private final ServiceUtil serviceUtil; - private final ProductCompositeIntegration integration; - - @Autowired - public ProductCompositeServiceImpl(ServiceUtil serviceUtil, ProductCompositeIntegration integration) { - this.serviceUtil = serviceUtil; - this.integration = integration; - } - - @Override - public ProductAggregate getProduct(int productId) { - - var product = integration.getProduct(productId); - if (product == null) - throw new NotFoundException("No product found for productId: " + productId); - - var recommendations = integration.getRecommendations(productId); - - var reviews = integration.getReviews(productId); - - return createProductAggregate(product, recommendations, reviews, serviceUtil.getServiceAddress()); - } - - private ProductAggregate createProductAggregate(Product product, List recommendations, - List reviews, String serviceAddress) { - - // 1. Setup product info - int productId = product.getProductId(); - String name = product.getName(); - int weight = product.getWeight(); - - // 2. Copy summary recommendation info, if available - List recommendationSummaries = (recommendations == null) ? null : - recommendations.stream() - .map(r -> new RecommendationSummary(r.getRecommendationId(), r.getAuthor(), r.getRate())) - .collect(Collectors.toList()); - - // 3. Copy summary review info, if available - List reviewSummaries = (reviews == null) ? null : - reviews.stream() - .map(r -> new ReviewSummary(r.getReviewId(), r.getAuthor(), r.getSubject())) - .collect(Collectors.toList()); - - // 4. Create info regarding the involved microservices addresses - String productAddress = product.getServiceAddress(); - String reviewAddress = (reviews != null && !reviews.isEmpty()) ? reviews.get(0).getServiceAddress() : ""; - String recommendationAddress = (recommendations != null && !recommendations.isEmpty()) ? - recommendations.get(0).getServiceAddress() : ""; - ServiceAddresses serviceAddresses = new ServiceAddresses( - serviceAddress, - productAddress, - reviewAddress, - recommendationAddress); - - return new ProductAggregate( - productId, - name, - weight, - recommendationSummaries, - reviewSummaries, - serviceAddresses); - } -} diff --git a/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/integration/ProductCompositeIntegration.java b/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/integration/ProductCompositeIntegration.java deleted file mode 100644 index 3073edb5..00000000 --- a/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/integration/ProductCompositeIntegration.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.siriusxi.ms.store.pcs.integration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.siriusxi.ms.store.api.core.product.Product; -import com.siriusxi.ms.store.api.core.product.ProductService; -import com.siriusxi.ms.store.api.core.recommendation.Recommendation; -import com.siriusxi.ms.store.api.core.recommendation.RecommendationService; -import com.siriusxi.ms.store.api.core.review.Review; -import com.siriusxi.ms.store.api.core.review.ReviewService; -import com.siriusxi.ms.store.util.exceptions.InvalidInputException; -import com.siriusxi.ms.store.util.exceptions.NotFoundException; -import com.siriusxi.ms.store.util.http.HttpErrorInfo; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.stereotype.Component; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestTemplate; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static java.lang.String.valueOf; -import static org.springframework.http.HttpMethod.GET; - -@Component -@Log4j2 -public class ProductCompositeIntegration - implements - ProductService, - RecommendationService, - ReviewService { - - private final RestTemplate restTemplate; - private final ObjectMapper mapper; - - private final String productServiceUrl; - private final String recommendationServiceUrl; - private final String reviewServiceUrl; - - @Autowired - public ProductCompositeIntegration( - RestTemplate restTemplate, - ObjectMapper mapper, - - @Value("${app.product-service.host}") String productServiceHost, - @Value("${app.product-service.port}") int productServicePort, - - @Value("${app.recommendation-service.host}") String recommendationServiceHost, - @Value("${app.recommendation-service.port}") int recommendationServicePort, - - @Value("${app.review-service.host}") String reviewServiceHost, - @Value("${app.review-service.port}") int reviewServicePort - ) { - - this.restTemplate = restTemplate; - this.mapper = mapper; - - var http = "http://"; - productServiceUrl = http.concat(productServiceHost).concat(":").concat(valueOf(productServicePort)) - .concat("/product/"); - recommendationServiceUrl = http.concat(recommendationServiceHost).concat(":") - .concat(valueOf(recommendationServicePort)).concat("/recommendation?productId="); - reviewServiceUrl = http.concat(reviewServiceHost).concat(":").concat(valueOf(reviewServicePort)) - .concat("/review?productId="); - } - - @Override - public Product getProduct(int productId) { - - try { - String url = productServiceUrl + productId; - log.debug("Will call getProduct API on URL: {}", url); - - Product product = restTemplate.getForObject(url, Product.class); - log.debug("Found a product with id: {}", product != null ? product.getProductId() : "No Product found!!"); - - return product; - - } catch (HttpClientErrorException ex) { - - switch (ex.getStatusCode()) { - case NOT_FOUND -> throw new NotFoundException(getErrorMessage(ex)); - case UNPROCESSABLE_ENTITY -> throw new InvalidInputException(getErrorMessage(ex)); - default -> { - log.warn("Got a unexpected HTTP error: {}, will rethrow it", ex.getStatusCode()); - log.warn("Error body: {}", ex.getResponseBodyAsString()); - throw ex; - } - } - } - } - - @Override - public List getRecommendations(int productId) { - - try { - String url = recommendationServiceUrl + productId; - - log.debug("Will call getRecommendations API on URL: {}", url); - List recommendations = restTemplate - .exchange(url, GET, null, - new ParameterizedTypeReference>() { - }) - .getBody(); - - log.debug("Found {} recommendations for a product with id: {}", - recommendations != null ? recommendations.size() : "{No Recommendations}", - productId); - - return recommendations; - - } catch (Exception ex) { - log.warn("Got an exception while requesting recommendations, return zero recommendations: {}", - ex.getMessage()); - - return new ArrayList<>(); - } - } - - @Override - public List getReviews(int productId) { - - try { - String url = reviewServiceUrl + productId; - - log.debug("Will call getReviews API on URL: {}", url); - List reviews = restTemplate.exchange( - url, - GET, - null, - new ParameterizedTypeReference>() { - }) - .getBody(); - - log.debug("Found {} reviews for a product with id: {}", - reviews != null ? reviews.size() : "{No Reviews}", - productId); - - return reviews; - - } catch (Exception ex) { - log.warn("Got an exception while requesting reviews, return zero reviews: {}", ex.getMessage()); - return new ArrayList<>(); - } - } - - private String getErrorMessage(HttpClientErrorException ex) { - try { - return mapper.readValue(ex.getResponseBodyAsString(), HttpErrorInfo.class).message(); - } catch (IOException ioex) { - return ex.getMessage(); - } - } -} diff --git a/product-composite-service/src/test/java/com/siriusxi/ms/store/pcs/ProductCompositeServiceApplicationTests.java b/product-composite-service/src/test/java/com/siriusxi/ms/store/pcs/ProductCompositeServiceApplicationTests.java deleted file mode 100644 index 2e324c43..00000000 --- a/product-composite-service/src/test/java/com/siriusxi/ms/store/pcs/ProductCompositeServiceApplicationTests.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.siriusxi.ms.store.pcs; - -import com.siriusxi.ms.store.api.core.product.Product; -import com.siriusxi.ms.store.api.core.recommendation.Recommendation; -import com.siriusxi.ms.store.api.core.review.Review; -import com.siriusxi.ms.store.pcs.integration.ProductCompositeIntegration; -import com.siriusxi.ms.store.util.exceptions.InvalidInputException; -import com.siriusxi.ms.store.util.exceptions.NotFoundException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.web.reactive.server.WebTestClient; - -import static java.util.Collections.singletonList; -import static org.mockito.Mockito.when; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; -import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY; -import static org.springframework.http.MediaType.APPLICATION_JSON; - -@SpringBootTest(webEnvironment = RANDOM_PORT) -class ProductCompositeServiceApplicationTests { - - private static final int PRODUCT_ID_OK = 1; - private static final int PRODUCT_ID_NOT_FOUND = 2; - private static final int PRODUCT_ID_INVALID = 3; - public static final String BASE_URL = "/v1/product-composite/"; - - - @Autowired - private WebTestClient client; - - @MockBean - private ProductCompositeIntegration compositeIntegration; - - @BeforeEach - void setUp() { - - when(compositeIntegration.getProduct(PRODUCT_ID_OK)). - thenReturn(new Product(PRODUCT_ID_OK, "name", 1, "mock-address")); - - when(compositeIntegration.getRecommendations(PRODUCT_ID_OK)). - thenReturn(singletonList(new Recommendation(PRODUCT_ID_OK, - 1, "author", - 1, "content", "mock address"))); - - when(compositeIntegration.getReviews(PRODUCT_ID_OK)). - thenReturn(singletonList(new Review(PRODUCT_ID_OK, 1, - "author", "subject", "content", - "mock address"))); - - when(compositeIntegration.getProduct(PRODUCT_ID_NOT_FOUND)) - .thenThrow(new NotFoundException("NOT FOUND: " + PRODUCT_ID_NOT_FOUND)); - - when(compositeIntegration.getProduct(PRODUCT_ID_INVALID)) - .thenThrow(new InvalidInputException("INVALID: " + PRODUCT_ID_INVALID)); - } - - @Test - public void getProductById() { - - client.get() - .uri(BASE_URL + PRODUCT_ID_OK) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.productId").isEqualTo(PRODUCT_ID_OK) - .jsonPath("$.recommendations.length()").isEqualTo(1) - .jsonPath("$.reviews.length()").isEqualTo(1); - } - - @Test - public void getProductNotFound() { - - client.get() - .uri(BASE_URL + PRODUCT_ID_NOT_FOUND) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isNotFound() - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo(BASE_URL + PRODUCT_ID_NOT_FOUND) - .jsonPath("$.message").isEqualTo("NOT FOUND: " + PRODUCT_ID_NOT_FOUND); - } - - @Test - public void getProductInvalidInput() { - - client.get() - .uri(BASE_URL + PRODUCT_ID_INVALID) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isEqualTo(UNPROCESSABLE_ENTITY) - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo(BASE_URL + PRODUCT_ID_INVALID) - .jsonPath("$.message").isEqualTo("INVALID: " + PRODUCT_ID_INVALID); - } - -} diff --git a/product-service/pom.xml b/product-service/pom.xml index f6665f5d..664ee112 100644 --- a/product-service/pom.xml +++ b/product-service/pom.xml @@ -16,4 +16,21 @@ 1.0-SNAPSHOT Product Service Spring Boot based project jar + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + test + + + diff --git a/product-service/src/main/java/com/siriusxi/ms/store/ps/ProductServiceApplication.java b/product-service/src/main/java/com/siriusxi/ms/store/ps/ProductServiceApplication.java index 9c3d985f..1c88f122 100644 --- a/product-service/src/main/java/com/siriusxi/ms/store/ps/ProductServiceApplication.java +++ b/product-service/src/main/java/com/siriusxi/ms/store/ps/ProductServiceApplication.java @@ -1,15 +1,22 @@ package com.siriusxi.ms.store.ps; +import lombok.extern.log4j.Log4j2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan("com.siriusxi.ms.store") +@Log4j2 public class ProductServiceApplication { public static void main(String[] args) { - SpringApplication.run(ProductServiceApplication.class, args); + ConfigurableApplicationContext ctx = SpringApplication.run(ProductServiceApplication.class, args); + + String mongodDbHost = ctx.getEnvironment().getProperty("spring.data.mongodb.host"); + String mongodDbPort = ctx.getEnvironment().getProperty("spring.data.mongodb.port"); + log.info("Connected to MongoDb: " + mongodDbHost + ":" + mongodDbPort); } } diff --git a/product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductMapper.java b/product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductMapper.java new file mode 100644 index 00000000..25a34994 --- /dev/null +++ b/product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductMapper.java @@ -0,0 +1,20 @@ +package com.siriusxi.ms.store.ps.controller; + +import com.siriusxi.ms.store.api.core.product.Product; +import com.siriusxi.ms.store.ps.persistence.ProductEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = "spring") +public interface ProductMapper { + + ProductMapper INSTANCE = Mappers.getMapper( ProductMapper.class); + + @Mapping(target = "serviceAddress", ignore = true) + Product entityToApi(ProductEntity entity); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "version", ignore = true) + ProductEntity apiToEntity(Product api); +} diff --git a/product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductServiceImpl.java b/product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductServiceImpl.java index 7458ccf2..c2152311 100644 --- a/product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductServiceImpl.java +++ b/product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductServiceImpl.java @@ -1,7 +1,10 @@ package com.siriusxi.ms.store.ps.controller; +import com.mongodb.DuplicateKeyException; import com.siriusxi.ms.store.api.core.product.Product; import com.siriusxi.ms.store.api.core.product.ProductService; +import com.siriusxi.ms.store.ps.persistence.ProductEntity; +import com.siriusxi.ms.store.ps.persistence.ProductRepository; import com.siriusxi.ms.store.util.exceptions.InvalidInputException; import com.siriusxi.ms.store.util.exceptions.NotFoundException; import com.siriusxi.ms.store.util.http.ServiceUtil; @@ -15,20 +18,51 @@ public class ProductServiceImpl implements ProductService { private final ServiceUtil serviceUtil; + private final ProductRepository repository; + + private final ProductMapper mapper; + @Autowired - public ProductServiceImpl(ServiceUtil serviceUtil) { + public ProductServiceImpl(ProductRepository repository, + ProductMapper mapper, + ServiceUtil serviceUtil) { + this.repository = repository; + this.mapper = mapper; this.serviceUtil = serviceUtil; } @Override - public Product getProduct(int productId) { - log.debug("/product returns the found product for productId={}", productId); + public Product createProduct(Product body) { + try { + ProductEntity entity = mapper.apiToEntity(body); + ProductEntity newEntity = repository.save(entity); + + log.debug("createProduct: entity created for productId: {}", body.getProductId()); + return mapper.entityToApi(newEntity); + } catch (DuplicateKeyException dke) { + throw new InvalidInputException("Duplicate key, Product Id: " + body.getProductId()); + } + } + + @Override + public Product getProduct(int productId) { if (productId < 1) throw new InvalidInputException("Invalid productId: " + productId); - if (productId == 13) - throw new NotFoundException("No product found for productId: " + productId); + ProductEntity entity = repository.findByProductId(productId) + .orElseThrow(() -> new NotFoundException("No product found for productId: " + productId)); + + Product response = mapper.entityToApi(entity); + response.setServiceAddress(serviceUtil.getServiceAddress()); + + log.debug("getProduct: found productId: {}", response.getProductId()); - return new Product(productId, "name-" + productId, 123, serviceUtil.getServiceAddress()); + return response; + } + + @Override + public void deleteProduct(int productId) { + log.debug("deleteProduct: tries to delete an entity with productId: {}", productId); + repository.findByProductId(productId).ifPresent(repository::delete); } } diff --git a/product-service/src/main/java/com/siriusxi/ms/store/ps/persistence/ProductEntity.java b/product-service/src/main/java/com/siriusxi/ms/store/ps/persistence/ProductEntity.java new file mode 100644 index 00000000..6e79fe2c --- /dev/null +++ b/product-service/src/main/java/com/siriusxi/ms/store/ps/persistence/ProductEntity.java @@ -0,0 +1,32 @@ +package com.siriusxi.ms.store.ps.persistence; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Version; +import org.springframework.data.mongodb.core.index.Indexed; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collection="products") +@Data +@NoArgsConstructor +public class ProductEntity { + @Id + private String id; + + @Version + private Integer version; + + @Indexed(unique = true) + private int productId; + + private String name; + + private int weight; + + public ProductEntity(int productId, String name, int weight) { + this.productId = productId; + this.name = name; + this.weight = weight; + } +} diff --git a/product-service/src/main/java/com/siriusxi/ms/store/ps/persistence/ProductRepository.java b/product-service/src/main/java/com/siriusxi/ms/store/ps/persistence/ProductRepository.java new file mode 100644 index 00000000..250ee046 --- /dev/null +++ b/product-service/src/main/java/com/siriusxi/ms/store/ps/persistence/ProductRepository.java @@ -0,0 +1,12 @@ +package com.siriusxi.ms.store.ps.persistence; + +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface ProductRepository extends PagingAndSortingRepository { + + Optional findByProductId(int productId); +} diff --git a/product-service/src/main/resources/application.yaml b/product-service/src/main/resources/application.yaml index e14a686a..0c7cdc9d 100644 --- a/product-service/src/main/resources/application.yaml +++ b/product-service/src/main/resources/application.yaml @@ -1,6 +1,11 @@ spring: application: name: product-service + data: + mongodb: + host: localhost + port: 27017 + database: product-db server: port: 9081 @@ -9,7 +14,8 @@ logging: level: web: DEBUG root: INFO - com.siriusxi.ms:.store: DEBUG + com.siriusxi.ms.store: DEBUG + org.springframework.data.mongodb.core.MongoTemplate: DEBUG management: endpoints: @@ -28,6 +34,9 @@ spring: profiles: docker jmx: enabled: false + data: + mongodb: + host: mongodb server: port: 8080 \ No newline at end of file diff --git a/product-service/src/test/java/com/siriusxi/ms/store/ps/MapperTests.java b/product-service/src/test/java/com/siriusxi/ms/store/ps/MapperTests.java new file mode 100644 index 00000000..7933fd07 --- /dev/null +++ b/product-service/src/test/java/com/siriusxi/ms/store/ps/MapperTests.java @@ -0,0 +1,36 @@ +package com.siriusxi.ms.store.ps; + +import com.siriusxi.ms.store.api.core.product.Product; +import com.siriusxi.ms.store.ps.controller.ProductMapper; +import com.siriusxi.ms.store.ps.persistence.ProductEntity; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class MapperTests { + + private final ProductMapper mapper = ProductMapper.INSTANCE; + + @Test + public void mapperTests() { + + assertNotNull(mapper); + + Product api = new Product(1, "n", 1, "sa"); + + ProductEntity entity = mapper.apiToEntity(api); + + assertEquals(api.getProductId(), entity.getProductId()); + assertEquals(api.getProductId(), entity.getProductId()); + assertEquals(api.getName(), entity.getName()); + assertEquals(api.getWeight(), entity.getWeight()); + + Product api2 = mapper.entityToApi(entity); + + assertEquals(api.getProductId(), api2.getProductId()); + assertEquals(api.getProductId(), api2.getProductId()); + assertEquals(api.getName(), api2.getName()); + assertEquals(api.getWeight(), api2.getWeight()); + assertNull(api2.getServiceAddress()); + } +} diff --git a/product-service/src/test/java/com/siriusxi/ms/store/ps/PersistenceTests.java b/product-service/src/test/java/com/siriusxi/ms/store/ps/PersistenceTests.java new file mode 100644 index 00000000..87f5deb6 --- /dev/null +++ b/product-service/src/test/java/com/siriusxi/ms/store/ps/PersistenceTests.java @@ -0,0 +1,157 @@ +package com.siriusxi.ms.store.ps; + +import com.siriusxi.ms.store.ps.persistence.ProductEntity; +import com.siriusxi.ms.store.ps.persistence.ProductRepository; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.dao.OptimisticLockingFailureException; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static java.util.stream.IntStream.rangeClosed; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.data.domain.Sort.Direction.ASC; + +// FIXME to fix all optional class check with isPresent() +@DataMongoTest +public class PersistenceTests { + + @Autowired private ProductRepository repository; + + private ProductEntity savedEntity; + + @BeforeEach + public void setupDb() { + repository.deleteAll(); + + ProductEntity entity = new ProductEntity(1, "n", 1); + savedEntity = repository.save(entity); + + assertEqualsProduct(entity, savedEntity); + } + + @Test + public void create() { + + ProductEntity newEntity = new ProductEntity(2, "n", 2); + repository.save(newEntity); + + ProductEntity foundEntity = repository.findById(newEntity.getId()).get(); + assertEqualsProduct(newEntity, foundEntity); + + assertEquals(2, repository.count()); + } + + @Test + public void update() { + savedEntity.setName("n2"); + repository.save(savedEntity); + + ProductEntity foundEntity = repository.findById(savedEntity.getId()).get(); + assertEquals(1, (long) foundEntity.getVersion()); + assertEquals("n2", foundEntity.getName()); + } + + @Test + public void delete() { + repository.delete(savedEntity); + assertFalse(repository.existsById(savedEntity.getId())); + } + + @Test + public void getByProductId() { + Optional entity = repository.findByProductId(savedEntity.getProductId()); + + assertTrue(entity.isPresent()); + assertEqualsProduct(savedEntity, entity.get()); + } + + //FIXME error which is not thrown + @Test + @Disabled + public void duplicateError() { + + Assertions.assertThrows( + DuplicateKeyException.class, + () -> { + ProductEntity entity = new ProductEntity(savedEntity.getProductId(), "n", 1); + repository.save(entity); + }); + } + + @Test + public void optimisticLockError() { + + // Store the saved entity in two separate entity objects + ProductEntity entity1 = repository.findById(savedEntity.getId()).get(); + ProductEntity entity2 = repository.findById(savedEntity.getId()).get(); + + // Update the entity using the first entity object + entity1.setName("n1"); + repository.save(entity1); + + // Update the entity using the second entity object. + // This should fail since the second entity now holds a old version number, i.e. a Optimistic + // Lock Error + try { + entity2.setName("n2"); + repository.save(entity2); + + fail("Expected an OptimisticLockingFailureException"); + } catch (OptimisticLockingFailureException ignored) { + } + + // Get the updated entity from the database and verify its new sate + ProductEntity updatedEntity = repository.findById(savedEntity.getId()).get(); + assertEquals(1, (int) updatedEntity.getVersion()); + assertEquals("n1", updatedEntity.getName()); + } + + @Test + public void paging() { + + repository.deleteAll(); + + List newProducts = + rangeClosed(1001, 1010) + .mapToObj(i -> new ProductEntity(i, "name " + i, i)) + .collect(Collectors.toList()); + repository.saveAll(newProducts); + + Pageable nextPage = PageRequest.of(0, 4, ASC, "productId"); + nextPage = testNextPage(nextPage, "[1001, 1002, 1003, 1004]", true); + nextPage = testNextPage(nextPage, "[1005, 1006, 1007, 1008]", true); + testNextPage(nextPage, "[1009, 1010]", false); + } + + private Pageable testNextPage( + Pageable nextPage, String expectedProductIds, boolean expectsNextPage) { + Page productPage = repository.findAll(nextPage); + assertEquals( + expectedProductIds, + productPage.getContent().stream() + .map(ProductEntity::getProductId) + .collect(Collectors.toList()) + .toString()); + assertEquals(expectsNextPage, productPage.hasNext()); + return productPage.nextPageable(); + } + + private void assertEqualsProduct(ProductEntity expectedEntity, ProductEntity actualEntity) { + assertEquals(expectedEntity.getId(), actualEntity.getId()); + assertEquals(expectedEntity.getVersion(), actualEntity.getVersion()); + assertEquals(expectedEntity.getProductId(), actualEntity.getProductId()); + assertEquals(expectedEntity.getName(), actualEntity.getName()); + assertEquals(expectedEntity.getWeight(), actualEntity.getWeight()); + } +} diff --git a/product-service/src/test/java/com/siriusxi/ms/store/ps/ProductServiceApplicationTests.java b/product-service/src/test/java/com/siriusxi/ms/store/ps/ProductServiceApplicationTests.java index 687a2ce3..ce7f24e1 100644 --- a/product-service/src/test/java/com/siriusxi/ms/store/ps/ProductServiceApplicationTests.java +++ b/product-service/src/test/java/com/siriusxi/ms/store/ps/ProductServiceApplicationTests.java @@ -1,47 +1,86 @@ package com.siriusxi.ms.store.ps; +import com.siriusxi.ms.store.api.core.product.Product; +import com.siriusxi.ms.store.ps.persistence.ProductRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpStatus; import org.springframework.test.web.reactive.server.WebTestClient; +import reactor.core.publisher.Mono; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; -import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY; +import static org.springframework.http.HttpStatus.*; import static org.springframework.http.MediaType.APPLICATION_JSON; -@SpringBootTest(webEnvironment = RANDOM_PORT) +@SpringBootTest(webEnvironment= RANDOM_PORT, properties = {"spring.data.mongodb.port: 0"}) class ProductServiceApplicationTests { + private final String BASE_URI = "/products/"; + @Autowired private WebTestClient client; + @Autowired + private ProductRepository repository; + + @BeforeEach + public void setupDb() { + repository.deleteAll(); + } + + @Test public void getProductById() { int productId = 1; - client.get() - .uri("/product/" + productId) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() + postAndVerifyProduct(productId, OK); + + assertTrue(repository.findByProductId(productId).isPresent()); + + getAndVerifyProduct(productId, OK) .jsonPath("$.productId").isEqualTo(productId); } + @Test + @Disabled + public void duplicateError() { + + int productId = 1; + + postAndVerifyProduct(productId, OK); + + assertTrue(repository.findByProductId(productId).isPresent()); + + postAndVerifyProduct(productId, UNPROCESSABLE_ENTITY) + .jsonPath("$.path").isEqualTo("BASE_RESOURCE_URI") + .jsonPath("$.message").isEqualTo("Duplicate key, Product Id: " + productId); + } + + @Test + public void deleteProduct() { + + int productId = 1; + + postAndVerifyProduct(productId, OK); + assertTrue(repository.findByProductId(productId).isPresent()); + + deleteAndVerifyProduct(productId, OK); + assertFalse(repository.findByProductId(productId).isPresent()); + + deleteAndVerifyProduct(productId, OK); + } + @Test public void getProductInvalidParameterString() { - client.get() - .uri("/product/no-integer") - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isEqualTo(BAD_REQUEST) - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/product/no-integer") + getAndVerifyProduct(BASE_URI + "/no-integer", BAD_REQUEST) + .jsonPath("$.path").isEqualTo(BASE_URI + "no-integer") .jsonPath("$.message").isEqualTo("Type mismatch."); } @@ -49,15 +88,8 @@ public void getProductInvalidParameterString() { public void getProductNotFound() { int productIdNotFound = 13; - - client.get() - .uri("/product/" + productIdNotFound) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isNotFound() - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/product/" + productIdNotFound) + getAndVerifyProduct(productIdNotFound, NOT_FOUND) + .jsonPath("$.path").isEqualTo(BASE_URI + productIdNotFound) .jsonPath("$.message").isEqualTo("No product found for productId: " + productIdNotFound); } @@ -66,15 +98,45 @@ public void getProductInvalidParameterNegativeValue() { int productIdInvalid = -1; - client.get() - .uri("/product/" + productIdInvalid) + getAndVerifyProduct(productIdInvalid, UNPROCESSABLE_ENTITY) + .jsonPath("$.path").isEqualTo(BASE_URI + productIdInvalid) + .jsonPath("$.message").isEqualTo("Invalid productId: " + productIdInvalid); + } + + + private WebTestClient.BodyContentSpec getAndVerifyProduct(int productId, HttpStatus expectedStatus) { + return getAndVerifyProduct(BASE_URI + productId, expectedStatus); + } + + private WebTestClient.BodyContentSpec getAndVerifyProduct(String productIdPath, HttpStatus expectedStatus) { + return client.get() + .uri(productIdPath) .accept(APPLICATION_JSON) .exchange() - .expectStatus().isEqualTo(UNPROCESSABLE_ENTITY) + .expectStatus().isEqualTo(expectedStatus) .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/product/" + productIdInvalid) - .jsonPath("$.message").isEqualTo("Invalid productId: " + productIdInvalid); + .expectBody(); + } + + private WebTestClient.BodyContentSpec postAndVerifyProduct(int productId, HttpStatus expectedStatus) { + Product product = new Product(productId, "Name " + productId, productId, "SA"); + return client.post() + .uri(BASE_URI) + .body(Mono.just(product), Product.class) + .accept(APPLICATION_JSON) + .exchange() + .expectStatus().isEqualTo(expectedStatus) + .expectHeader().contentType(APPLICATION_JSON) + .expectBody(); + } + + private WebTestClient.BodyContentSpec deleteAndVerifyProduct(int productId, HttpStatus expectedStatus) { + return client.delete() + .uri(BASE_URI + productId) + .accept(APPLICATION_JSON) + .exchange() + .expectStatus().isEqualTo(expectedStatus) + .expectBody(); } } diff --git a/recommendation-service/pom.xml b/recommendation-service/pom.xml index f9334c4f..49538a63 100644 --- a/recommendation-service/pom.xml +++ b/recommendation-service/pom.xml @@ -16,4 +16,21 @@ 1.0-SNAPSHOT Recommendation Service Spring Boot based project jar + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + test + + + diff --git a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/RecommendationServiceApplication.java b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/RecommendationServiceApplication.java index 29072e5f..c60fa311 100644 --- a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/RecommendationServiceApplication.java +++ b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/RecommendationServiceApplication.java @@ -1,15 +1,22 @@ package com.siriusxi.ms.store.rs; +import lombok.extern.log4j.Log4j2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan("com.siriusxi.ms.store") +@Log4j2 public class RecommendationServiceApplication { public static void main(String[] args) { - SpringApplication.run(RecommendationServiceApplication.class, args); + ConfigurableApplicationContext ctx = SpringApplication.run(RecommendationServiceApplication.class, args); + + String mongodDbHost = ctx.getEnvironment().getProperty("spring.data.mongodb.host"); + String mongodDbPort = ctx.getEnvironment().getProperty("spring.data.mongodb.port"); + log.info("Connected to MongoDb: " + mongodDbHost + ":" + mongodDbPort); } } diff --git a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationMapper.java b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationMapper.java new file mode 100644 index 00000000..f03814f2 --- /dev/null +++ b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationMapper.java @@ -0,0 +1,28 @@ +package com.siriusxi.ms.store.rs.controller; + +import com.siriusxi.ms.store.api.core.recommendation.Recommendation; +import com.siriusxi.ms.store.rs.persistence.RecommendationEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface RecommendationMapper { + + RecommendationMapper INSTANCE = Mappers.getMapper(RecommendationMapper.class); + + @Mapping(target = "rate", source = "entity.rating") + @Mapping(target = "serviceAddress", ignore = true) + Recommendation entityToApi(RecommendationEntity entity); + + @Mapping(target = "rating", source = "api.rate") + @Mapping(target = "id", ignore = true) + @Mapping(target = "version", ignore = true) + RecommendationEntity apiToEntity(Recommendation api); + + List entityListToApiList(List entity); + + List apiListToEntityList(List api); +} diff --git a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationServiceImpl.java b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationServiceImpl.java index c3026a44..611517a0 100644 --- a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationServiceImpl.java +++ b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationServiceImpl.java @@ -1,44 +1,73 @@ package com.siriusxi.ms.store.rs.controller; +import com.mongodb.DuplicateKeyException; import com.siriusxi.ms.store.api.core.recommendation.Recommendation; import com.siriusxi.ms.store.api.core.recommendation.RecommendationService; +import com.siriusxi.ms.store.rs.persistence.RecommendationEntity; +import com.siriusxi.ms.store.rs.persistence.RecommendationRepository; import com.siriusxi.ms.store.util.exceptions.InvalidInputException; import com.siriusxi.ms.store.util.http.ServiceUtil; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; +// FIXME to extract service from controller @RestController @Log4j2 public class RecommendationServiceImpl implements RecommendationService { + private final RecommendationRepository repository; + + private final RecommendationMapper mapper; + private final ServiceUtil serviceUtil; @Autowired - public RecommendationServiceImpl(ServiceUtil serviceUtil) { + public RecommendationServiceImpl(RecommendationRepository repository, + RecommendationMapper mapper, + ServiceUtil serviceUtil) { + this.repository = repository; + this.mapper = mapper; this.serviceUtil = serviceUtil; } @Override - public List getRecommendations(int productId) { + public Recommendation createRecommendation(Recommendation body) { + try { + RecommendationEntity entity = mapper.apiToEntity(body); + RecommendationEntity newEntity = repository.save(entity); - if (productId < 1) throw new InvalidInputException("Invalid productId: " + productId); + log.debug("createRecommendation: created a recommendation entity: {}/{}", + body.getProductId(), body.getRecommendationId()); + return mapper.entityToApi(newEntity); - if (productId == 113) { - log.debug("No recommendations found for productId: {}", productId); - return new ArrayList<>(); + } catch (DuplicateKeyException dke) { + throw new InvalidInputException("Duplicate key, Product Id: " + body.getProductId() + ", Recommendation Id:" + body.getRecommendationId()); } + } - List list = new ArrayList<>(); - list.add(new Recommendation(productId, 1, "Author 1", 1, "Content 1", serviceUtil.getServiceAddress())); - list.add(new Recommendation(productId, 2, "Author 2", 2, "Content 2", serviceUtil.getServiceAddress())); - list.add(new Recommendation(productId, 3, "Author 3", 3, "Content 3", serviceUtil.getServiceAddress())); + @Override + public List getRecommendations(int productId) { - log.debug("/recommendation response size: {}", list.size()); + if (productId < 1) throw new InvalidInputException("Invalid productId: " + productId); + + List entityList = repository.findByProductId(productId); + List list = mapper.entityListToApiList(entityList); + list.forEach(e -> e.setServiceAddress(serviceUtil.getServiceAddress())); + + log.debug("getRecommendations: response size: {}", list.size()); return list; } + + @Override + public void deleteRecommendations(int productId) { + log.debug("deleteRecommendations: tries to delete recommendations for the product with " + + "productId: {}", productId); + repository.deleteAll(repository.findByProductId(productId)); + } } diff --git a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/persistence/RecommendationEntity.java b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/persistence/RecommendationEntity.java new file mode 100644 index 00000000..1128f461 --- /dev/null +++ b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/persistence/RecommendationEntity.java @@ -0,0 +1,40 @@ +package com.siriusxi.ms.store.rs.persistence; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Version; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collection = "recommendations") +@CompoundIndex( + name = "prod-rec-id", + unique = true, + def = "{'productId': 1, 'recommendationId' : 1}") +@Data +@NoArgsConstructor +public class RecommendationEntity { + + @Id + private String id; + + @Version + private Integer version; + + private int productId; + private int recommendationId; + private String author; + private int rating; + private String content; + + public RecommendationEntity( + int productId, int recommendationId, String author, int rating, String content) { + this.productId = productId; + this.recommendationId = recommendationId; + this.author = author; + this.rating = rating; + this.content = content; + } + +} diff --git a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/persistence/RecommendationRepository.java b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/persistence/RecommendationRepository.java new file mode 100644 index 00000000..3e80bcd2 --- /dev/null +++ b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/persistence/RecommendationRepository.java @@ -0,0 +1,11 @@ +package com.siriusxi.ms.store.rs.persistence; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface RecommendationRepository extends CrudRepository { + List findByProductId(int productId); +} \ No newline at end of file diff --git a/recommendation-service/src/main/resources/application.yaml b/recommendation-service/src/main/resources/application.yaml index d0af2644..f7b79587 100644 --- a/recommendation-service/src/main/resources/application.yaml +++ b/recommendation-service/src/main/resources/application.yaml @@ -1,6 +1,11 @@ spring: application: name: recommendation-service + data: + mongodb: + host: localhost + port: 27017 + database: recommendation-db server: port: 9082 @@ -9,7 +14,10 @@ logging: level: web: DEBUG root: INFO - com.siriusxi.ms:.store: DEBUG + com.siriusxi.ms.store: DEBUG + org: + springframework.data.mongodb.core.MongoTemplate: DEBUG + mongodb: debug management: endpoints: @@ -28,6 +36,9 @@ spring: profiles: docker jmx: enabled: false + data: + mongodb: + host: mongodb server: port: 8080 diff --git a/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/MapperTests.java b/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/MapperTests.java new file mode 100644 index 00000000..74942e60 --- /dev/null +++ b/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/MapperTests.java @@ -0,0 +1,73 @@ +package com.siriusxi.ms.store.rs; + +import com.siriusxi.ms.store.api.core.recommendation.Recommendation; +import com.siriusxi.ms.store.rs.controller.RecommendationMapper; +import com.siriusxi.ms.store.rs.persistence.RecommendationEntity; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class MapperTests { + + private final RecommendationMapper mapper = RecommendationMapper.INSTANCE; + + @Test + public void mapperTests() { + + assertNotNull(mapper); + + Recommendation api = new Recommendation(1, 2, "a", 4, "C", "adr"); + + RecommendationEntity entity = mapper.apiToEntity(api); + + assertEquals(api.getProductId(), entity.getProductId()); + assertEquals(api.getRecommendationId(), entity.getRecommendationId()); + assertEquals(api.getAuthor(), entity.getAuthor()); + assertEquals(api.getRate(), entity.getRating()); + assertEquals(api.getContent(), entity.getContent()); + + Recommendation api2 = mapper.entityToApi(entity); + + assertEquals(api.getProductId(), api2.getProductId()); + assertEquals(api.getRecommendationId(), api2.getRecommendationId()); + assertEquals(api.getAuthor(), api2.getAuthor()); + assertEquals(api.getRate(), api2.getRate()); + assertEquals(api.getContent(), api2.getContent()); + assertNull(api2.getServiceAddress()); + } + + @Test + public void mapperListTests() { + + assertNotNull(mapper); + + Recommendation api = new Recommendation(1, 2, "a", 4, "C", "adr"); + List apiList = Collections.singletonList(api); + + List entityList = mapper.apiListToEntityList(apiList); + assertEquals(apiList.size(), entityList.size()); + + RecommendationEntity entity = entityList.get(0); + + assertEquals(api.getProductId(), entity.getProductId()); + assertEquals(api.getRecommendationId(), entity.getRecommendationId()); + assertEquals(api.getAuthor(), entity.getAuthor()); + assertEquals(api.getRate(), entity.getRating()); + assertEquals(api.getContent(), entity.getContent()); + + List api2List = mapper.entityListToApiList(entityList); + assertEquals(apiList.size(), api2List.size()); + + Recommendation api2 = api2List.get(0); + + assertEquals(api.getProductId(), api2.getProductId()); + assertEquals(api.getRecommendationId(), api2.getRecommendationId()); + assertEquals(api.getAuthor(), api2.getAuthor()); + assertEquals(api.getRate(), api2.getRate()); + assertEquals(api.getContent(), api2.getContent()); + assertNull(api2.getServiceAddress()); + } +} diff --git a/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/PersistenceTests.java b/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/PersistenceTests.java new file mode 100644 index 00000000..53123a84 --- /dev/null +++ b/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/PersistenceTests.java @@ -0,0 +1,125 @@ +package com.siriusxi.ms.store.rs; + +import com.mongodb.DuplicateKeyException; +import com.siriusxi.ms.store.rs.persistence.RecommendationEntity; +import com.siriusxi.ms.store.rs.persistence.RecommendationRepository; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.dao.OptimisticLockingFailureException; + +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.jupiter.api.Assertions.*; + +// FIXME to fix all optional class check with isPresent() +@DataMongoTest +public class PersistenceTests { + + @Autowired + private RecommendationRepository repository; + + private RecommendationEntity savedEntity; + + @BeforeEach + public void setupDb() { + repository.deleteAll(); + + RecommendationEntity entity = new RecommendationEntity(1, 2, "a", 3, "c"); + savedEntity = repository.save(entity); + + assertEqualsRecommendation(entity, savedEntity); + } + + + @Test + public void create() { + + RecommendationEntity newEntity = new RecommendationEntity(1, 3, "a", 3, "c"); + repository.save(newEntity); + + RecommendationEntity foundEntity = repository.findById(newEntity.getId()).get(); + assertEqualsRecommendation(newEntity, foundEntity); + + assertEquals(2, repository.count()); + } + + @Test + public void update() { + savedEntity.setAuthor("a2"); + repository.save(savedEntity); + + RecommendationEntity foundEntity = repository.findById(savedEntity.getId()).get(); + assertEquals(1, (long)foundEntity.getVersion()); + assertEquals("a2", foundEntity.getAuthor()); + } + + @Test + public void delete() { + repository.delete(savedEntity); + assertFalse(repository.existsById(savedEntity.getId())); + } + + @Test + public void getByProductId() { + List entityList = repository.findByProductId(savedEntity.getProductId()); + + assertThat(entityList, hasSize(1)); + assertEqualsRecommendation(savedEntity, entityList.get(0)); + } + + //FIXME error which is not thrown + @Test + @Disabled + public void duplicateError() { + + Assertions.assertThrows(DuplicateKeyException.class, + () -> { + RecommendationEntity entity = new RecommendationEntity(1, + 2, "a", 3, "c"); + repository.save(entity); + }); + } + + @Test + public void optimisticLockError() { + + // Store the saved entity in two separate entity objects + RecommendationEntity entity1 = repository.findById(savedEntity.getId()).get(); + RecommendationEntity entity2 = repository.findById(savedEntity.getId()).get(); + + // Update the entity using the first entity object + entity1.setAuthor("a1"); + repository.save(entity1); + + // Update the entity using the second entity object. + // This should fail since the second entity now holds a old version number, i.e. a Optimistic Lock Error + try { + entity2.setAuthor("a2"); + repository.save(entity2); + + fail("Expected an OptimisticLockingFailureException"); + } catch (OptimisticLockingFailureException ignored) {} + + // Get the updated entity from the database and verify its new sate + RecommendationEntity updatedEntity = repository.findById(savedEntity.getId()).get(); + assertEquals(1, (int)updatedEntity.getVersion()); + assertEquals("a1", updatedEntity.getAuthor()); + } + + private void assertEqualsRecommendation(RecommendationEntity expectedEntity, + RecommendationEntity actualEntity) { + assertEquals(expectedEntity.getId(), actualEntity.getId()); + assertEquals(expectedEntity.getVersion(), actualEntity.getVersion()); + assertEquals(expectedEntity.getProductId(), actualEntity.getProductId()); + assertEquals(expectedEntity.getRecommendationId(), actualEntity.getRecommendationId()); + assertEquals(expectedEntity.getAuthor(), actualEntity.getAuthor()); + assertEquals(expectedEntity.getRating(), actualEntity.getRating()); + assertEquals(expectedEntity.getContent(), actualEntity.getContent()); + } +} diff --git a/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/RecommendationServiceApplicationTests.java b/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/RecommendationServiceApplicationTests.java index 16fdd9f3..1a2938fc 100644 --- a/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/RecommendationServiceApplicationTests.java +++ b/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/RecommendationServiceApplicationTests.java @@ -1,77 +1,110 @@ package com.siriusxi.ms.store.rs; +import com.siriusxi.ms.store.api.core.recommendation.Recommendation; +import com.siriusxi.ms.store.rs.persistence.RecommendationRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpStatus; import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.test.web.reactive.server.WebTestClient.BodyContentSpec; +import reactor.core.publisher.Mono; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; -import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY; +import static org.springframework.http.HttpStatus.*; import static org.springframework.http.MediaType.APPLICATION_JSON; -@SpringBootTest(webEnvironment = RANDOM_PORT) +@SpringBootTest(webEnvironment = RANDOM_PORT, properties = {"spring.data.mongodb.port: 0"}) class RecommendationServiceApplicationTests { + private final String BASE_URI = "/recommendations"; @Autowired private WebTestClient client; + @Autowired + private RecommendationRepository repository; + + + @BeforeEach + public void setupDb() { + repository.deleteAll(); + } + @Test public void getRecommendationsByProductId() { int productId = 1; - client.get() - .uri("/recommendation?productId=" + productId) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() + postAndVerifyRecommendation(productId, 1, OK); + postAndVerifyRecommendation(productId, 2, OK); + postAndVerifyRecommendation(productId, 3, OK); + + assertEquals(3, repository.findByProductId(productId).size()); + + getAndVerifyRecommendationsByProductId(productId, OK) .jsonPath("$.length()").isEqualTo(3) - .jsonPath("$[0].productId").isEqualTo(productId); + .jsonPath("$[2].productId").isEqualTo(productId) + .jsonPath("$[2].recommendationId").isEqualTo(3); + } + + @Test + @Disabled + public void duplicateError() { + + int productId = 1; + int recommendationId = 1; + + postAndVerifyRecommendation(productId, recommendationId, OK) + .jsonPath("$.productId").isEqualTo(productId) + .jsonPath("$.recommendationId").isEqualTo(recommendationId); + + assertEquals(1, repository.count()); + + postAndVerifyRecommendation(productId, recommendationId, UNPROCESSABLE_ENTITY) + .jsonPath("$.path").isEqualTo(BASE_URI) + .jsonPath("$.message").isEqualTo("Duplicate key, Product Id: 1, Recommendation Id:1"); + + assertEquals(1, repository.count()); + } + + @Test + public void deleteRecommendations() { + + int productId = 1; + int recommendationId = 1; + + postAndVerifyRecommendation(productId, recommendationId, OK); + assertEquals(1, repository.findByProductId(productId).size()); + + deleteAndVerifyRecommendationsByProductIdIsOk(productId); + assertEquals(0, repository.findByProductId(productId).size()); + + deleteAndVerifyRecommendationsByProductIdIsOk(productId); } @Test public void getRecommendationsMissingParameter() { - client.get() - .uri("/recommendation") - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isEqualTo(BAD_REQUEST) - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/recommendation") + getAndVerifyRecommendationsByProductId("", BAD_REQUEST) + .jsonPath("$.path").isEqualTo(BASE_URI) .jsonPath("$.message").isEqualTo("Required int parameter 'productId' is not present"); } @Test public void getRecommendationsInvalidParameter() { - client.get() - .uri("/recommendation?productId=no-integer") - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isEqualTo(BAD_REQUEST) - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/recommendation") + getAndVerifyRecommendationsByProductId("?productId=no-integer", BAD_REQUEST) + .jsonPath("$.path").isEqualTo(BASE_URI) .jsonPath("$.message").isEqualTo("Type mismatch."); } @Test public void getRecommendationsNotFound() { - int productIdNotFound = 113; - - client.get() - .uri("/recommendation?productId=" + productIdNotFound) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() + getAndVerifyRecommendationsByProductId("?productId=113", OK) .jsonPath("$.length()").isEqualTo(0); } @@ -80,15 +113,51 @@ public void getRecommendationsInvalidParameterNegativeValue() { int productIdInvalid = -1; - client.get() - .uri("/recommendation?productId=" + productIdInvalid) + getAndVerifyRecommendationsByProductId("?productId=" + productIdInvalid, UNPROCESSABLE_ENTITY) + .jsonPath("$.path").isEqualTo(BASE_URI) + .jsonPath("$.message").isEqualTo("Invalid productId: " + productIdInvalid); + } + + private BodyContentSpec getAndVerifyRecommendationsByProductId(int productId, HttpStatus expectedStatus) { + return getAndVerifyRecommendationsByProductId("?productId=" + productId, expectedStatus); + } + + private BodyContentSpec getAndVerifyRecommendationsByProductId(String productIdQuery, + HttpStatus expectedStatus) { + return client.get() + .uri(BASE_URI + productIdQuery) .accept(APPLICATION_JSON) .exchange() - .expectStatus().isEqualTo(UNPROCESSABLE_ENTITY) + .expectStatus().isEqualTo(expectedStatus) .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/recommendation") - .jsonPath("$.message").isEqualTo("Invalid productId: " + productIdInvalid); + .expectBody(); + } + + private BodyContentSpec postAndVerifyRecommendation(int productId, + int recommendationId, + HttpStatus expectedStatus) { + + Recommendation recommendation = new Recommendation(productId, + recommendationId, "Author " + recommendationId, + recommendationId, "Content " + recommendationId, "SA"); + + return client.post() + .uri(BASE_URI) + .body(Mono.just(recommendation), Recommendation.class) + .accept(APPLICATION_JSON) + .exchange() + .expectStatus().isEqualTo(expectedStatus) + .expectHeader().contentType(APPLICATION_JSON) + .expectBody(); + } + + private void deleteAndVerifyRecommendationsByProductIdIsOk(int productId) { + client.delete() + .uri(BASE_URI + "?productId=" + productId) + .accept(APPLICATION_JSON) + .exchange() + .expectStatus().isEqualTo(OK) + .expectBody(); } } diff --git a/review-service/pom.xml b/review-service/pom.xml index d16430ab..6aef6ba7 100644 --- a/review-service/pom.xml +++ b/review-service/pom.xml @@ -16,4 +16,28 @@ 1.0-SNAPSHOT Review Service Spring Boot based project jar + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + mysql + mysql-connector-java + + + + + + com.h2database + h2 + test + + + diff --git a/review-service/src/main/java/com/siriusxi/ms/store/revs/ReviewServiceApplication.java b/review-service/src/main/java/com/siriusxi/ms/store/revs/ReviewServiceApplication.java index 1917ac14..b42009f3 100644 --- a/review-service/src/main/java/com/siriusxi/ms/store/revs/ReviewServiceApplication.java +++ b/review-service/src/main/java/com/siriusxi/ms/store/revs/ReviewServiceApplication.java @@ -1,15 +1,24 @@ package com.siriusxi.ms.store.revs; +import lombok.extern.log4j.Log4j2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; +import static org.springframework.boot.SpringApplication.*; + @SpringBootApplication @ComponentScan("com.siriusxi.ms.store") +@Log4j2 public class ReviewServiceApplication { public static void main(String[] args) { - SpringApplication.run(ReviewServiceApplication.class, args); + + ConfigurableApplicationContext ctx = run(ReviewServiceApplication.class, args); + + String mysqlUri = ctx.getEnvironment().getProperty("spring.datasource.url"); + log.info("Connected to MySQL: " + mysqlUri); } } diff --git a/review-service/src/main/java/com/siriusxi/ms/store/revs/controller/ReviewMapper.java b/review-service/src/main/java/com/siriusxi/ms/store/revs/controller/ReviewMapper.java new file mode 100644 index 00000000..9806155b --- /dev/null +++ b/review-service/src/main/java/com/siriusxi/ms/store/revs/controller/ReviewMapper.java @@ -0,0 +1,27 @@ +package com.siriusxi.ms.store.revs.controller; + +import com.siriusxi.ms.store.api.core.review.Review; +import com.siriusxi.ms.store.revs.persistence.ReviewEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +import java.util.List; + +import static org.mapstruct.factory.Mappers.getMapper; + +@Mapper(componentModel = "spring") +public interface ReviewMapper { + + ReviewMapper INSTANCE = getMapper(ReviewMapper.class); + + @Mapping(target = "serviceAddress", ignore = true) + Review entityToApi(ReviewEntity entity); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "version", ignore = true) + ReviewEntity apiToEntity(Review api); + + List entityListToApiList(List entity); + + List apiListToEntityList(List api); +} diff --git a/review-service/src/main/java/com/siriusxi/ms/store/revs/controller/ReviewServiceImpl.java b/review-service/src/main/java/com/siriusxi/ms/store/revs/controller/ReviewServiceImpl.java index 18a4dea4..2ff8580a 100644 --- a/review-service/src/main/java/com/siriusxi/ms/store/revs/controller/ReviewServiceImpl.java +++ b/review-service/src/main/java/com/siriusxi/ms/store/revs/controller/ReviewServiceImpl.java @@ -2,43 +2,70 @@ import com.siriusxi.ms.store.api.core.review.Review; import com.siriusxi.ms.store.api.core.review.ReviewService; +import com.siriusxi.ms.store.revs.persistence.ReviewEntity; +import com.siriusxi.ms.store.revs.persistence.ReviewRepository; import com.siriusxi.ms.store.util.exceptions.InvalidInputException; import com.siriusxi.ms.store.util.http.ServiceUtil; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; import java.util.List; @RestController @Log4j2 public class ReviewServiceImpl implements ReviewService { - private final ServiceUtil serviceUtil; + private final ReviewRepository repository; + private final ReviewMapper mapper; + private final ServiceUtil serviceUtil; - @Autowired - public ReviewServiceImpl(ServiceUtil serviceUtil) { - this.serviceUtil = serviceUtil; + @Autowired + public ReviewServiceImpl( + ReviewRepository repository, ReviewMapper mapper, ServiceUtil serviceUtil) { + this.repository = repository; + this.mapper = mapper; + this.serviceUtil = serviceUtil; + } + + @Override + public Review createReview(Review body) { + try { + ReviewEntity entity = mapper.apiToEntity(body); + ReviewEntity newEntity = repository.save(entity); + + log.debug( + "createReview: created a review entity: {}/{}", body.getProductId(), body.getReviewId()); + return mapper.entityToApi(newEntity); + + } catch (DataIntegrityViolationException dive) { + throw new InvalidInputException( + "Duplicate key, Product Id: " + + body.getProductId() + + ", Review Id:" + + body.getReviewId()); } + } - @Override - public List getReviews(int productId) { + @Override + public List getReviews(int productId) { - if (productId < 1) throw new InvalidInputException("Invalid productId: " + productId); + if (productId < 1) throw new InvalidInputException("Invalid productId: " + productId); - if (productId == 213) { - log.debug("No reviews found for productId: {}", productId); - return new ArrayList<>(); - } + List entityList = repository.findByProductId(productId); + List list = mapper.entityListToApiList(entityList); + list.forEach(e -> e.setServiceAddress(serviceUtil.getServiceAddress())); - List list = new ArrayList<>(); - list.add(new Review(productId, 1, "Author 1", "Subject 1", "Content 1", serviceUtil.getServiceAddress())); - list.add(new Review(productId, 2, "Author 2", "Subject 2", "Content 2", serviceUtil.getServiceAddress())); - list.add(new Review(productId, 3, "Author 3", "Subject 3", "Content 3", serviceUtil.getServiceAddress())); + log.debug("getReviews: response size: {}", list.size()); - log.debug("/reviews response size: {}", list.size()); + return list; + } - return list; - } + @Override + public void deleteReviews(int productId) { + log.debug( + "deleteReviews: tries to delete reviews for the product with productId: {}", productId); + repository.deleteAll(repository.findByProductId(productId)); + } } diff --git a/review-service/src/main/java/com/siriusxi/ms/store/revs/persistence/ReviewEntity.java b/review-service/src/main/java/com/siriusxi/ms/store/revs/persistence/ReviewEntity.java new file mode 100644 index 00000000..423cab75 --- /dev/null +++ b/review-service/src/main/java/com/siriusxi/ms/store/revs/persistence/ReviewEntity.java @@ -0,0 +1,35 @@ +package com.siriusxi.ms.store.revs.persistence; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Table( + name = "reviews", + indexes = { + @Index(name = "reviews_unique_idx", unique = true, columnList = "productId,reviewId") + }) +@Data +@NoArgsConstructor +public class ReviewEntity { + + @Id @GeneratedValue private int id; + + @Version private int version; + + private int productId; + private int reviewId; + private String author; + private String subject; + private String content; + + public ReviewEntity(int productId, int reviewId, String author, String subject, String content) { + this.productId = productId; + this.reviewId = reviewId; + this.author = author; + this.subject = subject; + this.content = content; + } +} diff --git a/review-service/src/main/java/com/siriusxi/ms/store/revs/persistence/ReviewRepository.java b/review-service/src/main/java/com/siriusxi/ms/store/revs/persistence/ReviewRepository.java new file mode 100644 index 00000000..7ea848dc --- /dev/null +++ b/review-service/src/main/java/com/siriusxi/ms/store/revs/persistence/ReviewRepository.java @@ -0,0 +1,14 @@ +package com.siriusxi.ms.store.revs.persistence; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Repository +public interface ReviewRepository extends CrudRepository { + + @Transactional(readOnly = true) + List findByProductId(int productId); +} diff --git a/review-service/src/main/resources/application.yaml b/review-service/src/main/resources/application.yaml index 21f2c40b..abfcbab0 100644 --- a/review-service/src/main/resources/application.yaml +++ b/review-service/src/main/resources/application.yaml @@ -2,6 +2,17 @@ spring: application: name: review-service + jpa: + hibernate: + # Strongly recommend to set this property to "none" in a production environment! + ddl-auto: update + datasource: + url: "jdbc:mysql://localhost/review-db" + username: user + password: pwd + hikari: + initializationFailTimeout: 60000 + server: port: 9083 @@ -9,7 +20,11 @@ logging: level: web: DEBUG root: INFO - com.siriusxi.ms:.store: DEBUG + com.siriusxi.ms.store: DEBUG + org: + hibernate: + SQL: DEBUG + type.descriptor.sql.BasicBinder: TRACE management: endpoints: @@ -28,6 +43,8 @@ spring: profiles: docker jmx: enabled: false + datasource: + url: "jdbc:mysql://mysql/review-db" server: port: 8080 \ No newline at end of file diff --git a/review-service/src/test/java/com/siriusxi/ms/store/revs/MapperTests.java b/review-service/src/test/java/com/siriusxi/ms/store/revs/MapperTests.java new file mode 100644 index 00000000..b85d65b7 --- /dev/null +++ b/review-service/src/test/java/com/siriusxi/ms/store/revs/MapperTests.java @@ -0,0 +1,73 @@ +package com.siriusxi.ms.store.revs; + +import com.siriusxi.ms.store.api.core.review.Review; +import com.siriusxi.ms.store.revs.controller.ReviewMapper; +import com.siriusxi.ms.store.revs.persistence.ReviewEntity; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class MapperTests { + + private final ReviewMapper mapper = ReviewMapper.INSTANCE; + + @Test + public void mapperTests() { + + assertNotNull(mapper); + + Review api = new Review(1, 2, "a", "s", "C", "adr"); + + ReviewEntity entity = mapper.apiToEntity(api); + + assertEquals(api.getProductId(), entity.getProductId()); + assertEquals(api.getReviewId(), entity.getReviewId()); + assertEquals(api.getAuthor(), entity.getAuthor()); + assertEquals(api.getSubject(), entity.getSubject()); + assertEquals(api.getContent(), entity.getContent()); + + Review api2 = mapper.entityToApi(entity); + + assertEquals(api.getProductId(), api2.getProductId()); + assertEquals(api.getReviewId(), api2.getReviewId()); + assertEquals(api.getAuthor(), api2.getAuthor()); + assertEquals(api.getSubject(), api2.getSubject()); + assertEquals(api.getContent(), api2.getContent()); + assertNull(api2.getServiceAddress()); + } + + @Test + public void mapperListTests() { + + assertNotNull(mapper); + + Review api = new Review(1, 2, "a", "s", "C", "adr"); + List apiList = Collections.singletonList(api); + + List entityList = mapper.apiListToEntityList(apiList); + assertEquals(apiList.size(), entityList.size()); + + ReviewEntity entity = entityList.get(0); + + assertEquals(api.getProductId(), entity.getProductId()); + assertEquals(api.getReviewId(), entity.getReviewId()); + assertEquals(api.getAuthor(), entity.getAuthor()); + assertEquals(api.getSubject(), entity.getSubject()); + assertEquals(api.getContent(), entity.getContent()); + + List api2List = mapper.entityListToApiList(entityList); + assertEquals(apiList.size(), api2List.size()); + + Review api2 = api2List.get(0); + + assertEquals(api.getProductId(), api2.getProductId()); + assertEquals(api.getReviewId(), api2.getReviewId()); + assertEquals(api.getAuthor(), api2.getAuthor()); + assertEquals(api.getSubject(), api2.getSubject()); + assertEquals(api.getContent(), api2.getContent()); + assertNull(api2.getServiceAddress()); + } +} diff --git a/review-service/src/test/java/com/siriusxi/ms/store/revs/PersistenceTests.java b/review-service/src/test/java/com/siriusxi/ms/store/revs/PersistenceTests.java new file mode 100644 index 00000000..9851b0a4 --- /dev/null +++ b/review-service/src/test/java/com/siriusxi/ms/store/revs/PersistenceTests.java @@ -0,0 +1,125 @@ +package com.siriusxi.ms.store.revs; + +import com.siriusxi.ms.store.revs.persistence.ReviewEntity; +import com.siriusxi.ms.store.revs.persistence.ReviewRepository; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.OptimisticLockingFailureException; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.assertj.core.api.Assertions.fail; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.springframework.transaction.annotation.Propagation.NOT_SUPPORTED; + +@DataJpaTest +@Transactional(propagation = NOT_SUPPORTED) +public class PersistenceTests { + + @Autowired private ReviewRepository repository; + + private ReviewEntity savedEntity; + + @BeforeEach + public void setupDb() { + repository.deleteAll(); + + ReviewEntity entity = new ReviewEntity(1, 2, "a", "s", "c"); + savedEntity = repository.save(entity); + + assertEqualsReview(entity, savedEntity); + } + + @Test + public void create() { + + ReviewEntity newEntity = new ReviewEntity(1, 3, "a", "s", "c"); + repository.save(newEntity); + + ReviewEntity foundEntity = repository.findById(newEntity.getId()).get(); + assertEqualsReview(newEntity, foundEntity); + + assertEquals(2, repository.count()); + } + + @Test + public void update() { + savedEntity.setAuthor("a2"); + repository.save(savedEntity); + + ReviewEntity foundEntity = repository.findById(savedEntity.getId()).get(); + assertEquals(1, (long) foundEntity.getVersion()); + assertEquals("a2", foundEntity.getAuthor()); + } + + @Test + public void delete() { + repository.delete(savedEntity); + assertFalse(repository.existsById(savedEntity.getId())); + } + + @Test + public void getByProductId() { + List entityList = repository.findByProductId(savedEntity.getProductId()); + + assertThat(entityList, hasSize(1)); + assertEqualsReview(savedEntity, entityList.get(0)); + } + + @Test + public void duplicateError() { + + Assertions.assertThrows( + DataIntegrityViolationException.class, + () -> { + ReviewEntity entity = new ReviewEntity(1, 2, "a", "s", "c"); + repository.save(entity); + }); + } + + @Test + public void optimisticLockError() { + + // Store the saved entity in two separate entity objects + ReviewEntity entity1 = repository.findById(savedEntity.getId()).get(); + ReviewEntity entity2 = repository.findById(savedEntity.getId()).get(); + + // Update the entity using the first entity object + entity1.setAuthor("a1"); + repository.save(entity1); + + // Update the entity using the second entity object. + // This should fail since the second entity now holds a old version number, i.e. a Optimistic + // Lock Error + try { + entity2.setAuthor("a2"); + repository.save(entity2); + + fail("Expected an OptimisticLockingFailureException"); + } catch (OptimisticLockingFailureException ignored) { + } + + // Get the updated entity from the database and verify its new sate + ReviewEntity updatedEntity = repository.findById(savedEntity.getId()).get(); + assertEquals(1, (int) updatedEntity.getVersion()); + assertEquals("a1", updatedEntity.getAuthor()); + } + + private void assertEqualsReview(ReviewEntity expectedEntity, ReviewEntity actualEntity) { + assertEquals(expectedEntity.getId(), actualEntity.getId()); + assertEquals(expectedEntity.getVersion(), actualEntity.getVersion()); + assertEquals(expectedEntity.getProductId(), actualEntity.getProductId()); + assertEquals(expectedEntity.getReviewId(), actualEntity.getReviewId()); + assertEquals(expectedEntity.getAuthor(), actualEntity.getAuthor()); + assertEquals(expectedEntity.getSubject(), actualEntity.getSubject()); + assertEquals(expectedEntity.getContent(), actualEntity.getContent()); + } +} diff --git a/review-service/src/test/java/com/siriusxi/ms/store/revs/ReviewServiceApplicationTests.java b/review-service/src/test/java/com/siriusxi/ms/store/revs/ReviewServiceApplicationTests.java index 208c19d1..10df8c72 100644 --- a/review-service/src/test/java/com/siriusxi/ms/store/revs/ReviewServiceApplicationTests.java +++ b/review-service/src/test/java/com/siriusxi/ms/store/revs/ReviewServiceApplicationTests.java @@ -1,77 +1,113 @@ package com.siriusxi.ms.store.revs; +import com.siriusxi.ms.store.api.core.review.Review; +import com.siriusxi.ms.store.revs.persistence.ReviewRepository; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpStatus; import org.springframework.test.web.reactive.server.WebTestClient; +import reactor.core.publisher.Mono; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; -import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY; +import static org.springframework.http.HttpStatus.*; import static org.springframework.http.MediaType.APPLICATION_JSON; -@SpringBootTest(webEnvironment = RANDOM_PORT) +@SpringBootTest(webEnvironment=RANDOM_PORT, properties = { + "spring.datasource.url=jdbc:h2:mem:review-db"}) class ReviewServiceApplicationTests { + private final String BASE_URI = "/reviews"; + @Autowired private WebTestClient client; + @Autowired + private ReviewRepository repository; + + + @BeforeEach + public void setupDb() { + repository.deleteAll(); + } + @Test public void getReviewsByProductId() { int productId = 1; - client.get() - .uri("/review?productId=" + productId) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() + assertEquals(0, repository.findByProductId(productId).size()); + + postAndVerifyReview(productId, 1, OK); + postAndVerifyReview(productId, 2, OK); + postAndVerifyReview(productId, 3, OK); + + assertEquals(3, repository.findByProductId(productId).size()); + + getAndVerifyReviewsByProductId(productId, OK) .jsonPath("$.length()").isEqualTo(3) - .jsonPath("$[0].productId").isEqualTo(productId); + .jsonPath("$[2].productId").isEqualTo(productId) + .jsonPath("$[2].reviewId").isEqualTo(3); + } + + @Test + public void duplicateError() { + + int productId = 1; + int reviewId = 1; + + assertEquals(0, repository.count()); + + postAndVerifyReview(productId, reviewId, OK) + .jsonPath("$.productId").isEqualTo(productId) + .jsonPath("$.reviewId").isEqualTo(reviewId); + + assertEquals(1, repository.count()); + + postAndVerifyReview(productId, reviewId, UNPROCESSABLE_ENTITY) + .jsonPath("$.path").isEqualTo(BASE_URI) + .jsonPath("$.message").isEqualTo("Duplicate key, Product Id: 1, Review Id:1"); + + assertEquals(1, repository.count()); + } + + @Test + public void deleteReviews() { + + int productId = 1; + int recommendationId = 1; + + postAndVerifyReview(productId, recommendationId, OK); + assertEquals(1, repository.findByProductId(productId).size()); + + deleteAndVerifyReviewsByProductId(productId, OK); + assertEquals(0, repository.findByProductId(productId).size()); + + deleteAndVerifyReviewsByProductId(productId, OK); } @Test public void getReviewsMissingParameter() { - client.get() - .uri("/review") - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isEqualTo(BAD_REQUEST) - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/review") + getAndVerifyReviewsByProductId("", BAD_REQUEST) + .jsonPath("$.path").isEqualTo(BASE_URI) .jsonPath("$.message").isEqualTo("Required int parameter 'productId' is not present"); } @Test public void getReviewsInvalidParameter() { - client.get() - .uri("/review?productId=no-integer") - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isEqualTo(BAD_REQUEST) - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/review") + getAndVerifyReviewsByProductId("?productId=no-integer", BAD_REQUEST) + .jsonPath("$.path").isEqualTo(BASE_URI) .jsonPath("$.message").isEqualTo("Type mismatch."); } @Test public void getReviewsNotFound() { - int productIdNotFound = 213; - - client.get() - .uri("/review?productId=" + productIdNotFound) - .accept(APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectHeader().contentType(APPLICATION_JSON) - .expectBody() + getAndVerifyReviewsByProductId("?productId=213", OK) .jsonPath("$.length()").isEqualTo(0); } @@ -80,16 +116,49 @@ public void getReviewsInvalidParameterNegativeValue() { int productIdInvalid = -1; - client.get() - .uri("/review?productId=" + productIdInvalid) + getAndVerifyReviewsByProductId("?productId=" + productIdInvalid, + UNPROCESSABLE_ENTITY) + .jsonPath("$.path").isEqualTo(BASE_URI) + .jsonPath("$.message").isEqualTo("Invalid productId: " + productIdInvalid); + } + + private WebTestClient.BodyContentSpec getAndVerifyReviewsByProductId(int productId, + HttpStatus expectedStatus) { + return getAndVerifyReviewsByProductId("?productId=" + productId, expectedStatus); + } + + private WebTestClient.BodyContentSpec getAndVerifyReviewsByProductId(String productIdQuery, + HttpStatus expectedStatus) { + return client.get() + .uri(BASE_URI + productIdQuery) .accept(APPLICATION_JSON) .exchange() - .expectStatus().isEqualTo(UNPROCESSABLE_ENTITY) + .expectStatus().isEqualTo(expectedStatus) .expectHeader().contentType(APPLICATION_JSON) - .expectBody() - .jsonPath("$.path").isEqualTo("/review") - .jsonPath("$.message").isEqualTo("Invalid productId: " + productIdInvalid); + .expectBody(); } + private WebTestClient.BodyContentSpec postAndVerifyReview(int productId, + int reviewId, + HttpStatus expectedStatus) { + Review review = new Review(productId, reviewId, "Author " + reviewId, + "Subject " + reviewId, "Content " + reviewId, "SA"); + return client.post() + .uri(BASE_URI) + .body(Mono.just(review), Review.class) + .accept(APPLICATION_JSON) + .exchange() + .expectStatus().isEqualTo(expectedStatus) + .expectHeader().contentType(APPLICATION_JSON) + .expectBody(); + } -} + private void deleteAndVerifyReviewsByProductId(int productId, HttpStatus expectedStatus) { + client.delete() + .uri(BASE_URI + "?productId=" + productId) + .accept(APPLICATION_JSON) + .exchange() + .expectStatus().isEqualTo(expectedStatus) + .expectBody(); + } +} \ No newline at end of file diff --git a/setup.sh b/setup.sh index 029e8ec4..2bb5da05 100644 --- a/setup.sh +++ b/setup.sh @@ -3,16 +3,16 @@ ## version: v1.0 echo -e "\nInstalling all Springy store core shared modules" echo -e "................................................\n" -echo "1- Installing [build parent] module..." +echo "1- Installing [Parent Build Chassis] module..." ./mvnw --quiet clean install -pl store-build-chassis || exit 126 echo -e "Done successfully.\n" -echo "2- Installing shared [Utilities] module..." +echo "2- Installing shared [Services Utilities] module..." ./mvnw --quiet clean install -pl store-utils || exit 126 echo -e "Done successfully.\n" -echo "3- Installing shared [APIs] module..." +echo "3- Installing shared [Services APIs] module..." ./mvnw --quiet clean install -pl store-api || exit 126 echo -e "Done successfully.\n" -echo "4- Installing [service parent] module..." +echo "4- Installing [Services Parent Chassis] module..." ./mvnw --quiet clean install -pl store-service-chassis || exit 126 echo -e "Done successfully.\n" diff --git a/store-api/pom.xml b/store-api/pom.xml index 9ec2739e..b4e4ef75 100644 --- a/store-api/pom.xml +++ b/store-api/pom.xml @@ -35,16 +35,6 @@ - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-webflux - - io.springfox diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/StoreService.java b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/StoreService.java new file mode 100644 index 00000000..989db656 --- /dev/null +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/StoreService.java @@ -0,0 +1,104 @@ +package com.siriusxi.ms.store.api.composite; + +import com.siriusxi.ms.store.api.composite.dto.ProductAggregate; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.springframework.web.bind.annotation.*; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +@Api("REST API for Springy Store products information.") +@RequestMapping("store/api/v1") +public interface StoreService { + + /** + * Sample usage: curl $HOST:$PORT/store/api/v1/products/1 + * + * @param productId is the product that you are looking for. + * @return the product info, if found, else null. + */ + @ApiOperation( + value = "${api.product-composite.get-composite-product.description}", + notes = "${api.product-composite.get-composite-product.notes}") + @ApiResponses( + value = { + @ApiResponse( + code = 400, + message = """ + Bad Request, invalid format of the request. + See response message for more information. + """), + @ApiResponse(code = 404, message = "Not found, the specified id does not exist."), + @ApiResponse( + code = 422, + message = """ + Unprocessable entity, input parameters caused the processing to fails. + See response message for more information. + """) + }) + @GetMapping(value = "products/{productId}", + produces = APPLICATION_JSON_VALUE) + ProductAggregate getProduct(@PathVariable int productId); + + /** + * Sample usage: + * + *

curl -X POST $HOST:$PORT/store/api/v1/products \ + * -H "Content-Type: application/json" --data \ + * '{"productId":123,"name":"product 123", "weight":123}' + * + * @param body of product elements definition. + */ + @ApiOperation( + value = "${api.product-composite.create-composite-product.description}", + notes = "${api.product-composite.create-composite-product.notes}") + @ApiResponses( + value = { + @ApiResponse( + code = 400, + message = """ + Bad Request, invalid format of the request. + See response message for more information. + """), + @ApiResponse( + code = 422, + message = """ + Unprocessable entity, input parameters caused the processing to fail. + See response message for more information. + """) + }) + @PostMapping( + value = "products", + consumes = APPLICATION_JSON_VALUE) + void createProduct(@RequestBody ProductAggregate body); + + /** + * Sample usage: + * + *

curl -X DELETE $HOST:$PORT/store/api/v1/products/1 + * + * @param productId to delete. + */ + @ApiOperation( + value = "${api.product-composite.delete-composite-product.description}", + notes = "${api.product-composite.delete-composite-product.notes}") + @ApiResponses( + value = { + @ApiResponse( + code = 400, + message =""" + Bad Request, invalid format of the request. + See response message for more information. + """), + @ApiResponse( + code = 422, + message =""" + Unprocessable entity, input parameters caused the processing to fail. + See response message for more information. + """) + }) + @DeleteMapping("products/{productId}") + void deleteProduct(@PathVariable int productId); +} diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ProductAggregate.java b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ProductAggregate.java similarity index 72% rename from store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ProductAggregate.java rename to store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ProductAggregate.java index 7ab13911..f57379ac 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ProductAggregate.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ProductAggregate.java @@ -1,11 +1,10 @@ -package com.siriusxi.ms.store.api.composite.product.dto; +package com.siriusxi.ms.store.api.composite.dto; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import java.util.List; +// TODO convert it to record @Data @NoArgsConstructor(force = true) @AllArgsConstructor diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/RecommendationSummary.java b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/RecommendationSummary.java similarity index 72% rename from store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/RecommendationSummary.java rename to store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/RecommendationSummary.java index 0682286d..674100f1 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/RecommendationSummary.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/RecommendationSummary.java @@ -1,9 +1,10 @@ -package com.siriusxi.ms.store.api.composite.product.dto; +package com.siriusxi.ms.store.api.composite.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +// TODO convert it to record @Data @NoArgsConstructor(force = true) @AllArgsConstructor @@ -11,4 +12,5 @@ public class RecommendationSummary { private final int recommendationId; private final String author; private final int rate; + private final String content; } diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ReviewSummary.java b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ReviewSummary.java similarity index 71% rename from store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ReviewSummary.java rename to store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ReviewSummary.java index 5285c18f..22220d8e 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ReviewSummary.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ReviewSummary.java @@ -1,9 +1,10 @@ -package com.siriusxi.ms.store.api.composite.product.dto; +package com.siriusxi.ms.store.api.composite.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +// TODO convert it to record @Data @NoArgsConstructor(force = true) @AllArgsConstructor @@ -11,4 +12,5 @@ public class ReviewSummary { private final int reviewId; private final String author; private final String subject; + private final String content; } diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ServiceAddresses.java b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ServiceAddresses.java similarity index 82% rename from store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ServiceAddresses.java rename to store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ServiceAddresses.java index 0cf1d3ab..9563d1b4 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/dto/ServiceAddresses.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/dto/ServiceAddresses.java @@ -1,10 +1,11 @@ -package com.siriusxi.ms.store.api.composite.product.dto; +package com.siriusxi.ms.store.api.composite.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +// TODO convert it to record @Data @NoArgsConstructor(force = true) @AllArgsConstructor diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/ProductCompositeService.java b/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/ProductCompositeService.java deleted file mode 100644 index 9cbe6d5d..00000000 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/composite/product/ProductCompositeService.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.siriusxi.ms.store.api.composite.product; - -import com.siriusxi.ms.store.api.composite.product.dto.ProductAggregate; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -@RequestMapping("v1") -@Api("REST API for composite product information.") -public interface ProductCompositeService { - - /** - * Sample usage: curl $HOST:$PORT/v1/product-composite/1 - * - * @param productId is the product that you are looking for. - * @return the composite product info, if found, else null. - */ - @ApiOperation( - value = "${api.product-composite.get-composite-product.description}", - notes = "${api.product-composite.get-composite-product.notes}") - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Bad Request, invalid format of the request. " + - "See response message for more information."), - @ApiResponse(code = 404, message = "Not found, the specified id does not exist."), - @ApiResponse(code = 422, message = "Unprocessable entity, input parameters caused the " + - "processing to fails. See response message for more information.") - }) - @GetMapping( - value = "/product-composite/{productId}", - produces = APPLICATION_JSON_VALUE) - ProductAggregate getProduct(@PathVariable int productId); -} diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/core/product/Product.java b/store-api/src/main/java/com/siriusxi/ms/store/api/core/product/Product.java index 45553676..3bc9b4a2 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/core/product/Product.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/core/product/Product.java @@ -5,11 +5,11 @@ import lombok.NoArgsConstructor; @Data -@NoArgsConstructor(force = true) +@NoArgsConstructor @AllArgsConstructor public class Product { - private final int productId; - private final String name; - private final int weight; - private final String serviceAddress; + private int productId; + private String name; + private int weight; + private String serviceAddress; } diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/core/product/ProductService.java b/store-api/src/main/java/com/siriusxi/ms/store/api/core/product/ProductService.java index e19b9205..41f64db8 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/core/product/ProductService.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/core/product/ProductService.java @@ -1,18 +1,43 @@ package com.siriusxi.ms.store.api.core.product; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.*; + import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +//@RequestMapping("products") public interface ProductService { - /** - * Sample usage: curl $HOST:$PORT/product/1 - * - * @param productId is the product that you are looking for. - * @return the product, if found, else null. - */ - @GetMapping( - value = "/product/{productId}", - produces = APPLICATION_JSON_VALUE) - Product getProduct(@PathVariable int productId); + + /** + * Sample usage: curl $HOST:$PORT/products/1 + * + * @param productId is the product that you are looking for. + * @return the product, if found, else null. + */ + @GetMapping(value = "products/{productId}", + produces = APPLICATION_JSON_VALUE) + Product getProduct(@PathVariable int productId); + + /** + * Sample usage: + * + *

curl -X POST $HOST:$PORT/products \ -H "Content-Type: application/json" --data \ + * '{"productId":123,"name":"product 123","weight":123}' + * + * @param body product to save. + * @return just created product. + */ + @PostMapping( value = "products", + produces = APPLICATION_JSON_VALUE, + consumes = APPLICATION_JSON_VALUE) + Product createProduct(@RequestBody Product body); + + /** + * Sample usage: + * + *

curl -X DELETE $HOST:$PORT/products/1 + * + * @param productId to be deleted. + */ + @DeleteMapping("products/{productId}") + void deleteProduct(@PathVariable int productId); } diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/core/recommendation/Recommendation.java b/store-api/src/main/java/com/siriusxi/ms/store/api/core/recommendation/Recommendation.java index 3bd41319..5757c25c 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/core/recommendation/Recommendation.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/core/recommendation/Recommendation.java @@ -8,10 +8,10 @@ @NoArgsConstructor(force = true) @AllArgsConstructor public class Recommendation { - private final int productId; - private final int recommendationId; - private final String author; - private final int rate; - private final String content; - private final String serviceAddress; + private int productId; + private int recommendationId; + private String author; + private int rate; + private String content; + private String serviceAddress; } diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/core/recommendation/RecommendationService.java b/store-api/src/main/java/com/siriusxi/ms/store/api/core/recommendation/RecommendationService.java index df7f82ec..273b85e2 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/core/recommendation/RecommendationService.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/core/recommendation/RecommendationService.java @@ -1,25 +1,46 @@ package com.siriusxi.ms.store.api.core.recommendation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.util.List; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +//@RequestMapping("recommendations") public interface RecommendationService { - /** - * Sample usage: curl $HOST:$PORT/recommendation?productId=1 - * - * @param productId that you are looking for its recommendations. - * @return list of recommendations for this product, - * or empty list if there are no recommendations. - */ - @GetMapping( - value = "/recommendation", - produces = APPLICATION_JSON_VALUE) - List getRecommendations( - @RequestParam(value = "productId") - int productId); + /** + * Sample usage: curl $HOST:$PORT/recommendations?productId=1 + * + * @param productId that you are looking for its recommendations. + * + * @return list of product recommendations, + * or empty list if there are no recommendations. + */ + @GetMapping(value = "recommendations",produces = APPLICATION_JSON_VALUE) + List getRecommendations(@RequestParam("productId") int productId); + + /** + * Sample usage: + * + *

curl -X POST $HOST:$PORT/recommendations \ -H "Content-Type: application/json" --data \ + * '{"productId":123,"recommendationId":456,"author":"me","rate":5,"content":"yada, yada, yada"}' + * + * @param body the recommendation to add. + * @return currently created recommendation. + */ + @PostMapping(value = "recommendations", + produces = APPLICATION_JSON_VALUE, + consumes = APPLICATION_JSON_VALUE) + Recommendation createRecommendation(@RequestBody Recommendation body); + + /** + * Sample usage: + * + *

curl -X DELETE $HOST:$PORT/recommendations?productId=1 + * + * @param productId to delete recommendations for. + */ + @DeleteMapping(value = "recommendations") + void deleteRecommendations(@RequestParam("productId") int productId); } diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/core/review/Review.java b/store-api/src/main/java/com/siriusxi/ms/store/api/core/review/Review.java index 8ef717de..f25dd9a6 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/core/review/Review.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/core/review/Review.java @@ -5,13 +5,13 @@ import lombok.NoArgsConstructor; @Data -@NoArgsConstructor(force = true) +@NoArgsConstructor @AllArgsConstructor public class Review { - private final int productId; - private final int reviewId; - private final String author; - private final String subject; - private final String content; - private final String serviceAddress; + private int productId; + private int reviewId; + private String author; + private String subject; + private String content; + private String serviceAddress; } diff --git a/store-api/src/main/java/com/siriusxi/ms/store/api/core/review/ReviewService.java b/store-api/src/main/java/com/siriusxi/ms/store/api/core/review/ReviewService.java index 08c4e69e..8c149ab3 100644 --- a/store-api/src/main/java/com/siriusxi/ms/store/api/core/review/ReviewService.java +++ b/store-api/src/main/java/com/siriusxi/ms/store/api/core/review/ReviewService.java @@ -1,23 +1,49 @@ package com.siriusxi.ms.store.api.core.review; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.util.List; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +//@RequestMapping("reviews") public interface ReviewService { /** - * Sample usage: curl $HOST:$PORT/review?productId=1 + * Sample usage: + * + * curl -X POST $HOST:$PORT/reviews \ + * -H "Content-Type: application/json" --data \ + * '{"productId":123,"reviewId":456,"author":"me","subject":"yada, yada, yada", + * "content":"yada, yada, yada"}' + * + * @param body review to be created. + * @return just created review. + */ + @PostMapping(value = "reviews", + produces = APPLICATION_JSON_VALUE, + consumes = APPLICATION_JSON_VALUE) + Review createReview(@RequestBody Review body); + + /** + * Sample usage: curl $HOST:$PORT/reviews?productId=1 * * @param productId that you are looking for its reviews. * @return list of reviews for this product, * or empty list if there are no reviews. */ - @GetMapping( - value = "/review", + @GetMapping(value = "reviews", produces = APPLICATION_JSON_VALUE) - List getReviews(@RequestParam(value = "productId") int productId); + List getReviews(@RequestParam("productId") int productId); + + + /** + * Sample usage: + * + * curl -X DELETE $HOST:$PORT/review?productId=1 + * + * @param productId to delete its reviews. + */ + @DeleteMapping(value = "reviews") + void deleteReviews(@RequestParam("productId") int productId); } diff --git a/store-build-chassis/pom.xml b/store-build-chassis/pom.xml index 67fcbcda..e8d1a2de 100644 --- a/store-build-chassis/pom.xml +++ b/store-build-chassis/pom.xml @@ -21,15 +21,19 @@ 14 UTF-8 UTF-8 - ../config/maven/store.properties + ../config/maven/store.properties + 3.8.1 3.0.0-M4 3.0.0-M4 1.0.0 3.0.0-SNAPSHOT + 1.3.1.Final + 1.18.12 + true @@ -42,6 +46,22 @@ + + + + + + org.projectlombok + lombok + true + + + + + org.springframework.boot + spring-boot-starter-webflux + + @@ -52,6 +72,18 @@ ${java.version} --enable-preview + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + org.projectlombok + lombok + ${org.lombok.version} + + diff --git a/store-service-chassis/pom.xml b/store-service-chassis/pom.xml index 2546d5d7..59f94b88 100644 --- a/store-service-chassis/pom.xml +++ b/store-service-chassis/pom.xml @@ -42,10 +42,6 @@ spring-boot-starter-actuator - - org.springframework.boot - spring-boot-starter-webflux - @@ -60,6 +56,11 @@ + + org.hamcrest + hamcrest-library + test + io.projectreactor @@ -82,11 +83,13 @@ + - org.projectlombok - lombok - true + org.mapstruct + mapstruct + ${org.mapstruct.version} + @@ -113,6 +116,7 @@ + diff --git a/product-composite-service/Dockerfile b/store-service/Dockerfile similarity index 100% rename from product-composite-service/Dockerfile rename to store-service/Dockerfile diff --git a/product-composite-service/pom.xml b/store-service/pom.xml similarity index 87% rename from product-composite-service/pom.xml rename to store-service/pom.xml index b2e81ff1..eed5f831 100644 --- a/product-composite-service/pom.xml +++ b/store-service/pom.xml @@ -11,10 +11,10 @@ ../store-service-chassis - product-composite-service - Product Composite Service + store-service + Store Service 1.0-SNAPSHOT - Product Composite Service Spring Boot based project + Store Product Composite Service Spring Boot based project jar diff --git a/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/ProductCompositeServiceApplication.java b/store-service/src/main/java/com/siriusxi/ms/store/pcs/StoreServiceApplication.java similarity index 78% rename from product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/ProductCompositeServiceApplication.java rename to store-service/src/main/java/com/siriusxi/ms/store/pcs/StoreServiceApplication.java index 21309298..31a8606a 100644 --- a/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/ProductCompositeServiceApplication.java +++ b/store-service/src/main/java/com/siriusxi/ms/store/pcs/StoreServiceApplication.java @@ -8,9 +8,8 @@ @SpringBootApplication @EnableSwagger2WebFlux // Starting point for initiating SpringFox @ComponentScan("com.siriusxi.ms.store") -public class ProductCompositeServiceApplication { - +public class StoreServiceApplication { public static void main(String[] args) { - SpringApplication.run(ProductCompositeServiceApplication.class, args); + SpringApplication.run(StoreServiceApplication.class, args); } } diff --git a/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/config/ProductCompositeConfiguration.java b/store-service/src/main/java/com/siriusxi/ms/store/pcs/config/StoreConfiguration.java similarity index 92% rename from product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/config/ProductCompositeConfiguration.java rename to store-service/src/main/java/com/siriusxi/ms/store/pcs/config/StoreConfiguration.java index 2d4a6ff3..e9fd3820 100644 --- a/product-composite-service/src/main/java/com/siriusxi/ms/store/pcs/config/ProductCompositeConfiguration.java +++ b/store-service/src/main/java/com/siriusxi/ms/store/pcs/config/StoreConfiguration.java @@ -10,12 +10,12 @@ import springfox.documentation.spring.web.plugins.Docket; import static java.util.Collections.emptyList; -import static org.springframework.web.bind.annotation.RequestMethod.GET; +import static org.springframework.web.bind.annotation.RequestMethod.*; import static springfox.documentation.builders.RequestHandlerSelectors.basePackage; import static springfox.documentation.spi.DocumentationType.SWAGGER_2; @Configuration -public class ProductCompositeConfiguration { +public class StoreConfiguration { @Value("${api.common.version}") String apiVersion; @Value("${api.common.title}") @@ -54,13 +54,15 @@ public Docket apiDocumentation() { Using the apis() and paths() methods, we can specify where SpringFox shall look for API documentation. */ - .apis(basePackage("com.siriusxi.ms.store.pcs")) + .apis(basePackage("com.siriusxi.ms.store")) .paths(PathSelectors.any()) .build() /* Using the globalResponseMessage() method, we ask SpringFox not to add any default HTTP response codes to the API documentation, such as 401 and 403, which we don't currently use. */ + .globalResponseMessage(POST, emptyList()) .globalResponseMessage(GET, emptyList()) + .globalResponseMessage(DELETE, emptyList()) /* The api* variables that are used to configure the Docket bean with general information about the API are initialized from the property file using Spring @Value annotations. */ diff --git a/store-service/src/main/java/com/siriusxi/ms/store/pcs/controller/StoreServiceImpl.java b/store-service/src/main/java/com/siriusxi/ms/store/pcs/controller/StoreServiceImpl.java new file mode 100644 index 00000000..877b1f22 --- /dev/null +++ b/store-service/src/main/java/com/siriusxi/ms/store/pcs/controller/StoreServiceImpl.java @@ -0,0 +1,127 @@ +package com.siriusxi.ms.store.pcs.controller; + +import com.siriusxi.ms.store.api.composite.StoreService; +import com.siriusxi.ms.store.api.composite.dto.ProductAggregate; +import com.siriusxi.ms.store.api.composite.dto.RecommendationSummary; +import com.siriusxi.ms.store.api.composite.dto.ReviewSummary; +import com.siriusxi.ms.store.api.composite.dto.ServiceAddresses; +import com.siriusxi.ms.store.api.core.product.Product; +import com.siriusxi.ms.store.api.core.recommendation.Recommendation; +import com.siriusxi.ms.store.api.core.review.Review; +import com.siriusxi.ms.store.pcs.integration.StoreIntegration; +import com.siriusxi.ms.store.util.exceptions.NotFoundException; +import com.siriusxi.ms.store.util.http.ServiceUtil; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@Log4j2 +public class StoreServiceImpl implements StoreService { + + private final ServiceUtil serviceUtil; + private final StoreIntegration integration; + + @Autowired + public StoreServiceImpl(ServiceUtil serviceUtil, + StoreIntegration integration) { + this.serviceUtil = serviceUtil; + this.integration = integration; + } + + @Override + public void createProduct(ProductAggregate body) { + + try { + + log.debug("createCompositeProduct: creates a new composite entity for productId: {}", + body.getProductId()); + + Product product = new Product(body.getProductId(), body.getName(), body.getWeight(), null); + integration.createProduct(product); + + if (body.getRecommendations() != null) { + body.getRecommendations().forEach(r -> { + Recommendation recommendation = new Recommendation(body.getProductId(), r.getRecommendationId(), r.getAuthor(), r.getRate(), r.getContent(), null); + integration.createRecommendation(recommendation); + }); + } + + if (body.getReviews() != null) { + body.getReviews().forEach(r -> { + Review review = new Review(body.getProductId(), r.getReviewId(), r.getAuthor(), r.getSubject(), r.getContent(), null); + integration.createReview(review); + }); + } + + log.debug("createCompositeProduct: composite entites created for productId: {}", + body.getProductId()); + + } catch (RuntimeException re) { + log.warn("createCompositeProduct failed", re); + throw re; + } + } + + @Override + public ProductAggregate getProduct(int productId) { + log.debug("getCompositeProduct: lookup a product aggregate for productId: {}", productId); + + Product product = integration.getProduct(productId); + if (product == null) throw new NotFoundException("No product found for productId: " + productId); + + List recommendations = integration.getRecommendations(productId); + + List reviews = integration.getReviews(productId); + + log.debug("getCompositeProduct: aggregate entity found for productId: {}", productId); + + return createProductAggregate(product, recommendations, reviews, serviceUtil.getServiceAddress()); + } + + @Override + public void deleteProduct(int productId) { + + log.debug("deleteCompositeProduct: Deletes a product aggregate for productId: {}", + productId); + + integration.deleteProduct(productId); + + integration.deleteRecommendations(productId); + + integration.deleteReviews(productId); + + log.debug("getCompositeProduct: aggregate entities deleted for productId: {}", productId); + } + + private ProductAggregate createProductAggregate(Product product, List recommendations, List reviews, String serviceAddress) { + + // 1. Setup product info + int productId = product.getProductId(); + String name = product.getName(); + int weight = product.getWeight(); + + // 2. Copy summary recommendation info, if available + List recommendationSummaries = (recommendations == null) ? null : + recommendations.stream() + .map(r -> new RecommendationSummary(r.getRecommendationId(), r.getAuthor(), r.getRate(), r.getContent())) + .collect(Collectors.toList()); + + // 3. Copy summary review info, if available + List reviewSummaries = (reviews == null) ? null : + reviews.stream() + .map(r -> new ReviewSummary(r.getReviewId(), r.getAuthor(), r.getSubject(), r.getContent())) + .collect(Collectors.toList()); + + // 4. Create info regarding the involved microservices addresses + String productAddress = product.getServiceAddress(); + String reviewAddress = (reviews != null && reviews.size() > 0) ? reviews.get(0).getServiceAddress() : ""; + String recommendationAddress = (recommendations != null && recommendations.size() > 0) ? recommendations.get(0).getServiceAddress() : ""; + ServiceAddresses serviceAddresses = new ServiceAddresses(serviceAddress, productAddress, reviewAddress, recommendationAddress); + + return new ProductAggregate(productId, name, weight, recommendationSummaries, reviewSummaries, serviceAddresses); + } +} diff --git a/store-service/src/main/java/com/siriusxi/ms/store/pcs/integration/StoreIntegration.java b/store-service/src/main/java/com/siriusxi/ms/store/pcs/integration/StoreIntegration.java new file mode 100644 index 00000000..1da5d2b0 --- /dev/null +++ b/store-service/src/main/java/com/siriusxi/ms/store/pcs/integration/StoreIntegration.java @@ -0,0 +1,234 @@ +package com.siriusxi.ms.store.pcs.integration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.siriusxi.ms.store.api.core.product.Product; +import com.siriusxi.ms.store.api.core.product.ProductService; +import com.siriusxi.ms.store.api.core.recommendation.Recommendation; +import com.siriusxi.ms.store.api.core.recommendation.RecommendationService; +import com.siriusxi.ms.store.api.core.review.Review; +import com.siriusxi.ms.store.api.core.review.ReviewService; +import com.siriusxi.ms.store.util.exceptions.InvalidInputException; +import com.siriusxi.ms.store.util.exceptions.NotFoundException; +import com.siriusxi.ms.store.util.http.HttpErrorInfo; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static java.lang.String.valueOf; +import static org.springframework.http.HttpMethod.GET; + +@Component +@Log4j2 +public class StoreIntegration + implements + ProductService, + RecommendationService, + ReviewService { + + private final RestTemplate restTemplate; + private final ObjectMapper mapper; + + private final String productServiceUrl; + private final String recommendationServiceUrl; + private final String reviewServiceUrl; + + @Autowired + public StoreIntegration( + RestTemplate restTemplate, + ObjectMapper mapper, + + @Value("${app.product-service.host}") String productServiceHost, + @Value("${app.product-service.port}") int productServicePort, + + @Value("${app.recommendation-service.host}") String recommendationServiceHost, + @Value("${app.recommendation-service.port}") int recommendationServicePort, + + @Value("${app.review-service.host}") String reviewServiceHost, + @Value("${app.review-service.port}") int reviewServicePort + ) { + + this.restTemplate = restTemplate; + this.mapper = mapper; + + var http = "http://"; + + productServiceUrl = http.concat(productServiceHost).concat(":").concat(valueOf(productServicePort)) + .concat("/products/"); + recommendationServiceUrl = http.concat(recommendationServiceHost).concat(":") + .concat(valueOf(recommendationServicePort)).concat("/recommendations"); + reviewServiceUrl = http.concat(reviewServiceHost).concat(":").concat(valueOf(reviewServicePort)) + .concat("/reviews"); + } + + @Override + public Product createProduct(Product body) { + + try { + String url = productServiceUrl; + log.debug("Will post a new product to URL: {}", url); + + Product product = restTemplate.postForObject(url, body, Product.class); + log.debug("Created a product with id: {}", product.getProductId()); + + return product; + + } catch (HttpClientErrorException ex) { + throw handleHttpClientException(ex); + } + } + + @Override + public Product getProduct(int productId) { + + try { + String url = productServiceUrl + "/" + productId; + log.debug("Will call the getProduct API on URL: {}", url); + + Product product = restTemplate.getForObject(url, Product.class); + log.debug("Found a product with id: {}", product.getProductId()); + + return product; + + } catch (HttpClientErrorException ex) { + throw handleHttpClientException(ex); + } + } + + @Override + public void deleteProduct(int productId) { + try { + String url = productServiceUrl + "/" + productId; + log.debug("Will call the deleteProduct API on URL: {}", url); + + restTemplate.delete(url); + + } catch (HttpClientErrorException ex) { + throw handleHttpClientException(ex); + } + } + + @Override + public Recommendation createRecommendation(Recommendation body) { + + try { + String url = recommendationServiceUrl; + log.debug("Will post a new recommendation to URL: {}", url); + + Recommendation recommendation = restTemplate.postForObject(url, body, Recommendation.class); + log.debug("Created a recommendation with id: {}", recommendation.getProductId()); + + return recommendation; + + } catch (HttpClientErrorException ex) { + throw handleHttpClientException(ex); + } + } + + @Override + public List getRecommendations(int productId) { + + try { + String url = recommendationServiceUrl + "?productId=" + productId; + + log.debug("Will call the getRecommendations API on URL: {}", url); + List recommendations = restTemplate.exchange(url, GET, null, new ParameterizedTypeReference>() {}).getBody(); + + log.debug("Found {} recommendations for a product with id: {}", recommendations.size(), productId); + return recommendations; + + } catch (Exception ex) { + log.warn("Got an exception while requesting recommendations, return zero recommendations: {}", ex.getMessage()); + return new ArrayList<>(); + } + } + + @Override + public void deleteRecommendations(int productId) { + try { + String url = recommendationServiceUrl + "?productId=" + productId; + log.debug("Will call the deleteRecommendations API on URL: {}", url); + + restTemplate.delete(url); + + } catch (HttpClientErrorException ex) { + throw handleHttpClientException(ex); + } + } + + @Override + public Review createReview(Review body) { + + try { + String url = reviewServiceUrl; + log.debug("Will post a new review to URL: {}", url); + + Review review = restTemplate.postForObject(url, body, Review.class); + log.debug("Created a review with id: {}", review.getProductId()); + + return review; + + } catch (HttpClientErrorException ex) { + throw handleHttpClientException(ex); + } + } + + @Override + public List getReviews(int productId) { + + try { + String url = reviewServiceUrl + "?productId=" + productId; + + log.debug("Will call the getReviews API on URL: {}", url); + List reviews = restTemplate.exchange(url, GET, null, new ParameterizedTypeReference>() {}).getBody(); + + log.debug("Found {} reviews for a product with id: {}", reviews.size(), productId); + return reviews; + + } catch (Exception ex) { + log.warn("Got an exception while requesting reviews, return zero reviews: {}", ex.getMessage()); + return new ArrayList<>(); + } + } + + @Override + public void deleteReviews(int productId) { + try { + String url = reviewServiceUrl + "?productId=" + productId; + log.debug("Will call the deleteReviews API on URL: {}", url); + + restTemplate.delete(url); + + } catch (HttpClientErrorException ex) { + throw handleHttpClientException(ex); + } + } + + private RuntimeException handleHttpClientException(HttpClientErrorException ex) { + switch (ex.getStatusCode()) { + case NOT_FOUND: + return new NotFoundException(getErrorMessage(ex)); + case UNPROCESSABLE_ENTITY : + return new InvalidInputException(getErrorMessage(ex)); + default: + log.warn("Got a unexpected HTTP error: {}, will rethrow it", ex.getStatusCode()); + log.warn("Error body: {}", ex.getResponseBodyAsString()); + return ex; + } + } + + private String getErrorMessage(HttpClientErrorException ex) { + try { + return mapper.readValue(ex.getResponseBodyAsString(), HttpErrorInfo.class).message(); + } catch (IOException ioException) { + return ex.getMessage(); + } + } +} diff --git a/product-composite-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/store-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json similarity index 75% rename from product-composite-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json rename to store-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 2c64bfaa..2833250c 100644 --- a/product-composite-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/store-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -84,6 +84,26 @@ "name": "api.product-composite.get-composite-product.notes", "type": "java.lang.String", "description": "Description for api.product-composite.get-composite-product.notes." + }, + { + "name": "api.product-composite.create-composite-product.description", + "type": "java.lang.String", + "description": "Description for api.product-composite.get-composite-product.create-composite-product.description." + }, + { + "name": "api.product-composite.create-composite-product.notes", + "type": "java.lang.String", + "description": "Description for api.product-composite.get-composite-product.create-composite-product.notes." + }, + { + "name": "api.product-composite.delete-composite-product.description", + "type": "java.lang.String", + "description": "Description for api.product-composite.delete-composite-product.description." + }, + { + "name": "api.product-composite.delete-composite-product.notes", + "type": "java.lang.String", + "description": "Description for api.product-composite.delete-composite-product.notes." } ] } \ No newline at end of file diff --git a/product-composite-service/src/main/resources/application.yaml b/store-service/src/main/resources/application.yaml similarity index 59% rename from product-composite-service/src/main/resources/application.yaml rename to store-service/src/main/resources/application.yaml index 5b41434f..2e7c1672 100644 --- a/product-composite-service/src/main/resources/application.yaml +++ b/store-service/src/main/resources/application.yaml @@ -1,6 +1,6 @@ spring: application: - name: product-search + name: store-service server: port: 9080 @@ -9,7 +9,7 @@ logging: level: web: DEBUG root: INFO - com.siriusxi.ms:.store: DEBUG + com.siriusxi.ms.store: DEBUG management: endpoints: @@ -59,28 +59,33 @@ api: notes: | # Normal response If the requested product id is found the method will return information regarding: - 1. Base product information + 1. Product information 1. Reviews 1. Recommendations - 1. Service Addresses\n(technical information regarding the addresses of the microservices that created the response) + 1. Service Addresses + (technical information regarding the addresses of the microservices that created the response) # Expected partial and error responses - In the following cases, only a partial response be created (used to simplify testing of error conditions) + 1. If no product information is found, a 404 - Not Found error will be returned + 1. In no recommendations or reviews are found for a product, a partial response will be returned - ## Product id 113 - 200 - Ok, but no recommendations will be returned - - ## Product id 213 - 200 - Ok, but no reviews will be returned - - ## Non numerical product id - 400 - A Bad Request error will be returned + create-composite-product: + description: Creates a composite product + notes: | + # Normal response + The composite product information posted to the API will be splitted up and stored as separate product-info, recommendation and review entities. - ## Product id 13 - 404 - A Not Found error will be returned + # Expected error responses + 1. If a product with the same productId as specified in the posted information already exists, + an 422 - Unprocessable Entity error with a "duplicate key" error message will be returned - ## Negative product ids - 422 - An Unprocessable Entity error will be returned + delete-composite-product: + description: Deletes a product composite + notes: | + # Normal response + Entities for product information, recommendations and reviews related to the specificed productId will be deleted. + The implementation of the delete method is idempotent, i.e. it can be called several times with the same response. + This means that a delete request of a non existing product will return 200 Ok. # ----------------------------------------------- # This is a docker specific profile properties diff --git a/product-composite-service/src/main/resources/banner.txt b/store-service/src/main/resources/banner.txt similarity index 100% rename from product-composite-service/src/main/resources/banner.txt rename to store-service/src/main/resources/banner.txt diff --git a/store-service/src/test/java/com/siriusxi/ms/store/pcs/StoreServiceApplicationTests.java b/store-service/src/test/java/com/siriusxi/ms/store/pcs/StoreServiceApplicationTests.java new file mode 100644 index 00000000..9ce716a2 --- /dev/null +++ b/store-service/src/test/java/com/siriusxi/ms/store/pcs/StoreServiceApplicationTests.java @@ -0,0 +1,146 @@ +package com.siriusxi.ms.store.pcs; + +import com.siriusxi.ms.store.api.composite.dto.ProductAggregate; +import com.siriusxi.ms.store.api.composite.dto.RecommendationSummary; +import com.siriusxi.ms.store.api.composite.dto.ReviewSummary; +import com.siriusxi.ms.store.api.core.product.Product; +import com.siriusxi.ms.store.api.core.recommendation.Recommendation; +import com.siriusxi.ms.store.api.core.review.Review; +import com.siriusxi.ms.store.pcs.integration.StoreIntegration; +import com.siriusxi.ms.store.util.exceptions.InvalidInputException; +import com.siriusxi.ms.store.util.exceptions.NotFoundException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.test.web.reactive.server.WebTestClient.BodyContentSpec; +import reactor.core.publisher.Mono; + +import static java.util.Collections.singletonList; +import static org.mockito.Mockito.when; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import static org.springframework.http.HttpStatus.*; +import static org.springframework.http.MediaType.APPLICATION_JSON; + +@SpringBootTest(webEnvironment = RANDOM_PORT) +class StoreServiceApplicationTests { + + private static final int PRODUCT_ID_OK = 1; + private static final int PRODUCT_ID_NOT_FOUND = 2; + private static final int PRODUCT_ID_INVALID = 3; + + public static final String BASE_URL = "/store/api/v1/products/"; + + @Autowired + private WebTestClient client; + + @MockBean + private StoreIntegration storeIntegration; + + @BeforeEach + void setUp() { + + when(storeIntegration.getProduct(PRODUCT_ID_OK)). + thenReturn(new Product(PRODUCT_ID_OK, "name", 1, "mock-address")); + + when(storeIntegration.getRecommendations(PRODUCT_ID_OK)). + thenReturn(singletonList(new Recommendation(PRODUCT_ID_OK, + 1, "author", + 1, "content", "mock address"))); + + when(storeIntegration.getReviews(PRODUCT_ID_OK)). + thenReturn(singletonList(new Review(PRODUCT_ID_OK, 1, + "author", "subject", "content", + "mock address"))); + + when(storeIntegration.getProduct(PRODUCT_ID_NOT_FOUND)) + .thenThrow(new NotFoundException("NOT FOUND: " + PRODUCT_ID_NOT_FOUND)); + + when(storeIntegration.getProduct(PRODUCT_ID_INVALID)) + .thenThrow(new InvalidInputException("INVALID: " + PRODUCT_ID_INVALID)); + } + + @Test + public void createCompositeProduct1() { + + ProductAggregate compositeProduct = new ProductAggregate(1, "name", 1, + null, null, null); + + postAndVerifyProductIsCreated(compositeProduct); + } + + @Test + public void createCompositeProduct2() { + ProductAggregate compositeProduct = new ProductAggregate(1, "name", 1, + singletonList(new RecommendationSummary(1, "a", 1, "c")), + singletonList(new ReviewSummary(1, "a", "s", "c")), null); + + postAndVerifyProductIsCreated(compositeProduct); + } + + @Test + public void deleteCompositeProduct() { + ProductAggregate compositeProduct = new ProductAggregate(1, "name", 1, + singletonList(new RecommendationSummary(1, "a", 1, "c")), + singletonList(new ReviewSummary(1, "a", "s", "c")), null); + + postAndVerifyProductIsCreated(compositeProduct); + + deleteAndVerifyProductIsDeleted(compositeProduct.getProductId()); + deleteAndVerifyProductIsDeleted(compositeProduct.getProductId()); + } + + @Test + public void getProductById() { + + getAndVerifyProduct(PRODUCT_ID_OK, OK) + .jsonPath("$.productId").isEqualTo(PRODUCT_ID_OK) + .jsonPath("$.recommendations.length()").isEqualTo(1) + .jsonPath("$.reviews.length()").isEqualTo(1); + } + + @Test + public void getProductNotFound() { + + getAndVerifyProduct(PRODUCT_ID_NOT_FOUND, NOT_FOUND) + .jsonPath("$.path").isEqualTo(BASE_URL + PRODUCT_ID_NOT_FOUND) + .jsonPath("$.message").isEqualTo("NOT FOUND: " + PRODUCT_ID_NOT_FOUND); + } + + @Test + public void getProductInvalidInput() { + + getAndVerifyProduct(PRODUCT_ID_INVALID, UNPROCESSABLE_ENTITY) + .jsonPath("$.path").isEqualTo(BASE_URL + PRODUCT_ID_INVALID) + .jsonPath("$.message").isEqualTo("INVALID: " + PRODUCT_ID_INVALID); + } + + private BodyContentSpec getAndVerifyProduct(int productId, HttpStatus expectedStatus) { + return client.get() + .uri(BASE_URL + productId) + .accept(APPLICATION_JSON) + .exchange() + .expectStatus().isEqualTo(expectedStatus) + .expectHeader().contentType(APPLICATION_JSON) + .expectBody(); + } + + private void postAndVerifyProductIsCreated(ProductAggregate compositeProduct) { + client.post() + .uri(BASE_URL) + .body(Mono.just(compositeProduct), ProductAggregate.class) + .exchange() + .expectStatus().isEqualTo(OK); + } + + private void deleteAndVerifyProductIsDeleted(int productId) { + client.delete() + .uri(BASE_URL + productId) + .exchange() + .expectStatus().isEqualTo(OK); + } + +} diff --git a/store-utils/pom.xml b/store-utils/pom.xml index 72dcbdac..430f4614 100644 --- a/store-utils/pom.xml +++ b/store-utils/pom.xml @@ -4,12 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - store-utils - 1.0-SNAPSHOT - Springy Store Utils - Project that define all Springy Store shared functionality - jar - com.siriusxi.ms.store store-build-chassis @@ -17,33 +11,10 @@ ../store-build-chassis - - - 2.3.0.M4 - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.dependencies.version} - import - pom - - - - - - - org.springframework.boot - spring-boot-starter-webflux - + store-utils + 1.0-SNAPSHOT + Springy Store Utils + Project that define all Springy Store shared functionality + jar - - org.projectlombok - lombok - true - - \ No newline at end of file diff --git a/test-em-all.sh b/test-em-all.sh index 5b003aa2..d064668f 100644 --- a/test-em-all.sh +++ b/test-em-all.sh @@ -1,7 +1,8 @@ #!/usr/bin/env bash ## Author: Mohamed Taman -## version: v1.0 +## version: v3.0 ### Sample usage: +# # for local run # HOST=localhost PORT=9080 ./test-em-all.bash # with docker compose @@ -12,6 +13,7 @@ echo -e "Starting [Springy Store] full functionality testing....\n" : ${HOST=localhost} : ${PORT=8080} +BASE_URL="/store/api/v1/products" function assertCurl() { local expectedHttpCode=$1 @@ -80,6 +82,45 @@ function waitForService() { done } +function createProduct() { + local productId=$1 + local composite=$2 + + assertCurl 200 "curl -X DELETE http://${HOST}:${PORT}${BASE_URL}/${productId} -s" + curl -X POST http://${HOST}:${PORT}${BASE_URL} -H "Content-Type: application/json" --data "$composite" +} + +function setupTestData() { + + body=\ +'{"productId":1,"name":"product 1","weight":1, "recommendations":[ + {"recommendationId":1,"author":"author 1","rate":1,"content":"content 1"}, + {"recommendationId":2,"author":"author 2","rate":2,"content":"content 2"}, + {"recommendationId":3,"author":"author 3","rate":3,"content":"content 3"} + ], "reviews":[ + {"reviewId":1,"author":"author 1","subject":"subject 1","content":"content 1"}, + {"reviewId":2,"author":"author 2","subject":"subject 2","content":"content 2"}, + {"reviewId":3,"author":"author 3","subject":"subject 3","content":"content 3"} + ]}' + createProduct 1 "$body" + + body=\ +'{"productId":113,"name":"product 113","weight":113, "reviews":[ + {"reviewId":1,"author":"author 1","subject":"subject 1","content":"content 1"}, + {"reviewId":2,"author":"author 2","subject":"subject 2","content":"content 2"}, + {"reviewId":3,"author":"author 3","subject":"subject 3","content":"content 3"} +]}' + createProduct 113 "$body" + + body=\ +'{"productId":213,"name":"product 213","weight":213, "recommendations":[ + {"recommendationId":1,"author":"author 1","rate":1,"content":"content 1"}, + {"recommendationId":2,"author":"author 2","rate":2,"content":"content 2"}, + {"recommendationId":3,"author":"author 3","rate":3,"content":"content 3"} +]}' + createProduct 213 "$body" +} + set -e echo "Start:" `date` @@ -96,35 +137,37 @@ then docker-compose -p ssm up -d fi -waitForService http://${HOST}:${PORT}/v1/product-composite/1 +waitForService curl -X DELETE http://${HOST}:${PORT}${BASE_URL}/13 + +setupTestData # Verify that a normal request works, expect three recommendations and three reviews -assertCurl 200 "curl http://$HOST:$PORT/v1/product-composite/1 -s" +assertCurl 200 "curl http://$HOST:$PORT${BASE_URL}/1 -s" assertEqual 1 $(echo ${RESPONSE} | jq .productId) assertEqual 3 $(echo ${RESPONSE} | jq ".recommendations | length") assertEqual 3 $(echo ${RESPONSE} | jq ".reviews | length") # Verify that a 404 (Not Found) error is returned for a non existing productId (13) -assertCurl 404 "curl http://$HOST:$PORT/v1/product-composite/13 -s" +assertCurl 404 "curl http://$HOST:$PORT${BASE_URL}/13 -s" # Verify that no recommendations are returned for productId 113 -assertCurl 200 "curl http://$HOST:$PORT/v1/product-composite/113 -s" +assertCurl 200 "curl http://$HOST:$PORT${BASE_URL}/113 -s" assertEqual 113 $(echo ${RESPONSE} | jq .productId) assertEqual 0 $(echo ${RESPONSE} | jq ".recommendations | length") assertEqual 3 $(echo ${RESPONSE} | jq ".reviews | length") # Verify that no reviews are returned for productId 213 -assertCurl 200 "curl http://$HOST:$PORT/v1/product-composite/213 -s" +assertCurl 200 "curl http://$HOST:$PORT${BASE_URL}/213 -s" assertEqual 213 $(echo ${RESPONSE} | jq .productId) assertEqual 3 $(echo ${RESPONSE} | jq ".recommendations | length") assertEqual 0 $(echo ${RESPONSE} | jq ".reviews | length") # Verify that a 422 (Unprocessable Entity) error is returned for a productId that is out of range (-1) -assertCurl 422 "curl http://$HOST:$PORT/v1/product-composite/-1 -s" +assertCurl 422 "curl http://$HOST:$PORT${BASE_URL}/-1 -s" assertEqual "\"Invalid productId: -1\"" "$(echo ${RESPONSE} | jq .message)" # Verify that a 400 (Bad Request) error error is returned for a productId that is not a number, i.e. invalid format -assertCurl 400 "curl http://$HOST:$PORT/v1/product-composite/invalidProductId -s" +assertCurl 400 "curl http://$HOST:$PORT${BASE_URL}/invalidProductId -s" assertEqual "\"Type mismatch.\"" "$(echo ${RESPONSE} | jq .message)" if [[ $@ == *"stop"* ]]