diff --git a/src/main/java/de/tum/cit/aet/artemis/iris/domain/settings/IrisChatSubSettings.java b/src/main/java/de/tum/cit/aet/artemis/iris/domain/settings/IrisChatSubSettings.java index 295d6a0042d0..e8773c783914 100644 --- a/src/main/java/de/tum/cit/aet/artemis/iris/domain/settings/IrisChatSubSettings.java +++ b/src/main/java/de/tum/cit/aet/artemis/iris/domain/settings/IrisChatSubSettings.java @@ -28,7 +28,6 @@ public class IrisChatSubSettings extends IrisSubSettings { @Column(name = "rate_limit_timeframe_hours") private Integer rateLimitTimeframeHours; - @Nullable @Column(name = "enabled_for_categories") @Convert(converter = IrisListConverter.class) private SortedSet enabledForCategories = new TreeSet<>(); diff --git a/src/main/java/de/tum/cit/aet/artemis/iris/dto/IrisCombinedChatSubSettingsDTO.java b/src/main/java/de/tum/cit/aet/artemis/iris/dto/IrisCombinedChatSubSettingsDTO.java index 9ca2784daf5d..4f003471a4d7 100644 --- a/src/main/java/de/tum/cit/aet/artemis/iris/dto/IrisCombinedChatSubSettingsDTO.java +++ b/src/main/java/de/tum/cit/aet/artemis/iris/dto/IrisCombinedChatSubSettingsDTO.java @@ -1,13 +1,13 @@ package de.tum.cit.aet.artemis.iris.dto; -import java.util.Set; +import java.util.SortedSet; import jakarta.annotation.Nullable; import com.fasterxml.jackson.annotation.JsonInclude; @JsonInclude(JsonInclude.Include.NON_EMPTY) -public record IrisCombinedChatSubSettingsDTO(boolean enabled, Integer rateLimit, Integer rateLimitTimeframeHours, @Nullable Set allowedVariants, - @Nullable String selectedVariant, @Nullable Set enabledForCategories) { +public record IrisCombinedChatSubSettingsDTO(boolean enabled, Integer rateLimit, Integer rateLimitTimeframeHours, @Nullable SortedSet allowedVariants, + @Nullable String selectedVariant, @Nullable SortedSet enabledForCategories) { } diff --git a/src/main/java/de/tum/cit/aet/artemis/iris/dto/IrisCombinedTextExerciseChatSubSettingsDTO.java b/src/main/java/de/tum/cit/aet/artemis/iris/dto/IrisCombinedTextExerciseChatSubSettingsDTO.java index 2db220d79a44..f8a5ccb61748 100644 --- a/src/main/java/de/tum/cit/aet/artemis/iris/dto/IrisCombinedTextExerciseChatSubSettingsDTO.java +++ b/src/main/java/de/tum/cit/aet/artemis/iris/dto/IrisCombinedTextExerciseChatSubSettingsDTO.java @@ -1,13 +1,13 @@ package de.tum.cit.aet.artemis.iris.dto; -import java.util.Set; +import java.util.SortedSet; import jakarta.annotation.Nullable; import com.fasterxml.jackson.annotation.JsonInclude; @JsonInclude(JsonInclude.Include.NON_EMPTY) -public record IrisCombinedTextExerciseChatSubSettingsDTO(boolean enabled, Integer rateLimit, Integer rateLimitTimeframeHours, @Nullable Set allowedVariants, - @Nullable String selectedVariant, @Nullable Set enabledForCategories) { +public record IrisCombinedTextExerciseChatSubSettingsDTO(boolean enabled, Integer rateLimit, Integer rateLimitTimeframeHours, @Nullable SortedSet allowedVariants, + @Nullable String selectedVariant, @Nullable SortedSet enabledForCategories) { } diff --git a/src/main/java/de/tum/cit/aet/artemis/iris/service/settings/IrisSettingsService.java b/src/main/java/de/tum/cit/aet/artemis/iris/service/settings/IrisSettingsService.java index 03993567e3b8..6047631fb5bf 100644 --- a/src/main/java/de/tum/cit/aet/artemis/iris/service/settings/IrisSettingsService.java +++ b/src/main/java/de/tum/cit/aet/artemis/iris/service/settings/IrisSettingsService.java @@ -303,7 +303,7 @@ private IrisCourseSettings updateCourseSettings(IrisCourseSettings existingSetti // Automatically update the exercise settings when the enabledForCategories is changed var newEnabledForCategoriesExerciseChat = existingSettings.getIrisChatSettings() == null ? new TreeSet() : existingSettings.getIrisChatSettings().getEnabledForCategories(); - if (!Objects.equals(oldEnabledForCategoriesExerciseChat, newEnabledForCategoriesExerciseChat)) { + if (!oldEnabledForCategoriesExerciseChat.equals(newEnabledForCategoriesExerciseChat)) { programmingExerciseRepository.findAllWithCategoriesByCourseId(existingSettings.getCourse().getId()) .forEach(exercise -> setEnabledForExerciseByCategories(exercise, oldEnabledForCategoriesExerciseChat, newEnabledForCategoriesExerciseChat)); } @@ -329,29 +329,15 @@ private IrisCourseSettings updateCourseSettings(IrisCourseSettings existingSetti * @param newEnabledForCategories The new enabled categories */ public void setEnabledForExerciseByCategories(Exercise exercise, SortedSet oldEnabledForCategories, SortedSet newEnabledForCategories) { - var removedCategories = new TreeSet<>(oldEnabledForCategories == null ? Set.of() : oldEnabledForCategories); + var removedCategories = new TreeSet<>(oldEnabledForCategories); removedCategories.removeAll(newEnabledForCategories); var categories = getCategoryNames(exercise.getCategories()); - if (newEnabledForCategories != null && categories.stream().anyMatch(newEnabledForCategories::contains)) { - var exerciseSettings = getRawIrisSettingsFor(exercise); - if (exercise instanceof ProgrammingExercise) { - exerciseSettings.getIrisChatSettings().setEnabled(true); - } - else if (exercise instanceof TextExercise) { - exerciseSettings.getIrisTextExerciseChatSettings().setEnabled(true); - } - irisSettingsRepository.save(exerciseSettings); + if (categories.stream().anyMatch(newEnabledForCategories::contains)) { + setExerciseSettingsEnabled(exercise, true); } else if (categories.stream().anyMatch(removedCategories::contains)) { - var exerciseSettings = getRawIrisSettingsFor(exercise); - if (exercise instanceof ProgrammingExercise) { - exerciseSettings.getIrisChatSettings().setEnabled(false); - } - else if (exercise instanceof TextExercise) { - exerciseSettings.getIrisTextExerciseChatSettings().setEnabled(false); - } - irisSettingsRepository.save(exerciseSettings); + setExerciseSettingsEnabled(exercise, false); } } @@ -388,25 +374,29 @@ else if (exercise instanceof TextExercise) { } if (newCategories.stream().anyMatch(enabledForCategories::contains)) { - var exerciseSettings = getRawIrisSettingsFor(exercise); - if (exercise instanceof ProgrammingExercise) { - exerciseSettings.getIrisChatSettings().setEnabled(true); - } - else if (exercise instanceof TextExercise) { - exerciseSettings.getIrisTextExerciseChatSettings().setEnabled(true); - } - irisSettingsRepository.save(exerciseSettings); + setExerciseSettingsEnabled(exercise, true); } else if (oldCategories.stream().anyMatch(enabledForCategories::contains)) { - var exerciseSettings = getRawIrisSettingsFor(exercise); - if (exercise instanceof ProgrammingExercise) { - exerciseSettings.getIrisChatSettings().setEnabled(false); - } - else if (exercise instanceof TextExercise) { - exerciseSettings.getIrisTextExerciseChatSettings().setEnabled(false); - } - irisSettingsRepository.save(exerciseSettings); + setExerciseSettingsEnabled(exercise, false); + } + } + + /** + * Helper method to set the enabled status for an exercise's Iris settings. + * Currently able to handle {@link ProgrammingExercise} and {@link TextExercise} settings. + * + * @param exercise The exercise to update the enabled status for + * @param enabled Whether the Iris settings should be enabled + */ + private void setExerciseSettingsEnabled(Exercise exercise, boolean enabled) { + var exerciseSettings = getRawIrisSettingsFor(exercise); + if (exercise instanceof ProgrammingExercise) { + exerciseSettings.getIrisChatSettings().setEnabled(enabled); + } + else if (exercise instanceof TextExercise) { + exerciseSettings.getIrisTextExerciseChatSettings().setEnabled(enabled); } + irisSettingsRepository.save(exerciseSettings); } /** diff --git a/src/main/java/de/tum/cit/aet/artemis/iris/service/settings/IrisSubSettingsService.java b/src/main/java/de/tum/cit/aet/artemis/iris/service/settings/IrisSubSettingsService.java index 0cf5af873aad..2c284b6ea1f8 100644 --- a/src/main/java/de/tum/cit/aet/artemis/iris/service/settings/IrisSubSettingsService.java +++ b/src/main/java/de/tum/cit/aet/artemis/iris/service/settings/IrisSubSettingsService.java @@ -332,7 +332,7 @@ private Integer getCombinedRateLimit(List settingsList) { * @param subSettingsFunction Function to get the sub settings from an IrisSettings object. * @return Combined allowedVariants field. */ - private Set getCombinedAllowedVariants(List settingsList, Function subSettingsFunction) { + private SortedSet getCombinedAllowedVariants(List settingsList, Function subSettingsFunction) { return settingsList.stream().filter(Objects::nonNull).map(subSettingsFunction).filter(Objects::nonNull).map(IrisSubSettings::getAllowedVariants).filter(Objects::nonNull) .filter(models -> !models.isEmpty()).reduce((first, second) -> second).orElse(new TreeSet<>()); } @@ -350,7 +350,7 @@ private String getCombinedSelectedVariant(List settingsList, Funct .filter(model -> model != null && !model.isBlank()).reduce((first, second) -> second).orElse(null); } - private Set getCombinedEnabledForCategories(List settingsList, Function subSettingsFunction) { + private SortedSet getCombinedEnabledForCategories(List settingsList, Function subSettingsFunction) { return settingsList.stream().filter(Objects::nonNull).filter(settings -> settings instanceof IrisCourseSettings).map(subSettingsFunction).filter(Objects::nonNull) .map(IrisChatSubSettings::getEnabledForCategories).filter(Objects::nonNull).filter(models -> !models.isEmpty()).reduce((first, second) -> second) .orElse(new TreeSet<>()); diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/repository/ProgrammingExerciseRepository.java b/src/main/java/de/tum/cit/aet/artemis/programming/repository/ProgrammingExerciseRepository.java index d4cde4abb323..1185299bef6b 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/repository/ProgrammingExerciseRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/repository/ProgrammingExerciseRepository.java @@ -109,7 +109,7 @@ Optional findWithTemplateAndSolutionParticipationTeamAssign Optional findWithAuxiliaryRepositoriesById(long exerciseId); @EntityGraph(type = LOAD, attributePaths = { "auxiliaryRepositories", "competencies", "buildConfig", "categories" }) - Optional findWithAuxiliaryRepositoriesCompetenciesAndBuildConfigById(long exerciseId); + Optional findForUpdateById(long exerciseId); @EntityGraph(type = LOAD, attributePaths = "submissionPolicy") Optional findWithSubmissionPolicyById(long exerciseId); @@ -599,8 +599,8 @@ default ProgrammingExercise findByIdWithAuxiliaryRepositoriesElseThrow(long prog * @return The programming exercise related to the given id */ @NotNull - default ProgrammingExercise findByIdWithAuxiliaryRepositoriesCompetenciesAndBuildConfigElseThrow(long programmingExerciseId) throws EntityNotFoundException { - return getValueElseThrow(findWithAuxiliaryRepositoriesCompetenciesAndBuildConfigById(programmingExerciseId), programmingExerciseId); + default ProgrammingExercise findForUpdateByIdElseThrow(long programmingExerciseId) throws EntityNotFoundException { + return getValueElseThrow(findForUpdateById(programmingExerciseId), programmingExerciseId); } /** diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/web/ProgrammingExerciseResource.java b/src/main/java/de/tum/cit/aet/artemis/programming/web/ProgrammingExerciseResource.java index 2225baa81759..189165f07cac 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/web/ProgrammingExerciseResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/web/ProgrammingExerciseResource.java @@ -298,8 +298,7 @@ public ResponseEntity updateProgrammingExercise(@RequestBod checkProgrammingExerciseForError(updatedProgrammingExercise); - var programmingExerciseBeforeUpdate = programmingExerciseRepository - .findByIdWithAuxiliaryRepositoriesCompetenciesAndBuildConfigElseThrow(updatedProgrammingExercise.getId()); + var programmingExerciseBeforeUpdate = programmingExerciseRepository.findForUpdateByIdElseThrow(updatedProgrammingExercise.getId()); if (!Objects.equals(programmingExerciseBeforeUpdate.getShortName(), updatedProgrammingExercise.getShortName())) { throw new BadRequestAlertException("The programming exercise short name cannot be changed", ENTITY_NAME, "shortNameCannotChange"); }