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