CustomerAddress.java

package com.rbctcsworld.ecommerce.address;

import com.rbctcsworld.ecommerce.order.ShippingAddress;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

import java.time.LocalDateTime;

/** One saved delivery address of one customer. */
@Entity
@Table(name = "customer_addresses")
public class CustomerAddress {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "user_id", nullable = false)
    private Long userId;

    @Column(length = 30)
    private String label;

    @Column(name = "full_name", nullable = false, length = 80) private String fullName;
    @Column(nullable = false, length = 100) private String line1;
    @Column(length = 100) private String line2;
    @Column(nullable = false, length = 60) private String city;
    @Column(nullable = false, length = 2) private String state;
    @Column(nullable = false, length = 10) private String zip;
    @Column(length = 20) private String phone;

    @Column(name = "is_default", nullable = false)
    private boolean isDefault;

    @Column(name = "created_at", nullable = false)
    private LocalDateTime createdAt = LocalDateTime.now();

    protected CustomerAddress() {
    }

    public CustomerAddress(Long userId) {
        this.userId = userId;
    }

    /** Copies a validated, normalised address (ShippingAddress.normalized()). */
    public void change(String label, ShippingAddress a) {
        this.label = label;
        this.fullName = a.fullName();
        this.line1 = a.line1();
        this.line2 = a.line2();
        this.city = a.city();
        this.state = a.state();
        this.zip = a.zip();
        this.phone = a.phone();
    }

    public ShippingAddress address() {
        return new ShippingAddress(fullName, line1, line2, city, state, zip, phone);
    }

    public Long getId() { return id; }
    public Long getUserId() { return userId; }
    public String getLabel() { return label; }
    public boolean isDefault() { return isDefault; }
    public LocalDateTime getCreatedAt() { return createdAt; }
    public void setDefault(boolean isDefault) { this.isDefault = isDefault; }
}