PointHistory.java

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

import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "point_history_id")
    private Long id;

    @Column(name = "service_id")
    private Long serviceId;

    @Column(name = "balance", nullable = false)
    private Integer balance;

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

    @Column(name = "updated_at", nullable = false)
    private LocalDateTime updatedAt = LocalDateTime.now();

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "point_type_id", nullable = false)
    private PointType pointType;

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

    @Builder
    private PointHistory(Long serviceId, Integer balance, PointType pointType, Long userId) {
        this.serviceId = serviceId;
        this.balance = balance;
        this.pointType = pointType;
        this.userId = userId;
    }

    /**
     * 멘토 권한 구매용 히스토리 생성
     * PointType은 서비스 계층에서 조회해서 넘겨줘야 함 (예: ID = 5)
     */
    public static PointHistory forMentorAuthority(Long userId, PointType pointType, Integer point, Integer price) {
        return PointHistory.builder()
                .userId(userId)
                .pointType(pointType)
                .balance(point)  // 차감 이후 잔여 포인트
                .serviceId(null)
                .build();
    }

}