Save the order to database - Backend

This commit is contained in:
Nezumi
2023-01-25 13:37:15 +07:00
parent 5ff0df39b2
commit 30d8f0b7b1
10 changed files with 331 additions and 0 deletions
@@ -0,0 +1,25 @@
package com.luv2code.ecommerce.controller;
import com.luv2code.ecommerce.dto.Purchase;
import com.luv2code.ecommerce.dto.PurchaseResponse;
import com.luv2code.ecommerce.service.CheckoutService;
import org.springframework.web.bind.annotation.*;
@CrossOrigin("http://localhost:4200")
@RestController
@RequestMapping("/api/checkout")
public class CheckoutController {
private CheckoutService checkoutService;
public CheckoutController(CheckoutService checkoutService){
this.checkoutService = checkoutService;
}
@PostMapping("/purchase")
public PurchaseResponse placeOrder(@RequestBody Purchase purchase) {
PurchaseResponse purchaseResponse = checkoutService.placeOrder(purchase);
return purchaseResponse;
}
}
@@ -0,0 +1,7 @@
package com.luv2code.ecommerce.dao;
import com.luv2code.ecommerce.entity.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CustomerRepository extends JpaRepository<Customer, Long> {
}
@@ -0,0 +1,19 @@
package com.luv2code.ecommerce.dto;
import com.luv2code.ecommerce.entity.Address;
import com.luv2code.ecommerce.entity.Customer;
import com.luv2code.ecommerce.entity.Order;
import com.luv2code.ecommerce.entity.OrderItem;
import lombok.Data;
import java.util.Set;
@Data
public class Purchase {
private Customer customer;
private Address shippingAddress;
private Address billingAddress;
private Order order;
private Set<OrderItem> orderItems;
}
@@ -0,0 +1,9 @@
package com.luv2code.ecommerce.dto;
import lombok.Data;
@Data
public class PurchaseResponse {
private final String orderTrackingNumber;
}
@@ -0,0 +1,36 @@
package com.luv2code.ecommerce.entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "address")
@Getter
@Setter
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "street")
private String street;
@Column(name = "city")
private String city;
@Column(name = "state")
private String state;
@Column(name = "country")
private String country;
@Column(name = "zip_code")
private String zipCode;
@OneToOne
@PrimaryKeyJoinColumn
private Order order;
}
@@ -0,0 +1,44 @@
package com.luv2code.ecommerce.entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "customer")
@Getter
@Setter
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private Set<Order> orders = new HashSet<>();
public void add(Order order){
if(order != null) {
if(orders == null){
orders = new HashSet<>();
}
orders.add(order);
order.setCustomer(this);
}
}
}
@@ -0,0 +1,81 @@
package com.luv2code.ecommerce.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name="orders")
@Getter
@Setter
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;
@Column(name="order_tracking_number")
private String orderTrackingNumber;
@Column(name="total_quantity")
private int totalQuantity;
@Column(name="total_price")
private BigDecimal totalPrice;
@Column(name="status")
private String status;
@Column(name="date_created")
@CreationTimestamp
private Date dateCreated;
@Column(name="last_updated")
@UpdateTimestamp
private Date lastUpdated;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "order")
private Set<OrderItem> orderItems = new HashSet<>();
@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "shipping_address_id", referencedColumnName = "id")
private Address shippingAddress;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "billing_address_id", referencedColumnName = "id")
private Address billingAddress;
public void add(OrderItem item) {
if (item != null) {
if (orderItems == null) {
orderItems = new HashSet<>();
}
orderItems.add(item);
item.setOrder(this);
}
}
}
@@ -0,0 +1,43 @@
package com.luv2code.ecommerce.entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
@Entity
@Table(name="order_item")
@Getter
@Setter
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;
@Column(name="image_url")
private String imageUrl;
@Column(name="unit_price")
private BigDecimal unitPrice;
@Column(name="quantity")
private int quantity;
@Column(name="product_id")
private Long productId;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
}
@@ -0,0 +1,9 @@
package com.luv2code.ecommerce.service;
import com.luv2code.ecommerce.dto.Purchase;
import com.luv2code.ecommerce.dto.PurchaseResponse;
public interface CheckoutService {
PurchaseResponse placeOrder(Purchase purchase);
}
@@ -0,0 +1,58 @@
package com.luv2code.ecommerce.service;
import com.luv2code.ecommerce.dao.CustomerRepository;
import com.luv2code.ecommerce.dto.Purchase;
import com.luv2code.ecommerce.dto.PurchaseResponse;
import com.luv2code.ecommerce.entity.Customer;
import com.luv2code.ecommerce.entity.Order;
import com.luv2code.ecommerce.entity.OrderItem;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Service;
import java.util.Set;
import java.util.UUID;
@Service
public class CheckoutServiceImpl implements CheckoutService{
private CustomerRepository customerRepository;
public CheckoutServiceImpl(CustomerRepository customerRepository){
this.customerRepository = customerRepository;
}
@Override
@Transactional
public PurchaseResponse placeOrder(Purchase purchase) {
//Retrieve the order info from dto
Order order = purchase.getOrder();
//Generate tracking number
String orderTrackingNumber = generateOrderTrackingNumber();
order.setOrderTrackingNumber(orderTrackingNumber);
//Populate order with orderItems
Set<OrderItem> orderItems = purchase.getOrderItems();
orderItems.forEach(item -> order.add(item));
//Populate order with billingAddress and shippingAddress
order.setBillingAddress(purchase.getBillingAddress());
order.setShippingAddress(purchase.getShippingAddress());
//Populate customer with order
Customer customer = purchase.getCustomer();
customer.add(order);
//Save to the database
customerRepository.save(customer);
//return a response
return new PurchaseResponse(orderTrackingNumber);
}
private String generateOrderTrackingNumber() {
//Generate a random UUID number (UUID version - 4)
return UUID.randomUUID().toString();
}
}