diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index 47a5437..e9f863b 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -30,6 +30,10 @@ spring: uri: lb://CATALOG-SERVICE predicates: - Path=/catalog-service/** + - id: order-service + uri: lb://ORDER-SERVICE + predicates: + - Path=/order-service/** - id: test-server-1 uri: lb://TEST-SERVER-1 predicates: diff --git a/order-service/build.gradle b/order-service/build.gradle index 5f0bba5..ba804b8 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -3,6 +3,8 @@ ext { } dependencies { + implementation(project(":util")) + implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' diff --git a/order-service/src/main/java/com/roy/springcloud/orderservice/controller/OrderController.java b/order-service/src/main/java/com/roy/springcloud/orderservice/controller/OrderController.java new file mode 100644 index 0000000..2f51af0 --- /dev/null +++ b/order-service/src/main/java/com/roy/springcloud/orderservice/controller/OrderController.java @@ -0,0 +1,50 @@ +package com.roy.springcloud.orderservice.controller; + +import com.roy.springcloud.orderservice.dto.OrderDto; +import com.roy.springcloud.orderservice.service.OrderService; +import com.roy.springcloud.orderservice.vo.request.OrderSaveRequest; +import com.roy.springcloud.orderservice.vo.response.OrderResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +import static com.roy.springcloud.util.mapper.MapperUtil.toObject; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/order-service") +public class OrderController { + private final Environment environment; + private final OrderService orderService; + + @GetMapping("/health-check") + public String healthCheck() { + return String.format("It's working in order service on port: %s", + environment.getProperty("local.server.port")); + } + + @PostMapping("/{userId}/orders") + public ResponseEntity createOrder(@PathVariable("userId") String userId, + @RequestBody OrderSaveRequest request) { + OrderDto orderDto = toObject(request, OrderDto.class); + orderDto.setUserId(userId); + OrderDto savedOrder = orderService.createOrder(orderDto); + OrderResponse response = toObject(savedOrder, OrderResponse.class); + return ResponseEntity.status(HttpStatus.CREATED).body(response); + } + + @GetMapping("/{userId}/orders") + public ResponseEntity> getOrder(@PathVariable("userId") String userId) { + List savedOrders = orderService.getOrderByUserId(userId); + List response = savedOrders.stream() + .map(order -> toObject(order, OrderResponse.class)) + .collect(Collectors.toList()); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + +} diff --git a/order-service/src/main/java/com/roy/springcloud/orderservice/domain/Order.java b/order-service/src/main/java/com/roy/springcloud/orderservice/domain/Order.java new file mode 100644 index 0000000..183816f --- /dev/null +++ b/order-service/src/main/java/com/roy/springcloud/orderservice/domain/Order.java @@ -0,0 +1,35 @@ +package com.roy.springcloud.orderservice.domain; + +import lombok.Data; +import org.hibernate.annotations.ColumnDefault; + +import javax.persistence.*; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Entity +@Table(name = "orders") +public class Order implements Serializable { + @Id @GeneratedValue + private Long id; + + @Column(nullable = false, length = 125) + private String productId; + @Column(nullable = false) + private Integer quantity; + @Column(nullable = false) + private Integer unitPrice; + @Column(nullable = false) + private Integer totalPrice; + + @Column(nullable = false) + private String userId; + @Column(nullable = false, unique = true) + private String orderId; + + @Column(nullable = false, updatable = false, insertable = false) + @ColumnDefault(value = "CURRENT_TIMESTAMP") + private LocalDateTime createdAt; + +} diff --git a/order-service/src/main/java/com/roy/springcloud/orderservice/dto/OrderDto.java b/order-service/src/main/java/com/roy/springcloud/orderservice/dto/OrderDto.java new file mode 100644 index 0000000..117d3f8 --- /dev/null +++ b/order-service/src/main/java/com/roy/springcloud/orderservice/dto/OrderDto.java @@ -0,0 +1,16 @@ +package com.roy.springcloud.orderservice.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class OrderDto implements Serializable { + private String productId; + private Integer quantity; + private Integer unitPrice; + private Integer totalPrice; + + private String orderId; + private String userId; +} diff --git a/order-service/src/main/java/com/roy/springcloud/orderservice/repository/OrderRepository.java b/order-service/src/main/java/com/roy/springcloud/orderservice/repository/OrderRepository.java new file mode 100644 index 0000000..2f13a24 --- /dev/null +++ b/order-service/src/main/java/com/roy/springcloud/orderservice/repository/OrderRepository.java @@ -0,0 +1,11 @@ +package com.roy.springcloud.orderservice.repository; + +import com.roy.springcloud.orderservice.domain.Order; +import org.springframework.data.repository.CrudRepository; + +import java.util.Optional; + +public interface OrderRepository extends CrudRepository { + Optional findByOrderId(String orderId); + Iterable findAllByUserId(String userId); +} diff --git a/order-service/src/main/java/com/roy/springcloud/orderservice/service/OrderService.java b/order-service/src/main/java/com/roy/springcloud/orderservice/service/OrderService.java new file mode 100644 index 0000000..3bba8c1 --- /dev/null +++ b/order-service/src/main/java/com/roy/springcloud/orderservice/service/OrderService.java @@ -0,0 +1,11 @@ +package com.roy.springcloud.orderservice.service; + +import com.roy.springcloud.orderservice.dto.OrderDto; + +import java.util.List; + +public interface OrderService { + OrderDto createOrder(OrderDto orderDto); + OrderDto getOrderByOrderId(String orderId); + List getOrderByUserId(String userId); +} diff --git a/order-service/src/main/java/com/roy/springcloud/orderservice/service/impl/OrderServiceImpl.java b/order-service/src/main/java/com/roy/springcloud/orderservice/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..f724885 --- /dev/null +++ b/order-service/src/main/java/com/roy/springcloud/orderservice/service/impl/OrderServiceImpl.java @@ -0,0 +1,47 @@ +package com.roy.springcloud.orderservice.service.impl; + +import com.roy.springcloud.orderservice.domain.Order; +import com.roy.springcloud.orderservice.dto.OrderDto; +import com.roy.springcloud.orderservice.repository.OrderRepository; +import com.roy.springcloud.orderservice.service.OrderService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static com.roy.springcloud.util.mapper.MapperUtil.toObject; + +@Service +@RequiredArgsConstructor +public class OrderServiceImpl implements OrderService { + private final OrderRepository orderRepository; + + @Override + public OrderDto createOrder(OrderDto orderDto) { + orderDto.setOrderId(UUID.randomUUID().toString()); + orderDto.setTotalPrice(orderDto.getQuantity() * orderDto.getUnitPrice()); + Order newOrder = toObject(orderDto, Order.class); + orderRepository.save(newOrder); + return toObject(newOrder, OrderDto.class); + } + + @Override + public OrderDto getOrderByOrderId(String orderId) { + Order savedOrder = orderRepository.findByOrderId(orderId) + .orElseThrow(() -> new IllegalArgumentException("Cannot found order")); + return toObject(savedOrder, OrderDto.class); + } + + @Override + public List getOrderByUserId(String userId) { + Iterable savedOrders = orderRepository.findAllByUserId(userId); + List response = new ArrayList<>(); + savedOrders.forEach(order -> { + response.add(toObject(order, OrderDto.class)); + }); + return response; + } + +} diff --git a/order-service/src/main/java/com/roy/springcloud/orderservice/vo/request/OrderSaveRequest.java b/order-service/src/main/java/com/roy/springcloud/orderservice/vo/request/OrderSaveRequest.java new file mode 100644 index 0000000..44f7c4d --- /dev/null +++ b/order-service/src/main/java/com/roy/springcloud/orderservice/vo/request/OrderSaveRequest.java @@ -0,0 +1,10 @@ +package com.roy.springcloud.orderservice.vo.request; + +import lombok.Data; + +@Data +public class OrderSaveRequest { + private String productId; + private Integer quantity; + private Integer unitPrice; +} diff --git a/order-service/src/main/java/com/roy/springcloud/orderservice/vo/response/OrderResponse.java b/order-service/src/main/java/com/roy/springcloud/orderservice/vo/response/OrderResponse.java new file mode 100644 index 0000000..4c79749 --- /dev/null +++ b/order-service/src/main/java/com/roy/springcloud/orderservice/vo/response/OrderResponse.java @@ -0,0 +1,18 @@ +package com.roy.springcloud.orderservice.vo.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class OrderResponse { + private String productId; + private Integer quantity; + private Integer unitPrice; + private Integer totalPrice; + private LocalDateTime createdAt; + + private String orderId; +} diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index 4a9139c..23efa58 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -10,6 +10,9 @@ spring: settings: web-allow-others: true path: /h2-console + jpa: + hibernate: + ddl-auto: update datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb @@ -24,4 +27,8 @@ eureka: defaultZone: http://localhost:8761/eureka greeting: - message: Welcome to the Simple E-Commerce(Order Service). \ No newline at end of file + message: Welcome to the Simple E-Commerce(Order Service). + +logging: + level: + com.roy.springcloud.orderservice: DEBUG \ No newline at end of file