Customer order application project

This commit is contained in:
Sasa M 2020-05-28 01:12:42 +02:00
parent 9e6dd6f41b
commit ebfae11149
40 changed files with 1226 additions and 0 deletions

View File

@ -0,0 +1,13 @@
--------------------------------- CustomerOrderApp installation steps----------------------------------
1. Clone or download sample project from GitHub repo: https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/customer-order-app
2. Unzip project folder to local disk for example to: C:/baeldung-tutorials/customer-order-app
3. Run `mvn clean install -DskipTests=true`
4. Navigate to payment-service/payment-server module folder and type `mvn spring-boot:run`
5. Open another CMD PROMPT window.
Navigate to order-service/order-server module folder and type `mvn spring-boot:run`
6. Open another CMD PROMPT window.
Navigate to customer-service module folder and type `mvn spring-boot:run`
7. Launch the Postman application from your machine and import the collection of POST requests located in the _postman_ folder

View File

@ -0,0 +1,41 @@
#https://github.com/spring-projects/spring-boot/blob/master/.gitignore
*#
*.iml
*.ipr
*.iws
*.jar
*.sw?
*~
.#*
.*.md.html
.DS_Store
.classpath
.factorypath
.gradle
.idea
.metadata
.project
.recommenders
.settings
.springBeans
/build
/code
MANIFEST.MF
_site/
activemq-data
bin
build
build.log
dependency-reduced-pom.xml
dump.rdb
interpolated*.xml
lib/
manifest.yml
overridedb.*
target
transaction-logs
.flattened-pom.xml
secrets.yml
.gradletasknamecache
.sts4-cache

View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>CustomerOrderApp</artifactId>
<groupId>com.baeldung</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung.customerservice</groupId>
<artifactId>customer-service</artifactId>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baeldung.orderservice</groupId>
<artifactId>order-client</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -0,0 +1,14 @@
package com.baeldung.customerservice;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Customer {
private int id;
private String firstName;
private String lastName;
}

View File

@ -0,0 +1,25 @@
package com.baeldung.customerservice;
import com.baeldung.orderservice.client.OrderClient;
import com.baeldung.orderservice.client.OrderClientImpl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
/**
* Spring Boot application starter class
*/
@SpringBootApplication
public class CustomerApplication {
public static void main(String[] args) {
SpringApplication.run(CustomerApplication.class, args);
}
@Bean
public OrderClient getOrderClient() {
return new OrderClientImpl(new RestTemplateBuilder());
}
}

View File

@ -0,0 +1,56 @@
package com.baeldung.customerservice;
import com.baeldung.orderservice.client.OrderClient;
import com.baeldung.orderservice.client.OrderDTO;
import com.baeldung.orderservice.client.OrderResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@RestController
public class CustomerService {
@Autowired
private OrderClient orderClient;
private List<Customer> customers = Arrays.asList(
new Customer(1, "John", "Smith"),
new Customer(2, "Deny", "Dominic"));
@GetMapping
public List<Customer> getAllCustomers() {
return customers;
}
@GetMapping("/{id}")
public Customer getCustomerById(@PathVariable int id) {
return customers.stream()
.filter(customer -> customer.getId() == id)
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
@PostMapping(value = "/order")
public String sendOrder(@RequestBody Map<String, Object> body) {
OrderDTO dto = new OrderDTO();
dto.setCustomerId((Integer) body.get("customerId"));
dto.setItemId((String) body.get("itemId"));
OrderResponse response = orderClient.order(dto);
return response.getStatus();
}
}

View File

@ -0,0 +1,4 @@
#Spring Boot server configuration
server.servlet.context-path=/customer-service
server.port=8001

View File

@ -0,0 +1,33 @@
package com.baeldung.customerservice;
import com.baeldung.orderservice.client.OrderClient;
import com.baeldung.orderservice.client.OrderDTO;
import com.baeldung.orderservice.client.OrderResponse;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CustomerApplication.class)
public class CustomerServiceTest {
@Autowired
private OrderClient orderClient;
@Test
public void testAddOrderSuccess(){
OrderDTO dto = new OrderDTO(2,"A152");
OrderResponse response = orderClient.order(dto);
Assert.assertNotNull("Order Id not generated", response.getOrderId());
Assert.assertEquals("A152", response.getProductId());
Assert.assertEquals("CREATED", response.getStatus());
}
}

View File

@ -0,0 +1,2 @@
local.server.port=8001
server.servlet.context-path=/customer-service

View File

@ -0,0 +1,41 @@
#https://github.com/spring-projects/spring-boot/blob/master/.gitignore
*#
*.iml
*.ipr
*.iws
*.jar
*.sw?
*~
.#*
.*.md.html
.DS_Store
.classpath
.factorypath
.gradle
.idea
.metadata
.project
.recommenders
.settings
.springBeans
/build
/code
MANIFEST.MF
_site/
activemq-data
bin
build
build.log
dependency-reduced-pom.xml
dump.rdb
interpolated*.xml
lib/
manifest.yml
overridedb.*
target
transaction-logs
.flattened-pom.xml
secrets.yml
.gradletasknamecache
.sts4-cache

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<!-- Your own application should inherit from spring-boot-starter-parent -->
<groupId>com.baeldung.orderservice</groupId>
<artifactId>order-service</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>order-client</artifactId>
<groupId>com.baeldung.orderservice</groupId>
<name>order-client</name>
<description>Order service client module</description>
<url>http://projects.spring.io/spring-boot/</url>
</project>

View File

@ -0,0 +1,6 @@
package com.baeldung.orderservice.client;
public interface OrderClient {
OrderResponse order(OrderDTO orderDTO);
}

View File

@ -0,0 +1,35 @@
package com.baeldung.orderservice.client;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
public class OrderClientImpl implements OrderClient {
private RestTemplate restTemplate;
public OrderClientImpl(RestTemplateBuilder builder) {
this.restTemplate = builder.build();
}
@Override
public OrderResponse order(OrderDTO orderDTO) {
String serviceUrl = "http://localhost:8002/order-service";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<OrderDTO> request = new HttpEntity<>(orderDTO, headers);
OrderResponse orderResponse = restTemplate.postForObject(serviceUrl + "/create", request, OrderResponse.class);
return orderResponse;
}
}

View File

@ -0,0 +1,16 @@
package com.baeldung.orderservice.client;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderDTO {
private int customerId;
private String itemId;
}

View File

@ -0,0 +1,15 @@
package com.baeldung.orderservice.client;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderResponse {
private int orderId;
private String productId;
private String status;
}

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>order-service</artifactId>
<groupId>com.baeldung.orderservice</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung.orderservice</groupId>
<artifactId>order-server</artifactId>
<dependencies>
<dependency>
<groupId>com.baeldung.orderservice</groupId>
<artifactId>order-client</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baeldung.paymentservice</groupId>
<artifactId>payment-client</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,18 @@
package com.baeldung.orderservice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {
private Integer id;
private Integer customerId;
private String itemId;
private String date;
}

View File

@ -0,0 +1,24 @@
package com.baeldung.orderservice;
import com.baeldung.paymentservice.PaymentClient;
import com.baeldung.paymentservice.PaymentClientImpl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
/**
* Spring Boot application starter class
*/
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public PaymentClient getPaymentClient() {
return new PaymentClientImpl(new RestTemplateBuilder());
}
}

View File

@ -0,0 +1,75 @@
package com.baeldung.orderservice;
import com.baeldung.orderservice.client.OrderDTO;
import com.baeldung.orderservice.client.OrderResponse;
import com.baeldung.paymentservice.PaymentClient;
import com.baeldung.paymentservice.PaymentDTO;
import com.baeldung.paymentservice.PaymentResponse;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RestController
public class OrderService {
@Autowired
private PaymentClient paymentClient;
private List<Order> orders = Arrays.asList(
new Order(1, 1, "A101", "2020/02/14"),
new Order(2, 1, "A101", "2020/02/14"),
new Order(3, 2, "A150", "2020/02/17"));
@GetMapping
public List<Order> getAllOrders() {
return orders;
}
@GetMapping("/{id}")
public List<Order> getOrdersByCustomer(@PathVariable int id) {
return orders.stream()
.filter(order -> order.getCustomerId() == id).collect(Collectors.toList());
}
@PostMapping("/create")
public OrderResponse createOrder(@RequestBody OrderDTO request) {
int lastIndex = orders.size();
Order order = new Order();
order.setId(lastIndex + 1);
order.setCustomerId(request.getCustomerId());
order.setItemId(request.getItemId());
String date = DateFormatUtils.format(new Date(), "yyyy/MM/dd");
order.setDate(date);
return new OrderResponse(order.getId(), order.getItemId(), "CREATED");
}
@PostMapping("/pay/{orderNumber}")
public PaymentResponse sendPayment(@PathVariable String orderNumber, @RequestBody Map<String, Object> body) {
PaymentDTO dto = new PaymentDTO();
dto.setFirstName((String) body.get("firstName"));
dto.setLastName((String) body.get("lastName"));
dto.setCardNumber((String) body.get("cardNumber"));
dto.setAmount((Double) body.get("amount"));
dto.setCurrency((String) body.get("currency"));
PaymentResponse paymentResponse = paymentClient.pay(orderNumber, dto);
return paymentResponse;
}
}

View File

@ -0,0 +1,4 @@
#Spring Boot server configuration
server.servlet.context-path=/order-service
server.port=8002

View File

@ -0,0 +1,35 @@
package com.baeldung.orderservice;
import com.baeldung.paymentservice.PaymentClient;
import com.baeldung.paymentservice.PaymentDTO;
import com.baeldung.paymentservice.PaymentResponse;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = OrderApplication.class)
public class OrderServiceTest {
@Autowired
private PaymentClient paymentClient;
@Test
public void testSendPaySuccess(){
PaymentDTO dto = new PaymentDTO("Sasa","Milenkovic","4260-6720-3283-7081",150.0,"USD");
PaymentResponse response = paymentClient.pay("A152", dto);
Assert.assertNotNull("Payment Id not generated", response.getPaymentId());
Assert.assertEquals("CREDITCARD", response.getPaymentMethod());
Assert.assertEquals("Sasa Milenkovic", response.getCustomerFullName());
Assert.assertEquals(new Double(150.0), response.getAmount());
Assert.assertEquals("USD", response.getCurrency());
}
}

View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>CustomerOrderApp</artifactId>
<groupId>com.baeldung</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung.orderservice</groupId>
<artifactId>order-service</artifactId>
<packaging>pom</packaging>
<modules>
<module>order-client</module>
<module>order-server</module>
</modules>
<properties>
<java.version>1.8</java.version>
<commons-lang.version>2.6</commons-lang.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<orderservice.mainclass>com.baeldung.orderservice.OrderApplication</orderservice.mainclass>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test-autoconfigure</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${orderservice.mainclass}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exe</classifier>
</configuration>
</execution>
<execution>
<id>start-application</id>
<configuration>
<mainClass>com.baeldung.orderservice.OrderApplication</mainClass>
<classesDirectory>../order-server/target/classes</classesDirectory>
</configuration>
<goals>
<goal>start</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -0,0 +1,41 @@
#https://github.com/spring-projects/spring-boot/blob/master/.gitignore
*#
*.iml
*.ipr
*.iws
*.jar
*.sw?
*~
.#*
.*.md.html
.DS_Store
.classpath
.factorypath
.gradle
.idea
.metadata
.project
.recommenders
.settings
.springBeans
/build
/code
MANIFEST.MF
_site/
activemq-data
bin
build
build.log
dependency-reduced-pom.xml
dump.rdb
interpolated*.xml
lib/
manifest.yml
overridedb.*
target
transaction-logs
.flattened-pom.xml
secrets.yml
.gradletasknamecache
.sts4-cache

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>payment-service</artifactId>
<groupId>com.baeldung.paymentservice</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.baeldung.paymentservice</groupId>
<artifactId>payment-client</artifactId>
</project>

View File

@ -0,0 +1,6 @@
package com.baeldung.paymentservice;
public interface PaymentClient {
PaymentResponse pay (String orderNumber, PaymentDTO paymentDTO);
}

View File

@ -0,0 +1,35 @@
package com.baeldung.paymentservice;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
public class PaymentClientImpl implements PaymentClient {
private RestTemplate restTemplate;
public PaymentClientImpl(RestTemplateBuilder builder) {
this.restTemplate = builder.build();
}
@Override
public PaymentResponse pay(String orderNumber, PaymentDTO paymentDTO) {
String serviceUrl = "http://localhost:8003/payment-service";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<PaymentDTO> request = new HttpEntity<>(paymentDTO, headers);
PaymentResponse paymentResponse = restTemplate.postForObject(serviceUrl + "/pay/" + orderNumber, request, PaymentResponse.class);
return paymentResponse;
}
}

View File

@ -0,0 +1,17 @@
package com.baeldung.paymentservice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PaymentDTO {
private String firstName;
private String lastName;
private String cardNumber;
private double amount;
private String currency;
}

View File

@ -0,0 +1,18 @@
package com.baeldung.paymentservice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PaymentResponse{
private String paymentId;
private String paymentMethod;
private String customerFullName;
private Double amount;
private String currency;
}

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.baeldung.paymentservice</groupId>
<artifactId>payment-service</artifactId>
<version>1.0-SNAPSHOT</version> <!-- lookup parent from repository -->
</parent>
<groupId>com.baeldung.paymentservice</groupId>
<artifactId>payment-server</artifactId>
<name>payment-server</name>
<dependencies>
<dependency>
<groupId>com.baeldung.paymentservice</groupId>
<artifactId>payment-client</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,31 @@
package com.baeldung.paymentservice;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CardValidator {
public static boolean validate(String cardNumber){
boolean isValid = false;
String regex = "^(?:(?<visa>4[0-9]{12}(?:[0-9]{3})?)|" +
"(?<mastercard>5[1-5][0-9]{14})|" +
"(?<discover>6(?:011|5[0-9]{2})[0-9]{12})|" +
"(?<amex>3[47][0-9]{13})|" +
"(?<diners>3(?:0[0-5]|[68][0-9])?[0-9]{11})|" +
"(?<jcb>(?:2131|1800|35[0-9]{3})[0-9]{11}))$";
Pattern pattern = Pattern.compile(regex);
cardNumber = cardNumber.replaceAll("-", "");
Matcher matcher = pattern.matcher(cardNumber);
if(matcher.matches()){
isValid = true;
}
return isValid;
}
}

View File

@ -0,0 +1,19 @@
package com.baeldung.paymentservice;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Payment {
private String paymentId;
private String paymentMethod;
private String customerFullName;
private double amount;
private String currency;
}

View File

@ -0,0 +1,15 @@
package com.baeldung.paymentservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
*
* Spring Boot application starter class
*/
@SpringBootApplication
public class PaymentApplication {
public static void main(String[] args) {
SpringApplication.run(PaymentApplication.class, args);
}
}

View File

@ -0,0 +1,39 @@
package com.baeldung.paymentservice;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.smartcardio.CardException;
import java.util.UUID;
@RestController
public class PaymentService {
@PostMapping("/pay/{orderNum}")
public PaymentResponse createPayment(@PathVariable String orderNum, @RequestBody PaymentDTO paymentDTO) {
Payment payment = new Payment();
payment.setPaymentId(UUID.randomUUID().toString().replace("-", ""));
String firstName = paymentDTO.getFirstName();
String lastName = paymentDTO.getLastName();
payment.setCustomerFullName(firstName + " " + lastName);
String cardNumber = paymentDTO.getCardNumber();
if(CardValidator.validate(cardNumber)){
payment.setPaymentMethod("CREDITCARD");
} else try {
throw new CardException("Card with number:"+ cardNumber + " is invalid");
} catch (CardException e) {
e.printStackTrace();
}
payment.setAmount(paymentDTO.getAmount());
payment.setCurrency(paymentDTO.getCurrency());
return new PaymentResponse(payment.getPaymentId(), payment.getPaymentMethod(), payment.getCustomerFullName(), payment.getAmount(), payment.getCurrency());
}
}

View File

@ -0,0 +1,3 @@
#Spring Boot server configuration
server.servlet.context-path=/payment-service
server.port=8003

View File

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>CustomerOrderApp</artifactId>
<groupId>com.baeldung</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung.paymentservice</groupId>
<artifactId>payment-service</artifactId>
<packaging>pom</packaging>
<modules>
<module>payment-client</module>
<module>payment-server</module>
</modules>
<properties>
<java.version>1.8</java.version>
<commons-lang.version>2.6</commons-lang.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<paymentservice.mainclass>com.baeldung.paymentservice.PaymentApplication</paymentservice.mainclass>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test-autoconfigure</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${paymentservice.mainclass}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exe</classifier>
</configuration>
</execution>
<execution>
<id>start-application</id>
<configuration>
<mainClass>com.baeldung.paymentservice.PaymentApplication</mainClass>
<classesDirectory>../payment-server/target/classes</classesDirectory>
</configuration>
<goals>
<goal>start</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -0,0 +1,46 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung</groupId>
<artifactId>CustomerOrderApp</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>CustomerOrderApp</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<modules>
<module>customer-service</module>
<module>order-service</module>
<module>payment-service</module>
</modules>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,87 @@
{
"info": {
"_postman_id": "92594398-49cc-4a7c-b44f-1037307afbd3",
"name": "postman-requests",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "Crete new Customer order",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "multipart/form-data",
"type": "text",
"disabled": true
},
{
"key": "Accept-Charset",
"value": "utf-8",
"type": "text",
"disabled": true
},
{
"key": "boundary",
"value": "nAp4nMEt-BuGuuLlq-6fnASQErGjSamaG",
"type": "text",
"disabled": true
}
],
"body": {
"mode": "raw",
"raw": "{\n \"customerId\":2,\n \"itemId\":\"A152\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:8001/customer-service/order",
"protocol": "http",
"host": [
"localhost"
],
"port": "8001",
"path": [
"customer-service",
"order"
]
}
},
"response": []
},
{
"name": "Send Order for payment",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n\t\n\"firstName\":\"John\",\n\"lastName\":\"Smith\",\n\"cardNumber\":\"4260-6720-3283-7081\",\n\"amount\":150.0,\n\"currency\":\"USD\"\n\t\n\t\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "localhost:8002/order-service/pay/A152",
"host": [
"localhost"
],
"port": "8002",
"path": [
"order-service",
"pay",
"A152"
]
}
},
"response": []
}
],
"protocolProfileBehavior": {}
}

View File

@ -0,0 +1,23 @@
package com.baeldung;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
/**
* Customer Order Spring Boot Main Application
*
* */
@SpringBootApplication
@ComponentScan(basePackages = "com.baeldung.*")
public class CustomerOrderApp
{
public static void main( String[] args )
{
SpringApplication.run(CustomerOrderApp.class,args);
}
}