Product.java

package com.newbit.product.command.domain.aggregate;

import java.math.BigDecimal;
import java.time.LocalDateTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "product")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Product {

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

    @Column(nullable = false, length = 100)
    private String name;

    @Column(nullable = false)
    private BigDecimal price;

    @Column(nullable = false)
    private Integer diamondAmount;

    @Column(length = 500)
    private String description;

    @Column(name = "is_active", nullable = false)
    private boolean isActive;

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    @PrePersist
    protected void onCreate() {
        this.createdAt = LocalDateTime.now();
        this.updatedAt = LocalDateTime.now();
    }

    @PreUpdate
    protected void onUpdate() {
        this.updatedAt = LocalDateTime.now();
    }

    @Builder
    private Product(String name, BigDecimal price, Integer diamondAmount, String description, boolean isActive) {
        this.name = name;
        this.price = price;
        this.diamondAmount = diamondAmount;
        this.description = description;
        this.isActive = isActive;
    }

    public static Product createDiamondProduct(String name, BigDecimal price, Integer diamondAmount, String description) {
        return Product.builder()
                .name(name)
                .price(price)
                .diamondAmount(diamondAmount)
                .description(description)
                .isActive(true)
                .build();
    }

    public void deactivate() {
        this.isActive = false;
    }

    public void activate() {
        this.isActive = true;
    }

    public void updateProduct(String name, BigDecimal price, Integer diamondAmount, String description) {
        this.name = name;
        this.price = price;
        this.diamondAmount = diamondAmount;
        this.description = description;
    }
}