Discussion.java

package qwerty.chaekit.domain.group.activity.discussion;


import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.BatchSize;
import qwerty.chaekit.domain.BaseEntity;
import qwerty.chaekit.domain.group.activity.discussion.highlight.DiscussionHighlight;
import qwerty.chaekit.domain.group.activity.Activity;
import qwerty.chaekit.domain.group.activity.discussion.comment.DiscussionComment;
import qwerty.chaekit.domain.highlight.Highlight;
import qwerty.chaekit.domain.member.user.UserProfile;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Table(name = "discussion")
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
@BatchSize(size = 20)
public class Discussion extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "activity_id")
    private Activity activity;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false, length = 5000)
    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "author_id")
    private UserProfile author;

    @Column(nullable = false)
    private boolean isDebate = false;

    @OneToMany(mappedBy = "discussion", cascade = CascadeType.ALL, orphanRemoval = true)
    @BatchSize(size = 20)
    private final List<DiscussionComment> comments = new ArrayList<>();

    @OneToMany(mappedBy = "discussion", cascade = CascadeType.ALL, orphanRemoval = true)
    @BatchSize(size = 20)
    private final List<DiscussionHighlight> highlights = new ArrayList<>();

    @Builder
    public Discussion(Long id, Activity activity, String title, String content, UserProfile author, boolean isDebate) {
        this.id = id;
        this.activity = activity;
        this.title = title;
        this.content = content;
        this.author = author;
        this.isDebate = isDebate;
    }

    public void update(String title, String content) {
        if(title != null) {
            this.title = title;
        }
        if(content != null) {
            this.content = content;
        }
    }
    
    public boolean isAuthor(UserProfile user) {
        return author.getId().equals(user.getId());
    }
    
    public void addComment(DiscussionComment comment) {
        comments.add(comment);
    }

    public void resetHighlights() {
        this.highlights.clear();
    }

    public void addHighlight(Highlight highlight) {
        DiscussionHighlight link = new DiscussionHighlight(this, highlight);
        this.highlights.add(link);
    }
}