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