Highlight.java

package qwerty.chaekit.domain.highlight;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.BatchSize;
import qwerty.chaekit.domain.BaseEntity;
import qwerty.chaekit.domain.group.activity.discussion.highlight.DiscussionHighlight;
import qwerty.chaekit.domain.ebook.Ebook;
import qwerty.chaekit.domain.group.activity.Activity;
import qwerty.chaekit.domain.highlight.comment.HighlightComment;
import qwerty.chaekit.domain.highlight.reaction.HighlightReaction;
import qwerty.chaekit.domain.member.user.UserProfile;

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

@Entity
@Getter
@Table(name = "highlight")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Highlight extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "book_id")
    private Ebook book;

    @Column(nullable = false)
    private String cfi;

    @Column(nullable = false)
    private String spine;

    @Column(nullable = false, length = 1000)
    private String highlightcontent;
  
    @Column(length = 2000)
    private String memo;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="activity_id")
    private Activity activity;

    @Column(nullable = false)
    private boolean isPublic;
    
    @OneToMany(mappedBy = "highlight", cascade = CascadeType.ALL, orphanRemoval = true)
    @BatchSize(size = 20)
    private final List<HighlightComment> comments = new ArrayList<>();

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

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

    @Builder
    public Highlight(Long id, UserProfile author, Ebook book, String cfi, String spine, String highlightcontent, String memo, Activity activity, boolean isPublic) {
        this.id = id;
        this.author = author;
        this.book = book;
        this.cfi = cfi;
        this.spine = spine;
        this.highlightcontent=highlightcontent;
        this.memo = memo;
        this.activity = activity;
        this.isPublic = isPublic;
    }

    public void updateMemo(String memo) {
        this.memo = memo;
    }

    public void setAsPublicActivity(Activity activity) {
        this.activity = activity;
        this.isPublic = true;
    }

    public boolean isPublic() {
        return isPublic;
    }
    
    public boolean isAuthor(UserProfile user) {
        return author.getId().equals(user.getId());
    }

    public void detachActivity() {
        this.isPublic = false;
        this.activity = null;
    }
}