StudentDatabaseRepository.java

package fr.avenirsesr.portfolio.user.infrastructure.adapter.repository;

import fr.avenirsesr.portfolio.common.data.infrastructure.adapter.repository.GenericJpaRepositoryAdapter;
import fr.avenirsesr.portfolio.common.error.domain.exception.UserNotFoundException;
import fr.avenirsesr.portfolio.selfknowledge.domain.exception.SelfKnowledgeCategoryNotLinkedToStudentException;
import fr.avenirsesr.portfolio.selfknowledge.domain.model.SelfKnowledgeCategory;
import fr.avenirsesr.portfolio.selfknowledge.infrastructure.adapter.mapper.SelfKnowledgeCategoryMapper;
import fr.avenirsesr.portfolio.user.domain.model.Student;
import fr.avenirsesr.portfolio.user.domain.port.output.repository.StudentRepository;
import fr.avenirsesr.portfolio.user.infrastructure.adapter.mapper.StudentMapper;
import fr.avenirsesr.portfolio.user.infrastructure.adapter.model.StudentEntity;
import java.util.List;
import org.springframework.stereotype.Repository;

@Repository
public class StudentDatabaseRepository extends GenericJpaRepositoryAdapter<Student, StudentEntity>
    implements StudentRepository {
  private final StudentJpaRepository jpaRepository;

  public StudentDatabaseRepository(StudentJpaRepository repository) {
    super(repository, repository, StudentEntity.class, StudentMapper.INSTANCE);
    this.jpaRepository = repository;
  }

  @Override
  public void addSelfKnowledgeCategories(Student student, List<SelfKnowledgeCategory> categories) {
    StudentEntity studentEntity =
        jpaRepository.findById(student.getId()).orElseThrow(UserNotFoundException::new);
    studentEntity
        .getSelfKnowledgeCategories()
        .addAll(categories.stream().map(SelfKnowledgeCategoryMapper.INSTANCE::fromDomain).toList());
    jpaRepository.save(studentEntity);
  }

  @Override
  public void removeSelfKnowledgeCategory(
      Student student, SelfKnowledgeCategory selfKnowledgeCategory) {
    StudentEntity studentEntity =
        jpaRepository.findById(student.getId()).orElseThrow(UserNotFoundException::new);
    boolean removed =
        studentEntity
            .getSelfKnowledgeCategories()
            .removeIf(category -> category.getId().equals(selfKnowledgeCategory.getId()));
    if (!removed) {
      throw new SelfKnowledgeCategoryNotLinkedToStudentException();
    }
    jpaRepository.save(studentEntity);
  }
}