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.
This commit is contained in:
2026-02-26 15:06:45 -03:00
parent 8e5516735c
commit f29c695a2c
8 changed files with 162 additions and 0 deletions

View File

@@ -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<Orders> create(@RequestBody NewOrderDTO createDTO) {
return new ResponseEntity<>(ordersService.createOrder(createDTO), HttpStatus.CREATED);
}
}

View File

@@ -0,0 +1,9 @@
package com.vegamarket.orderservice.dtos;
import java.util.List;
public record NewOrderDTO(
Long customerId,
List<OrderItems> items
) {
}

View File

@@ -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;
}

View File

@@ -0,0 +1,9 @@
package com.vegamarket.orderservice.enums;
public enum OrdersStatus {
CREATED,
PAYMENT_PENDING,
PAID,
FAILED,
CANCELED,
}

View File

@@ -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<OrderItems> items;
@CreationTimestamp
private Timestamp createdAt;
@UpdateTimestamp
private Timestamp updatedAt;
}

View File

@@ -0,0 +1,6 @@
package com.vegamarket.orderservice.model;
import org.springframework.data.jpa.repository.JpaRepository;
public interface OrdersRepository extends JpaRepository<Orders, Long> {
}

View File

@@ -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<OrderItems> items) {
BigDecimal totalAmount = BigDecimal.ZERO;
for (OrderItems item : items) {
totalAmount = totalAmount.add(item.getPrice());
}
return totalAmount;
}
}

View File

@@ -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
);