From 30d8f0b7b1529582531d5f78f2f44b5d581a2feb Mon Sep 17 00:00:00 2001 From: Nezumi <123229563+Nez27@users.noreply.github.com> Date: Wed, 25 Jan 2023 13:37:15 +0700 Subject: [PATCH] Save the order to database - Backend --- .../controller/CheckoutController.java | 25 ++++++ .../ecommerce/dao/CustomerRepository.java | 7 ++ .../com/luv2code/ecommerce/dto/Purchase.java | 19 +++++ .../ecommerce/dto/PurchaseResponse.java | 9 +++ .../luv2code/ecommerce/entity/Address.java | 36 +++++++++ .../luv2code/ecommerce/entity/Customer.java | 44 ++++++++++ .../com/luv2code/ecommerce/entity/Order.java | 81 +++++++++++++++++++ .../luv2code/ecommerce/entity/OrderItem.java | 43 ++++++++++ .../ecommerce/service/CheckoutService.java | 9 +++ .../service/CheckoutServiceImpl.java | 58 +++++++++++++ 10 files changed, 331 insertions(+) create mode 100644 src/main/java/com/luv2code/ecommerce/controller/CheckoutController.java create mode 100644 src/main/java/com/luv2code/ecommerce/dao/CustomerRepository.java create mode 100644 src/main/java/com/luv2code/ecommerce/dto/Purchase.java create mode 100644 src/main/java/com/luv2code/ecommerce/dto/PurchaseResponse.java create mode 100644 src/main/java/com/luv2code/ecommerce/entity/Address.java create mode 100644 src/main/java/com/luv2code/ecommerce/entity/Customer.java create mode 100644 src/main/java/com/luv2code/ecommerce/entity/Order.java create mode 100644 src/main/java/com/luv2code/ecommerce/entity/OrderItem.java create mode 100644 src/main/java/com/luv2code/ecommerce/service/CheckoutService.java create mode 100644 src/main/java/com/luv2code/ecommerce/service/CheckoutServiceImpl.java diff --git a/src/main/java/com/luv2code/ecommerce/controller/CheckoutController.java b/src/main/java/com/luv2code/ecommerce/controller/CheckoutController.java new file mode 100644 index 0000000..c607bbf --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/controller/CheckoutController.java @@ -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; + } +} diff --git a/src/main/java/com/luv2code/ecommerce/dao/CustomerRepository.java b/src/main/java/com/luv2code/ecommerce/dao/CustomerRepository.java new file mode 100644 index 0000000..ec34193 --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/dao/CustomerRepository.java @@ -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 { +} diff --git a/src/main/java/com/luv2code/ecommerce/dto/Purchase.java b/src/main/java/com/luv2code/ecommerce/dto/Purchase.java new file mode 100644 index 0000000..ec5299d --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/dto/Purchase.java @@ -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 orderItems; +} diff --git a/src/main/java/com/luv2code/ecommerce/dto/PurchaseResponse.java b/src/main/java/com/luv2code/ecommerce/dto/PurchaseResponse.java new file mode 100644 index 0000000..52b9fb1 --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/dto/PurchaseResponse.java @@ -0,0 +1,9 @@ +package com.luv2code.ecommerce.dto; + +import lombok.Data; + +@Data +public class PurchaseResponse { + + private final String orderTrackingNumber; +} diff --git a/src/main/java/com/luv2code/ecommerce/entity/Address.java b/src/main/java/com/luv2code/ecommerce/entity/Address.java new file mode 100644 index 0000000..d6faf42 --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/entity/Address.java @@ -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; +} diff --git a/src/main/java/com/luv2code/ecommerce/entity/Customer.java b/src/main/java/com/luv2code/ecommerce/entity/Customer.java new file mode 100644 index 0000000..5485d75 --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/entity/Customer.java @@ -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 orders = new HashSet<>(); + + public void add(Order order){ + if(order != null) { + if(orders == null){ + orders = new HashSet<>(); + } + + orders.add(order); + order.setCustomer(this); + } + } + +} diff --git a/src/main/java/com/luv2code/ecommerce/entity/Order.java b/src/main/java/com/luv2code/ecommerce/entity/Order.java new file mode 100644 index 0000000..e2d17bc --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/entity/Order.java @@ -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 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); + } + } +} + + + + + + + + diff --git a/src/main/java/com/luv2code/ecommerce/entity/OrderItem.java b/src/main/java/com/luv2code/ecommerce/entity/OrderItem.java new file mode 100644 index 0000000..d5e40a2 --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/entity/OrderItem.java @@ -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; + +} + + + + + + + diff --git a/src/main/java/com/luv2code/ecommerce/service/CheckoutService.java b/src/main/java/com/luv2code/ecommerce/service/CheckoutService.java new file mode 100644 index 0000000..8a95f9a --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/service/CheckoutService.java @@ -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); +} diff --git a/src/main/java/com/luv2code/ecommerce/service/CheckoutServiceImpl.java b/src/main/java/com/luv2code/ecommerce/service/CheckoutServiceImpl.java new file mode 100644 index 0000000..f2c87b2 --- /dev/null +++ b/src/main/java/com/luv2code/ecommerce/service/CheckoutServiceImpl.java @@ -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 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(); + } +}