From f29c695a2c84466198075c13a1e1aa07f499a676 Mon Sep 17 00:00:00 2001 From: arturgso Date: Thu, 26 Feb 2026 15:06:45 -0300 Subject: [PATCH] feat: Implement order creation functionality - Add OrdersController for handling order creation requests. - Create NewOrderDTO and OrderItems DTOs for order data. - Define Orders model with persistence capabilities. - Implement OrdersService for business logic of order creation. - Introduce OrdersStatus enum for order states. - Create OrdersRepository for data access. - Add Flyway migration script to create the orders table. --- .../controller/OrdersController.java | 24 ++++++++++ .../orderservice/dtos/NewOrderDTO.java | 9 ++++ .../orderservice/dtos/OrderItems.java | 16 +++++++ .../orderservice/enums/OrdersStatus.java | 9 ++++ .../vegamarket/orderservice/model/Orders.java | 46 +++++++++++++++++++ .../orderservice/model/OrdersRepository.java | 6 +++ .../orderservice/services/OrdersService.java | 42 +++++++++++++++++ .../db/migration/V1__CREATE-ORDERS-TABLE.sql | 10 ++++ 8 files changed, 162 insertions(+) create mode 100644 src/main/java/com/vegamarket/orderservice/controller/OrdersController.java create mode 100644 src/main/java/com/vegamarket/orderservice/dtos/NewOrderDTO.java create mode 100644 src/main/java/com/vegamarket/orderservice/dtos/OrderItems.java create mode 100644 src/main/java/com/vegamarket/orderservice/enums/OrdersStatus.java create mode 100644 src/main/java/com/vegamarket/orderservice/model/Orders.java create mode 100644 src/main/java/com/vegamarket/orderservice/model/OrdersRepository.java create mode 100644 src/main/java/com/vegamarket/orderservice/services/OrdersService.java create mode 100644 src/main/resources/db/migration/V1__CREATE-ORDERS-TABLE.sql diff --git a/src/main/java/com/vegamarket/orderservice/controller/OrdersController.java b/src/main/java/com/vegamarket/orderservice/controller/OrdersController.java new file mode 100644 index 0000000..1726443 --- /dev/null +++ b/src/main/java/com/vegamarket/orderservice/controller/OrdersController.java @@ -0,0 +1,24 @@ +package com.vegamarket.orderservice.controller; + +import com.vegamarket.orderservice.dtos.NewOrderDTO; +import com.vegamarket.orderservice.model.Orders; +import com.vegamarket.orderservice.services.OrdersService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/orders") +@RequiredArgsConstructor +public class OrdersController { + private final OrdersService ordersService; + + @PostMapping + public ResponseEntity create(@RequestBody NewOrderDTO createDTO) { + return new ResponseEntity<>(ordersService.createOrder(createDTO), HttpStatus.CREATED); + } +} diff --git a/src/main/java/com/vegamarket/orderservice/dtos/NewOrderDTO.java b/src/main/java/com/vegamarket/orderservice/dtos/NewOrderDTO.java new file mode 100644 index 0000000..c30fba7 --- /dev/null +++ b/src/main/java/com/vegamarket/orderservice/dtos/NewOrderDTO.java @@ -0,0 +1,9 @@ +package com.vegamarket.orderservice.dtos; + +import java.util.List; + +public record NewOrderDTO( + Long customerId, + List items +) { +} diff --git a/src/main/java/com/vegamarket/orderservice/dtos/OrderItems.java b/src/main/java/com/vegamarket/orderservice/dtos/OrderItems.java new file mode 100644 index 0000000..8db3b40 --- /dev/null +++ b/src/main/java/com/vegamarket/orderservice/dtos/OrderItems.java @@ -0,0 +1,16 @@ +package com.vegamarket.orderservice.dtos; + +import lombok.*; + +import java.math.BigDecimal; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class OrderItems { + + private String name; + private BigDecimal price; +} diff --git a/src/main/java/com/vegamarket/orderservice/enums/OrdersStatus.java b/src/main/java/com/vegamarket/orderservice/enums/OrdersStatus.java new file mode 100644 index 0000000..0c22b43 --- /dev/null +++ b/src/main/java/com/vegamarket/orderservice/enums/OrdersStatus.java @@ -0,0 +1,9 @@ +package com.vegamarket.orderservice.enums; + +public enum OrdersStatus { + CREATED, + PAYMENT_PENDING, + PAID, + FAILED, + CANCELED, +} diff --git a/src/main/java/com/vegamarket/orderservice/model/Orders.java b/src/main/java/com/vegamarket/orderservice/model/Orders.java new file mode 100644 index 0000000..414a55b --- /dev/null +++ b/src/main/java/com/vegamarket/orderservice/model/Orders.java @@ -0,0 +1,46 @@ +package com.vegamarket.orderservice.model; + +import com.vegamarket.orderservice.dtos.OrderItems; +import com.vegamarket.orderservice.enums.OrdersStatus; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.JdbcType; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.UpdateTimestamp; +import org.hibernate.type.SqlTypes; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.List; +import java.util.Map; + +@Entity +@Table(name = "orders") +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +@Builder +public class Orders { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long orderId; + private Long customerId; + + @Enumerated(EnumType.STRING) + private OrdersStatus status; + private BigDecimal totalAmount; + private String traceId; + + @Column(columnDefinition = "jsonb", nullable = false) + @JdbcTypeCode(SqlTypes.JSON) + private List items; + + @CreationTimestamp + private Timestamp createdAt; + + @UpdateTimestamp + private Timestamp updatedAt; +} diff --git a/src/main/java/com/vegamarket/orderservice/model/OrdersRepository.java b/src/main/java/com/vegamarket/orderservice/model/OrdersRepository.java new file mode 100644 index 0000000..21aa2a5 --- /dev/null +++ b/src/main/java/com/vegamarket/orderservice/model/OrdersRepository.java @@ -0,0 +1,6 @@ +package com.vegamarket.orderservice.model; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrdersRepository extends JpaRepository { +} diff --git a/src/main/java/com/vegamarket/orderservice/services/OrdersService.java b/src/main/java/com/vegamarket/orderservice/services/OrdersService.java new file mode 100644 index 0000000..2b30976 --- /dev/null +++ b/src/main/java/com/vegamarket/orderservice/services/OrdersService.java @@ -0,0 +1,42 @@ +package com.vegamarket.orderservice.services; + +import com.vegamarket.orderservice.dtos.NewOrderDTO; +import com.vegamarket.orderservice.dtos.OrderItems; +import com.vegamarket.orderservice.enums.OrdersStatus; +import com.vegamarket.orderservice.model.Orders; +import com.vegamarket.orderservice.model.OrdersRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class OrdersService { + + private final OrdersRepository ordersRepository; + + public Orders createOrder(NewOrderDTO createDTO) { + Orders order = Orders.builder() + .customerId(createDTO.customerId()) + .status(OrdersStatus.CREATED) + .totalAmount(getTotalAmount(createDTO.items())) + .traceId("request_" + new Timestamp(System.currentTimeMillis())) + .items(createDTO.items()) + .build(); + + order = ordersRepository.save(order); + return order; + } + + private BigDecimal getTotalAmount(List items) { + BigDecimal totalAmount = BigDecimal.ZERO; + for (OrderItems item : items) { + totalAmount = totalAmount.add(item.getPrice()); + } + + return totalAmount; + } +} diff --git a/src/main/resources/db/migration/V1__CREATE-ORDERS-TABLE.sql b/src/main/resources/db/migration/V1__CREATE-ORDERS-TABLE.sql new file mode 100644 index 0000000..9b87730 --- /dev/null +++ b/src/main/resources/db/migration/V1__CREATE-ORDERS-TABLE.sql @@ -0,0 +1,10 @@ +create table orders ( + order_id bigint generated always as identity primary key, + customer_id bigint not null, + status text not null, + total_amount numeric(19,2) not null, + trace_id varchar(31) not null, + items jsonb not null, + created_at timestamp not null, + updated_at timestamp not null +); \ No newline at end of file