From 19ce3090b064d8c3786988e394840a78834a56e8 Mon Sep 17 00:00:00 2001 From: Victoria Garcia Date: Thu, 28 Aug 2025 09:25:14 +0200 Subject: [PATCH 01/10] change docker-compose --- docker-compose.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 2b20a5d9..e65f28af 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -19,10 +19,11 @@ services: simulado: image : ldabiralai/simulado:latest ports: - - "3001:80" + - "5000:80" volumes: - ./shared/simulado:/app command: ./bin/simulado -f /app/mocks.json + platform: linux/amd64 k6: image: loadimpact/k6:0.28.0 ports: From 53a5e61ac2a9161812314b5f2810af7e620ec2e5 Mon Sep 17 00:00:00 2001 From: Victoria Garcia Date: Thu, 28 Aug 2025 09:25:53 +0200 Subject: [PATCH 02/10] add gitignore --- .idea/.gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .idea/.gitignore diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..a08d0cd1 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,4 @@ +# Default ignored files +/shelf/ +/workspace.xml +.idea/ \ No newline at end of file From 0a9b74737906b9afcd2adda07216da9c89c0f359 Mon Sep 17 00:00:00 2001 From: Victoria Garcia Date: Thu, 28 Aug 2025 11:32:28 +0200 Subject: [PATCH 03/10] generate classes --- .idea/backendDevTest.iml | 9 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + api-root.yaml | 83 +++++++++ dockerfile | 37 ++++ generated-server/.openapi-generator-ignore | 23 +++ generated-server/.openapi-generator/FILES | 15 ++ generated-server/.openapi-generator/VERSION | 1 + generated-server/README.md | 21 +++ generated-server/pom.xml | 80 ++++++++ .../OpenApiGeneratorApplication.java | 30 +++ .../org/openapitools/RFC3339DateFormat.java | 38 ++++ .../configuration/HomeController.java | 20 ++ .../configuration/SpringDocConfiguration.java | 27 +++ .../src/main/java/org/test/api/ApiUtil.java | 19 ++ .../main/java/org/test/api/ProductApi.java | 159 ++++++++++++++++ .../org/test/api/ProductApiController.java | 47 +++++ .../org/test/model/ProductDetailBasic.java | 171 ++++++++++++++++++ .../org/test/model/ProductFullDetail.java | 171 ++++++++++++++++++ .../src/main/resources/application.properties | 3 + .../src/main/resources/openapi.yaml | 132 ++++++++++++++ .../OpenApiGeneratorApplicationTests.java | 13 ++ importantSteps.txt | 7 + 24 files changed, 1126 insertions(+) create mode 100644 .idea/backendDevTest.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 api-root.yaml create mode 100644 dockerfile create mode 100644 generated-server/.openapi-generator-ignore create mode 100644 generated-server/.openapi-generator/FILES create mode 100644 generated-server/.openapi-generator/VERSION create mode 100644 generated-server/README.md create mode 100644 generated-server/pom.xml create mode 100644 generated-server/src/main/java/org/openapitools/OpenApiGeneratorApplication.java create mode 100644 generated-server/src/main/java/org/openapitools/RFC3339DateFormat.java create mode 100644 generated-server/src/main/java/org/openapitools/configuration/HomeController.java create mode 100644 generated-server/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java create mode 100644 generated-server/src/main/java/org/test/api/ApiUtil.java create mode 100644 generated-server/src/main/java/org/test/api/ProductApi.java create mode 100644 generated-server/src/main/java/org/test/api/ProductApiController.java create mode 100644 generated-server/src/main/java/org/test/model/ProductDetailBasic.java create mode 100644 generated-server/src/main/java/org/test/model/ProductFullDetail.java create mode 100644 generated-server/src/main/resources/application.properties create mode 100644 generated-server/src/main/resources/openapi.yaml create mode 100644 generated-server/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java create mode 100644 importantSteps.txt diff --git a/.idea/backendDevTest.iml b/.idea/backendDevTest.iml new file mode 100644 index 00000000..d6ebd480 --- /dev/null +++ b/.idea/backendDevTest.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..639900d1 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..59be48c8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/api-root.yaml b/api-root.yaml new file mode 100644 index 00000000..9fb05028 --- /dev/null +++ b/api-root.yaml @@ -0,0 +1,83 @@ +openapi: 3.0.0 +info: + title: Combined SimilarProducts API + version: '1.0' +servers: + - url: 'http://localhost:5000' + - url: 'http://localhost:3001' + +paths: + /product/{productId}/similar: + get: + operationId: getSimilarProductDetails + summary: Similar products + parameters: + - name: productId + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SimilarProductDetails' + '404': + description: Product Not found + + /product/{productId}/similarids: + get: + operationId: getSimilarProductsIds + summary: Gets the ids of similar products + parameters: + - name: productId + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SimilarProductIds' + + /product/{productId}: + get: + operationId: getProductId + summary: Gets a product detail + parameters: + - name: productId + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ProductDetailBasic' + '404': + description: Product Not found + +components: + schemas: + SimilarProductDetails: + type: array + items: + $ref: './similarProducts.yaml#/components/schemas/ProductDetail' + description: List of similar products with full details + ProductFullDetail: + $ref: './similarProducts.yaml#/components/schemas/ProductDetail' + SimilarProductIds: + type: array + items: + type: string + description: List of similar product IDs + ProductDetailBasic: + $ref: './existingApis.yaml#/components/schemas/ProductDetail' diff --git a/dockerfile b/dockerfile new file mode 100644 index 00000000..94fd43fd --- /dev/null +++ b/dockerfile @@ -0,0 +1,37 @@ +FROM node:20 AS bundler +WORKDIR /app +COPY similarProducts.yaml . +COPY existingApis.yaml . +RUN npm install -g @apidevtools/swagger-cli + +COPY api-root.yaml . + +RUN swagger-cli bundle api-root.yaml --outfile openapi.yaml --type yaml + +FROM openjdk:17-jdk-slim AS builder +WORKDIR /app +RUN apt-get update && apt-get install -y wget unzip && \ + wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.0.0/openapi-generator-cli-7.0.0.jar -O /openapi-generator-cli.jar + +COPY --from=bundler /app/openapi.yaml . + +RUN java -jar /openapi-generator-cli.jar generate \ + -i openapi.yaml \ + -g spring \ + -o generated-server \ + --api-package org.test.api \ + --model-package org.test.model + +FROM openjdk:17-jdk-slim AS export-code +WORKDIR /app +COPY --from=generator /app/generated-server ./generated-server + +FROM maven:3.9.6-eclipse-temurin-17 AS build +WORKDIR /src +COPY --from=builder /app/generated-server . +RUN mvn clean package -DskipTests + +FROM eclipse-temurin:17-jre +WORKDIR /app +COPY --from=build /src/target/*.jar backendDevTest.jar +CMD ["java", "-jar", "backendDevTest.jar"] diff --git a/generated-server/.openapi-generator-ignore b/generated-server/.openapi-generator-ignore new file mode 100644 index 00000000..7484ee59 --- /dev/null +++ b/generated-server/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/generated-server/.openapi-generator/FILES b/generated-server/.openapi-generator/FILES new file mode 100644 index 00000000..fa3470ad --- /dev/null +++ b/generated-server/.openapi-generator/FILES @@ -0,0 +1,15 @@ +.openapi-generator-ignore +README.md +pom.xml +src/main/java/org/openapitools/OpenApiGeneratorApplication.java +src/main/java/org/openapitools/RFC3339DateFormat.java +src/main/java/org/openapitools/configuration/HomeController.java +src/main/java/org/openapitools/configuration/SpringDocConfiguration.java +src/main/java/org/test/api/ApiUtil.java +src/main/java/org/test/api/ProductApi.java +src/main/java/org/test/api/ProductApiController.java +src/main/java/org/test/model/ProductDetailBasic.java +src/main/java/org/test/model/ProductFullDetail.java +src/main/resources/application.properties +src/main/resources/openapi.yaml +src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java diff --git a/generated-server/.openapi-generator/VERSION b/generated-server/.openapi-generator/VERSION new file mode 100644 index 00000000..41225218 --- /dev/null +++ b/generated-server/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.0.0 \ No newline at end of file diff --git a/generated-server/README.md b/generated-server/README.md new file mode 100644 index 00000000..085513f2 --- /dev/null +++ b/generated-server/README.md @@ -0,0 +1,21 @@ +# OpenAPI generated server + +Spring Boot Server + +## Overview +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. +By using the [OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled server in Java using the SpringBoot framework. + + +The underlying library integrating OpenAPI to Spring Boot is [springdoc](https://springdoc.org). +Springdoc will generate an OpenAPI v3 specification based on the generated Controller and Model classes. +The specification is available to download using the following url: +http://localhost:5000/v3/api-docs/ + +Start your server as a simple java application + +You can view the api documentation in swagger-ui by pointing to +http://localhost:5000/swagger-ui.html + +Change default port value in application.properties \ No newline at end of file diff --git a/generated-server/pom.xml b/generated-server/pom.xml new file mode 100644 index 00000000..4e63f53a --- /dev/null +++ b/generated-server/pom.xml @@ -0,0 +1,80 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0 + + 1.8 + ${java.version} + ${java.version} + UTF-8 + 1.6.14 + 4.15.5 + + + org.springframework.boot + spring-boot-starter-parent + 2.7.6 + + + + src/main/java + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.data + spring-data-commons + + + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + + com.google.code.findbugs + jsr305 + 3.0.2 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.openapitools + jackson-databind-nullable + 0.2.6 + + + + org.springframework.boot + spring-boot-starter-validation + + + com.fasterxml.jackson.core + jackson-databind + + + org.springframework.boot + spring-boot-starter-test + test + + + diff --git a/generated-server/src/main/java/org/openapitools/OpenApiGeneratorApplication.java b/generated-server/src/main/java/org/openapitools/OpenApiGeneratorApplication.java new file mode 100644 index 00000000..67fc336f --- /dev/null +++ b/generated-server/src/main/java/org/openapitools/OpenApiGeneratorApplication.java @@ -0,0 +1,30 @@ +package org.openapitools; + +import com.fasterxml.jackson.databind.Module; +import org.openapitools.jackson.nullable.JsonNullableModule; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.FullyQualifiedAnnotationBeanNameGenerator; + +@SpringBootApplication( + nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class +) +@ComponentScan( + basePackages = {"org.openapitools", "org.test.api" , "org.openapitools.configuration"}, + nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class +) +public class OpenApiGeneratorApplication { + + public static void main(String[] args) { + SpringApplication.run(OpenApiGeneratorApplication.class, args); + } + + @Bean(name = "org.openapitools.OpenApiGeneratorApplication.jsonNullableModule") + public Module jsonNullableModule() { + return new JsonNullableModule(); + } + +} \ No newline at end of file diff --git a/generated-server/src/main/java/org/openapitools/RFC3339DateFormat.java b/generated-server/src/main/java/org/openapitools/RFC3339DateFormat.java new file mode 100644 index 00000000..bcd3936d --- /dev/null +++ b/generated-server/src/main/java/org/openapitools/RFC3339DateFormat.java @@ -0,0 +1,38 @@ +package org.openapitools; + +import com.fasterxml.jackson.databind.util.StdDateFormat; + +import java.text.DateFormat; +import java.text.FieldPosition; +import java.text.ParsePosition; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.TimeZone; + +public class RFC3339DateFormat extends DateFormat { + private static final long serialVersionUID = 1L; + private static final TimeZone TIMEZONE_Z = TimeZone.getTimeZone("UTC"); + + private final StdDateFormat fmt = new StdDateFormat() + .withTimeZone(TIMEZONE_Z) + .withColonInTimeZone(true); + + public RFC3339DateFormat() { + this.calendar = new GregorianCalendar(); + } + + @Override + public Date parse(String source, ParsePosition pos) { + return fmt.parse(source, pos); + } + + @Override + public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { + return fmt.format(date, toAppendTo, fieldPosition); + } + + @Override + public Object clone() { + return this; + } +} \ No newline at end of file diff --git a/generated-server/src/main/java/org/openapitools/configuration/HomeController.java b/generated-server/src/main/java/org/openapitools/configuration/HomeController.java new file mode 100644 index 00000000..9aa29284 --- /dev/null +++ b/generated-server/src/main/java/org/openapitools/configuration/HomeController.java @@ -0,0 +1,20 @@ +package org.openapitools.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Home redirection to OpenAPI api documentation + */ +@Controller +public class HomeController { + + @RequestMapping("/") + public String index() { + return "redirect:swagger-ui.html"; + } + +} \ No newline at end of file diff --git a/generated-server/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java b/generated-server/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java new file mode 100644 index 00000000..da8dd216 --- /dev/null +++ b/generated-server/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java @@ -0,0 +1,27 @@ +package org.openapitools.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.security.SecurityScheme; + +@Configuration +public class SpringDocConfiguration { + + @Bean(name = "org.openapitools.configuration.SpringDocConfiguration.apiInfo") + OpenAPI apiInfo() { + return new OpenAPI() + .info( + new Info() + .title("Combined SimilarProducts API") + .description("No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)") + .version("1.0") + ) + ; + } +} \ No newline at end of file diff --git a/generated-server/src/main/java/org/test/api/ApiUtil.java b/generated-server/src/main/java/org/test/api/ApiUtil.java new file mode 100644 index 00000000..4b94ff61 --- /dev/null +++ b/generated-server/src/main/java/org/test/api/ApiUtil.java @@ -0,0 +1,19 @@ +package org.test.api; + +import org.springframework.web.context.request.NativeWebRequest; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class ApiUtil { + public static void setExampleResponse(NativeWebRequest req, String contentType, String example) { + try { + HttpServletResponse res = req.getNativeResponse(HttpServletResponse.class); + res.setCharacterEncoding("UTF-8"); + res.addHeader("Content-Type", contentType); + res.getWriter().print(example); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/generated-server/src/main/java/org/test/api/ProductApi.java b/generated-server/src/main/java/org/test/api/ProductApi.java new file mode 100644 index 00000000..f8b2d550 --- /dev/null +++ b/generated-server/src/main/java/org/test/api/ProductApi.java @@ -0,0 +1,159 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.0.0). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.test.api; + +import org.test.model.ProductDetailBasic; +import org.test.model.ProductFullDetail; +import io.swagger.v3.oas.annotations.ExternalDocumentation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.annotation.Generated; + +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T08:57:53.930059333Z[Etc/UTC]") +@Validated +@Tag(name = "product", description = "the product API") +public interface ProductApi { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * GET /product/{productId} : Gets a product detail + * + * @param productId (required) + * @return OK (status code 200) + * or Product Not found (status code 404) + */ + @Operation( + operationId = "getProductId", + summary = "Gets a product detail", + responses = { + @ApiResponse(responseCode = "200", description = "OK", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ProductDetailBasic.class)) + }), + @ApiResponse(responseCode = "404", description = "Product Not found") + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/product/{productId}", + produces = { "application/json" } + ) + default ResponseEntity getProductId( + @Parameter(name = "productId", description = "", required = true, in = ParameterIn.PATH) @PathVariable("productId") String productId + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"price\" : 0.8008281904610115, \"name\" : \"name\", \"id\" : \"id\", \"availability\" : true }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * GET /product/{productId}/similar : Similar products + * + * @param productId (required) + * @return OK (status code 200) + * or Product Not found (status code 404) + */ + @Operation( + operationId = "getSimilarProductDetails", + summary = "Similar products", + responses = { + @ApiResponse(responseCode = "200", description = "OK", content = { + @Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = ProductFullDetail.class))) + }), + @ApiResponse(responseCode = "404", description = "Product Not found") + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/product/{productId}/similar", + produces = { "application/json" } + ) + default ResponseEntity> getSimilarProductDetails( + @Parameter(name = "productId", description = "", required = true, in = ParameterIn.PATH) @PathVariable("productId") String productId + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "[ { \"price\" : 0.8008281904610115, \"name\" : \"name\", \"id\" : \"id\", \"availability\" : true }, { \"price\" : 0.8008281904610115, \"name\" : \"name\", \"id\" : \"id\", \"availability\" : true } ]"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * GET /product/{productId}/similarids : Gets the ids of similar products + * + * @param productId (required) + * @return OK (status code 200) + */ + @Operation( + operationId = "getSimilarProductsIds", + summary = "Gets the ids of similar products", + responses = { + @ApiResponse(responseCode = "200", description = "OK", content = { + @Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = String.class))) + }) + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/product/{productId}/similarids", + produces = { "application/json" } + ) + default ResponseEntity> getSimilarProductsIds( + @Parameter(name = "productId", description = "", required = true, in = ParameterIn.PATH) @PathVariable("productId") String productId + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "[ \"\", \"\" ]"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/generated-server/src/main/java/org/test/api/ProductApiController.java b/generated-server/src/main/java/org/test/api/ProductApiController.java new file mode 100644 index 00000000..3b0b7e50 --- /dev/null +++ b/generated-server/src/main/java/org/test/api/ProductApiController.java @@ -0,0 +1,47 @@ +package org.test.api; + +import org.test.model.ProductDetailBasic; +import org.test.model.ProductFullDetail; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.context.request.NativeWebRequest; + +import javax.validation.constraints.*; +import javax.validation.Valid; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.annotation.Generated; + +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T08:57:53.930059333Z[Etc/UTC]") +@Controller +@RequestMapping("${openapi.combinedSimilarProducts.base-path:}") +public class ProductApiController implements ProductApi { + + private final NativeWebRequest request; + + @Autowired + public ProductApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/generated-server/src/main/java/org/test/model/ProductDetailBasic.java b/generated-server/src/main/java/org/test/model/ProductDetailBasic.java new file mode 100644 index 00000000..2f17c879 --- /dev/null +++ b/generated-server/src/main/java/org/test/model/ProductDetailBasic.java @@ -0,0 +1,171 @@ +package org.test.model; + +import java.net.URI; +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import java.math.BigDecimal; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + + +import java.util.*; +import javax.annotation.Generated; + +/** + * Product detail + */ + +@Schema(name = "ProductDetailBasic", description = "Product detail") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T08:57:53.930059333Z[Etc/UTC]") +public class ProductDetailBasic { + + private String id; + + private String name; + + private BigDecimal price; + + private Boolean availability; + + public ProductDetailBasic() { + super(); + } + + /** + * Constructor with only required parameters + */ + public ProductDetailBasic(String id, String name, BigDecimal price, Boolean availability) { + this.id = id; + this.name = name; + this.price = price; + this.availability = availability; + } + + public ProductDetailBasic id(String id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + */ + @NotNull @Size(min = 1) + @Schema(name = "id", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public ProductDetailBasic name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + */ + @NotNull @Size(min = 1) + @Schema(name = "name", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("name") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ProductDetailBasic price(BigDecimal price) { + this.price = price; + return this; + } + + /** + * Get price + * @return price + */ + @NotNull @Valid + @Schema(name = "price", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("price") + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public ProductDetailBasic availability(Boolean availability) { + this.availability = availability; + return this; + } + + /** + * Get availability + * @return availability + */ + @NotNull + @Schema(name = "availability", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("availability") + public Boolean getAvailability() { + return availability; + } + + public void setAvailability(Boolean availability) { + this.availability = availability; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProductDetailBasic productDetailBasic = (ProductDetailBasic) o; + return Objects.equals(this.id, productDetailBasic.id) && + Objects.equals(this.name, productDetailBasic.name) && + Objects.equals(this.price, productDetailBasic.price) && + Objects.equals(this.availability, productDetailBasic.availability); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, price, availability); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ProductDetailBasic {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" price: ").append(toIndentedString(price)).append("\n"); + sb.append(" availability: ").append(toIndentedString(availability)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/generated-server/src/main/java/org/test/model/ProductFullDetail.java b/generated-server/src/main/java/org/test/model/ProductFullDetail.java new file mode 100644 index 00000000..b887f4e3 --- /dev/null +++ b/generated-server/src/main/java/org/test/model/ProductFullDetail.java @@ -0,0 +1,171 @@ +package org.test.model; + +import java.net.URI; +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import java.math.BigDecimal; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + + +import java.util.*; +import javax.annotation.Generated; + +/** + * Product detail + */ + +@Schema(name = "ProductFullDetail", description = "Product detail") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T08:57:53.930059333Z[Etc/UTC]") +public class ProductFullDetail { + + private String id; + + private String name; + + private BigDecimal price; + + private Boolean availability; + + public ProductFullDetail() { + super(); + } + + /** + * Constructor with only required parameters + */ + public ProductFullDetail(String id, String name, BigDecimal price, Boolean availability) { + this.id = id; + this.name = name; + this.price = price; + this.availability = availability; + } + + public ProductFullDetail id(String id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + */ + @NotNull @Size(min = 1) + @Schema(name = "id", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public ProductFullDetail name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + */ + @NotNull @Size(min = 1) + @Schema(name = "name", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("name") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ProductFullDetail price(BigDecimal price) { + this.price = price; + return this; + } + + /** + * Get price + * @return price + */ + @NotNull @Valid + @Schema(name = "price", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("price") + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public ProductFullDetail availability(Boolean availability) { + this.availability = availability; + return this; + } + + /** + * Get availability + * @return availability + */ + @NotNull + @Schema(name = "availability", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("availability") + public Boolean getAvailability() { + return availability; + } + + public void setAvailability(Boolean availability) { + this.availability = availability; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProductFullDetail productFullDetail = (ProductFullDetail) o; + return Objects.equals(this.id, productFullDetail.id) && + Objects.equals(this.name, productFullDetail.name) && + Objects.equals(this.price, productFullDetail.price) && + Objects.equals(this.availability, productFullDetail.availability); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, price, availability); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ProductFullDetail {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" price: ").append(toIndentedString(price)).append("\n"); + sb.append(" availability: ").append(toIndentedString(availability)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/generated-server/src/main/resources/application.properties b/generated-server/src/main/resources/application.properties new file mode 100644 index 00000000..bc41f557 --- /dev/null +++ b/generated-server/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=5000 +spring.jackson.date-format=org.openapitools.RFC3339DateFormat +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false diff --git a/generated-server/src/main/resources/openapi.yaml b/generated-server/src/main/resources/openapi.yaml new file mode 100644 index 00000000..713d951d --- /dev/null +++ b/generated-server/src/main/resources/openapi.yaml @@ -0,0 +1,132 @@ +openapi: 3.0.0 +info: + title: Combined SimilarProducts API + version: "1.0" +servers: +- url: http://localhost:5000 +- url: http://localhost:3001 +paths: + /product/{productId}/similar: + get: + operationId: getSimilarProductDetails + parameters: + - explode: false + in: path + name: productId + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/SimilarProductDetails' + description: OK + "404": + description: Product Not found + summary: Similar products + x-accepts: application/json + /product/{productId}/similarids: + get: + operationId: getSimilarProductsIds + parameters: + - explode: false + in: path + name: productId + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/SimilarProductIds' + description: OK + summary: Gets the ids of similar products + x-accepts: application/json + /product/{productId}: + get: + operationId: getProductId + parameters: + - explode: false + in: path + name: productId + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/ProductDetailBasic' + description: OK + "404": + description: Product Not found + summary: Gets a product detail + x-accepts: application/json +components: + schemas: + SimilarProductDetails: + description: List of similar products with full details + items: + $ref: '#/components/schemas/ProductFullDetail' + type: array + ProductFullDetail: + description: Product detail + example: + price: 0.8008281904610115 + name: name + id: id + availability: true + properties: + id: + minLength: 1 + type: string + name: + minLength: 1 + type: string + price: + type: number + availability: + type: boolean + required: + - availability + - id + - name + - price + type: object + SimilarProductIds: + description: List of similar product IDs + items: + type: string + type: array + ProductDetailBasic: + description: Product detail + example: + price: 0.8008281904610115 + name: name + id: id + availability: true + properties: + id: + minLength: 1 + type: string + name: + minLength: 1 + type: string + price: + type: number + availability: + type: boolean + required: + - availability + - id + - name + - price + type: object diff --git a/generated-server/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java b/generated-server/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java new file mode 100644 index 00000000..3681f67e --- /dev/null +++ b/generated-server/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java @@ -0,0 +1,13 @@ +package org.openapitools; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class OpenApiGeneratorApplicationTests { + + @Test + void contextLoads() { + } + +} \ No newline at end of file diff --git a/importantSteps.txt b/importantSteps.txt new file mode 100644 index 00000000..c77d6925 --- /dev/null +++ b/importantSteps.txt @@ -0,0 +1,7 @@ +In order to add the generated classes to the actual project, I did some steps outside the dockerfile: + 1. docker build --target builder -t my-api-generator . + 2. docker create --name temp my-api-generator + 3. docker cp temp:/app/generated-server ./generated-server + 4. docker rm temp + +Following these steps I got the generated classes into my actual code. \ No newline at end of file From bb6555f0aa2cd8b1912a259106d0aa8cb51c2cbb Mon Sep 17 00:00:00 2001 From: Victoria Garcia Date: Thu, 28 Aug 2025 14:32:08 +0200 Subject: [PATCH 04/10] change resources --- .idea/.gitignore | 4 +++- .idea/misc.xml | 2 +- .idea/vcs.xml | 1 + dockerfile | 12 ++++-------- .../.openapi-generator-ignore | 0 .../.openapi-generator/FILES | 10 +++++----- .../.openapi-generator/VERSION | 0 {generated-server => generated-resources}/README.md | 0 {generated-server => generated-resources}/pom.xml | 0 .../java/org/backendDevTest/infra}/api/ApiUtil.java | 2 +- .../org/backendDevTest/infra}/api/ProductApi.java | 8 ++++---- .../infra}/api/ProductApiController.java | 8 ++++---- .../infra}/model/ProductDetailBasic.java | 4 ++-- .../infra}/model/ProductFullDetail.java | 4 ++-- .../openapitools/OpenApiGeneratorApplication.java | 2 +- .../java/org/openapitools/RFC3339DateFormat.java | 0 .../openapitools/configuration/HomeController.java | 0 .../configuration/SpringDocConfiguration.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/openapi.yaml | 0 .../OpenApiGeneratorApplicationTests.java | 0 importantSteps.txt | 2 +- 22 files changed, 29 insertions(+), 30 deletions(-) rename {generated-server => generated-resources}/.openapi-generator-ignore (100%) rename {generated-server => generated-resources}/.openapi-generator/FILES (57%) rename {generated-server => generated-resources}/.openapi-generator/VERSION (100%) rename {generated-server => generated-resources}/README.md (100%) rename {generated-server => generated-resources}/pom.xml (100%) rename {generated-server/src/main/java/org/test => generated-resources/src/main/java/org/backendDevTest/infra}/api/ApiUtil.java (94%) rename {generated-server/src/main/java/org/test => generated-resources/src/main/java/org/backendDevTest/infra}/api/ProductApi.java (96%) rename {generated-server/src/main/java/org/test => generated-resources/src/main/java/org/backendDevTest/infra}/api/ProductApiController.java (87%) rename {generated-server/src/main/java/org/test => generated-resources/src/main/java/org/backendDevTest/infra}/model/ProductDetailBasic.java (97%) rename {generated-server/src/main/java/org/test => generated-resources/src/main/java/org/backendDevTest/infra}/model/ProductFullDetail.java (97%) rename {generated-server => generated-resources}/src/main/java/org/openapitools/OpenApiGeneratorApplication.java (90%) rename {generated-server => generated-resources}/src/main/java/org/openapitools/RFC3339DateFormat.java (100%) rename {generated-server => generated-resources}/src/main/java/org/openapitools/configuration/HomeController.java (100%) rename {generated-server => generated-resources}/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java (100%) rename {generated-server => generated-resources}/src/main/resources/application.properties (100%) rename {generated-server => generated-resources}/src/main/resources/openapi.yaml (100%) rename {generated-server => generated-resources}/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java (100%) diff --git a/.idea/.gitignore b/.idea/.gitignore index a08d0cd1..0e87887e 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,4 +1,6 @@ # Default ignored files /shelf/ /workspace.xml -.idea/ \ No newline at end of file +.idea/ +*.iml +target/ \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 639900d1..41eb9cb2 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1ddf..7dd09ad8 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/dockerfile b/dockerfile index 94fd43fd..73f693a5 100644 --- a/dockerfile +++ b/dockerfile @@ -18,17 +18,13 @@ COPY --from=bundler /app/openapi.yaml . RUN java -jar /openapi-generator-cli.jar generate \ -i openapi.yaml \ -g spring \ - -o generated-server \ - --api-package org.test.api \ - --model-package org.test.model - -FROM openjdk:17-jdk-slim AS export-code -WORKDIR /app -COPY --from=generator /app/generated-server ./generated-server + -o generated-resources \ + --api-package org.backendDevTest.infra.api \ + --model-package org.backendDevTest.infra.model FROM maven:3.9.6-eclipse-temurin-17 AS build WORKDIR /src -COPY --from=builder /app/generated-server . +COPY --from=builder /app/generated-resources . RUN mvn clean package -DskipTests FROM eclipse-temurin:17-jre diff --git a/generated-server/.openapi-generator-ignore b/generated-resources/.openapi-generator-ignore similarity index 100% rename from generated-server/.openapi-generator-ignore rename to generated-resources/.openapi-generator-ignore diff --git a/generated-server/.openapi-generator/FILES b/generated-resources/.openapi-generator/FILES similarity index 57% rename from generated-server/.openapi-generator/FILES rename to generated-resources/.openapi-generator/FILES index fa3470ad..53cdf588 100644 --- a/generated-server/.openapi-generator/FILES +++ b/generated-resources/.openapi-generator/FILES @@ -1,15 +1,15 @@ .openapi-generator-ignore README.md pom.xml +src/main/java/org/backendDevTest/infra/api/ApiUtil.java +src/main/java/org/backendDevTest/infra/api/ProductApi.java +src/main/java/org/backendDevTest/infra/api/ProductApiController.java +src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java +src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java src/main/java/org/openapitools/OpenApiGeneratorApplication.java src/main/java/org/openapitools/RFC3339DateFormat.java src/main/java/org/openapitools/configuration/HomeController.java src/main/java/org/openapitools/configuration/SpringDocConfiguration.java -src/main/java/org/test/api/ApiUtil.java -src/main/java/org/test/api/ProductApi.java -src/main/java/org/test/api/ProductApiController.java -src/main/java/org/test/model/ProductDetailBasic.java -src/main/java/org/test/model/ProductFullDetail.java src/main/resources/application.properties src/main/resources/openapi.yaml src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java diff --git a/generated-server/.openapi-generator/VERSION b/generated-resources/.openapi-generator/VERSION similarity index 100% rename from generated-server/.openapi-generator/VERSION rename to generated-resources/.openapi-generator/VERSION diff --git a/generated-server/README.md b/generated-resources/README.md similarity index 100% rename from generated-server/README.md rename to generated-resources/README.md diff --git a/generated-server/pom.xml b/generated-resources/pom.xml similarity index 100% rename from generated-server/pom.xml rename to generated-resources/pom.xml diff --git a/generated-server/src/main/java/org/test/api/ApiUtil.java b/generated-resources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java similarity index 94% rename from generated-server/src/main/java/org/test/api/ApiUtil.java rename to generated-resources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java index 4b94ff61..d871bea9 100644 --- a/generated-server/src/main/java/org/test/api/ApiUtil.java +++ b/generated-resources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java @@ -1,4 +1,4 @@ -package org.test.api; +package org.backendDevTest.infra.api; import org.springframework.web.context.request.NativeWebRequest; diff --git a/generated-server/src/main/java/org/test/api/ProductApi.java b/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApi.java similarity index 96% rename from generated-server/src/main/java/org/test/api/ProductApi.java rename to generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApi.java index f8b2d550..baedda37 100644 --- a/generated-server/src/main/java/org/test/api/ProductApi.java +++ b/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApi.java @@ -3,10 +3,10 @@ * https://openapi-generator.tech * Do not edit the class manually. */ -package org.test.api; +package org.backendDevTest.infra.api; -import org.test.model.ProductDetailBasic; -import org.test.model.ProductFullDetail; +import org.backendDevTest.infra.model.ProductDetailBasic; +import org.backendDevTest.infra.model.ProductFullDetail; import io.swagger.v3.oas.annotations.ExternalDocumentation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -33,7 +33,7 @@ import java.util.Optional; import javax.annotation.Generated; -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T08:57:53.930059333Z[Etc/UTC]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T12:17:15.294568502Z[Etc/UTC]") @Validated @Tag(name = "product", description = "the product API") public interface ProductApi { diff --git a/generated-server/src/main/java/org/test/api/ProductApiController.java b/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApiController.java similarity index 87% rename from generated-server/src/main/java/org/test/api/ProductApiController.java rename to generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApiController.java index 3b0b7e50..82f5e8d7 100644 --- a/generated-server/src/main/java/org/test/api/ProductApiController.java +++ b/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApiController.java @@ -1,7 +1,7 @@ -package org.test.api; +package org.backendDevTest.infra.api; -import org.test.model.ProductDetailBasic; -import org.test.model.ProductFullDetail; +import org.backendDevTest.infra.model.ProductDetailBasic; +import org.backendDevTest.infra.model.ProductFullDetail; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +27,7 @@ import java.util.Optional; import javax.annotation.Generated; -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T08:57:53.930059333Z[Etc/UTC]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T12:17:15.294568502Z[Etc/UTC]") @Controller @RequestMapping("${openapi.combinedSimilarProducts.base-path:}") public class ProductApiController implements ProductApi { diff --git a/generated-server/src/main/java/org/test/model/ProductDetailBasic.java b/generated-resources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java similarity index 97% rename from generated-server/src/main/java/org/test/model/ProductDetailBasic.java rename to generated-resources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java index 2f17c879..1d87adb9 100644 --- a/generated-server/src/main/java/org/test/model/ProductDetailBasic.java +++ b/generated-resources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java @@ -1,4 +1,4 @@ -package org.test.model; +package org.backendDevTest.infra.model; import java.net.URI; import java.util.Objects; @@ -20,7 +20,7 @@ */ @Schema(name = "ProductDetailBasic", description = "Product detail") -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T08:57:53.930059333Z[Etc/UTC]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T12:17:15.294568502Z[Etc/UTC]") public class ProductDetailBasic { private String id; diff --git a/generated-server/src/main/java/org/test/model/ProductFullDetail.java b/generated-resources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java similarity index 97% rename from generated-server/src/main/java/org/test/model/ProductFullDetail.java rename to generated-resources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java index b887f4e3..e88ab1cc 100644 --- a/generated-server/src/main/java/org/test/model/ProductFullDetail.java +++ b/generated-resources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java @@ -1,4 +1,4 @@ -package org.test.model; +package org.backendDevTest.infra.model; import java.net.URI; import java.util.Objects; @@ -20,7 +20,7 @@ */ @Schema(name = "ProductFullDetail", description = "Product detail") -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T08:57:53.930059333Z[Etc/UTC]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T12:17:15.294568502Z[Etc/UTC]") public class ProductFullDetail { private String id; diff --git a/generated-server/src/main/java/org/openapitools/OpenApiGeneratorApplication.java b/generated-resources/src/main/java/org/openapitools/OpenApiGeneratorApplication.java similarity index 90% rename from generated-server/src/main/java/org/openapitools/OpenApiGeneratorApplication.java rename to generated-resources/src/main/java/org/openapitools/OpenApiGeneratorApplication.java index 67fc336f..2d245acb 100644 --- a/generated-server/src/main/java/org/openapitools/OpenApiGeneratorApplication.java +++ b/generated-resources/src/main/java/org/openapitools/OpenApiGeneratorApplication.java @@ -13,7 +13,7 @@ nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class ) @ComponentScan( - basePackages = {"org.openapitools", "org.test.api" , "org.openapitools.configuration"}, + basePackages = {"org.openapitools", "org.backendDevTest.infra.api" , "org.openapitools.configuration"}, nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class ) public class OpenApiGeneratorApplication { diff --git a/generated-server/src/main/java/org/openapitools/RFC3339DateFormat.java b/generated-resources/src/main/java/org/openapitools/RFC3339DateFormat.java similarity index 100% rename from generated-server/src/main/java/org/openapitools/RFC3339DateFormat.java rename to generated-resources/src/main/java/org/openapitools/RFC3339DateFormat.java diff --git a/generated-server/src/main/java/org/openapitools/configuration/HomeController.java b/generated-resources/src/main/java/org/openapitools/configuration/HomeController.java similarity index 100% rename from generated-server/src/main/java/org/openapitools/configuration/HomeController.java rename to generated-resources/src/main/java/org/openapitools/configuration/HomeController.java diff --git a/generated-server/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java b/generated-resources/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java similarity index 100% rename from generated-server/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java rename to generated-resources/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java diff --git a/generated-server/src/main/resources/application.properties b/generated-resources/src/main/resources/application.properties similarity index 100% rename from generated-server/src/main/resources/application.properties rename to generated-resources/src/main/resources/application.properties diff --git a/generated-server/src/main/resources/openapi.yaml b/generated-resources/src/main/resources/openapi.yaml similarity index 100% rename from generated-server/src/main/resources/openapi.yaml rename to generated-resources/src/main/resources/openapi.yaml diff --git a/generated-server/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java b/generated-resources/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java similarity index 100% rename from generated-server/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java rename to generated-resources/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java diff --git a/importantSteps.txt b/importantSteps.txt index c77d6925..c0114acb 100644 --- a/importantSteps.txt +++ b/importantSteps.txt @@ -1,7 +1,7 @@ In order to add the generated classes to the actual project, I did some steps outside the dockerfile: 1. docker build --target builder -t my-api-generator . 2. docker create --name temp my-api-generator - 3. docker cp temp:/app/generated-server ./generated-server + 3. docker cp temp:/app/generated-resources ./generated-resources 4. docker rm temp Following these steps I got the generated classes into my actual code. \ No newline at end of file From 99c66cd349697dbc25e017bd58fec17b06065f8e Mon Sep 17 00:00:00 2001 From: Victoria Garcia Date: Thu, 28 Aug 2025 15:12:33 +0200 Subject: [PATCH 05/10] refactor to add pom --- .idea/backendDevTest.iml | 9 - .idea/compiler.xml | 18 ++ .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 8 + .idea/modules.xml | 8 - generated-resources/.openapi-generator/FILES | 15 -- generated-resources/README.md | 21 --- .../infra/api/ProductApiController.java | 47 ----- .../OpenApiGeneratorApplication.java | 30 --- .../org/openapitools/RFC3339DateFormat.java | 38 ---- .../configuration/HomeController.java | 20 -- .../configuration/SpringDocConfiguration.java | 27 --- .../src/main/resources/application.properties | 3 - .../src/main/resources/openapi.yaml | 132 -------------- .../OpenApiGeneratorApplicationTests.java | 13 -- pom.xml | 93 ++++++++++ .../infra/api/ProductApiControllerImpl.java | 7 + target/backendDevTest-1.0-SNAPSHOT.jar | Bin 0 -> 12180 bytes .../backendDevTest/infra/api/ApiUtil.class | Bin 0 -> 1343 bytes .../backendDevTest/infra/api/ProductApi.class | Bin 0 -> 5813 bytes .../infra/api/ProductApiControllerImpl.class | Bin 0 -> 441 bytes .../infra/model/ProductDetail.class | Bin 0 -> 4268 bytes .../infra/model/ProductDetailBasic.class | Bin 0 -> 4313 bytes .../infra/model/ProductFullDetail.class | Bin 0 -> 4304 bytes .../.openapi-generator-ignore | 0 .../.openapi-generator/FILES | 8 + .../.openapi-generator/VERSION | 0 .../api-root.yaml-generate-api.sha256 | 1 + target/generated-sources/README.md | 27 +++ .../generated-sources}/pom.xml | 29 ++- .../org/backendDevTest/infra/api/ApiUtil.java | 2 +- .../backendDevTest/infra/api/ProductApi.java | 14 +- .../infra/model/ProductDetail.java | 171 ++++++++++++++++++ .../infra/model/ProductDetailBasic.java | 8 +- .../infra/model/ProductFullDetail.java | 8 +- target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 6 + .../compile/default-compile/inputFiles.lst | 6 + 38 files changed, 403 insertions(+), 389 deletions(-) delete mode 100644 .idea/backendDevTest.iml create mode 100644 .idea/compiler.xml create mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/modules.xml delete mode 100644 generated-resources/.openapi-generator/FILES delete mode 100644 generated-resources/README.md delete mode 100644 generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApiController.java delete mode 100644 generated-resources/src/main/java/org/openapitools/OpenApiGeneratorApplication.java delete mode 100644 generated-resources/src/main/java/org/openapitools/RFC3339DateFormat.java delete mode 100644 generated-resources/src/main/java/org/openapitools/configuration/HomeController.java delete mode 100644 generated-resources/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java delete mode 100644 generated-resources/src/main/resources/application.properties delete mode 100644 generated-resources/src/main/resources/openapi.yaml delete mode 100644 generated-resources/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java create mode 100644 pom.xml create mode 100644 src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java create mode 100644 target/backendDevTest-1.0-SNAPSHOT.jar create mode 100644 target/classes/org/backendDevTest/infra/api/ApiUtil.class create mode 100644 target/classes/org/backendDevTest/infra/api/ProductApi.class create mode 100644 target/classes/org/backendDevTest/infra/api/ProductApiControllerImpl.class create mode 100644 target/classes/org/backendDevTest/infra/model/ProductDetail.class create mode 100644 target/classes/org/backendDevTest/infra/model/ProductDetailBasic.class create mode 100644 target/classes/org/backendDevTest/infra/model/ProductFullDetail.class rename {generated-resources => target/generated-sources}/.openapi-generator-ignore (100%) create mode 100644 target/generated-sources/.openapi-generator/FILES rename {generated-resources => target/generated-sources}/.openapi-generator/VERSION (100%) create mode 100644 target/generated-sources/.openapi-generator/api-root.yaml-generate-api.sha256 create mode 100644 target/generated-sources/README.md rename {generated-resources => target/generated-sources}/pom.xml (81%) rename {generated-resources => target/generated-sources}/src/main/java/org/backendDevTest/infra/api/ApiUtil.java (92%) rename {generated-resources => target/generated-sources}/src/main/java/org/backendDevTest/infra/api/ProductApi.java (94%) create mode 100644 target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java rename {generated-resources => target/generated-sources}/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java (95%) rename {generated-resources => target/generated-sources}/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java (95%) create mode 100644 target/maven-archiver/pom.properties create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.idea/backendDevTest.iml b/.idea/backendDevTest.iml deleted file mode 100644 index d6ebd480..00000000 --- a/.idea/backendDevTest.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..93d5e219 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..712ab9d9 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 41eb9cb2..e8f7f2dd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,13 @@ + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 59be48c8..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/generated-resources/.openapi-generator/FILES b/generated-resources/.openapi-generator/FILES deleted file mode 100644 index 53cdf588..00000000 --- a/generated-resources/.openapi-generator/FILES +++ /dev/null @@ -1,15 +0,0 @@ -.openapi-generator-ignore -README.md -pom.xml -src/main/java/org/backendDevTest/infra/api/ApiUtil.java -src/main/java/org/backendDevTest/infra/api/ProductApi.java -src/main/java/org/backendDevTest/infra/api/ProductApiController.java -src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java -src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java -src/main/java/org/openapitools/OpenApiGeneratorApplication.java -src/main/java/org/openapitools/RFC3339DateFormat.java -src/main/java/org/openapitools/configuration/HomeController.java -src/main/java/org/openapitools/configuration/SpringDocConfiguration.java -src/main/resources/application.properties -src/main/resources/openapi.yaml -src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java diff --git a/generated-resources/README.md b/generated-resources/README.md deleted file mode 100644 index 085513f2..00000000 --- a/generated-resources/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# OpenAPI generated server - -Spring Boot Server - -## Overview -This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. -By using the [OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. -This is an example of building a OpenAPI-enabled server in Java using the SpringBoot framework. - - -The underlying library integrating OpenAPI to Spring Boot is [springdoc](https://springdoc.org). -Springdoc will generate an OpenAPI v3 specification based on the generated Controller and Model classes. -The specification is available to download using the following url: -http://localhost:5000/v3/api-docs/ - -Start your server as a simple java application - -You can view the api documentation in swagger-ui by pointing to -http://localhost:5000/swagger-ui.html - -Change default port value in application.properties \ No newline at end of file diff --git a/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApiController.java b/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApiController.java deleted file mode 100644 index 82f5e8d7..00000000 --- a/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApiController.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.backendDevTest.infra.api; - -import org.backendDevTest.infra.model.ProductDetailBasic; -import org.backendDevTest.infra.model.ProductFullDetail; - - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.CookieValue; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.context.request.NativeWebRequest; - -import javax.validation.constraints.*; -import javax.validation.Valid; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import javax.annotation.Generated; - -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T12:17:15.294568502Z[Etc/UTC]") -@Controller -@RequestMapping("${openapi.combinedSimilarProducts.base-path:}") -public class ProductApiController implements ProductApi { - - private final NativeWebRequest request; - - @Autowired - public ProductApiController(NativeWebRequest request) { - this.request = request; - } - - @Override - public Optional getRequest() { - return Optional.ofNullable(request); - } - -} diff --git a/generated-resources/src/main/java/org/openapitools/OpenApiGeneratorApplication.java b/generated-resources/src/main/java/org/openapitools/OpenApiGeneratorApplication.java deleted file mode 100644 index 2d245acb..00000000 --- a/generated-resources/src/main/java/org/openapitools/OpenApiGeneratorApplication.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.openapitools; - -import com.fasterxml.jackson.databind.Module; -import org.openapitools.jackson.nullable.JsonNullableModule; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.FilterType; -import org.springframework.context.annotation.FullyQualifiedAnnotationBeanNameGenerator; - -@SpringBootApplication( - nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class -) -@ComponentScan( - basePackages = {"org.openapitools", "org.backendDevTest.infra.api" , "org.openapitools.configuration"}, - nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class -) -public class OpenApiGeneratorApplication { - - public static void main(String[] args) { - SpringApplication.run(OpenApiGeneratorApplication.class, args); - } - - @Bean(name = "org.openapitools.OpenApiGeneratorApplication.jsonNullableModule") - public Module jsonNullableModule() { - return new JsonNullableModule(); - } - -} \ No newline at end of file diff --git a/generated-resources/src/main/java/org/openapitools/RFC3339DateFormat.java b/generated-resources/src/main/java/org/openapitools/RFC3339DateFormat.java deleted file mode 100644 index bcd3936d..00000000 --- a/generated-resources/src/main/java/org/openapitools/RFC3339DateFormat.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.openapitools; - -import com.fasterxml.jackson.databind.util.StdDateFormat; - -import java.text.DateFormat; -import java.text.FieldPosition; -import java.text.ParsePosition; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.TimeZone; - -public class RFC3339DateFormat extends DateFormat { - private static final long serialVersionUID = 1L; - private static final TimeZone TIMEZONE_Z = TimeZone.getTimeZone("UTC"); - - private final StdDateFormat fmt = new StdDateFormat() - .withTimeZone(TIMEZONE_Z) - .withColonInTimeZone(true); - - public RFC3339DateFormat() { - this.calendar = new GregorianCalendar(); - } - - @Override - public Date parse(String source, ParsePosition pos) { - return fmt.parse(source, pos); - } - - @Override - public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { - return fmt.format(date, toAppendTo, fieldPosition); - } - - @Override - public Object clone() { - return this; - } -} \ No newline at end of file diff --git a/generated-resources/src/main/java/org/openapitools/configuration/HomeController.java b/generated-resources/src/main/java/org/openapitools/configuration/HomeController.java deleted file mode 100644 index 9aa29284..00000000 --- a/generated-resources/src/main/java/org/openapitools/configuration/HomeController.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.openapitools.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * Home redirection to OpenAPI api documentation - */ -@Controller -public class HomeController { - - @RequestMapping("/") - public String index() { - return "redirect:swagger-ui.html"; - } - -} \ No newline at end of file diff --git a/generated-resources/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java b/generated-resources/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java deleted file mode 100644 index da8dd216..00000000 --- a/generated-resources/src/main/java/org/openapitools/configuration/SpringDocConfiguration.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.openapitools.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.security.SecurityScheme; - -@Configuration -public class SpringDocConfiguration { - - @Bean(name = "org.openapitools.configuration.SpringDocConfiguration.apiInfo") - OpenAPI apiInfo() { - return new OpenAPI() - .info( - new Info() - .title("Combined SimilarProducts API") - .description("No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)") - .version("1.0") - ) - ; - } -} \ No newline at end of file diff --git a/generated-resources/src/main/resources/application.properties b/generated-resources/src/main/resources/application.properties deleted file mode 100644 index bc41f557..00000000 --- a/generated-resources/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -server.port=5000 -spring.jackson.date-format=org.openapitools.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false diff --git a/generated-resources/src/main/resources/openapi.yaml b/generated-resources/src/main/resources/openapi.yaml deleted file mode 100644 index 713d951d..00000000 --- a/generated-resources/src/main/resources/openapi.yaml +++ /dev/null @@ -1,132 +0,0 @@ -openapi: 3.0.0 -info: - title: Combined SimilarProducts API - version: "1.0" -servers: -- url: http://localhost:5000 -- url: http://localhost:3001 -paths: - /product/{productId}/similar: - get: - operationId: getSimilarProductDetails - parameters: - - explode: false - in: path - name: productId - required: true - schema: - type: string - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/SimilarProductDetails' - description: OK - "404": - description: Product Not found - summary: Similar products - x-accepts: application/json - /product/{productId}/similarids: - get: - operationId: getSimilarProductsIds - parameters: - - explode: false - in: path - name: productId - required: true - schema: - type: string - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/SimilarProductIds' - description: OK - summary: Gets the ids of similar products - x-accepts: application/json - /product/{productId}: - get: - operationId: getProductId - parameters: - - explode: false - in: path - name: productId - required: true - schema: - type: string - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/ProductDetailBasic' - description: OK - "404": - description: Product Not found - summary: Gets a product detail - x-accepts: application/json -components: - schemas: - SimilarProductDetails: - description: List of similar products with full details - items: - $ref: '#/components/schemas/ProductFullDetail' - type: array - ProductFullDetail: - description: Product detail - example: - price: 0.8008281904610115 - name: name - id: id - availability: true - properties: - id: - minLength: 1 - type: string - name: - minLength: 1 - type: string - price: - type: number - availability: - type: boolean - required: - - availability - - id - - name - - price - type: object - SimilarProductIds: - description: List of similar product IDs - items: - type: string - type: array - ProductDetailBasic: - description: Product detail - example: - price: 0.8008281904610115 - name: name - id: id - availability: true - properties: - id: - minLength: 1 - type: string - name: - minLength: 1 - type: string - price: - type: number - availability: - type: boolean - required: - - availability - - id - - name - - price - type: object diff --git a/generated-resources/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java b/generated-resources/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java deleted file mode 100644 index 3681f67e..00000000 --- a/generated-resources/src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.openapitools; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class OpenApiGeneratorApplicationTests { - - @Test - void contextLoads() { - } - -} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..6c12c7b7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,93 @@ + + 4.0.0 + + org.backendDevTest + backendDevTest + 1.0-SNAPSHOT + jar + + + 17 + 3.3.0 + 7.0.0 + + + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + + org.springframework.boot + spring-boot-starter-validation + ${spring.boot.version} + + + + org.openapitools + jackson-databind-nullable + 0.2.6 + + + + io.swagger.core.v3 + swagger-annotations + 2.2.8 + + + + + src/main/java + + + src/main/resources + + + + + + + org.openapitools + openapi-generator-maven-plugin + ${openapi.generator.version} + + + generate-api + + generate + + + ${project.basedir}/api-root.yaml + spring + ${project.build.directory}/generated-sources + org.backendDevTest.infra.api + org.backendDevTest.infra.model + + true + true + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + ${java.version} + ${java.version} + UTF-8 + ${project.build.directory}/generated-sources + + + + + diff --git a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java new file mode 100644 index 00000000..64f6b718 --- /dev/null +++ b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java @@ -0,0 +1,7 @@ +package org.backendDevTest.infra.api; + +import org.springframework.stereotype.Controller; + +@Controller +public class ProductApiControllerImpl { +} \ No newline at end of file diff --git a/target/backendDevTest-1.0-SNAPSHOT.jar b/target/backendDevTest-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4e6c395bcaa6a67934fd1c5ea6fcf320acaf4b5 GIT binary patch literal 12180 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 literal 0 HcmV?d00001 diff --git a/target/classes/org/backendDevTest/infra/api/ApiUtil.class b/target/classes/org/backendDevTest/infra/api/ApiUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..d5750e8479e420292e970d46c31b714700879b91 GIT binary patch literal 1343 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 A2LJ#7 literal 0 HcmV?d00001 diff --git a/target/classes/org/backendDevTest/infra/model/ProductDetailBasic.class b/target/classes/org/backendDevTest/infra/model/ProductDetailBasic.class new file mode 100644 index 0000000000000000000000000000000000000000..8739505d6c01452715ac835cbb430a21eae29cb7 GIT binary patch literal 4313 zcmbVPU2_}d6@FfQts*2_$c_^mQUo!pkIws?bDs0@ zuKxL-zy1xt)A%5V1d<9;d8CmMC~j%nnrdp+hWgU_mR|P+GEW(n;XNaeoSI(Uhb;Cf z$mMYl@&deqCuv7m2X)Ll*P>b$YBpx2G2X8L>g z=P`x@0(nMYnA*Bw8s3h;NW{{-ZJWAg&B~z1^O(SW0@)4SJ8f#NOVz3Ah_WxF>LGkb z!2@}e@u0xHzT0ijFhhR0Eu+8Q)=WM;G8Ne#&^OyJnZ7JB59cw7hZ*Un=58{ssVf6C z7Zp4raG;l}`L~w>-TOY!NsTg$_yRhbHFt1Vk>2?+fH4 zw9NR)auz2A?vZOh;ZpDvt3?W;X_azTq_`oYo6F-A=INnlcbpiFWikvfiv?L(ZPS$b zpUdJo)|GENhef=g;Ke+aa4yya9YDp=Tc#!}a3LDs=}pb4G5xw#*Q2S9$p=JFKTfkj z1csLkOJ8m`*LCNjwr)~VTC(e!xvDvaT!+Gxw`s7zPAuJVzs(Aqk9r((5h=Eqq_?pm zdY$H(UKMz50Oa&tIhSVpEwUoVSK5|mH1$=(H5m6P%d$PqGi-}tOJmnG$J5kp%`_Um zSgrFX&(RFabJb%;#~wPw7jQ!m*xtRyF(5SUpqY}LK4ZEWa{x_v^mHCNTT z=GCU&Ff_GR-_)BLcjg`D+i>*8IX{6<-oft4mB>~?WmnEzxU{%(hGnTP)$OKwRdYSv zd828nTb!w`ZABbWU*MV@-qIa!hnv&nqRo0a6esTDPAg7c+6@TaKPY8PrNRU(v-kK! z&EV<9P`9@l?k>f0!k!Pt_rXqI_96>R49eW9%(rBUu7wcexATp$JRgm5uU_w}E{Ey# zsn|iXzvH`qI(E?6!t^b!IX2J@`WMSVXEt8u9JAvmV)zqiStj4x9u1$Hp;v;?R2kFC5Md-K{%DOZKL~ zP^eOF_(we3W6`p7$3HuDSHVvOp7{3d6>AU$?+H}C{bt&Z_7@&RmSY}B@yeGKJ|*PK zg@5Neg@5M@1MelUosi*mnX41L3*OU}FChNxtG&dlJTrj9gqy^9KIH=?T)+xf5}?Mb z1bByo*|)EYrz6jGnpy&VGUs8dV&@C{_~Lvn_D$Qk}$j(!_*WVgx6G58IOrqshr$>(J#QZ!Oo zU<=p6FkSsu&ZdU(+p~@}}R{8xD>EzAo-;q66;gp!+_es=%^7nQdGTqg(c8C@`sfjl^0~hEZEfN&jnW zY3X=vEh9ayeTj#po54U08vU1%#7%}S2>Ayk#QuiP$?FIP({ zZxv~47svTndOQ$65sC|O@spvr7#Gim;?cPHX&-AB&vxtVA)b%GuXz16huLrVN9q%f z@ZWMa{*Jx#dvf-NNI6^&L&>tB-oOrnNyxu|VNkDxL5)trwI7SUaCgIRLKM-ArxNTpkIws?bDs0@ zuKxL-KmQHDb9g(41d<9;d8CmMC~j*znrdp+rux#xwqExHGS3>8;XN;qoSI%cfGiFu z$mQ_>@&ZrT&ZfGd)o2u$)8BhA zk1;$XkY@mfscjgh;q3~HL@dqQwyA5@tc-a)j|qHDAiJr1XHCs@sX8?sQTByYJ&bQC zcsP$T9uauZcf0KwW=IdWW%O6un#qU9ry|<}_GbGf(^n`qnwZ}d5V1abh%<$S}Yx7GzzHZg^Xr^QG0nyWsvuqE6 z;bp_pSK7@D-MOr7n3R;3?Yd^JX^tV+p)lob8LY39%lF!CvjP{R4u@1kN-ZYoZL5f0 zr*)>+1QrKCPT!AjY4+X{>v4RwZFxphUo%{TQJ=9a+tWP5wivXubwhJJP2JHWRjq4Y zZR!m}Q)~4ty{U0$-eI;4M{iv4)A!6h?4DeWY$a57_1vW^ORMKtlnaq`k`K=8pq8Dl0DCSZk~$0uqA zPv=A3-eS0~49n?yF&N#4I!)ON%=tAaaceT&k|=r>LX6+dHHPwHG{pUCy`QQarq5?$ zXUM^h>;Ade0cZQtwYcWkKriTCECZdnc$G8Ejvt2MPdsT_{YPh^=CL#`XsvKAWaZ%z zOcI{WOFUcM4R%wcZG-miOmfcJn%#El`l2Cc%~;=oaayFWqZ7DDm zYLpw{sh(f5EZy4H5RDtn^Hnk z0#`6kco~{X(14piLFqzC>f}pgKQC*PPtl{7d4Gjk>r1$bYqT`%68^h7zK8GQ2mIlO za;;Ho1c^~deO~u>2yCEEE$PGa+${sj_yKjP3=(vP@yti!$?V6I*^g&ZRCAiNPqgBT+;t=|nLGGsKEfGTKK;lVDZ^EJ}&&Oi4+T8vV^Q+DpmqT_|~& znyCI3CW!)g64U;E#q-mh4V@Av_f1K0MO z^%@+wbo?-9hsSZ9K%004q?IA@Z_Fvk&dJQ|;AR-zia$evN#(CdtS4m{we^(rzqX#1 zj@Q;R(&O3}cvQL>4Ah{}e;rBOWaxsB|4c&cFX@~dUpN1PqwAmZwYFNC-b3}}YDwj- zB5m#A1RqOJ1>&beaUm{#CKMOr;@MC<8W%t3W9{LEZk;{K^AUKT*AF<%KIA{Bk2u0V z=4|{8d*`?0?01oJxEY3$WkJ1$T?Uho|NX+CUI~L5seXw}>Fj4LgL9>)N{f5=wlo-| zamY{0C*<~1rtuFE@R9vgjfAO^2}(jJyu8lG1m57_0*bU3R{oE0%Voj-gwhopenapi-spring 1.0 - 1.8 + 17 ${java.version} ${java.version} UTF-8 - 1.6.14 + 2.0.2 4.15.5 org.springframework.boot spring-boot-starter-parent - 2.7.6 + 3.0.0 + + + + repository.spring.milestone + Spring Milestone Repository + https://repo.spring.io/milestone + + + + + spring-milestones + https://repo.spring.io/milestone + + + src/main/java - - - org.springframework.boot - spring-boot-maven-plugin - - @@ -40,7 +49,7 @@ org.springdoc - springdoc-openapi-ui + springdoc-openapi-starter-webmvc-ui ${springdoc.version} diff --git a/generated-resources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java b/target/generated-sources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java similarity index 92% rename from generated-resources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java rename to target/generated-sources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java index d871bea9..da96aa03 100644 --- a/generated-resources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java +++ b/target/generated-sources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java @@ -2,7 +2,7 @@ import org.springframework.web.context.request.NativeWebRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class ApiUtil { diff --git a/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApi.java b/target/generated-sources/src/main/java/org/backendDevTest/infra/api/ProductApi.java similarity index 94% rename from generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApi.java rename to target/generated-sources/src/main/java/org/backendDevTest/infra/api/ProductApi.java index baedda37..07f2856d 100644 --- a/generated-resources/src/main/java/org/backendDevTest/infra/api/ProductApi.java +++ b/target/generated-sources/src/main/java/org/backendDevTest/infra/api/ProductApi.java @@ -5,8 +5,8 @@ */ package org.backendDevTest.infra.api; +import org.backendDevTest.infra.model.ProductDetail; import org.backendDevTest.infra.model.ProductDetailBasic; -import org.backendDevTest.infra.model.ProductFullDetail; import io.swagger.v3.oas.annotations.ExternalDocumentation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -26,14 +26,14 @@ import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.multipart.MultipartFile; -import javax.validation.Valid; -import javax.validation.constraints.*; +import jakarta.validation.Valid; +import jakarta.validation.constraints.*; import java.util.List; import java.util.Map; import java.util.Optional; -import javax.annotation.Generated; +import jakarta.annotation.Generated; -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T12:17:15.294568502Z[Etc/UTC]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T14:57:35.936267+02:00[Europe/Madrid]") @Validated @Tag(name = "product", description = "the product API") public interface ProductApi { @@ -93,7 +93,7 @@ default ResponseEntity getProductId( summary = "Similar products", responses = { @ApiResponse(responseCode = "200", description = "OK", content = { - @Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = ProductFullDetail.class))) + @Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = ProductDetail.class))) }), @ApiResponse(responseCode = "404", description = "Product Not found") } @@ -103,7 +103,7 @@ default ResponseEntity getProductId( value = "/product/{productId}/similar", produces = { "application/json" } ) - default ResponseEntity> getSimilarProductDetails( + default ResponseEntity> getSimilarProductDetails( @Parameter(name = "productId", description = "", required = true, in = ParameterIn.PATH) @PathVariable("productId") String productId ) { getRequest().ifPresent(request -> { diff --git a/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java b/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java new file mode 100644 index 00000000..8b4edf36 --- /dev/null +++ b/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java @@ -0,0 +1,171 @@ +package org.backendDevTest.infra.model; + +import java.net.URI; +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import java.math.BigDecimal; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import jakarta.validation.Valid; +import jakarta.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + + +import java.util.*; +import jakarta.annotation.Generated; + +/** + * Product detail + */ + +@Schema(name = "ProductDetail", description = "Product detail") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T14:57:35.936267+02:00[Europe/Madrid]") +public class ProductDetail { + + private String id; + + private String name; + + private BigDecimal price; + + private Boolean availability; + + public ProductDetail() { + super(); + } + + /** + * Constructor with only required parameters + */ + public ProductDetail(String id, String name, BigDecimal price, Boolean availability) { + this.id = id; + this.name = name; + this.price = price; + this.availability = availability; + } + + public ProductDetail id(String id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + */ + @NotNull @Size(min = 1) + @Schema(name = "id", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public ProductDetail name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + */ + @NotNull @Size(min = 1) + @Schema(name = "name", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("name") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ProductDetail price(BigDecimal price) { + this.price = price; + return this; + } + + /** + * Get price + * @return price + */ + @NotNull @Valid + @Schema(name = "price", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("price") + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public ProductDetail availability(Boolean availability) { + this.availability = availability; + return this; + } + + /** + * Get availability + * @return availability + */ + @NotNull + @Schema(name = "availability", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("availability") + public Boolean getAvailability() { + return availability; + } + + public void setAvailability(Boolean availability) { + this.availability = availability; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProductDetail productDetail = (ProductDetail) o; + return Objects.equals(this.id, productDetail.id) && + Objects.equals(this.name, productDetail.name) && + Objects.equals(this.price, productDetail.price) && + Objects.equals(this.availability, productDetail.availability); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, price, availability); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ProductDetail {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" price: ").append(toIndentedString(price)).append("\n"); + sb.append(" availability: ").append(toIndentedString(availability)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/generated-resources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java b/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java similarity index 95% rename from generated-resources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java rename to target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java index 1d87adb9..9b262afe 100644 --- a/generated-resources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java +++ b/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java @@ -7,20 +7,20 @@ import java.math.BigDecimal; import org.openapitools.jackson.nullable.JsonNullable; import java.time.OffsetDateTime; -import javax.validation.Valid; -import javax.validation.constraints.*; +import jakarta.validation.Valid; +import jakarta.validation.constraints.*; import io.swagger.v3.oas.annotations.media.Schema; import java.util.*; -import javax.annotation.Generated; +import jakarta.annotation.Generated; /** * Product detail */ @Schema(name = "ProductDetailBasic", description = "Product detail") -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T12:17:15.294568502Z[Etc/UTC]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T14:57:35.936267+02:00[Europe/Madrid]") public class ProductDetailBasic { private String id; diff --git a/generated-resources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java b/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java similarity index 95% rename from generated-resources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java rename to target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java index e88ab1cc..a52fafc3 100644 --- a/generated-resources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java +++ b/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java @@ -7,20 +7,20 @@ import java.math.BigDecimal; import org.openapitools.jackson.nullable.JsonNullable; import java.time.OffsetDateTime; -import javax.validation.Valid; -import javax.validation.constraints.*; +import jakarta.validation.Valid; +import jakarta.validation.constraints.*; import io.swagger.v3.oas.annotations.media.Schema; import java.util.*; -import javax.annotation.Generated; +import jakarta.annotation.Generated; /** * Product detail */ @Schema(name = "ProductFullDetail", description = "Product detail") -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T12:17:15.294568502Z[Etc/UTC]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-28T14:57:35.936267+02:00[Europe/Madrid]") public class ProductFullDetail { private String id; diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 00000000..191328d6 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=backendDevTest +groupId=org.backendDevTest +version=1.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..2ed20ed1 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,6 @@ +org/backendDevTest/infra/model/ProductFullDetail.class +org/backendDevTest/infra/api/ApiUtil.class +org/backendDevTest/infra/model/ProductDetail.class +org/backendDevTest/infra/api/ProductApi.class +org/backendDevTest/infra/model/ProductDetailBasic.class +org/backendDevTest/infra/api/ProductApiControllerImpl.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..ce1ae7ac --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +/Users/victoriagarciaarmario/Documents/repos/backendDevTest/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java +/Users/victoriagarciaarmario/Documents/repos/backendDevTest/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductFullDetail.java +/Users/victoriagarciaarmario/Documents/repos/backendDevTest/target/generated-sources/src/main/java/org/backendDevTest/infra/api/ProductApi.java +/Users/victoriagarciaarmario/Documents/repos/backendDevTest/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java +/Users/victoriagarciaarmario/Documents/repos/backendDevTest/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetailBasic.java +/Users/victoriagarciaarmario/Documents/repos/backendDevTest/target/generated-sources/src/main/java/org/backendDevTest/infra/api/ApiUtil.java From 7c93186d1e907e2861464b555d6fc118a0c0c81c Mon Sep 17 00:00:00 2001 From: Victoria Garcia Date: Fri, 29 Aug 2025 11:41:18 +0200 Subject: [PATCH 06/10] create endpoints --- .idea/misc.xml | 5 +++ docker-compose.yaml | 9 ++++- dockerfile | 34 +++++------------- importantSteps.txt | 7 ---- pom.xml | 19 +++++++--- .../BackendDevTestApplication.java | 12 +++++++ .../infra/api/ProductApiControllerImpl.java | 33 +++++++++++++++-- src/main/resources/application.yml | 9 +++++ target/backendDevTest-1.0-SNAPSHOT.jar | Bin 12180 -> 13383 bytes target/classes/application.yml | 9 +++++ .../BackendDevTestApplication.class | Bin 0 -> 737 bytes .../infra/api/ProductApiControllerImpl.class | Bin 441 -> 1891 bytes .../backendDevTest/infra/api/ProductApi.java | 2 +- .../infra/model/ProductDetail.java | 2 +- .../infra/model/ProductDetailBasic.java | 2 +- .../infra/model/ProductFullDetail.java | 2 +- .../compile/default-compile/createdFiles.lst | 7 ++-- .../compile/default-compile/inputFiles.lst | 1 + 18 files changed, 105 insertions(+), 48 deletions(-) delete mode 100644 importantSteps.txt create mode 100644 src/main/java/org/backendDevTest/BackendDevTestApplication.java create mode 100644 src/main/resources/application.yml create mode 100644 target/classes/application.yml create mode 100644 target/classes/org/backendDevTest/BackendDevTestApplication.class diff --git a/.idea/misc.xml b/.idea/misc.xml index e8f7f2dd..ace9ea7f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,10 @@ + + + + + + + io.swagger.core.v3 + swagger-core-jakarta + 2.2.25 + + - io.swagger.core.v3 - swagger-annotations - 2.2.8 + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.2.0 @@ -50,7 +56,11 @@ - + + org.springframework.boot + spring-boot-maven-plugin + + org.openapitools openapi-generator-maven-plugin @@ -76,7 +86,6 @@ - org.apache.maven.plugins maven-compiler-plugin diff --git a/src/main/java/org/backendDevTest/BackendDevTestApplication.java b/src/main/java/org/backendDevTest/BackendDevTestApplication.java new file mode 100644 index 00000000..85c7378c --- /dev/null +++ b/src/main/java/org/backendDevTest/BackendDevTestApplication.java @@ -0,0 +1,12 @@ +package org.backendDevTest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class BackendDevTestApplication { + + public static void main(String[] args) { + SpringApplication.run(BackendDevTestApplication.class, args); + } +} diff --git a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java index 64f6b718..0f960d09 100644 --- a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java +++ b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java @@ -1,7 +1,34 @@ package org.backendDevTest.infra.api; -import org.springframework.stereotype.Controller; +import org.backendDevTest.infra.model.ProductDetail; +import org.backendDevTest.infra.model.ProductDetailBasic; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; -@Controller -public class ProductApiControllerImpl { +import java.util.List; + +@RestController +@RequestMapping("/product") +public class ProductApiControllerImpl implements ProductApi { + + @Override + @GetMapping("/{productId}") + public ResponseEntity getProductId(@PathVariable("productId") String productId) { + return ResponseEntity.ok(new ProductDetailBasic()); + } + + @Override + @GetMapping("/{productId}/similar") + public ResponseEntity> getSimilarProductDetails(@PathVariable("productId") String productId) { + return ProductApi.super.getSimilarProductDetails(productId); + } + + @Override + @GetMapping("/{productId}/similarids") + public ResponseEntity> getSimilarProductsIds(@PathVariable("productId") String productId) { + return ProductApi.super.getSimilarProductsIds(productId); + } } \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 00000000..a5ea1b15 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,9 @@ +server: + port: 8080 + address: 0.0.0.0 +springdoc: + swagger-ui: + path: / +logging: + level: + org.springframework.web: DEBUG \ No newline at end of file diff --git a/target/backendDevTest-1.0-SNAPSHOT.jar b/target/backendDevTest-1.0-SNAPSHOT.jar index a4e6c395bcaa6a67934fd1c5ea6fcf320acaf4b5..15873ebae4971c51755a23d9890a265b23d9ac4d 100644 GIT binary patch delta 2876 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 diff --git a/target/classes/application.yml b/target/classes/application.yml new file mode 100644 index 00000000..a5ea1b15 --- /dev/null +++ b/target/classes/application.yml @@ -0,0 +1,9 @@ +server: + port: 8080 + address: 0.0.0.0 +springdoc: + swagger-ui: + path: / +logging: + level: + org.springframework.web: DEBUG \ No newline at end of file diff --git a/target/classes/org/backendDevTest/BackendDevTestApplication.class b/target/classes/org/backendDevTest/BackendDevTestApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..59d5934f6efb80d60032a2ac1a9b6802ed8a1692 GIT binary patch literal 737 zcma)4O-lnY5PfN@TWhu2`mG4wY7zJ5r7CE}Q&F%|51z7XT%+5hWV7nu@}zk12l%7J z$tt))1#_4%Z!&K(Z|42u^$oxt)+#8V=%G}_7{(c9Zuvd;W3D3qG`JO^WfkWyc6o`NZg-`#QKN7+=JmTmLa!Ns|qTZ^iZv03eyZNmzxZYRMEBJ z1M#5EogZjz{ayydJv zqZ;T_oSTSv8zaIDm7Y#bD2}E3*7~1hmhZbtW5>ly4R3(t^sVNl8}+3ME=)X^Ys v0&|!r#3k=!WI(y@wO%lB@ssa%6tqSjCUYEREMSrF0+uqnj1{_FtySO?$S%Wh literal 0 HcmV?d00001 diff --git a/target/classes/org/backendDevTest/infra/api/ProductApiControllerImpl.class b/target/classes/org/backendDevTest/infra/api/ProductApiControllerImpl.class index ff2fb1d7c490e468a75930c5654f2be12973fecf..736bc929545ade703be04ed0397b80af45782f05 100644 GIT binary patch literal 1891 zcmb_cYflqF6g^W)3uUEPc`J(e;H8WxK4JlbpoXL>p@hWvY1)ouV7t5S&O(ea{w4i{ z(ZnC%k22nEm(r~zX`>&yGk1FLJ@=k_W`6zt{u96omQskJD~Y&)ZX_56_Qj##rm)KV zbzxr?HA7-qSxT=mbj{4}Ceg#NXuD-z5XA#&l{Vzzj`TEF);m}5id~W>-*WAeU(_2? z3uQhPo+_r0L{|!ZFp@ZDpdV?5=^%^exXLP1Xhj~`?g8J^+Tq*Mb8O3#&n&I<2Zoq^ zz_2otYpyLjn`<*iwh!l#N#cTmK@5f1Ejtj7I;nrnQ4FJHsq?C$OyNe_@|r5j>!6Vi zD;hB{8k95i7l^l6@{$;5xPKM7hFt?B;a>%Q)CA9BS zMQ-C{JLPft?2^wCV|JAa9^3XwT@|^jJViXLS(dGZRwO%yrIxZfk_BE+R*8$cFMlER zOW`=dEH0;r-X zN_DO3eH}Mw?I-&t{iff7d6>a0of$!KbHSlU5u}AW^y3gZF*kpVfo9b42Gm3yH4#Cb uZ-IKNB`Uq4VZ#yB;bzpyHc)T3KwW5o8l%YsOx~&bXK1%b_T4%^_x=ErLITwQ delta 164 zcmaFNx09Lc)W2Q(7#J9A8H6TsnJ}78W@J>K?7+k~`2l0$ Date: Fri, 29 Aug 2025 17:07:49 +0200 Subject: [PATCH 07/10] dummy commit --- .idea/misc.xml | 6 ++- .../application/service/ProductService.java | 24 +++++++++++ .../infra/api/ProductApiControllerImpl.java | 16 ++++++- .../infra/repository/MockRepository.java | 42 +++++++++++++++++++ 4 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/backendDevTest/application/service/ProductService.java create mode 100644 src/main/java/org/backendDevTest/infra/repository/MockRepository.java diff --git a/.idea/misc.xml b/.idea/misc.xml index ace9ea7f..d3c65fd9 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,10 @@ - - + + + + diff --git a/src/main/java/org/backendDevTest/application/service/ProductService.java b/src/main/java/org/backendDevTest/application/service/ProductService.java new file mode 100644 index 00000000..a8d5d762 --- /dev/null +++ b/src/main/java/org/backendDevTest/application/service/ProductService.java @@ -0,0 +1,24 @@ +package org.backendDevTest.application.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.backendDevTest.infra.model.ProductDetailBasic; +import org.backendDevTest.infra.repository.MockRepository; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class ProductService { + + private final MockRepository mockRepository; + private final ObjectMapper mapper = new ObjectMapper(); + + public ProductService(MockRepository mockRepository) { + this.mockRepository = mockRepository; + } + + public ProductDetailBasic getProductId(String productId) throws JsonProcessingException { + return Optional.ofNullable(mapper.readValue(mockRepository.getProduct(productId), ProductDetailBasic.class)).orElse(new ProductDetailBasic()); + } +} diff --git a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java index 0f960d09..5af4f204 100644 --- a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java +++ b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java @@ -1,7 +1,14 @@ package org.backendDevTest.infra.api; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.backendDevTest.application.service.ProductService; import org.backendDevTest.infra.model.ProductDetail; import org.backendDevTest.infra.model.ProductDetailBasic; +import org.backendDevTest.infra.repository.MockRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpRequest; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -14,10 +21,17 @@ @RequestMapping("/product") public class ProductApiControllerImpl implements ProductApi { + @Autowired + private ProductService productService; + @Override @GetMapping("/{productId}") public ResponseEntity getProductId(@PathVariable("productId") String productId) { - return ResponseEntity.ok(new ProductDetailBasic()); + try { + return ResponseEntity.ok(productService.getProductId(productId)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } } @Override diff --git a/src/main/java/org/backendDevTest/infra/repository/MockRepository.java b/src/main/java/org/backendDevTest/infra/repository/MockRepository.java new file mode 100644 index 00000000..ae87d502 --- /dev/null +++ b/src/main/java/org/backendDevTest/infra/repository/MockRepository.java @@ -0,0 +1,42 @@ +package org.backendDevTest.infra.repository; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.annotation.PostConstruct; +import org.springframework.stereotype.Repository; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +@Repository +public class MockRepository { + private final Map productBodies = new HashMap<>(); + private final Map similarIdsBodies = new HashMap<>(); + + @PostConstruct + public void init() throws Exception { + ObjectMapper mapper = new ObjectMapper(); + InputStream is = getClass().getResourceAsStream("/mocks.json"); + JsonNode root = mapper.readTree(is); + + for (JsonNode node : root) { + String path = node.get("path").asText(); + String body = node.has("body") ? node.get("body").asText() : null; + + if (path.endsWith("/similarids")) { + similarIdsBodies.put(path.split("/product/")[1].replace("/similarids",""), body); + } else if (path.matches("/product/\\d+")) { + productBodies.put(path.split("/product/")[1], body); + } + } + } + + public String getProduct(String id) { + return productBodies.get(id); + } + + public String getSimilarIds(String id) { + return similarIdsBodies.get(id); + } +} From 99e06054d0bb4d2cd4f175dbc1682aad471eae9c Mon Sep 17 00:00:00 2001 From: Vicky Date: Tue, 2 Sep 2025 23:16:42 +0200 Subject: [PATCH 08/10] finish controller --- api-root.yaml | 17 ++++---- dockerfile | 1 + pom.xml | 7 ++++ shared/simulado/mocks.json | 13 +++++- .../application/service/ProductService.java | 41 +++++++++++++++++-- .../infra/api/ProductApiControllerImpl.java | 25 +++++++---- .../infra/repository/MockRepository.java | 40 +++++++++++++----- .../infra/model/ProductDetail.java | 2 +- 8 files changed, 112 insertions(+), 34 deletions(-) diff --git a/api-root.yaml b/api-root.yaml index 9fb05028..fb4b1599 100644 --- a/api-root.yaml +++ b/api-root.yaml @@ -23,7 +23,9 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SimilarProductDetails' + type: array + items: + $ref: '#/components/schemas/ProductDetail' '404': description: Product Not found @@ -61,23 +63,18 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/ProductDetailBasic' + $ref: '#/components/schemas/ProductDetail' '404': description: Product Not found components: schemas: - SimilarProductDetails: - type: array - items: - $ref: './similarProducts.yaml#/components/schemas/ProductDetail' - description: List of similar products with full details - ProductFullDetail: + ProductDetail: + type: object $ref: './similarProducts.yaml#/components/schemas/ProductDetail' + description: List of similar products with full details SimilarProductIds: type: array items: type: string description: List of similar product IDs - ProductDetailBasic: - $ref: './existingApis.yaml#/components/schemas/ProductDetail' diff --git a/dockerfile b/dockerfile index c89af5cb..9c3cbd7a 100644 --- a/dockerfile +++ b/dockerfile @@ -4,6 +4,7 @@ WORKDIR /app COPY pom.xml . COPY *.yaml . COPY src ./src +COPY shared/simulado/mocks.json shared/simulado/mocks.json RUN mvn clean package spring-boot:repackage -DskipTests diff --git a/pom.xml b/pom.xml index 801e3c7d..cffaaf00 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,13 @@ src/main/resources + + shared/simulado + . + + mocks.json + + diff --git a/shared/simulado/mocks.json b/shared/simulado/mocks.json index 31f63bc4..c2ed8e74 100644 --- a/shared/simulado/mocks.json +++ b/shared/simulado/mocks.json @@ -70,8 +70,19 @@ }, { "path": "/product/10000", - "body": "{\"id\":\"10000\",\"name\":\"Leather jacket\",\"price\":89.99,\"availability\":true}", + "body": "`[{\"id\":\"10000\",\"name\":\"Leather jacket\",\"price\":89.99,\"availability\":true}]", "delay": 50000, "headers": {"Content-Type": "application/json"} + }, + { + "path": "/product/4/similar", + "body": "[{\"message\":\"Product not found\"}]", + "status": 404, + "headers": {"Content-Type": "application/json"} + }, + { + "path": "/product/10000/similar", + "body": "[{\"id\":\"100000\",\"name\":\"Wool jacket\",\"price\":69.99,\"availability\":true}]", + "headers": {"Content-Type": "application/json"} } ] \ No newline at end of file diff --git a/src/main/java/org/backendDevTest/application/service/ProductService.java b/src/main/java/org/backendDevTest/application/service/ProductService.java index a8d5d762..2d17f42a 100644 --- a/src/main/java/org/backendDevTest/application/service/ProductService.java +++ b/src/main/java/org/backendDevTest/application/service/ProductService.java @@ -1,11 +1,14 @@ package org.backendDevTest.application.service; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.backendDevTest.infra.model.ProductDetailBasic; +import org.backendDevTest.infra.model.ProductDetail; import org.backendDevTest.infra.repository.MockRepository; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; @Service @@ -18,7 +21,39 @@ public ProductService(MockRepository mockRepository) { this.mockRepository = mockRepository; } - public ProductDetailBasic getProductId(String productId) throws JsonProcessingException { - return Optional.ofNullable(mapper.readValue(mockRepository.getProduct(productId), ProductDetailBasic.class)).orElse(new ProductDetailBasic()); + public ProductDetail getProductId(String productId) throws JsonProcessingException { + return Optional.ofNullable(mapper.readValue(mockRepository.getProduct(productId), ProductDetail.class)) + .orElse(new ProductDetail()); + } + + public List getSimilarProduct(String productId) throws JsonProcessingException { + String body = mockRepository.getSimilarProducts(productId); + if (body == null) { + return List.of(); + } + + JsonNode node = mapper.readTree(body); + if (node.isArray()) { + if (!node.isEmpty() && node.get(0).has("message")) { + return List.of(); + } + return mapper.readValue(body, new TypeReference>() {}); + } + + return List.of(); + } + + public List getSimilarIds(String productId) throws JsonProcessingException { + String body = mockRepository.getSimilarIds(productId); + + JsonNode node = mapper.readTree(body); + if (node.isArray()) { + if (!node.isEmpty() && node.get(0).has("message")) { + return List.of(); + } + return mapper.readValue(body, new TypeReference>() {}); + } + + return List.of(); } } diff --git a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java index 5af4f204..05a98f75 100644 --- a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java +++ b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java @@ -1,15 +1,11 @@ package org.backendDevTest.infra.api; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.backendDevTest.application.service.ProductService; import org.backendDevTest.infra.model.ProductDetail; -import org.backendDevTest.infra.model.ProductDetailBasic; -import org.backendDevTest.infra.repository.MockRepository; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpRequest; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -26,9 +22,10 @@ public class ProductApiControllerImpl implements ProductApi { @Override @GetMapping("/{productId}") - public ResponseEntity getProductId(@PathVariable("productId") String productId) { + public ResponseEntity getProductId(@PathVariable("productId") String productId) { try { - return ResponseEntity.ok(productService.getProductId(productId)); + ProductDetail productDetail = productService.getProductId(productId); + return ObjectUtils.isEmpty(productDetail) ? ResponseEntity.notFound().build() : ResponseEntity.ok(productDetail); } catch (JsonProcessingException e) { throw new RuntimeException(e); } @@ -37,12 +34,22 @@ public ResponseEntity getProductId(@PathVariable("productId" @Override @GetMapping("/{productId}/similar") public ResponseEntity> getSimilarProductDetails(@PathVariable("productId") String productId) { - return ProductApi.super.getSimilarProductDetails(productId); + try { + List details = productService.getSimilarProduct(productId); + return details.isEmpty() ? ResponseEntity.notFound().build() : ResponseEntity.ok(details); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } } @Override @GetMapping("/{productId}/similarids") public ResponseEntity> getSimilarProductsIds(@PathVariable("productId") String productId) { - return ProductApi.super.getSimilarProductsIds(productId); + try { + List similarIds = productService.getSimilarIds(productId); + return similarIds.isEmpty() ? ResponseEntity.notFound().build() : ResponseEntity.ok(similarIds); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } } } \ No newline at end of file diff --git a/src/main/java/org/backendDevTest/infra/repository/MockRepository.java b/src/main/java/org/backendDevTest/infra/repository/MockRepository.java index ae87d502..d3d08a1a 100644 --- a/src/main/java/org/backendDevTest/infra/repository/MockRepository.java +++ b/src/main/java/org/backendDevTest/infra/repository/MockRepository.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Repository; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -15,20 +16,35 @@ public class MockRepository { private final Map similarIdsBodies = new HashMap<>(); @PostConstruct - public void init() throws Exception { + public void init() { ObjectMapper mapper = new ObjectMapper(); - InputStream is = getClass().getResourceAsStream("/mocks.json"); - JsonNode root = mapper.readTree(is); + byte[] bytes; + try (InputStream is = getClass().getResourceAsStream("/mocks.json")) { + if (is == null) { + throw new IllegalStateException("Could not find mocks.json in classpath"); + } + + bytes = is.readAllBytes(); + + String content = new String(bytes, StandardCharsets.UTF_8); + + JsonNode root = mapper.readTree(content); - for (JsonNode node : root) { - String path = node.get("path").asText(); - String body = node.has("body") ? node.get("body").asText() : null; + for (JsonNode node : root) { + String path = node.get("path").asText(); + String body = node.has("body") ? node.get("body").asText() : null; - if (path.endsWith("/similarids")) { - similarIdsBodies.put(path.split("/product/")[1].replace("/similarids",""), body); - } else if (path.matches("/product/\\d+")) { - productBodies.put(path.split("/product/")[1], body); + if (path.endsWith("/similarids")) { + similarIdsBodies.put(path.split("/product/")[1].replace("/similarids", ""), body); + } else if (path.endsWith("/similarProducts")) { + productBodies.put(path.split("/product/")[1].replace("/similarProducts", ""), body); + System.out.println("body " + body); + } else if (path.matches("/product/\\d+")) { + productBodies.put(path.split("/product/")[1], body); + } } + } catch (Exception e) { + e.getStackTrace(); } } @@ -36,6 +52,10 @@ public String getProduct(String id) { return productBodies.get(id); } + public String getSimilarProducts(String id) { + return productBodies.get(id); + } + public String getSimilarIds(String id) { return similarIdsBodies.get(id); } diff --git a/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java b/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java index d3782725..2cdecfa3 100644 --- a/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java +++ b/target/generated-sources/src/main/java/org/backendDevTest/infra/model/ProductDetail.java @@ -20,7 +20,7 @@ */ @Schema(name = "ProductDetail", description = "Product detail") -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-08-29T11:21:00.996791+02:00[Europe/Madrid]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2025-09-02T23:05:51.910583500+02:00[Europe/Madrid]") public class ProductDetail { private String id; From 7f99f2936698035ac55e3850cd25723e1c79c757 Mon Sep 17 00:00:00 2001 From: Vicky Date: Tue, 2 Sep 2025 23:20:15 +0200 Subject: [PATCH 09/10] add gitignore --- .idea/.gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.idea/.gitignore b/.idea/.gitignore index 0e87887e..9afe39a8 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -3,4 +3,7 @@ /workspace.xml .idea/ *.iml -target/ \ No newline at end of file +target/ +.classpath +.project +.settings/ \ No newline at end of file From 9262e55e17d1ff1d8ef6f9043ccfe2ede2bcb861 Mon Sep 17 00:00:00 2001 From: victoria Date: Sun, 7 Sep 2025 21:01:11 +0200 Subject: [PATCH 10/10] increase api --- api-root.yaml | 16 +++++++++ docker-compose.yaml | 1 + dockerfile | 2 +- existingApis.yaml | 16 +++++++++ shared/simulado/mocks.json | 2 +- .../application/service/ProductService.java | 35 ++++++++++++------- .../infra/api/ProductApiControllerImpl.java | 16 ++++++--- .../infra/repository/MockRepository.java | 8 ++++- 8 files changed, 77 insertions(+), 19 deletions(-) diff --git a/api-root.yaml b/api-root.yaml index fb4b1599..3e98536f 100644 --- a/api-root.yaml +++ b/api-root.yaml @@ -7,6 +7,22 @@ servers: - url: 'http://localhost:3001' paths: + /product: + get: + operationId: getAllProducts + summary: Products + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ProductDetail' + '404': + description: Product Not found + /product/{productId}/similar: get: operationId: getSimilarProductDetails diff --git a/docker-compose.yaml b/docker-compose.yaml index b614cbd4..848f7aee 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -4,6 +4,7 @@ services: image: influxdb:1.8.2 ports: - "8086:8086" + - "5005:5005" environment: - INFLUXDB_DB=k6 grafana: diff --git a/dockerfile b/dockerfile index 9c3cbd7a..759bef9d 100644 --- a/dockerfile +++ b/dockerfile @@ -13,6 +13,6 @@ WORKDIR /app COPY --from=build /app/target/*.jar backendDevTest.jar -EXPOSE 5000 +EXPOSE 5000 5005 CMD ["java", "-jar", "backendDevTest.jar", "--server.port=5000", "--server.address=0.0.0.0"] diff --git a/existingApis.yaml b/existingApis.yaml index cf7805e8..bd94420e 100644 --- a/existingApis.yaml +++ b/existingApis.yaml @@ -5,6 +5,22 @@ info: servers: - url: 'http://localhost:3001' paths: + '/product': + get: + operationId: getAllProducts + summary: Products + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ProductDetail' + '404': + description: Product Not found + '/product/{productId}/similarids': parameters: - schema: diff --git a/shared/simulado/mocks.json b/shared/simulado/mocks.json index c2ed8e74..44d40583 100644 --- a/shared/simulado/mocks.json +++ b/shared/simulado/mocks.json @@ -70,7 +70,7 @@ }, { "path": "/product/10000", - "body": "`[{\"id\":\"10000\",\"name\":\"Leather jacket\",\"price\":89.99,\"availability\":true}]", + "body": "{\"id\":\"10000\",\"name\":\"Leather jacket\",\"price\":89.99,\"availability\":true}", "delay": 50000, "headers": {"Content-Type": "application/json"} }, diff --git a/src/main/java/org/backendDevTest/application/service/ProductService.java b/src/main/java/org/backendDevTest/application/service/ProductService.java index 2d17f42a..2b759d59 100644 --- a/src/main/java/org/backendDevTest/application/service/ProductService.java +++ b/src/main/java/org/backendDevTest/application/service/ProductService.java @@ -8,6 +8,7 @@ import org.backendDevTest.infra.repository.MockRepository; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -21,6 +22,11 @@ public ProductService(MockRepository mockRepository) { this.mockRepository = mockRepository; } + public List getProducts() throws JsonProcessingException { + String body = mockRepository.getAllProducts(); + return getProductDetails(body); + } + public ProductDetail getProductId(String productId) throws JsonProcessingException { return Optional.ofNullable(mapper.readValue(mockRepository.getProduct(productId), ProductDetail.class)) .orElse(new ProductDetail()); @@ -28,32 +34,37 @@ public ProductDetail getProductId(String productId) throws JsonProcessingExcepti public List getSimilarProduct(String productId) throws JsonProcessingException { String body = mockRepository.getSimilarProducts(productId); - if (body == null) { - return List.of(); - } + return getProductDetails(body); + } + + public List getSimilarIds(String productId) throws JsonProcessingException { + String body = mockRepository.getSimilarIds(productId); JsonNode node = mapper.readTree(body); if (node.isArray()) { if (!node.isEmpty() && node.get(0).has("message")) { return List.of(); } - return mapper.readValue(body, new TypeReference>() {}); + return mapper.readValue(body, new TypeReference>() {}); } return List.of(); } - public List getSimilarIds(String productId) throws JsonProcessingException { - String body = mockRepository.getSimilarIds(productId); + private List getProductDetails(String body) throws JsonProcessingException { + if (body == null || body.isBlank()) { + return List.of(); + } - JsonNode node = mapper.readTree(body); - if (node.isArray()) { - if (!node.isEmpty() && node.get(0).has("message")) { - return List.of(); + List items = mapper.readValue(body, new TypeReference<>() {}); + List products = new ArrayList<>(); + + for (JsonNode item : items) { + if (item != null && item.isObject() && item.has("id")) { + products.add(mapper.treeToValue(item, ProductDetail.class)); } - return mapper.readValue(body, new TypeReference>() {}); } - return List.of(); + return products; } } diff --git a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java index 05a98f75..98ce95d0 100644 --- a/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java +++ b/src/main/java/org/backendDevTest/infra/api/ProductApiControllerImpl.java @@ -6,20 +6,28 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.util.ObjectUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/product") +@CrossOrigin() public class ProductApiControllerImpl implements ProductApi { @Autowired private ProductService productService; + @Override + @GetMapping() + public ResponseEntity> getAllProducts() { + try { + return ResponseEntity.ok(productService.getProducts()); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + @Override @GetMapping("/{productId}") public ResponseEntity getProductId(@PathVariable("productId") String productId) { diff --git a/src/main/java/org/backendDevTest/infra/repository/MockRepository.java b/src/main/java/org/backendDevTest/infra/repository/MockRepository.java index d3d08a1a..3f3b9529 100644 --- a/src/main/java/org/backendDevTest/infra/repository/MockRepository.java +++ b/src/main/java/org/backendDevTest/infra/repository/MockRepository.java @@ -1,5 +1,6 @@ package org.backendDevTest.infra.repository; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.PostConstruct; @@ -38,9 +39,10 @@ public void init() { similarIdsBodies.put(path.split("/product/")[1].replace("/similarids", ""), body); } else if (path.endsWith("/similarProducts")) { productBodies.put(path.split("/product/")[1].replace("/similarProducts", ""), body); - System.out.println("body " + body); } else if (path.matches("/product/\\d+")) { productBodies.put(path.split("/product/")[1], body); + } else { + productBodies.put(path.split("/product/")[1], body); } } } catch (Exception e) { @@ -48,6 +50,10 @@ public void init() { } } + public String getAllProducts() throws JsonProcessingException { + return productBodies.values().toString(); + } + public String getProduct(String id) { return productBodies.get(id); }