TraceEntity.java

package fr.avenirsesr.portfolio.api.infrastructure.adapter.model;

import fr.avenirsesr.portfolio.api.domain.model.enums.ELanguage;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.Instant;
import java.util.List;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

@Entity
@Table(name = "trace")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class TraceEntity extends AvenirsBaseEntity {
  @ManyToOne(optional = false)
  private UserEntity user;

  @Column(nullable = false)
  private String title;

  @Column(nullable = false)
  private ELanguage language;

  @ManyToMany
  @OnDelete(action = OnDeleteAction.CASCADE)
  @JoinTable(
      name = "trace_skill_level",
      joinColumns = @JoinColumn(name = "trace_id"),
      inverseJoinColumns = @JoinColumn(name = "skill_level_id"))
  private List<SkillLevelEntity> skillLevels;

  @ManyToMany
  @OnDelete(action = OnDeleteAction.CASCADE)
  @JoinTable(
      name = "trace_ams",
      joinColumns = @JoinColumn(name = "trace_id"),
      inverseJoinColumns = @JoinColumn(name = "ams_id"))
  private List<AMSEntity> amses;

  @Column(nullable = false)
  private boolean isGroup;

  @Column private Instant deletedAt;

  public TraceEntity(
      UUID id,
      UserEntity user,
      String title,
      ELanguage language,
      List<SkillLevelEntity> skillLevels,
      List<AMSEntity> amses,
      boolean isGroup,
      Instant createdAt,
      Instant updatedAt,
      Instant deletedAt) {
    this.setId(id);
    this.user = user;
    this.title = title;
    this.language = language;
    this.skillLevels = skillLevels;
    this.amses = amses;
    this.isGroup = isGroup;
    this.setCreatedAt(createdAt);
    this.setUpdatedAt(updatedAt);
    this.setDeletedAt(deletedAt);
  }
}