package com.paymentlink.model.entity; import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "payment_links") @Data @NoArgsConstructor @AllArgsConstructor @Builder public class PaymentLink { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "link_id", unique = true, nullable = false) private String linkId; // Hex format @OneToMany(mappedBy = "paymentLink", cascade = CascadeType.ALL, orphanRemoval = true) @Builder.Default @JsonManagedReference private List items = new ArrayList<>(); @Column(nullable = false) private Long amount; // Total amount in cents @Column(nullable = false) private Long subtotal; // Subtotal in cents @Column(name = "shipping_cost") private Long shippingCost; // In cents @Column(name = "tax_amount") private Long taxAmount; // In cents @Column(nullable = false, length = 3) private String currency; @Column(nullable = false) private String status; // pending, paid, expired, failed @Column(name = "order_id") private String orderId; @Column(name = "stripe_payment_intent_id") private String stripePaymentIntentId; @Column(name = "customer_email") private String customerEmail; @Column(name = "customer_name") private String customerName; @Column(name = "customer_phone") private String customerPhone; @Column(name = "shipping_address") private String shippingAddress; @Column(name = "shipping_city") private String shippingCity; @Column(name = "shipping_state") private String shippingState; @Column(name = "shipping_zip") private String shippingZip; @Column(name = "shipping_country") private String shippingCountry; @Column(name = "shipping_method") private String shippingMethod; @Column(name = "node_id") private String nodeId; @CreationTimestamp @Column(name = "created_at", updatable = false) private LocalDateTime createdAt; @UpdateTimestamp @Column(name = "updated_at") private LocalDateTime updatedAt; // Helper method to add item public void addItem(PaymentLinkItem item) { items.add(item); item.setPaymentLink(this); } }