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:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.vegamarket.orderservice.dtos;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public record NewOrderDTO(
|
||||||
|
Long customerId,
|
||||||
|
List<OrderItems> items
|
||||||
|
) {
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.vegamarket.orderservice.enums;
|
||||||
|
|
||||||
|
public enum OrdersStatus {
|
||||||
|
CREATED,
|
||||||
|
PAYMENT_PENDING,
|
||||||
|
PAID,
|
||||||
|
FAILED,
|
||||||
|
CANCELED,
|
||||||
|
}
|
||||||
46
src/main/java/com/vegamarket/orderservice/model/Orders.java
Normal file
46
src/main/java/com/vegamarket/orderservice/model/Orders.java
Normal 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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.vegamarket.orderservice.model;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
public interface OrdersRepository extends JpaRepository<Orders, Long> {
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/main/resources/db/migration/V1__CREATE-ORDERS-TABLE.sql
Normal file
10
src/main/resources/db/migration/V1__CREATE-ORDERS-TABLE.sql
Normal 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
|
||||||
|
);
|
||||||
Reference in New Issue
Block a user