diff --git a/openbas-api/src/main/java/io/openbas/rest/exercise/service/ExerciseService.java b/openbas-api/src/main/java/io/openbas/rest/exercise/service/ExerciseService.java index 1860558d0e..8423904b62 100644 --- a/openbas-api/src/main/java/io/openbas/rest/exercise/service/ExerciseService.java +++ b/openbas-api/src/main/java/io/openbas/rest/exercise/service/ExerciseService.java @@ -65,8 +65,9 @@ public class ExerciseService { private final ArticleRepository articleRepository; private final ExerciseRepository exerciseRepository; private final TeamRepository teamRepository; - private final ExerciseTeamUserRepository exerciseTeamUserRepository; - private final InjectRepository injectRepository; + private final ExerciseTeamUserRepository exerciseTeamUserRepository; + private final InjectRepository injectRepository; + private final LessonsCategoryRepository lessonsCategoryRepository; // region properties @Value("${openbas.mail.imap.enabled}") @@ -79,18 +80,19 @@ public class ExerciseService { private OpenBASConfig openBASConfig; // endregion - public List exercises(){ + public List exercises() { // We get the exercises depending on whether or not we are granted List exercises = currentUser().isAdmin() ? exerciseRepository.rawAll() : exerciseRepository.rawAllGranted(currentUser().getId()); - return exercises.stream().map(exercise->exerciseMapper.fromRawExerciseSimple(exercise)).collect(Collectors.toList()); + return exercises.stream().map(exercise -> exerciseMapper.fromRawExerciseSimple(exercise)) + .collect(Collectors.toList()); } public Page exercises( - Specification specification, - Specification specificationCount, - Pageable pageable) { + Specification specification, + Specification specificationCount, + Pageable pageable) { CriteriaBuilder cb = this.entityManager.getCriteriaBuilder(); CriteriaQuery cq = cb.createTupleQuery(); @@ -120,9 +122,11 @@ public Page exercises( List exercises = execution(query); for (ExerciseSimple exercise : exercises) { - if (exercise.getInjectIds() != null) { - exercise.setExpectationResultByTypes(resultUtils.getResultsByTypes(new HashSet<>(Arrays.asList(exercise.getInjectIds())))); - exercise.setTargets(resultUtils.getInjectTargetWithResults(new HashSet<>(Arrays.asList(exercise.getInjectIds())))); + if (exercise.getInjectIds() != null) { + exercise.setExpectationResultByTypes( + resultUtils.getResultsByTypes(new HashSet<>(Arrays.asList(exercise.getInjectIds())))); + exercise.setTargets( + resultUtils.getInjectTargetWithResults(new HashSet<>(Arrays.asList(exercise.getInjectIds())))); } } @@ -189,7 +193,7 @@ private List execution(TypedQuery query) { // -- CREATION -- - @Transactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) public Exercise createExercise(@NotNull final Exercise exercise) { if (imapEnabled) { exercise.setFrom(imapUsername); @@ -421,6 +425,8 @@ public Iterable removeTeams(@NotBlank final String exerciseId, @NotNull fi this.exerciseTeamUserRepository.deleteTeamsFromAllReferences(teamIds); // Remove all association between injects and teams this.injectRepository.removeTeamsForExercise(exerciseId, teamIds); + // Remove all association between lessons learned and teams + this.lessonsCategoryRepository.removeTeamsForExercise(exerciseId, teamIds); return teamRepository.findAllById(teamIds); } diff --git a/openbas-api/src/main/java/io/openbas/service/ScenarioService.java b/openbas-api/src/main/java/io/openbas/service/ScenarioService.java index 7cb823aed9..8e735582a9 100644 --- a/openbas-api/src/main/java/io/openbas/service/ScenarioService.java +++ b/openbas-api/src/main/java/io/openbas/service/ScenarioService.java @@ -104,7 +104,7 @@ public class ScenarioService { private final FileService fileService; private final InjectDuplicateService injectDuplicateService; private final InjectRepository injectRepository; - + private final LessonsCategoryRepository lessonsCategoryRepository; @Transactional public Scenario createScenario(@NotNull final Scenario scenario) { @@ -469,6 +469,8 @@ public Iterable removeTeams(@NotBlank final String scenarioId, @NotNull fi this.scenarioTeamUserRepository.deleteTeamFromAllReferences(teamIds); // Remove all association between injects and teams this.injectRepository.removeTeamsForScenario(scenarioId, teamIds); + // Remove all association between lessons learned and teams + this.lessonsCategoryRepository.removeTeamsForScenario(scenarioId, teamIds); return teamRepository.findAllById(teamIds); } diff --git a/openbas-model/src/main/java/io/openbas/database/repository/LessonsCategoryRepository.java b/openbas-model/src/main/java/io/openbas/database/repository/LessonsCategoryRepository.java index ede64bcfad..2e84329563 100644 --- a/openbas-model/src/main/java/io/openbas/database/repository/LessonsCategoryRepository.java +++ b/openbas-model/src/main/java/io/openbas/database/repository/LessonsCategoryRepository.java @@ -2,10 +2,16 @@ import io.openbas.database.model.LessonsCategory; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import jakarta.validation.constraints.NotNull; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; import java.util.Optional; @Repository @@ -13,4 +19,28 @@ public interface LessonsCategoryRepository extends CrudRepository findById(@NotNull String id); + + // -- TEAM - + + @Modifying + @Query( + value = "DELETE FROM lessons_categories_teams lct " + + "WHERE lct.team_id IN :teamIds " + + "AND EXISTS (SELECT 1 FROM lessons_categories lc WHERE lct.lessons_category_id = lc.lessons_category_id AND lc.lessons_category_exercise = :exerciseId)", + nativeQuery = true + ) + @Transactional + void removeTeamsForExercise(@Param("exerciseId") final String exerciseId, @Param("teamIds") final List teamIds); + + @Modifying + @Query( + value = "DELETE FROM lessons_categories_teams lct " + + "WHERE lct.team_id IN :teamIds " + + "AND EXISTS (SELECT 1 FROM lessons_categories lc WHERE lct.lessons_category_id = lc.lessons_category_id AND lc.lessons_category_scenario = :scenarioId)", + nativeQuery = true + ) + @Transactional + void removeTeamsForScenario(@Param("scenarioId") final String scenarioId, @Param("teamIds") final List teamIds); + + }