Coffeechat.java
package com.newbit.coffeechat.command.domain.aggregate;
import com.newbit.coffeechat.query.dto.response.ProgressStatus;
import jakarta.persistence.*;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
@Entity
@Table(name = "coffeechat")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@EntityListeners(AuditingEntityListener.class)
public class Coffeechat {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "coffeechat_id")
private Long coffeechatId;
@Setter
@Enumerated(EnumType.STRING)
@Column(name = "progress_status", nullable = false)
private ProgressStatus progressStatus = ProgressStatus.IN_PROGRESS;
@Column(name = "request_message", nullable = false)
private String requestMessage;
@Column(name = "confirmed_schedule")
private LocalDateTime confirmedSchedule;
@Column(name = "ended_at")
private LocalDateTime endedAt;
@CreatedDate
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "updated_at", nullable = false)
private LocalDateTime updatedAt;
@Column(name = "purchase_confirmed_at")
private LocalDateTime purchaseConfirmedAt;
@Column(name = "sale_confirmed_at")
private LocalDateTime saleConfirmedAt;
@Column(name = "purchase_quantity", nullable = false)
private int purchaseQuantity;
@Column(name = "mentee_id")
private Long menteeId;
@Column(name = "mentor_id")
private Long mentorId;
@Column(name = "cancel_reason_id")
private Long cancelReasonId;
public static Coffeechat of(Long userId, @NotNull @Min(value = 1) Long mentorId, @NotNull @NotBlank String requestMessage, int purchaseQuantity) {
Coffeechat coffeechat = new Coffeechat();
coffeechat.menteeId = userId;
coffeechat.mentorId = mentorId;
coffeechat.requestMessage = requestMessage;
coffeechat.purchaseQuantity = purchaseQuantity;
return coffeechat;
}
public void markAsPurchased() {
this.progressStatus = ProgressStatus.COFFEECHAT_WAITING;
}
public void confirmSchedule(LocalDateTime confirmedSchedule) {
this.confirmedSchedule = confirmedSchedule;
this.endedAt = confirmedSchedule.plusMinutes(purchaseQuantity * 30L);
progressStatus = ProgressStatus.PAYMENT_WAITING;
}
public void rejectSchedule() {
progressStatus = ProgressStatus.CANCEL;
cancelReasonId = 3L;
}
public void closeSchedule() {
progressStatus = ProgressStatus.COMPLETE;
saleConfirmedAt = LocalDateTime.now();
}
public void confirmPurchaseSchedule() {
purchaseConfirmedAt = LocalDateTime.now();
}
public void cancelCoffeechat(Long cancelReasonId) {
progressStatus = ProgressStatus.CANCEL;
this.cancelReasonId = cancelReasonId;
}
}