diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 6cf8675..b2d9fcb 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -6,12 +6,14 @@ on: - "main" paths: - "customer-api-provider/**" + - "customer-api-consumer/**" - ".github/**" pull_request: branches: - "main" paths: - "customer-api-provider/**" + - "customer-api-consumer/**" - ".github/**" jobs: @@ -27,6 +29,9 @@ jobs: java-version: '21' distribution: 'temurin' cache: maven - - name: Build with Maven + - name: Build API Provider with Maven working-directory: customer-api-provider run: mvn -B package --file pom.xml + - name: Build API Consumer with Maven + working-directory: customer-api-consumer + run: mvn -B package --file pom.xml diff --git a/customer-api-consumer/pom.xml b/customer-api-consumer/pom.xml new file mode 100644 index 0000000..cb6b680 --- /dev/null +++ b/customer-api-consumer/pom.xml @@ -0,0 +1,153 @@ + + + 4.0.0 + de.schulung.quarkus + customer-api-consumer + 1.0.0-SNAPSHOT + + + 3.12.1 + 21 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.11.2 + true + 3.2.5 + 1.18.32 + + + + + + io.quarkus.platform + quarkus-bom + ${quarkus.platform.version} + pom + import + + + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-resteasy-reactive + + + io.quarkus + quarkus-rest-client-reactive-jsonb + + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-junit5-mockito + test + + + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + + + -parameters + + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + native + + + + false + true + + + + diff --git a/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomerConsumerApplication.java b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomerConsumerApplication.java new file mode 100644 index 0000000..edd116b --- /dev/null +++ b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomerConsumerApplication.java @@ -0,0 +1,13 @@ +package de.schulung.sample.consumer; + +import io.quarkus.runtime.Quarkus; +import io.quarkus.runtime.annotations.QuarkusMain; + +@QuarkusMain +public class CustomerConsumerApplication { + + public static void main(String[] args) { + Quarkus.run(args); + } + +} diff --git a/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomerService.java b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomerService.java new file mode 100644 index 0000000..f523b73 --- /dev/null +++ b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomerService.java @@ -0,0 +1,20 @@ +package de.schulung.sample.consumer; + +import de.schulung.sample.consumer.client.CustomerApi; +import de.schulung.sample.consumer.client.CustomerDto; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import lombok.RequiredArgsConstructor; + +import java.util.Collection; + +@ApplicationScoped +@RequiredArgsConstructor +public class CustomerService { + + private final CustomerApi customerApi; + + public Uni> getAllCustomers() { // quick'n'dirty without mapping! + return customerApi.getAllCustomers(); + } +} diff --git a/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomersResource.java b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomersResource.java new file mode 100644 index 0000000..ca9224c --- /dev/null +++ b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/CustomersResource.java @@ -0,0 +1,31 @@ +package de.schulung.sample.consumer; + +import de.schulung.sample.consumer.client.CustomerDto; +import io.smallrye.mutiny.Uni; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import lombok.RequiredArgsConstructor; + +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Path("/customers") +public class CustomersResource { + + private final CustomerService service; + + @GET + @Produces(MediaType.TEXT_PLAIN) + public Uni getCustomerNames() { + return this.service + .getAllCustomers() + .map(list -> list + .stream() + .map(CustomerDto::getName) + .collect(Collectors.joining("\n")) + ); + } + +} diff --git a/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerApi.java b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerApi.java new file mode 100644 index 0000000..a4bfda0 --- /dev/null +++ b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerApi.java @@ -0,0 +1,22 @@ +package de.schulung.sample.consumer.client; + +import io.smallrye.mutiny.Uni; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +import java.util.Collection; + +@RegisterRestClient(configKey = "customer-api") +@Path("/customers") +public interface CustomerApi { + + // https://quarkus.io/guides/rest-client + + @GET + @Produces(MediaType.APPLICATION_JSON) + Uni> getAllCustomers(); + +} diff --git a/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerApiProvider.java b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerApiProvider.java new file mode 100644 index 0000000..61b1efe --- /dev/null +++ b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerApiProvider.java @@ -0,0 +1,19 @@ +package de.schulung.sample.consumer.client; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Default; +import jakarta.enterprise.inject.Produces; +import lombok.Getter; +import org.eclipse.microprofile.rest.client.inject.RestClient; + +@ApplicationScoped +public class CustomerApiProvider { + + @RestClient + @Getter(onMethod_ = { + @Produces, + @Default + }) + CustomerApi customerApi; + +} diff --git a/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerDto.java b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerDto.java new file mode 100644 index 0000000..99d738b --- /dev/null +++ b/customer-api-consumer/src/main/java/de/schulung/sample/consumer/client/CustomerDto.java @@ -0,0 +1,26 @@ +package de.schulung.sample.consumer.client; + +import jakarta.json.bind.annotation.JsonbTransient; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDate; +import java.util.UUID; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class CustomerDto { + + // readonly property + @Setter(onMethod_ = @JsonbTransient) + private UUID uuid; + private String name; + //@JsonbProperty("birth_date") + private LocalDate birthDate; + private String state; + +} diff --git a/customer-api-consumer/src/main/resources/application.properties b/customer-api-consumer/src/main/resources/application.properties new file mode 100644 index 0000000..39776b5 --- /dev/null +++ b/customer-api-consumer/src/main/resources/application.properties @@ -0,0 +1,4 @@ +%dev.quarkus.http.port=8081 +%dev.quarkus.rest-client."customer-api".url=http://localhost:8080 +quarkus.rest-client."customer-api".connect-timeout=2000 +%dev.quarkus.rest-client."customer-api".read-timeout=2000 \ No newline at end of file