From 0e7243b9325d3e033474de121c82ce36d019a2c8 Mon Sep 17 00:00:00 2001 From: tisla4 Date: Tue, 11 Mar 2025 13:07:18 -0400 Subject: [PATCH 1/5] feat: BaseGetPolyImperativeRestController --- .../BaseGetPolyImperativeRestController.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 api/synapse-api-rest-imperative/src/main/java/io/americanexpress/synapse/api/rest/imperative/controller/BaseGetPolyImperativeRestController.java diff --git a/api/synapse-api-rest-imperative/src/main/java/io/americanexpress/synapse/api/rest/imperative/controller/BaseGetPolyImperativeRestController.java b/api/synapse-api-rest-imperative/src/main/java/io/americanexpress/synapse/api/rest/imperative/controller/BaseGetPolyImperativeRestController.java new file mode 100644 index 000000000..323734dbe --- /dev/null +++ b/api/synapse-api-rest-imperative/src/main/java/io/americanexpress/synapse/api/rest/imperative/controller/BaseGetPolyImperativeRestController.java @@ -0,0 +1,58 @@ +package io.americanexpress.synapse.api.rest.imperative.controller; + +import io.americanexpress.synapse.api.rest.imperative.controller.helpers.PolyResponseEntityCreator; +import io.americanexpress.synapse.service.imperative.model.BaseServiceRequest; +import io.americanexpress.synapse.service.imperative.model.BaseServiceResponse; +import io.americanexpress.synapse.service.imperative.model.PageResponse; +import io.americanexpress.synapse.service.imperative.service.BaseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import java.util.List; + +/** + * {@code BaseGetPolyImperativeRestController} class specifies the prototypes for listening for requests from the consumer + * to Read (GET) a resource. This Controller expects no request and a list of objects as response, hence, "Poly" in the name. + * + * @param an object extending {@link BaseServiceRequest} + * @param an object extending {@link BaseServiceResponse} + * @param an object extending {@link BaseService} + * @author Tanvir Islam + */ +public class BaseGetPolyImperativeRestController< + I extends BaseServiceRequest, + O extends BaseServiceResponse, + S extends BaseService> + > extends BaseController { + + /** + * Get a list of multiple resources from the back end service. + * + * @param httpHeaders containing the HTTP headers from the consumer + * @param serviceRequest body from the consumer + * @return a list of resources from the back end service + */ + @Operation(summary = "Read operation based on path.", description = "Read a collection of resources based on request criteria.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Ok"), + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "400", description = "Bad Request"), + @ApiResponse(responseCode = "401", description = "Unauthorized"), + @ApiResponse(responseCode = "403", description = "Forbidden"), + @ApiResponse(responseCode = "404", description = "Not Found") + }) + @GetMapping + public ResponseEntity> read(@RequestHeader HttpHeaders httpHeaders, I serviceRequest) { + logger.entry(serviceRequest); + + final PageResponse page = service.execute(serviceRequest); + final ResponseEntity> responseEntity = PolyResponseEntityCreator.create(page); + + logger.exit(responseEntity); + return responseEntity; + } +} From 9c7bf4c3ab9db12f5881d637f2f2bee25ee08f2b Mon Sep 17 00:00:00 2001 From: tisla4 Date: Tue, 11 Mar 2025 13:07:56 -0400 Subject: [PATCH 2/5] feat: sample api for read poly and get poly controller / service testing --- api/api-samples/pom.xml | 33 +++++++++++++ .../sample-api-imperative-book/pom.xml | 39 ++++++++++++++++ .../imperativebook/BookApplication.java | 30 ++++++++++++ .../imperativebook/config/BookApiConfig.java | 30 ++++++++++++ .../imperativebook/config/BookEndpoint.java | 21 +++++++++ .../controller/GetPolyBookController.java | 19 ++++++++ .../controller/ReadPolyBookController.java | 19 ++++++++ .../helpers/PolyResponseEntityCreator.java | 2 +- .../config/BookServiceConfig.java | 4 ++ .../model/GetPolyBookServiceRequest.java | 11 +++++ .../model/GetPolyBookServiceResponse.java | 11 +++++ .../model/ReadPolyBookServiceRequest.java | 34 ++++++++++++++ .../model/ReadPolyBookServiceResponse.java | 11 +++++ .../service/GetPolyBookService.java | 44 ++++++++++++++++++ .../service/ReadPolyBookService.java | 46 +++++++++++++++++++ .../helper/GetBookServiceResponseCreator.java | 28 +++++++++++ .../ReadBookServiceResponseCreator.java | 18 ++++++++ 17 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 api/api-samples/pom.xml create mode 100644 api/api-samples/sample-api-imperative-book/pom.xml create mode 100644 api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/BookApplication.java create mode 100644 api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/config/BookApiConfig.java create mode 100644 api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/config/BookEndpoint.java create mode 100644 api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/controller/GetPolyBookController.java create mode 100644 api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/controller/ReadPolyBookController.java create mode 100644 service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/GetPolyBookServiceRequest.java create mode 100644 service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/GetPolyBookServiceResponse.java create mode 100644 service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/ReadPolyBookServiceRequest.java create mode 100644 service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/ReadPolyBookServiceResponse.java create mode 100644 service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/GetPolyBookService.java create mode 100644 service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/ReadPolyBookService.java create mode 100644 service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/helper/GetBookServiceResponseCreator.java diff --git a/api/api-samples/pom.xml b/api/api-samples/pom.xml new file mode 100644 index 000000000..1f23ed5e4 --- /dev/null +++ b/api/api-samples/pom.xml @@ -0,0 +1,33 @@ + + + + + io.americanexpress.synapse + api + 0.4.10-SNAPSHOT + + + 4.0.0 + api-samples + pom + + + + sample-api-imperative-book + + + diff --git a/api/api-samples/sample-api-imperative-book/pom.xml b/api/api-samples/sample-api-imperative-book/pom.xml new file mode 100644 index 000000000..a7dcf6850 --- /dev/null +++ b/api/api-samples/sample-api-imperative-book/pom.xml @@ -0,0 +1,39 @@ + + + + + + api-samples + io.americanexpress.synapse + 0.4.10-SNAPSHOT + + + 4.0.0 + sample-api-imperative-book + + + + + io.americanexpress.synapse + synapse-api-rest-imperative + + + io.americanexpress.synapse + sample-service-imperative-book + + + diff --git a/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/BookApplication.java b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/BookApplication.java new file mode 100644 index 000000000..1b009be55 --- /dev/null +++ b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/BookApplication.java @@ -0,0 +1,30 @@ +package io.americanexpress.synapse.api.rest.sample.imperativebook; + +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * {@code BookApplication} starts the Spring Boot Application for the book rest sample. + * + * @author Tanvir Islam + */ +@SpringBootApplication() +public class BookApplication { + + /** + * The logger. + */ + private static final XLogger LOGGER = XLoggerFactory.getXLogger(BookApplication.class); + + /** + * Runs the application. + * + * @param args the var args + */ + public static void main(String[] args) { + SpringApplication.run(BookApplication.class, args); + LOGGER.info("Rest Book Imperative Sample Application is up and running..."); + } +} \ No newline at end of file diff --git a/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/config/BookApiConfig.java b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/config/BookApiConfig.java new file mode 100644 index 000000000..dfb35c6f1 --- /dev/null +++ b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/config/BookApiConfig.java @@ -0,0 +1,30 @@ +package io.americanexpress.synapse.api.rest.sample.imperativebook.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.americanexpress.service.sample.imperativebook.config.BookServiceConfig; +import io.americanexpress.synapse.api.rest.imperative.config.BaseApiImperativeRestConfig; +import io.americanexpress.synapse.api.rest.imperative.interceptor.MetricInterceptor; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * {@code BookApiConfig} sets configuration for the Book API. + * + * @author Tanvir Islam + */ +@Configuration +@Import(BookServiceConfig.class) +@ComponentScan("io.americanexpress.synapse.api.rest.sample.imperativebook") +public class BookApiConfig extends BaseApiImperativeRestConfig { + + /** + * Constructor taking in objectMapper & metricInterceptor. + * + * @param defaultObjectMapper the default object mapper + * @param interceptor the metric interceptor + */ + public BookApiConfig(ObjectMapper defaultObjectMapper, MetricInterceptor interceptor) { + super(defaultObjectMapper, interceptor); + } +} diff --git a/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/config/BookEndpoint.java b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/config/BookEndpoint.java new file mode 100644 index 000000000..5223dacac --- /dev/null +++ b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/config/BookEndpoint.java @@ -0,0 +1,21 @@ +package io.americanexpress.synapse.api.rest.sample.imperativebook.config; + +/** + * {@code BookEndpoint} sets the endpoints for this API. + * + * @author Tanvir Islam + */ +public class BookEndpoint { + + /** + * Private constructor for class with constants. + */ + private BookEndpoint() { + + } + + /** + * Books resource for all endpoints in this API. + */ + public static final String BOOK_ENDPOINT = "/books"; +} diff --git a/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/controller/GetPolyBookController.java b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/controller/GetPolyBookController.java new file mode 100644 index 000000000..db27908c5 --- /dev/null +++ b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/controller/GetPolyBookController.java @@ -0,0 +1,19 @@ +package io.americanexpress.synapse.api.rest.sample.imperativebook.controller; + +import io.americanexpress.service.sample.imperativebook.model.GetPolyBookServiceRequest; +import io.americanexpress.service.sample.imperativebook.model.GetPolyBookServiceResponse; +import io.americanexpress.service.sample.imperativebook.service.GetPolyBookService; +import io.americanexpress.synapse.api.rest.imperative.controller.BaseGetPolyImperativeRestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import static io.americanexpress.synapse.api.rest.sample.imperativebook.config.BookEndpoint.BOOK_ENDPOINT; + +/** + * {@code GetPolyBookController} gets multiple book resources by a path variable. + * + * @author Tanvir Islam + */ +@RestController +@RequestMapping(BOOK_ENDPOINT) +public class GetPolyBookController extends BaseGetPolyImperativeRestController { +} diff --git a/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/controller/ReadPolyBookController.java b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/controller/ReadPolyBookController.java new file mode 100644 index 000000000..1571603a1 --- /dev/null +++ b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/controller/ReadPolyBookController.java @@ -0,0 +1,19 @@ +package io.americanexpress.synapse.api.rest.sample.imperativebook.controller; + +import io.americanexpress.service.sample.imperativebook.model.ReadPolyBookServiceRequest; +import io.americanexpress.service.sample.imperativebook.model.ReadPolyBookServiceResponse; +import io.americanexpress.service.sample.imperativebook.service.ReadPolyBookService; +import io.americanexpress.synapse.api.rest.imperative.controller.BaseReadPolyImperativeRestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import static io.americanexpress.synapse.api.rest.sample.imperativebook.config.BookEndpoint.BOOK_ENDPOINT; + +/** + * {@code ReadPolyBookController} reads multiple book resources with specific criteria + * + * @author Tanvir Islam + */ +@RestController +@RequestMapping(BOOK_ENDPOINT) +public class ReadPolyBookController extends BaseReadPolyImperativeRestController { +} diff --git a/api/synapse-api-rest-imperative/src/main/java/io/americanexpress/synapse/api/rest/imperative/controller/helpers/PolyResponseEntityCreator.java b/api/synapse-api-rest-imperative/src/main/java/io/americanexpress/synapse/api/rest/imperative/controller/helpers/PolyResponseEntityCreator.java index ae201c852..aa80ae0af 100644 --- a/api/synapse-api-rest-imperative/src/main/java/io/americanexpress/synapse/api/rest/imperative/controller/helpers/PolyResponseEntityCreator.java +++ b/api/synapse-api-rest-imperative/src/main/java/io/americanexpress/synapse/api/rest/imperative/controller/helpers/PolyResponseEntityCreator.java @@ -39,7 +39,7 @@ public static ResponseEntity> create(Pag final ResponseEntity> responseEntity; List pageContent = null; if (page != null) { - pageContent = page.getResponsesForPage(); + pageContent = page.getPageSize() > 0 ? page.getResponsesForPage() : page.getResponses(); } if (page == null || CollectionUtils.isEmpty(pageContent)) { responseEntity = new ResponseEntity<>(HttpStatus.NO_CONTENT); diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/config/BookServiceConfig.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/config/BookServiceConfig.java index 8c5d2017d..addee493b 100644 --- a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/config/BookServiceConfig.java +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/config/BookServiceConfig.java @@ -14,12 +14,16 @@ package io.americanexpress.service.sample.imperativebook.config; import io.americanexpress.synapse.service.imperative.config.BaseImperativeServiceConfig; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; /** * The type Book service config. * * @author Francois Gutt */ +@Configuration +@ComponentScan("io.americanexpress.service.sample.imperativebook") public class BookServiceConfig extends BaseImperativeServiceConfig { } diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/GetPolyBookServiceRequest.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/GetPolyBookServiceRequest.java new file mode 100644 index 000000000..7e929a4f1 --- /dev/null +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/GetPolyBookServiceRequest.java @@ -0,0 +1,11 @@ +package io.americanexpress.service.sample.imperativebook.model; + +import io.americanexpress.synapse.service.imperative.model.BaseServiceRequest; + +/** + * {@code GetPolyBookServiceRequest} class is the request model for {@link io.americanexpress.service.sample.imperativebook.service.GetPolyBookService} + * + * @author Tanvir Islam + */ +public class GetPolyBookServiceRequest extends BaseBook implements BaseServiceRequest { +} diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/GetPolyBookServiceResponse.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/GetPolyBookServiceResponse.java new file mode 100644 index 000000000..80d952f3a --- /dev/null +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/GetPolyBookServiceResponse.java @@ -0,0 +1,11 @@ +package io.americanexpress.service.sample.imperativebook.model; + +import io.americanexpress.synapse.service.imperative.model.BaseServiceResponse; + +/** + * {@code GetPolyBookServiceResponse} class is the response model for {@link io.americanexpress.service.sample.imperativebook.service.GetPolyBookService} + * + * @author Tanvir Islam + */ +public class GetPolyBookServiceResponse extends BaseBook implements BaseServiceResponse { +} diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/ReadPolyBookServiceRequest.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/ReadPolyBookServiceRequest.java new file mode 100644 index 000000000..2b24296ff --- /dev/null +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/ReadPolyBookServiceRequest.java @@ -0,0 +1,34 @@ +package io.americanexpress.service.sample.imperativebook.model; + +import io.americanexpress.synapse.service.imperative.model.BasePaginatedServiceRequest; + +/** + * {@code ReadPolyBookServiceRequest} class is the request model for {@link io.americanexpress.service.sample.imperativebook.service.ReadPolyBookService} + * + * @author Tanvir Islam + */ +public class ReadPolyBookServiceRequest extends BasePaginatedServiceRequest { + + /** + * Author of the book. + */ + private String author; + + /** + * Get the author of the book. + * + * @return the author of the book + */ + public String getAuthor() { + return author; + } + + /** + * Set the author of the book. + * + * @param author the author of the book + */ + public void setAuthor(String author) { + this.author = author; + } +} diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/ReadPolyBookServiceResponse.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/ReadPolyBookServiceResponse.java new file mode 100644 index 000000000..b7094cb58 --- /dev/null +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/model/ReadPolyBookServiceResponse.java @@ -0,0 +1,11 @@ +package io.americanexpress.service.sample.imperativebook.model; + +import io.americanexpress.synapse.service.imperative.model.BaseServiceResponse; + +/** + * {@code ReadPolyBookServiceResponse} class is the request model for {@link io.americanexpress.service.sample.imperativebook.service.ReadPolyBookService} + * + * @author Tanvir Islam + */ +public class ReadPolyBookServiceResponse extends BaseBook implements BaseServiceResponse { +} diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/GetPolyBookService.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/GetPolyBookService.java new file mode 100644 index 000000000..ba19f38d0 --- /dev/null +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/GetPolyBookService.java @@ -0,0 +1,44 @@ +package io.americanexpress.service.sample.imperativebook.service; + +import io.americanexpress.service.sample.imperativebook.model.GetPolyBookServiceRequest; +import io.americanexpress.service.sample.imperativebook.model.GetPolyBookServiceResponse; +import io.americanexpress.service.sample.imperativebook.service.helper.GetBookServiceResponseCreator; +import io.americanexpress.synapse.service.imperative.model.PageResponse; +import io.americanexpress.synapse.service.imperative.service.BaseService; +import org.springframework.stereotype.Component; +import java.util.List; + +/** + * {@code GetPolyBookService} gets multiple book resources. + * + * @author Tanvir Islam + */ +@Component +public class GetPolyBookService extends BaseService> { + + /** + * Creates the book response. + */ + private final GetBookServiceResponseCreator getBookServiceResponseCreator; + + /** + * Constructor creates a new instance of ReadBookService with the given values. + * + * @param getBookServiceResponseCreator the base book service response creator + */ + public GetPolyBookService(GetBookServiceResponseCreator getBookServiceResponseCreator) { + this.getBookServiceResponseCreator = getBookServiceResponseCreator; + } + + /** + * Gets multiple book resources. + * + * @param request the request object. + * @return a list of book resources. + */ + @Override + protected PageResponse doExecute(GetPolyBookServiceRequest request) { + var response = getBookServiceResponseCreator.create(); + return new PageResponse<>(List.of(response, response)); + } +} diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/ReadPolyBookService.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/ReadPolyBookService.java new file mode 100644 index 000000000..01f6cce32 --- /dev/null +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/ReadPolyBookService.java @@ -0,0 +1,46 @@ +package io.americanexpress.service.sample.imperativebook.service; + +import io.americanexpress.service.sample.imperativebook.model.ReadPolyBookServiceRequest; +import io.americanexpress.service.sample.imperativebook.model.ReadPolyBookServiceResponse; +import io.americanexpress.service.sample.imperativebook.service.helper.ReadBookServiceResponseCreator; +import io.americanexpress.synapse.service.imperative.model.PageResponse; +import io.americanexpress.synapse.service.imperative.service.BaseService; +import org.springframework.stereotype.Component; +import java.util.List; + +/** + * {@code ReadPolyBookService} reads multiple book resources with specified criteria. + * + * @author Tanvir Islam + */ +@Component +public class ReadPolyBookService extends BaseService> { + + /** + * Creates the book response. + */ + private final ReadBookServiceResponseCreator readBookServiceResponseCreator; + + /** + * Constructor creates a new instance of ReadBookService with the given values. + * + * @param readBookServiceResponseCreator the base book service response creator + */ + public ReadPolyBookService(ReadBookServiceResponseCreator readBookServiceResponseCreator) { + this.readBookServiceResponseCreator = readBookServiceResponseCreator; + } + + /** + * Reads multiple book resources with specified criteria. + * + * @param request the request object. + * @return a list of book resources. + */ + @Override + protected PageResponse doExecute(ReadPolyBookServiceRequest request) { + var response = readBookServiceResponseCreator.create(request); + var otherResponse = readBookServiceResponseCreator.create(request); + otherResponse.setCost(35); + return new PageResponse<>(List.of(response, otherResponse), request.getPageInformation()); + } +} diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/helper/GetBookServiceResponseCreator.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/helper/GetBookServiceResponseCreator.java new file mode 100644 index 000000000..790594cd6 --- /dev/null +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/helper/GetBookServiceResponseCreator.java @@ -0,0 +1,28 @@ +package io.americanexpress.service.sample.imperativebook.service.helper; + +import io.americanexpress.service.sample.imperativebook.model.GetPolyBookServiceResponse; +import org.springframework.stereotype.Component; + +/** + * {@code GetBookServiceResponseCreator} creates the response for getting multiple books. + * + * @author Tanvir Islam + */ +@Component +public class GetBookServiceResponseCreator { + + /** + * Creates a new {@link GetPolyBookServiceResponse} object. + * + * @return a new {@link GetPolyBookServiceResponse} object. + */ + public GetPolyBookServiceResponse create() { + var getPolyBookServiceResponse = new GetPolyBookServiceResponse(); + getPolyBookServiceResponse.setTitle("Harry Potter"); + getPolyBookServiceResponse.setAuthor("J.K. Rowling"); + getPolyBookServiceResponse.setCost(15); + getPolyBookServiceResponse.setYear(2005); + getPolyBookServiceResponse.setPublisher("Publishing Co."); + return getPolyBookServiceResponse; + } +} diff --git a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/helper/ReadBookServiceResponseCreator.java b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/helper/ReadBookServiceResponseCreator.java index 2ef7f98ce..9eead9adf 100644 --- a/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/helper/ReadBookServiceResponseCreator.java +++ b/service/service-samples/sample-service-imperative-book/src/main/java/io/americanexpress/service/sample/imperativebook/service/helper/ReadBookServiceResponseCreator.java @@ -15,6 +15,8 @@ import io.americanexpress.service.sample.imperativebook.model.BaseBook; import io.americanexpress.service.sample.imperativebook.model.ReadBookServiceResponse; +import io.americanexpress.service.sample.imperativebook.model.ReadPolyBookServiceRequest; +import io.americanexpress.service.sample.imperativebook.model.ReadPolyBookServiceResponse; import org.springframework.stereotype.Component; /** @@ -42,4 +44,20 @@ public ReadBookServiceResponse create(BaseBook request) { return readBookServiceResponse; } + + /** + * Creates the poly book service response. + * + * @param request the body received from the controller. + * @return response body to the controller. + */ + public ReadPolyBookServiceResponse create(ReadPolyBookServiceRequest request) { + var readBookServiceResponse = new ReadPolyBookServiceResponse(); + readBookServiceResponse.setTitle("Harry Potter"); + readBookServiceResponse.setAuthor(request.getAuthor()); + readBookServiceResponse.setCost(15); + readBookServiceResponse.setYear(2005); + readBookServiceResponse.setPublisher("Publishing Co."); + return readBookServiceResponse; + } } From 52bb4d97028e1541314dc73c4737a40212dd5858 Mon Sep 17 00:00:00 2001 From: tisla4 Date: Tue, 11 Mar 2025 13:34:34 -0400 Subject: [PATCH 3/5] feat: add example read poly request with page information --- .../src/test/resources/read-poly-book-service-request.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 api/api-samples/sample-api-imperative-book/src/test/resources/read-poly-book-service-request.json diff --git a/api/api-samples/sample-api-imperative-book/src/test/resources/read-poly-book-service-request.json b/api/api-samples/sample-api-imperative-book/src/test/resources/read-poly-book-service-request.json new file mode 100644 index 000000000..596493335 --- /dev/null +++ b/api/api-samples/sample-api-imperative-book/src/test/resources/read-poly-book-service-request.json @@ -0,0 +1,7 @@ +{ + "author": "j.k. rowling", + "pageInformation": { + "page": "1", + "size": "1" + } +} \ No newline at end of file From 34f5ca4352fe0d2988af609b40cdd98512fbb6f3 Mon Sep 17 00:00:00 2001 From: tisla4 Date: Tue, 11 Mar 2025 13:35:29 -0400 Subject: [PATCH 4/5] style: new line eof --- .../synapse/api/rest/sample/imperativebook/BookApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/BookApplication.java b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/BookApplication.java index 1b009be55..de0471404 100644 --- a/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/BookApplication.java +++ b/api/api-samples/sample-api-imperative-book/src/main/java/io/americanexpress/synapse/api/rest/sample/imperativebook/BookApplication.java @@ -27,4 +27,4 @@ public static void main(String[] args) { SpringApplication.run(BookApplication.class, args); LOGGER.info("Rest Book Imperative Sample Application is up and running..."); } -} \ No newline at end of file +} From 792e58a4853b91ebfe4ae8e30923ea43c08a0f60 Mon Sep 17 00:00:00 2001 From: tisla4 Date: Wed, 12 Mar 2025 09:50:47 -0400 Subject: [PATCH 5/5] style: new line eof --- .../src/test/resources/read-poly-book-service-request.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/api-samples/sample-api-imperative-book/src/test/resources/read-poly-book-service-request.json b/api/api-samples/sample-api-imperative-book/src/test/resources/read-poly-book-service-request.json index 596493335..b1a793746 100644 --- a/api/api-samples/sample-api-imperative-book/src/test/resources/read-poly-book-service-request.json +++ b/api/api-samples/sample-api-imperative-book/src/test/resources/read-poly-book-service-request.json @@ -4,4 +4,4 @@ "page": "1", "size": "1" } -} \ No newline at end of file +}