From dfb6fa095101c0869f4cf7d08c101f31bb711eaa Mon Sep 17 00:00:00 2001 From: Gael Leblan Date: Wed, 22 May 2024 10:04:53 +0200 Subject: [PATCH] [backend] Avoid raising stack trace instead of returning a 404 (#867) --- .../config/GlobalExceptionHandler.java | 21 ++++++ .../io/openbas/helper/DatabaseHelper.java | 3 +- .../rest/atomic_testing/AtomicTestingApi.java | 6 +- .../rest/attack_pattern/AttackPatternApi.java | 9 +-- .../openbas/rest/challenge/ChallengeApi.java | 9 +-- .../io/openbas/rest/channel/ChannelApi.java | 33 ++++----- .../openbas/rest/collector/CollectorApi.java | 4 +- .../io/openbas/rest/comcheck/ComcheckApi.java | 11 +-- .../io/openbas/rest/document/DocumentApi.java | 25 +++---- .../exception/ElementNotFoundException.java | 12 ++++ .../io/openbas/rest/executor/ExecutorApi.java | 3 +- .../io/openbas/rest/exercise/ExerciseApi.java | 71 ++++++++++--------- .../rest/exercise/ExercisePlayerApi.java | 3 +- .../java/io/openbas/rest/group/GroupApi.java | 17 ++--- .../io/openbas/rest/inject/InjectApi.java | 47 ++++++------ .../io/openbas/rest/injector/InjectorApi.java | 7 +- .../InjectorContractApi.java | 7 +- .../kill_chain_phase/KillChainPhaseApi.java | 7 +- .../io/openbas/rest/lessons/LessonsApi.java | 21 +++--- .../lessons_template/LessonsTemplateApi.java | 11 +-- .../rest/mitigation/MitigationApi.java | 7 +- .../openbas/rest/objective/ObjectiveApi.java | 22 +++--- .../rest/organization/OrganizationApi.java | 5 +- .../io/openbas/rest/payload/PayloadApi.java | 5 +- .../io/openbas/rest/report/ReportApi.java | 14 ++-- .../io/openbas/rest/scenario/ScenarioApi.java | 5 +- .../main/java/io/openbas/rest/tag/TagApi.java | 4 +- .../java/io/openbas/rest/team/TeamApi.java | 13 ++-- .../main/java/io/openbas/rest/user/MeApi.java | 13 ++-- .../java/io/openbas/rest/user/PlayerApi.java | 9 +-- .../java/io/openbas/rest/user/UserApi.java | 7 +- .../io/openbas/rest/variable/VariableApi.java | 3 +- .../io/openbas/service/ScenarioService.java | 5 +- 33 files changed, 249 insertions(+), 190 deletions(-) create mode 100644 openbas-api/src/main/java/io/openbas/config/GlobalExceptionHandler.java create mode 100644 openbas-api/src/main/java/io/openbas/rest/exception/ElementNotFoundException.java diff --git a/openbas-api/src/main/java/io/openbas/config/GlobalExceptionHandler.java b/openbas-api/src/main/java/io/openbas/config/GlobalExceptionHandler.java new file mode 100644 index 0000000000..3750dffaac --- /dev/null +++ b/openbas-api/src/main/java/io/openbas/config/GlobalExceptionHandler.java @@ -0,0 +1,21 @@ +package io.openbas.config; + +import io.openbas.rest.exception.ElementNotFoundException; +import lombok.extern.java.Log; +import org.springdoc.api.ErrorMessage; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +@Log +public class GlobalExceptionHandler { + + @ExceptionHandler(ElementNotFoundException.class) + public ResponseEntity handleElementNotFoundException() { + ErrorMessage message = new ErrorMessage("Not found"); + return new ResponseEntity(message, HttpStatus.NOT_FOUND); + } + +} diff --git a/openbas-api/src/main/java/io/openbas/helper/DatabaseHelper.java b/openbas-api/src/main/java/io/openbas/helper/DatabaseHelper.java index 6ad8b64b91..503a45ab28 100644 --- a/openbas-api/src/main/java/io/openbas/helper/DatabaseHelper.java +++ b/openbas-api/src/main/java/io/openbas/helper/DatabaseHelper.java @@ -1,6 +1,7 @@ package io.openbas.helper; import io.openbas.database.model.Base; +import io.openbas.rest.exception.ElementNotFoundException; import org.springframework.data.repository.CrudRepository; import java.util.Optional; @@ -32,6 +33,6 @@ public static T resolveOptionalRelation(String inputRelationId, CrudReposito } public static T resolveRelation(String inputRelationId, CrudRepository repository) { - return repository.findById(inputRelationId).orElseThrow(); + return repository.findById(inputRelationId).orElseThrow(ElementNotFoundException::new); } } diff --git a/openbas-api/src/main/java/io/openbas/rest/atomic_testing/AtomicTestingApi.java b/openbas-api/src/main/java/io/openbas/rest/atomic_testing/AtomicTestingApi.java index 7bc14a6032..2cf49d12da 100644 --- a/openbas-api/src/main/java/io/openbas/rest/atomic_testing/AtomicTestingApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/atomic_testing/AtomicTestingApi.java @@ -2,11 +2,11 @@ import io.openbas.database.model.Inject; import io.openbas.database.model.InjectExpectation; -import io.openbas.database.model.InjectStatus; import io.openbas.inject_expectation.InjectExpectationService; import io.openbas.rest.atomic_testing.form.AtomicTestingInput; import io.openbas.rest.atomic_testing.form.AtomicTestingUpdateTagsInput; import io.openbas.rest.atomic_testing.form.InjectResultDTO; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.service.AtomicTestingService; import io.openbas.utils.AtomicTestingMapper; @@ -48,12 +48,12 @@ inject, getTargets( public InjectResultDTO findAtomicTesting(@PathVariable String injectId) { return atomicTestingService.findById(injectId) .map(AtomicTestingMapper::toDtoWithTargetResults) - .orElseThrow(); + .orElseThrow(ElementNotFoundException::new); } @GetMapping("/{injectId}/update") public Inject findAtomicTestingForUpdate(@PathVariable String injectId) { - return atomicTestingService.findById(injectId).orElseThrow(); + return atomicTestingService.findById(injectId).orElseThrow(ElementNotFoundException::new); } @PostMapping() diff --git a/openbas-api/src/main/java/io/openbas/rest/attack_pattern/AttackPatternApi.java b/openbas-api/src/main/java/io/openbas/rest/attack_pattern/AttackPatternApi.java index 43c72c7cbd..2d1015d857 100644 --- a/openbas-api/src/main/java/io/openbas/rest/attack_pattern/AttackPatternApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/attack_pattern/AttackPatternApi.java @@ -11,6 +11,7 @@ import io.openbas.rest.attack_pattern.form.AttackPatternCreateInput; import io.openbas.rest.attack_pattern.form.AttackPatternUpdateInput; import io.openbas.rest.attack_pattern.form.AttackPatternUpsertInput; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.utils.pagination.SearchPaginationInput; import jakarta.transaction.Transactional; @@ -75,7 +76,7 @@ public Page attackPatterns(@RequestBody @Valid final SearchPagina @GetMapping("/api/attack_patterns/{attackPatternId}") public AttackPattern attackPattern(@PathVariable String attackPatternId) { - return attackPatternRepository.findById(attackPatternId).orElseThrow(); + return attackPatternRepository.findById(attackPatternId).orElseThrow(ElementNotFoundException::new); } @Secured(ROLE_ADMIN) @@ -90,7 +91,7 @@ public AttackPattern createAttackPattern(@Valid @RequestBody AttackPatternCreate @GetMapping("/api/attack_patterns/{attackPatternId}/injector_contracts") public Iterable injectorContracts(@PathVariable String attackPatternId) { - attackPatternRepository.findById(attackPatternId).orElseThrow(); + attackPatternRepository.findById(attackPatternId).orElseThrow(ElementNotFoundException::new); return injectorContractRepository.findAll(InjectorContractSpecification.fromAttackPattern(attackPatternId)); } @@ -99,7 +100,7 @@ public Iterable injectorContracts(@PathVariable String attackP public AttackPattern updateAttackPattern( @NotBlank @PathVariable final String attackPatternId, @Valid @RequestBody AttackPatternUpdateInput input) { - AttackPattern attackPattern = this.attackPatternRepository.findById(attackPatternId).orElseThrow(); + AttackPattern attackPattern = this.attackPatternRepository.findById(attackPatternId).orElseThrow(ElementNotFoundException::new); attackPattern.setUpdateAttributes(input); attackPattern.setKillChainPhases(fromIterable(this.killChainPhaseRepository.findAllById(input.getKillChainPhasesIds()))); attackPattern.setUpdatedAt(Instant.now()); @@ -116,7 +117,7 @@ private List upsertAttackPatterns(List fromIterable(killChainPhaseRepository.findAllById(attackPatternInput.getKillChainPhasesIds())) : List.of(); AttackPattern attackPatternParent = attackPatternInput.getParentId() != null ? - attackPatternRepository.findByStixId(attackPatternInput.getParentId()).orElseThrow() : null; + attackPatternRepository.findByStixId(attackPatternInput.getParentId()).orElseThrow(ElementNotFoundException::new) : null; if (optionalAttackPattern.isEmpty()) { AttackPattern newAttackPattern = new AttackPattern(); newAttackPattern.setStixId(attackPatternInput.getStixId()); diff --git a/openbas-api/src/main/java/io/openbas/rest/challenge/ChallengeApi.java b/openbas-api/src/main/java/io/openbas/rest/challenge/ChallengeApi.java index 170e17fa4f..42a3b0d148 100644 --- a/openbas-api/src/main/java/io/openbas/rest/challenge/ChallengeApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/challenge/ChallengeApi.java @@ -9,6 +9,7 @@ import io.openbas.rest.challenge.response.ChallengeInformation; import io.openbas.rest.challenge.response.ChallengeResult; import io.openbas.rest.challenge.response.ChallengesReader; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.service.ChallengeService; import io.openbas.service.ScenarioService; @@ -101,7 +102,7 @@ public Iterable challenges() { public Challenge updateChallenge( @PathVariable String challengeId, @Valid @RequestBody ChallengeUpdateInput input) { - Challenge challenge = challengeRepository.findById(challengeId).orElseThrow(); + Challenge challenge = challengeRepository.findById(challengeId).orElseThrow(ElementNotFoundException::new); challenge.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); challenge.setDocuments(fromIterable(documentRepository.findAllById(input.getDocumentIds()))); challenge.setUpdateAttributes(input); @@ -149,7 +150,7 @@ public Iterable exerciseChallenges(@PathVariable String exerciseId) { @GetMapping("/api/player/challenges/{exerciseId}") public ChallengesReader playerChallenges(@PathVariable String exerciseId, @RequestParam Optional userId) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); final User user = impersonateUser(userRepository, userId); if (user.getId().equals(ANONYMOUS)) { throw new UnsupportedOperationException("User must be logged or dynamic player is required"); @@ -172,7 +173,7 @@ public ChallengesReader playerChallenges(@PathVariable String exerciseId, @Reque @GetMapping("/api/observer/challenges/{exerciseId}") public ChallengesReader observerChallenges(@PathVariable String exerciseId) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); ChallengesReader challengesReader = new ChallengesReader(exercise); Iterable challenges = exerciseChallenges(exerciseId); challengesReader.setExerciseChallenges(fromIterable(challenges).stream() @@ -205,7 +206,7 @@ private boolean checkFlag(ChallengeFlag flag, String value) { @PostMapping("/api/challenges/{challengeId}/try") public ChallengeResult tryChallenge(@PathVariable String challengeId, @Valid @RequestBody ChallengeTryInput input) { - Challenge challenge = challengeRepository.findById(challengeId).orElseThrow(); + Challenge challenge = challengeRepository.findById(challengeId).orElseThrow(ElementNotFoundException::new); for (ChallengeFlag flag : challenge.getFlags()) { if (checkFlag(flag, input.getValue())) { return new ChallengeResult(true); diff --git a/openbas-api/src/main/java/io/openbas/rest/channel/ChannelApi.java b/openbas-api/src/main/java/io/openbas/rest/channel/ChannelApi.java index c0b3efd996..931b09d03f 100644 --- a/openbas-api/src/main/java/io/openbas/rest/channel/ChannelApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/channel/ChannelApi.java @@ -7,6 +7,7 @@ import io.openbas.rest.channel.form.*; import io.openbas.rest.channel.model.VirtualArticle; import io.openbas.rest.channel.response.ChannelReader; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.service.ScenarioService; import jakarta.transaction.Transactional; @@ -86,13 +87,13 @@ public Iterable channels() { @GetMapping("/api/channels/{channelId}") public Channel channel(@PathVariable String channelId) { - return channelRepository.findById(channelId).orElseThrow(); + return channelRepository.findById(channelId).orElseThrow(ElementNotFoundException::new); } @Secured(ROLE_ADMIN) @PutMapping("/api/channels/{channelId}") public Channel updateChannel(@PathVariable String channelId, @Valid @RequestBody ChannelUpdateInput input) { - Channel channel = channelRepository.findById(channelId).orElseThrow(); + Channel channel = channelRepository.findById(channelId).orElseThrow(ElementNotFoundException::new); channel.setUpdateAttributes(input); channel.setUpdatedAt(Instant.now()); return channelRepository.save(channel); @@ -101,7 +102,7 @@ public Channel updateChannel(@PathVariable String channelId, @Valid @RequestBody @Secured(ROLE_ADMIN) @PutMapping("/api/channels/{channelId}/logos") public Channel updateChannelLogos(@PathVariable String channelId, @Valid @RequestBody ChannelUpdateLogoInput input) { - Channel channel = channelRepository.findById(channelId).orElseThrow(); + Channel channel = channelRepository.findById(channelId).orElseThrow(ElementNotFoundException::new); if (input.getLogoDark() != null) { channel.setLogoDark(documentRepository.findById(input.getLogoDark()).orElse(null)); } else { @@ -156,14 +157,14 @@ private List
enrichArticleWithVirtualPublication(List injects, } private Article enrichArticleWithVirtualPublication(List injects, Article article) { - return enrichArticleWithVirtualPublication(injects, List.of(article)).stream().findFirst().orElseThrow(); + return enrichArticleWithVirtualPublication(injects, List.of(article)).stream().findFirst().orElseThrow(ElementNotFoundException::new); } @GetMapping("/api/observer/channels/{exerciseId}/{channelId}") @PreAuthorize("isExerciseObserver(#exerciseId)") public ChannelReader observerArticles(@PathVariable String exerciseId, @PathVariable String channelId) { ChannelReader channelReader; - Channel channel = channelRepository.findById(channelId).orElseThrow(); + Channel channel = channelRepository.findById(channelId).orElseThrow(ElementNotFoundException::new); Optional exerciseOpt = this.exerciseRepository.findById(exerciseId); if (exerciseOpt.isPresent()) { @@ -188,7 +189,7 @@ public ChannelReader playerArticles( @PathVariable String channelId, @RequestParam Optional userId) { ChannelReader channelReader; - Channel channel = channelRepository.findById(channelId).orElseThrow(); + Channel channel = channelRepository.findById(channelId).orElseThrow(ElementNotFoundException::new); List injects; Optional exerciseOpt = exerciseRepository.findById(exerciseId); @@ -259,11 +260,11 @@ public ChannelReader playerArticles( public Article createArticleForExercise( @PathVariable String exerciseId, @Valid @RequestBody ArticleCreateInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); Article article = new Article(); article.setUpdateAttributes(input); - article.setChannel(channelRepository.findById(input.getChannelId()).orElseThrow()); - article.setExercise(exerciseRepository.findById(exerciseId).orElseThrow()); + article.setChannel(channelRepository.findById(input.getChannelId()).orElseThrow(ElementNotFoundException::new)); + article.setExercise(exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new)); Article savedArticle = articleRepository.save(article); List articleDocuments = input.getDocuments(); List finalArticleDocuments = new ArrayList<>(); @@ -286,7 +287,7 @@ public Article createArticleForExercise( @PreAuthorize("isExerciseObserver(#exerciseId)") @GetMapping("/api/exercises/{exerciseId}/articles") public Iterable
exerciseArticles(@PathVariable String exerciseId) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); return enrichArticleWithVirtualPublication(exercise.getInjects(), exercise.getArticles()); } @@ -296,11 +297,11 @@ public Article updateArticleForExercise( @PathVariable String exerciseId, @PathVariable String articleId, @Valid @RequestBody ArticleUpdateInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); - Article article = articleRepository.findById(articleId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); + Article article = articleRepository.findById(articleId).orElseThrow(ElementNotFoundException::new); List newDocumentsIds = input.getDocuments(); List currentDocumentIds = article.getDocuments().stream().map(Document::getId).toList(); - article.setChannel(channelRepository.findById(input.getChannelId()).orElseThrow()); + article.setChannel(channelRepository.findById(input.getChannelId()).orElseThrow(ElementNotFoundException::new)); article.setUpdateAttributes(input); // Original List List articleDocuments = new ArrayList<>(article.getDocuments()); @@ -344,7 +345,7 @@ public Article createArticleForScenario( Scenario scenario = this.scenarioService.scenario(scenarioId); Article article = new Article(); article.setUpdateAttributes(input); - article.setChannel(this.channelRepository.findById(input.getChannelId()).orElseThrow()); + article.setChannel(this.channelRepository.findById(input.getChannelId()).orElseThrow(ElementNotFoundException::new)); article.setScenario(scenario); Article savedArticle = this.articleRepository.save(article); List articleDocuments = input.getDocuments(); @@ -379,10 +380,10 @@ public Article updateArticleForScenario( @PathVariable @NotBlank final String articleId, @Valid @RequestBody ArticleUpdateInput input) { Scenario scenario = this.scenarioService.scenario(scenarioId); - Article article = articleRepository.findById(articleId).orElseThrow(); + Article article = articleRepository.findById(articleId).orElseThrow(ElementNotFoundException::new); List newDocumentsIds = input.getDocuments(); List currentDocumentIds = article.getDocuments().stream().map(Document::getId).toList(); - article.setChannel(channelRepository.findById(input.getChannelId()).orElseThrow()); + article.setChannel(channelRepository.findById(input.getChannelId()).orElseThrow(ElementNotFoundException::new)); article.setUpdateAttributes(input); // Original List List articleDocuments = new ArrayList<>(article.getDocuments()); diff --git a/openbas-api/src/main/java/io/openbas/rest/collector/CollectorApi.java b/openbas-api/src/main/java/io/openbas/rest/collector/CollectorApi.java index 0c25a90a41..cda82e5e22 100644 --- a/openbas-api/src/main/java/io/openbas/rest/collector/CollectorApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/collector/CollectorApi.java @@ -3,10 +3,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.openbas.config.OpenBASConfig; import io.openbas.database.model.Collector; -import io.openbas.database.model.Injector; import io.openbas.database.repository.CollectorRepository; import io.openbas.rest.collector.form.CollectorCreateInput; import io.openbas.rest.collector.form.CollectorUpdateInput; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.service.FileService; import jakarta.annotation.Resource; @@ -63,7 +63,7 @@ private Collector updateCollector(Collector collector, String type, String name, @Secured(ROLE_ADMIN) @PutMapping("/api/collectors/{collectorId}") public Collector updateCollector(@PathVariable String collectorId, @Valid @RequestBody CollectorUpdateInput input) { - Collector collector = collectorRepository.findById(collectorId).orElseThrow(); + Collector collector = collectorRepository.findById(collectorId).orElseThrow(ElementNotFoundException::new); return updateCollector(collector, collector.getType(), collector.getName(), collector.getPeriod(), input.getLastExecution()); } diff --git a/openbas-api/src/main/java/io/openbas/rest/comcheck/ComcheckApi.java b/openbas-api/src/main/java/io/openbas/rest/comcheck/ComcheckApi.java index 10c59570ce..4cb1a0db82 100644 --- a/openbas-api/src/main/java/io/openbas/rest/comcheck/ComcheckApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/comcheck/ComcheckApi.java @@ -1,18 +1,19 @@ package io.openbas.rest.comcheck; import io.openbas.database.model.*; -import io.openbas.database.repository.TeamRepository; import io.openbas.database.repository.ComcheckRepository; import io.openbas.database.repository.ComcheckStatusRepository; import io.openbas.database.repository.ExerciseRepository; +import io.openbas.database.repository.TeamRepository; import io.openbas.rest.comcheck.form.ComcheckInput; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; +import jakarta.transaction.Transactional; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import jakarta.transaction.Transactional; -import jakarta.validation.Valid; import java.util.List; import static io.openbas.helper.StreamHelper.fromIterable; @@ -49,7 +50,7 @@ public void setExerciseRepository(ExerciseRepository exerciseRepository) { @Transactional(rollbackOn = Exception.class) @GetMapping("/api/comcheck/{comcheckStatusId}") public ComcheckStatus checkValidation(@PathVariable String comcheckStatusId) { - ComcheckStatus comcheckStatus = comcheckStatusRepository.findById(comcheckStatusId).orElseThrow(); + ComcheckStatus comcheckStatus = comcheckStatusRepository.findById(comcheckStatusId).orElseThrow(ElementNotFoundException::new); Comcheck comcheck = comcheckStatus.getComcheck(); if (!comcheck.getState().equals(Comcheck.COMCHECK_STATUS.RUNNING)) { throw new UnsupportedOperationException("This comcheck is closed."); @@ -80,7 +81,7 @@ public Comcheck communicationCheck(@PathVariable String exerciseId, check.setUpdateAttributes(comCheck); check.setName(comCheck.getName()); check.setStart(now()); - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); check.setExercise(exercise); // 02. Get users List teamIds = comCheck.getTeamIds(); diff --git a/openbas-api/src/main/java/io/openbas/rest/document/DocumentApi.java b/openbas-api/src/main/java/io/openbas/rest/document/DocumentApi.java index b3b3b754bd..0ee0903f0c 100644 --- a/openbas-api/src/main/java/io/openbas/rest/document/DocumentApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/document/DocumentApi.java @@ -8,6 +8,7 @@ import io.openbas.rest.document.form.DocumentCreateInput; import io.openbas.rest.document.form.DocumentTagUpdateInput; import io.openbas.rest.document.form.DocumentUpdateInput; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.service.FileService; import io.openbas.service.InjectService; @@ -212,18 +213,18 @@ public Page searchDocuments(@RequestBody @Valid final SearchPagination @GetMapping("/api/documents/{documentId}") public Document document(@PathVariable String documentId) { - return resolveDocument(documentId).orElseThrow(); + return resolveDocument(documentId).orElseThrow(ElementNotFoundException::new); } @GetMapping("/api/documents/{documentId}/tags") public List documentTags(@PathVariable String documentId) { - Document document = resolveDocument(documentId).orElseThrow(); + Document document = resolveDocument(documentId).orElseThrow(ElementNotFoundException::new); return document.getTags(); } @PutMapping("/api/documents/{documentId}/tags") public Document documentTags(@PathVariable String documentId, @RequestBody DocumentTagUpdateInput input) { - Document document = resolveDocument(documentId).orElseThrow(); + Document document = resolveDocument(documentId).orElseThrow(ElementNotFoundException::new); document.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); return documentRepository.save(document); } @@ -232,14 +233,14 @@ public Document documentTags(@PathVariable String documentId, @RequestBody Docum @PutMapping("/api/documents/{documentId}") public Document updateDocumentInformation(@PathVariable String documentId, @Valid @RequestBody DocumentUpdateInput input) { - Document document = resolveDocument(documentId).orElseThrow(); + Document document = resolveDocument(documentId).orElseThrow(ElementNotFoundException::new); document.setUpdateAttributes(input); document.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); // Get removed exercises Stream askExerciseIdsStream = document.getExercises() .stream() - .filter(exercise -> !exercise.isUserHasAccess(userRepository.findById(currentUser().getId()).orElseThrow())) + .filter(exercise -> !exercise.isUserHasAccess(userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new))) .map(Exercise::getId); List askExerciseIds = Stream.concat(askExerciseIdsStream, input.getExerciseIds().stream()).distinct().toList(); List removedExercises = document.getExercises().stream() @@ -250,7 +251,7 @@ public Document updateDocumentInformation(@PathVariable String documentId, // Get removed scenarios Stream askScenarioIdsStream = document.getScenarios().stream() - .filter(scenario -> !scenario.isUserHasAccess(userRepository.findById(currentUser().getId()).orElseThrow())) + .filter(scenario -> !scenario.isUserHasAccess(userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new))) .map(Scenario::getId); List askScenarioIds = Stream.concat(askScenarioIdsStream, input.getScenarioIds().stream()).distinct().toList(); List removedScenarios = document.getScenarios().stream() @@ -265,11 +266,11 @@ public Document updateDocumentInformation(@PathVariable String documentId, @GetMapping("/api/documents/{documentId}/file") public void downloadDocument(@PathVariable String documentId, HttpServletResponse response) throws IOException { - Document document = resolveDocument(documentId).orElseThrow(); + Document document = resolveDocument(documentId).orElseThrow(ElementNotFoundException::new); response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + document.getName()); response.addHeader(HttpHeaders.CONTENT_TYPE, document.getType()); response.setStatus(HttpServletResponse.SC_OK); - InputStream fileStream = fileService.getFile(document).orElseThrow(); + InputStream fileStream = fileService.getFile(document).orElseThrow(ElementNotFoundException::new); fileStream.transferTo(response.getOutputStream()); } @@ -297,7 +298,7 @@ public void downloadDocument(@PathVariable String documentId, HttpServletRespons @GetMapping(value = "/api/images/collectors/id/{collectorId}", produces = MediaType.IMAGE_PNG_VALUE) public @ResponseBody ResponseEntity getCollectorImageFromId(@PathVariable String collectorId) throws IOException { - Collector collector = this.collectorRepository.findById(collectorId).orElseThrow(); + Collector collector = this.collectorRepository.findById(collectorId).orElseThrow(ElementNotFoundException::new); Optional fileStream = fileService.getCollectorImage(collector.getType()); if (fileStream.isPresent()) { return ResponseEntity.ok() @@ -417,7 +418,7 @@ public void downloadPlayerDocument( .stream() .filter(doc -> doc.getId().equals(documentId)) .findFirst() - .orElseThrow(); + .orElseThrow(ElementNotFoundException::new); } else if (scenarioOpt.isPresent()) { if (!scenarioOpt.get().isUserHasAccess(user) && !scenarioOpt.get().getUsers().contains(user)) { throw new UnsupportedOperationException("The given player is not in this exercise"); @@ -426,14 +427,14 @@ public void downloadPlayerDocument( .stream() .filter(doc -> doc.getId().equals(documentId)) .findFirst() - .orElseThrow(); + .orElseThrow(ElementNotFoundException::new); } if (document != null) { response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + document.getName()); response.addHeader(HttpHeaders.CONTENT_TYPE, document.getType()); response.setStatus(HttpServletResponse.SC_OK); - InputStream fileStream = fileService.getFile(document).orElseThrow(); + InputStream fileStream = fileService.getFile(document).orElseThrow(ElementNotFoundException::new); fileStream.transferTo(response.getOutputStream()); } } diff --git a/openbas-api/src/main/java/io/openbas/rest/exception/ElementNotFoundException.java b/openbas-api/src/main/java/io/openbas/rest/exception/ElementNotFoundException.java new file mode 100644 index 0000000000..c35b44e4ef --- /dev/null +++ b/openbas-api/src/main/java/io/openbas/rest/exception/ElementNotFoundException.java @@ -0,0 +1,12 @@ +package io.openbas.rest.exception; + +public class ElementNotFoundException extends RuntimeException{ + + public ElementNotFoundException() { + super(); + } + + public ElementNotFoundException(String errorMessage) { + super(errorMessage); + } +} diff --git a/openbas-api/src/main/java/io/openbas/rest/executor/ExecutorApi.java b/openbas-api/src/main/java/io/openbas/rest/executor/ExecutorApi.java index 155547b4b1..5471c4a14e 100644 --- a/openbas-api/src/main/java/io/openbas/rest/executor/ExecutorApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/executor/ExecutorApi.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.openbas.database.model.Executor; import io.openbas.database.repository.ExecutorRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.executor.form.ExecutorCreateInput; import io.openbas.rest.executor.form.ExecutorUpdateInput; import io.openbas.rest.helper.RestBehavior; @@ -56,7 +57,7 @@ private Executor updateExecutor(Executor executor, String type, String name, Str @Secured(ROLE_ADMIN) @PutMapping("/api/executors/{executorId}") public Executor updateExecutor(@PathVariable String executorId, @Valid @RequestBody ExecutorUpdateInput input) { - Executor executor = executorRepository.findById(executorId).orElseThrow(); + Executor executor = executorRepository.findById(executorId).orElseThrow(ElementNotFoundException::new); return updateExecutor(executor, executor.getType(), executor.getName(), executor.getPlatforms()); } diff --git a/openbas-api/src/main/java/io/openbas/rest/exercise/ExerciseApi.java b/openbas-api/src/main/java/io/openbas/rest/exercise/ExerciseApi.java index 70100fb754..bbee6798e1 100644 --- a/openbas-api/src/main/java/io/openbas/rest/exercise/ExerciseApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/exercise/ExerciseApi.java @@ -1,12 +1,12 @@ package io.openbas.rest.exercise; import com.fasterxml.jackson.databind.ObjectMapper; -import io.openbas.utils.AtomicTestingMapper.ExpectationResultsByType; import io.openbas.config.OpenBASConfig; import io.openbas.database.model.*; import io.openbas.database.model.Exercise.STATUS; import io.openbas.database.repository.*; import io.openbas.database.specification.*; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.exception.InputValidationException; import io.openbas.rest.exercise.exports.ExerciseExportMixins; import io.openbas.rest.exercise.exports.ExerciseFileExport; @@ -16,6 +16,7 @@ import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.inject.form.InjectExpectationResultsByAttackPattern; import io.openbas.service.*; +import io.openbas.utils.AtomicTestingMapper.ExpectationResultsByType; import io.openbas.utils.ResultUtils; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; @@ -229,12 +230,12 @@ public Iterable logs(@PathVariable String exercise) { @PostMapping("/api/exercises/{exerciseId}/logs") public Log createLog(@PathVariable String exerciseId, @Valid @RequestBody LogCreateInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); Log log = new Log(); log.setUpdateAttributes(input); log.setExercise(exercise); log.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); - log.setUser(userRepository.findById(currentUser().getId()).orElseThrow()); + log.setUser(userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new)); return exerciseLogRepository.save(log); } @@ -242,7 +243,7 @@ public Log createLog(@PathVariable String exerciseId, @Valid @RequestBody LogCre @PreAuthorize("isExercisePlanner(#exerciseId)") public Log updateLog(@PathVariable String exerciseId, @PathVariable String logId, @Valid @RequestBody LogCreateInput input) { - Log log = logRepository.findById(logId).orElseThrow(); + Log log = logRepository.findById(logId).orElseThrow(ElementNotFoundException::new); log.setUpdateAttributes(input); log.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); return logRepository.save(log); @@ -264,9 +265,9 @@ public Iterable dryruns(@PathVariable String exerciseId) { @PostMapping("/api/exercises/{exerciseId}/dryruns") @PreAuthorize("isExercisePlanner(#exerciseId)") public Dryrun createDryrun(@PathVariable String exerciseId, @Valid @RequestBody DryrunCreateInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); List userIds = input.getUserIds(); - List users = userIds.isEmpty() ? List.of(userRepository.findById(currentUser().getId()).orElseThrow()) + List users = userIds.isEmpty() ? List.of(userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new)) : fromIterable(userRepository.findAllById(userIds)); return dryrunService.provisionDryrun(exercise, users, input.getName()); } @@ -275,7 +276,7 @@ public Dryrun createDryrun(@PathVariable String exerciseId, @Valid @RequestBody @PreAuthorize("isExerciseObserver(#exerciseId)") public Dryrun dryrun(@PathVariable String exerciseId, @PathVariable String dryrunId) { Specification filters = DryRunSpecification.fromExercise(exerciseId).and(DryRunSpecification.id(dryrunId)); - return dryRunRepository.findOne(filters).orElseThrow(); + return dryRunRepository.findOne(filters).orElseThrow(ElementNotFoundException::new); } @DeleteMapping("/api/exercises/{exerciseId}/dryruns/{dryrunId}") @@ -301,7 +302,7 @@ public Iterable comchecks(@PathVariable String exercise) { public Comcheck comcheck(@PathVariable String exercise, @PathVariable String comcheck) { Specification filters = ComcheckSpecification.fromExercise(exercise) .and(ComcheckSpecification.id(comcheck)); - return comcheckRepository.findOne(filters).orElseThrow(); + return comcheckRepository.findOne(filters).orElseThrow(ElementNotFoundException::new); } @GetMapping("/api/exercises/{exercise}/comchecks/{comcheck}/statuses") @@ -314,7 +315,7 @@ public List comcheckStatuses(@PathVariable String exercise, @Pat @GetMapping("/api/exercises/{exerciseId}/teams") @PreAuthorize("isExerciseObserver(#exerciseId)") public Iterable getExerciseTeams(@PathVariable String exerciseId) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); return exercise.getTeams(); } @@ -324,7 +325,7 @@ public Iterable getExerciseTeams(@PathVariable String exerciseId) { public Iterable addExerciseTeams( @PathVariable String exerciseId, @Valid @RequestBody ExerciseUpdateTeamsInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); List teams = exercise.getTeams(); List teamsToAdd = fromIterable(teamRepository.findAllById(input.getTeamIds())); List existingTeamIds = teams.stream().map(Team::getId).toList(); @@ -339,7 +340,7 @@ public Iterable addExerciseTeams( @PreAuthorize("isExercisePlanner(#exerciseId)") public Iterable removeExerciseTeams(@PathVariable String exerciseId, @Valid @RequestBody ExerciseUpdateTeamsInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); // Remove teams from exercise List teams = exercise.getTeams().stream().filter(team -> !input.getTeamIds().contains(team.getId())).toList(); exercise.setTeams(fromIterable(teams)); @@ -356,16 +357,16 @@ public Iterable removeExerciseTeams(@PathVariable String exerciseId, @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise enableExerciseTeamPlayers(@PathVariable String exerciseId, @PathVariable String teamId, @Valid @RequestBody ExerciseTeamPlayersEnableInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); - Team team = teamRepository.findById(teamId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); + Team team = teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new); input.getPlayersIds().forEach(playerId -> { ExerciseTeamUser exerciseTeamUser = new ExerciseTeamUser(); exerciseTeamUser.setExercise(exercise); exerciseTeamUser.setTeam(team); - exerciseTeamUser.setUser(userRepository.findById(playerId).orElseThrow()); + exerciseTeamUser.setUser(userRepository.findById(playerId).orElseThrow(ElementNotFoundException::new)); exerciseTeamUserRepository.save(exerciseTeamUser); }); - return exerciseRepository.findById(exerciseId).orElseThrow(); + return exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); } @Transactional(rollbackOn = Exception.class) @@ -380,7 +381,7 @@ public Exercise disableExerciseTeamPlayers(@PathVariable String exerciseId, @Pat exerciseTeamUserId.setUserId(playerId); exerciseTeamUserRepository.deleteById(exerciseTeamUserId); }); - return exerciseRepository.findById(exerciseId).orElseThrow(); + return exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); } @Transactional(rollbackOn = Exception.class) @@ -388,8 +389,8 @@ public Exercise disableExerciseTeamPlayers(@PathVariable String exerciseId, @Pat @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise addExerciseTeamPlayers(@PathVariable String exerciseId, @PathVariable String teamId, @Valid @RequestBody ExerciseTeamPlayersEnableInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); - Team team = teamRepository.findById(teamId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); + Team team = teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new); Iterable teamUsers = userRepository.findAllById(input.getPlayersIds()); team.getUsers().addAll(fromIterable(teamUsers)); teamRepository.save(team); @@ -397,7 +398,7 @@ public Exercise addExerciseTeamPlayers(@PathVariable String exerciseId, @PathVar ExerciseTeamUser exerciseTeamUser = new ExerciseTeamUser(); exerciseTeamUser.setExercise(exercise); exerciseTeamUser.setTeam(team); - exerciseTeamUser.setUser(userRepository.findById(playerId).orElseThrow()); + exerciseTeamUser.setUser(userRepository.findById(playerId).orElseThrow(ElementNotFoundException::new)); exerciseTeamUserRepository.save(exerciseTeamUser); }); return exercise; @@ -408,7 +409,7 @@ public Exercise addExerciseTeamPlayers(@PathVariable String exerciseId, @PathVar @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise removeExerciseTeamPlayers(@PathVariable String exerciseId, @PathVariable String teamId, @Valid @RequestBody ExerciseTeamPlayersEnableInput input) { - Team team = teamRepository.findById(teamId).orElseThrow(); + Team team = teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new); Iterable teamUsers = userRepository.findAllById(input.getPlayersIds()); team.getUsers().removeAll(fromIterable(teamUsers)); teamRepository.save(team); @@ -419,7 +420,7 @@ public Exercise removeExerciseTeamPlayers(@PathVariable String exerciseId, @Path exerciseTeamUserId.setUserId(playerId); exerciseTeamUserRepository.deleteById(exerciseTeamUserId); }); - return exerciseRepository.findById(exerciseId).orElseThrow(); + return exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); } // endregion @@ -445,7 +446,7 @@ public Exercise createExercise(@Valid @RequestBody ExerciseCreateInput input) { @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise updateExerciseInformation(@PathVariable String exerciseId, @Valid @RequestBody ExerciseUpdateInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); exercise.setTags(fromIterable(this.tagRepository.findAllById(input.getTagIds()))); exercise.setUpdateAttributes(input); return exerciseRepository.save(exercise); @@ -455,7 +456,7 @@ public Exercise updateExerciseInformation(@PathVariable String exerciseId, @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise updateExerciseStart(@PathVariable String exerciseId, @Valid @RequestBody ExerciseUpdateStartDateInput input) throws InputValidationException { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); if (!exercise.getStatus().equals(SCHEDULED)) { String message = "Change date is only possible in scheduling state"; throw new InputValidationException("exercise_start_date", message); @@ -468,7 +469,7 @@ public Exercise updateExerciseStart(@PathVariable String exerciseId, @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise updateExerciseTags(@PathVariable String exerciseId, @Valid @RequestBody ExerciseUpdateTagsInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); exercise.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); return exerciseRepository.save(exercise); } @@ -477,7 +478,7 @@ public Exercise updateExerciseTags(@PathVariable String exerciseId, @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise updateExerciseLogos(@PathVariable String exerciseId, @Valid @RequestBody ExerciseUpdateLogoInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); exercise.setLogoDark(documentRepository.findById(input.getLogoDark()).orElse(null)); exercise.setLogoLight(documentRepository.findById(input.getLogoLight()).orElse(null)); return exerciseRepository.save(exercise); @@ -487,7 +488,7 @@ public Exercise updateExerciseLogos(@PathVariable String exerciseId, @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise updateExerciseLessons(@PathVariable String exerciseId, @Valid @RequestBody ExerciseLessonsInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); exercise.setLessonsAnonymized(input.getLessonsAnonymized()); return exerciseRepository.save(exercise); } @@ -501,7 +502,7 @@ public void deleteExercise(@PathVariable String exerciseId) { @GetMapping("/api/exercises/{exerciseId}") @PreAuthorize("isExerciseObserver(#exerciseId)") public Exercise exercise(@PathVariable String exerciseId) { - return exerciseRepository.findById(exerciseId).orElseThrow(); + return exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); } @GetMapping("/api/exercises/{exerciseId}/results") @@ -526,9 +527,9 @@ public List injectResults(@NotBlank fin @DeleteMapping("/api/exercises/{exerciseId}/{documentId}") @PreAuthorize("isExercisePlanner(#exerciseId)") public Exercise deleteDocument(@PathVariable String exerciseId, @PathVariable String documentId) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); exercise.setUpdatedAt(now()); - Document doc = documentRepository.findById(documentId).orElseThrow(); + Document doc = documentRepository.findById(documentId).orElseThrow(ElementNotFoundException::new); List docExercises = doc.getExercises().stream().filter(ex -> !ex.getId().equals(exerciseId)).toList(); if (docExercises.isEmpty()) { // Document is no longer associate to any exercise, delete it @@ -551,7 +552,7 @@ public Exercise changeExerciseStatus( @PathVariable String exerciseId, @Valid @RequestBody ExerciseUpdateStatusInput input) { STATUS status = input.getStatus(); - Exercise exercise = this.exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = this.exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); // Check if next status is possible List nextPossibleStatus = exercise.nextPossibleStatus(); if (!nextPossibleStatus.contains(status)) { @@ -589,7 +590,7 @@ public Exercise changeExerciseStatus( // If exercise move from pause to running state, // we log the pause date to be able to recompute inject dates. if (PAUSED.equals(exercise.getStatus()) && RUNNING.equals(status)) { - Instant lastPause = exercise.getCurrentPause().orElseThrow(); + Instant lastPause = exercise.getCurrentPause().orElseThrow(ElementNotFoundException::new); exercise.setCurrentPause(null); Pause pause = new Pause(); pause.setDate(lastPause); @@ -622,7 +623,7 @@ public List exercises() { @GetMapping("/api/exercises/{exerciseId}/communications") @PreAuthorize("isExerciseObserver(#exerciseId)") public Iterable exerciseCommunications(@PathVariable String exerciseId) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); List communications = new ArrayList<>(); exercise.getInjects().forEach(injectDoc -> communications.addAll(injectDoc.getCommunications())); return communications; @@ -631,7 +632,7 @@ public Iterable exerciseCommunications(@PathVariable String exerc @GetMapping("/api/communications/attachment") // @PreAuthorize("isExerciseObserver(#exerciseId)") public void downloadAttachment(@RequestParam String file, HttpServletResponse response) throws IOException { - FileContainer fileContainer = fileService.getFileContainer(file).orElseThrow(); + FileContainer fileContainer = fileService.getFileContainer(file).orElseThrow(ElementNotFoundException::new); response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileContainer.getName()); response.addHeader(HttpHeaders.CONTENT_TYPE, fileContainer.getContentType()); response.setStatus(HttpServletResponse.SC_OK); @@ -656,7 +657,7 @@ public void exerciseExport(@NotBlank @PathVariable final String exerciseId, // Start exporting exercise ExerciseFileExport importExport = new ExerciseFileExport(); importExport.setVersion(1); - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); objectMapper.addMixIn(Exercise.class, ExerciseExportMixins.Exercise.class); // Build the export importExport.setExercise(exercise); @@ -750,7 +751,7 @@ public void exerciseExport(@NotBlank @PathVariable final String exerciseId, zipExport.closeEntry(); // Add the documents documentIds.stream().distinct().forEach(docId -> { - Document doc = documentRepository.findById(docId).orElseThrow(); + Document doc = documentRepository.findById(docId).orElseThrow(ElementNotFoundException::new); Optional docStream = fileService.getFile(doc); if (docStream.isPresent()) { try { diff --git a/openbas-api/src/main/java/io/openbas/rest/exercise/ExercisePlayerApi.java b/openbas-api/src/main/java/io/openbas/rest/exercise/ExercisePlayerApi.java index 745dc43c82..7faafd0bd5 100644 --- a/openbas-api/src/main/java/io/openbas/rest/exercise/ExercisePlayerApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/exercise/ExercisePlayerApi.java @@ -3,6 +3,7 @@ import io.openbas.database.model.Exercise; import io.openbas.database.repository.ExerciseRepository; import io.openbas.database.repository.UserRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.exercise.response.PublicExercise; import io.openbas.rest.helper.RestBehavior; import lombok.RequiredArgsConstructor; @@ -25,7 +26,7 @@ public class ExercisePlayerApi extends RestBehavior { @GetMapping(EXERCISE_URI + "/{exerciseId}") public PublicExercise playerExercise(@PathVariable String exerciseId, @RequestParam Optional userId) { impersonateUser(this.userRepository, userId); - Exercise exercise = this.exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = this.exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); return new PublicExercise(exercise); } diff --git a/openbas-api/src/main/java/io/openbas/rest/group/GroupApi.java b/openbas-api/src/main/java/io/openbas/rest/group/GroupApi.java index 59420e30af..ec7ae0c6d4 100644 --- a/openbas-api/src/main/java/io/openbas/rest/group/GroupApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/group/GroupApi.java @@ -3,6 +3,7 @@ import io.openbas.database.audit.BaseEvent; import io.openbas.database.model.*; import io.openbas.database.repository.*; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.group.form.GroupCreateInput; import io.openbas.rest.group.form.GroupGrantInput; import io.openbas.rest.group.form.GroupUpdateUsersInput; @@ -94,7 +95,7 @@ public Page users(@RequestBody @Valid final SearchPaginationInput searchP @GetMapping("/api/groups/{groupId}") public Group group(@PathVariable String groupId) { - return groupRepository.findById(groupId).orElseThrow(); + return groupRepository.findById(groupId).orElseThrow(ElementNotFoundException::new); } @Secured(ROLE_ADMIN) @@ -111,7 +112,7 @@ public Group createGroup(@Valid @RequestBody GroupCreateInput input) { @PutMapping("/api/groups/{groupId}/users") public Group updateGroupUsers(@PathVariable String groupId, @Valid @RequestBody GroupUpdateUsersInput input) { - Group group = groupRepository.findById(groupId).orElseThrow(); + Group group = groupRepository.findById(groupId).orElseThrow(ElementNotFoundException::new); Spliterator userSpliterator = userRepository.findAllById(input.getUserIds()).spliterator(); group.setUsers(stream(userSpliterator, false).collect(toList())); Group savedGroup = groupRepository.save(group); @@ -133,7 +134,7 @@ public Group updateGroupUsers(@PathVariable String groupId, public Group updateGroupInformation( @PathVariable String groupId, @Valid @RequestBody GroupCreateInput input) { - Group group = groupRepository.findById(groupId).orElseThrow(); + Group group = groupRepository.findById(groupId).orElseThrow(ElementNotFoundException::new); group.setUpdateAttributes(input); group.setExercisesDefaultGrants(input.defaultExerciseGrants()); group.setScenariosDefaultGrants(input.defaultScenarioGrants()); @@ -149,7 +150,7 @@ public Grant groupGrant(@PathVariable String groupId, @Valid @RequestBody GroupG } // Resolve dependencies - Group group = groupRepository.findById(groupId).orElseThrow(); + Group group = groupRepository.findById(groupId).orElseThrow(ElementNotFoundException::new); Optional exerciseOpt = input.getExerciseId() == null ? Optional.empty() : exerciseRepository.findById(input.getExerciseId()); Optional scenarioOpt = input.getScenarioId() == null ? Optional.empty() : scenarioRepository.findById(input.getScenarioId()); @@ -189,8 +190,8 @@ public Grant groupGrant(@PathVariable String groupId, @Valid @RequestBody GroupG @PostMapping("/api/groups/{groupId}/organizations") public Group groupOrganization(@PathVariable String groupId, @Valid @RequestBody OrganizationGrantInput input) { // Resolve dependencies - Group group = groupRepository.findById(groupId).orElseThrow(); - Organization organization = organizationRepository.findById(input.getOrganizationId()).orElseThrow(); + Group group = groupRepository.findById(groupId).orElseThrow(ElementNotFoundException::new); + Organization organization = organizationRepository.findById(input.getOrganizationId()).orElseThrow(ElementNotFoundException::new); group.getOrganizations().add(organization); return groupRepository.save(group); } @@ -198,8 +199,8 @@ public Group groupOrganization(@PathVariable String groupId, @Valid @RequestBody @Secured(ROLE_ADMIN) @DeleteMapping("/api/groups/{groupId}/organizations/{organizationId}") public Group deleteGroupOrganization(@PathVariable String groupId, @PathVariable String organizationId) { - Group group = groupRepository.findById(groupId).orElseThrow(); - Organization organization = organizationRepository.findById(organizationId).orElseThrow(); + Group group = groupRepository.findById(groupId).orElseThrow(ElementNotFoundException::new); + Organization organization = organizationRepository.findById(organizationId).orElseThrow(ElementNotFoundException::new); group.getOrganizations().remove(organization); return groupRepository.save(group); } diff --git a/openbas-api/src/main/java/io/openbas/rest/inject/InjectApi.java b/openbas-api/src/main/java/io/openbas/rest/inject/InjectApi.java index 2ff2488af4..2d2fb6a1a8 100644 --- a/openbas-api/src/main/java/io/openbas/rest/inject/InjectApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/inject/InjectApi.java @@ -16,6 +16,7 @@ import io.openbas.execution.Executor; import io.openbas.injector_contract.ContractType; import io.openbas.rest.atomic_testing.form.InjectResultDTO; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.inject.form.*; import io.openbas.service.AtomicTestingService; @@ -169,8 +170,8 @@ public void setExecutionContextService(@NotNull final ExecutionContextService ex @PostMapping("/api/injects/execution/reception/{injectId}") public Inject InjectExecutionReception(@PathVariable String injectId, @Valid @RequestBody InjectReceptionInput input) { - Inject inject = injectRepository.findById(injectId).orElseThrow(); - InjectStatus injectStatus = inject.getStatus().orElseThrow(); + Inject inject = injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new); + InjectStatus injectStatus = inject.getStatus().orElseThrow(ElementNotFoundException::new); injectStatus.setName(ExecutionStatus.PENDING); injectStatus.setTrackingAckDate(Instant.now()); injectStatus.setTrackingTotalCount(input.getTrackingTotalCount()); @@ -182,8 +183,8 @@ public Inject InjectExecutionReception(@PathVariable String injectId, @Secured(ROLE_ADMIN) @PostMapping("/api/injects/execution/callback/{injectId}") public Inject InjectExecutionCallback(@PathVariable String injectId, @Valid @RequestBody InjectExecutionInput input) { - Inject inject = injectRepository.findById(injectId).orElseThrow(); - InjectStatus injectStatus = inject.getStatus().orElseThrow(); + Inject inject = injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new); + InjectStatus injectStatus = inject.getStatus().orElseThrow(ElementNotFoundException::new); ExecutionStatus executionStatus = ExecutionStatus.valueOf(input.getStatus()); InjectStatusExecution execution = new InjectStatusExecution(); Instant trackingEndDate = now(); @@ -226,7 +227,7 @@ public Inject updateInject( @PathVariable String exerciseId, @PathVariable String injectId, @Valid @RequestBody InjectInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); Inject inject = updateInject(injectId, input); // If Documents not yet linked directly to the exercise, attached it @@ -270,13 +271,13 @@ inject, getTargets( @GetMapping("/api/exercises/{exerciseId}/injects/{injectId}") @PreAuthorize("isExerciseObserver(#exerciseId)") public Inject exerciseInject(@PathVariable String exerciseId, @PathVariable String injectId) { - return injectRepository.findById(injectId).orElseThrow(); + return injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new); } @GetMapping("/api/exercises/{exerciseId}/injects/{injectId}/teams") @PreAuthorize("isExerciseObserver(#exerciseId)") public Iterable exerciseInjectTeams(@PathVariable String exerciseId, @PathVariable String injectId) { - return injectRepository.findById(injectId).orElseThrow().getTeams(); + return injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new).getTeams(); } @GetMapping("/api/exercises/{exerciseId}/injects/{injectId}/communications") @@ -292,8 +293,8 @@ public Iterable exerciseInjectCommunications(@PathVariable String @PostMapping("/api/exercises/{exerciseId}/injects") @PreAuthorize("isExercisePlanner(#exerciseId)") public Inject createInject(@PathVariable String exerciseId, @Valid @RequestBody InjectInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); - InjectorContract injectorContract = injectorContractRepository.findById(input.getInjectorContract()).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); + InjectorContract injectorContract = injectorContractRepository.findById(input.getInjectorContract()).orElseThrow(ElementNotFoundException::new); // Set expectations ObjectNode finalContent = input.getContent(); if (input.getContent() == null || input.getContent().get("expectations").isNull() || input.getContent().get("expectations").isEmpty()) { @@ -320,7 +321,7 @@ public Inject createInject(@PathVariable String exerciseId, @Valid @RequestBody input.setContent(finalContent); // Get common attributes Inject inject = input.toInject(injectorContract); - inject.setUser(userRepository.findById(currentUser().getId()).orElseThrow()); + inject.setUser(userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new)); inject.setExercise(exercise); // Set dependencies inject.setDependsOn(resolveOptionalRelation(input.getDependsOn(), injectRepository)); @@ -332,7 +333,7 @@ public Inject createInject(@PathVariable String exerciseId, @Valid @RequestBody .map(i -> { InjectDocument injectDocument = new InjectDocument(); injectDocument.setInject(inject); - injectDocument.setDocument(documentRepository.findById(i.getDocumentId()).orElseThrow()); + injectDocument.setDocument(documentRepository.findById(i.getDocumentId()).orElseThrow(ElementNotFoundException::new)); injectDocument.setAttached(i.isAttached()); return injectDocument; }).toList(); @@ -345,9 +346,9 @@ public Inject createInject(@PathVariable String exerciseId, @Valid @RequestBody public InjectStatus executeInject(@PathVariable String exerciseId, @Valid @RequestPart("input") DirectInjectInput input, @RequestPart("file") Optional file) { - Inject inject = input.toInject(injectorContractRepository.findById(input.getInjectorContract()).orElseThrow()); - inject.setUser(userRepository.findById(currentUser().getId()).orElseThrow()); - inject.setExercise(exerciseRepository.findById(exerciseId).orElseThrow()); + Inject inject = input.toInject(injectorContractRepository.findById(input.getInjectorContract()).orElseThrow(ElementNotFoundException::new)); + inject.setUser(userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new)); + inject.setExercise(exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new)); Iterable users = userRepository.findAllById(input.getUserIds()); List userInjectContexts = fromIterable(users).stream() .map(user -> this.executionContextService.executionContext(user, inject, "Direct execution")).toList(); @@ -381,7 +382,7 @@ public Inject updateInjectTrigger( @PathVariable String exerciseId, @PathVariable String injectId, @Valid @RequestBody InjectUpdateTriggerInput input) { - Inject inject = injectRepository.findById(injectId).orElseThrow(); + Inject inject = injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new); inject.setDependsDuration(input.getDependsDuration()); inject.setUpdatedAt(now()); return injectRepository.save(inject); @@ -399,7 +400,7 @@ public Inject setInjectStatus(@PathVariable String exerciseId, @PathVariable Str @PreAuthorize("isExercisePlanner(#exerciseId)") public Inject updateInjectTeams(@PathVariable String exerciseId, @PathVariable String injectId, @Valid @RequestBody InjectTeamsInput input) { - Inject inject = injectRepository.findById(injectId).orElseThrow(); + Inject inject = injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new); Iterable injectTeams = teamRepository.findAllById(input.getTeamIds()); inject.setTeams(fromIterable(injectTeams)); return injectRepository.save(inject); @@ -411,7 +412,7 @@ public List nextInjectsToExecute(@RequestParam Optional size) { // Keep only injects visible by the user .filter(inject -> inject.getDate().isPresent()) .filter(inject -> inject.getExercise() - .isUserHasAccess(userRepository.findById(currentUser().getId()).orElseThrow())) + .isUserHasAccess(userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new))) // Order by near execution .sorted(Inject.executionComparator) // Keep only the expected size @@ -428,7 +429,7 @@ public Inject createInjectForScenario( @PathVariable @NotBlank final String scenarioId, @Valid @RequestBody InjectInput input) { Scenario scenario = this.scenarioService.scenario(scenarioId); - InjectorContract injectorContract = injectorContractRepository.findById(input.getInjectorContract()).orElseThrow(); + InjectorContract injectorContract = injectorContractRepository.findById(input.getInjectorContract()).orElseThrow(ElementNotFoundException::new); // Set expectations ObjectNode finalContent = input.getContent(); if (input.getContent() == null || input.getContent().get("expectations").isNull() || input.getContent().get("expectations").isEmpty()) { @@ -455,7 +456,7 @@ public Inject createInjectForScenario( input.setContent(finalContent); // Get common attributes Inject inject = input.toInject(injectorContract); - inject.setUser(this.userRepository.findById(currentUser().getId()).orElseThrow()); + inject.setUser(this.userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new)); inject.setScenario(scenario); // Set dependencies inject.setDependsOn(resolveOptionalRelation(input.getDependsOn(), this.injectRepository)); @@ -467,7 +468,7 @@ public Inject createInjectForScenario( .map(i -> { InjectDocument injectDocument = new InjectDocument(); injectDocument.setInject(inject); - injectDocument.setDocument(documentRepository.findById(i.getDocumentId()).orElseThrow()); + injectDocument.setDocument(documentRepository.findById(i.getDocumentId()).orElseThrow(ElementNotFoundException::new)); injectDocument.setAttached(i.isAttached()); return injectDocument; }).toList(); @@ -491,7 +492,7 @@ public Inject scenarioInject( @PathVariable @NotBlank final String injectId) { Scenario scenario = this.scenarioService.scenario(scenarioId); assert scenarioId.equals(scenario.getId()); - return injectRepository.findById(injectId).orElseThrow(); + return injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new); } @Transactional(rollbackOn = Exception.class) @@ -538,7 +539,7 @@ public void deleteInjectForScenario( // -- PRIVATE -- private Inject updateInject(@NotBlank final String injectId, @NotNull InjectInput input) { - Inject inject = this.injectRepository.findById(injectId).orElseThrow(); + Inject inject = this.injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new); inject.setUpdateAttributes(input); // Set dependencies @@ -587,7 +588,7 @@ private Inject updateInject(@NotBlank final String injectId, @NotNull InjectInpu private Inject updateInjectActivation(@NotBlank final String injectId, @NotNull final InjectUpdateActivationInput input) { - Inject inject = this.injectRepository.findById(injectId).orElseThrow(); + Inject inject = this.injectRepository.findById(injectId).orElseThrow(ElementNotFoundException::new); inject.setEnabled(input.isEnabled()); inject.setUpdatedAt(now()); return injectRepository.save(inject); diff --git a/openbas-api/src/main/java/io/openbas/rest/injector/InjectorApi.java b/openbas-api/src/main/java/io/openbas/rest/injector/InjectorApi.java index 7dc7b95e79..f440035962 100644 --- a/openbas-api/src/main/java/io/openbas/rest/injector/InjectorApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/injector/InjectorApi.java @@ -13,6 +13,7 @@ import io.openbas.database.repository.AttackPatternRepository; import io.openbas.database.repository.InjectorContractRepository; import io.openbas.database.repository.InjectorRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.injector.form.InjectorCreateInput; import io.openbas.rest.injector.form.InjectorUpdateInput; @@ -83,7 +84,7 @@ public Iterable injectors() { @GetMapping("/api/injectors/{injectorId}/injector_contracts") public Collection injectorInjectTypes(@PathVariable String injectorId) { - Injector injector = injectorRepository.findById(injectorId).orElseThrow(); + Injector injector = injectorRepository.findById(injectorId).orElseThrow(ElementNotFoundException::new); return fromIterable(injectorContractRepository.findInjectorContractsByInjector(injector)).stream() .map(contract -> { try { @@ -163,7 +164,7 @@ private Injector updateInjector( @Secured(ROLE_ADMIN) @PutMapping("/api/injectors/{injectorId}") public Injector updateInjector(@PathVariable String injectorId, @Valid @RequestBody InjectorUpdateInput input) { - Injector injector = injectorRepository.findById(injectorId).orElseThrow(); + Injector injector = injectorRepository.findById(injectorId).orElseThrow(ElementNotFoundException::new); return updateInjector( injector, injector.getType(), @@ -179,7 +180,7 @@ public Injector updateInjector(@PathVariable String injectorId, @Valid @RequestB @Secured(ROLE_ADMIN) @GetMapping("/api/injectors/{injectorId}") public Injector injector(@PathVariable String injectorId) { - return injectorRepository.findById(injectorId).orElseThrow(); + return injectorRepository.findById(injectorId).orElseThrow(ElementNotFoundException::new); } @Secured(ROLE_ADMIN) diff --git a/openbas-api/src/main/java/io/openbas/rest/injector_contract/InjectorContractApi.java b/openbas-api/src/main/java/io/openbas/rest/injector_contract/InjectorContractApi.java index 4c7c918346..076352dfb6 100644 --- a/openbas-api/src/main/java/io/openbas/rest/injector_contract/InjectorContractApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/injector_contract/InjectorContractApi.java @@ -7,6 +7,7 @@ import io.openbas.database.repository.InjectorContractRepository; import io.openbas.database.repository.InjectorRepository; import io.openbas.database.specification.InjectorContractSpecification; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.injector_contract.form.InjectorContractAddInput; import io.openbas.rest.injector_contract.form.InjectorContractUpdateInput; @@ -97,7 +98,7 @@ public Page injectorContracts(@RequestBody @Valid final Search @Secured(ROLE_ADMIN) @GetMapping("/api/injector_contracts/{injectorContractId}") public InjectorContract injectorContract(@PathVariable String injectorContractId) { - return injectorContractRepository.findById(injectorContractId).orElseThrow(); + return injectorContractRepository.findById(injectorContractId).orElseThrow(ElementNotFoundException::new); } @Secured(ROLE_ADMIN) @@ -118,7 +119,7 @@ public InjectorContract createInjectorContract(@Valid @RequestBody InjectorContr @Secured(ROLE_ADMIN) @PutMapping("/api/injector_contracts/{injectorContractId}") public InjectorContract updateInjectorContract(@PathVariable String injectorContractId, @Valid @RequestBody InjectorContractUpdateInput input) { - InjectorContract injectorContract = injectorContractRepository.findById(injectorContractId).orElseThrow(); + InjectorContract injectorContract = injectorContractRepository.findById(injectorContractId).orElseThrow(ElementNotFoundException::new); injectorContract.setUpdateAttributes(input); injectorContract.setAttackPatterns(fromIterable(attackPatternRepository.findAllById(input.getAttackPatternsIds()))); injectorContract.setUpdatedAt(Instant.now()); @@ -128,7 +129,7 @@ public InjectorContract updateInjectorContract(@PathVariable String injectorCont @Secured(ROLE_ADMIN) @PutMapping("/api/injector_contracts/{injectorContractId}/mapping") public InjectorContract updateInjectorContractMapping(@PathVariable String injectorContractId, @Valid @RequestBody InjectorContractUpdateMappingInput input) { - InjectorContract injectorContract = injectorContractRepository.findById(injectorContractId).orElseThrow(); + InjectorContract injectorContract = injectorContractRepository.findById(injectorContractId).orElseThrow(ElementNotFoundException::new); injectorContract.setAttackPatterns(fromIterable(attackPatternRepository.findAllById(input.getAttackPatternsIds()))); injectorContract.setUpdatedAt(Instant.now()); return injectorContractRepository.save(injectorContract); diff --git a/openbas-api/src/main/java/io/openbas/rest/kill_chain_phase/KillChainPhaseApi.java b/openbas-api/src/main/java/io/openbas/rest/kill_chain_phase/KillChainPhaseApi.java index 42739d0934..eb45da237b 100644 --- a/openbas-api/src/main/java/io/openbas/rest/kill_chain_phase/KillChainPhaseApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/kill_chain_phase/KillChainPhaseApi.java @@ -1,9 +1,8 @@ package io.openbas.rest.kill_chain_phase; -import io.openbas.database.model.Channel; import io.openbas.database.model.KillChainPhase; import io.openbas.database.repository.KillChainPhaseRepository; -import io.openbas.rest.channel.form.ChannelUpdateInput; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.kill_chain_phase.form.KillChainPhaseCreateInput; import io.openbas.rest.kill_chain_phase.form.KillChainPhaseUpdateInput; @@ -54,14 +53,14 @@ public Page killChainPhases(@RequestBody @Valid SearchPagination @GetMapping("/api/kill_chain_phases/{killChainPhaseId}") public KillChainPhase killChainPhase(@PathVariable String killChainPhaseId) { - return killChainPhaseRepository.findById(killChainPhaseId).orElseThrow(); + return killChainPhaseRepository.findById(killChainPhaseId).orElseThrow(ElementNotFoundException::new); } @Secured(ROLE_ADMIN) @PutMapping("/api/kill_chain_phases/{killChainPhaseId}") public KillChainPhase updateKillChainPhase(@PathVariable String killChainPhaseId, @Valid @RequestBody KillChainPhaseUpdateInput input) { - KillChainPhase killchainPhase = killChainPhaseRepository.findById(killChainPhaseId).orElseThrow(); + KillChainPhase killchainPhase = killChainPhaseRepository.findById(killChainPhaseId).orElseThrow(ElementNotFoundException::new); killchainPhase.setUpdateAttributes(input); killchainPhase.setUpdatedAt(Instant.now()); return killChainPhaseRepository.save(killchainPhase); diff --git a/openbas-api/src/main/java/io/openbas/rest/lessons/LessonsApi.java b/openbas-api/src/main/java/io/openbas/rest/lessons/LessonsApi.java index 41cca98074..4ae5f8a5d2 100644 --- a/openbas-api/src/main/java/io/openbas/rest/lessons/LessonsApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/lessons/LessonsApi.java @@ -5,14 +5,15 @@ import io.openbas.database.specification.LessonsAnswerSpecification; import io.openbas.database.specification.LessonsCategorySpecification; import io.openbas.database.specification.LessonsQuestionSpecification; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.lessons.form.*; import io.openbas.service.MailingService; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import jakarta.validation.Valid; import java.util.List; import java.util.Optional; @@ -81,8 +82,8 @@ public Iterable exerciseLessonsCategories(@PathVariable String @PreAuthorize("isExercisePlanner(#exerciseId)") public Iterable applyExerciseLessonsTemplate(@PathVariable String exerciseId, @PathVariable String lessonsTemplateId) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); - LessonsTemplate lessonsTemplate = lessonsTemplateRepository.findById(lessonsTemplateId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); + LessonsTemplate lessonsTemplate = lessonsTemplateRepository.findById(lessonsTemplateId).orElseThrow(ElementNotFoundException::new); List lessonsTemplateCategories = lessonsTemplate.getCategories().stream().toList(); for (LessonsTemplateCategory lessonsTemplateCategory : lessonsTemplateCategories) { LessonsCategory lessonsCategory = new LessonsCategory(); @@ -109,7 +110,7 @@ public Iterable applyExerciseLessonsTemplate(@PathVariable Stri @PreAuthorize("isExercisePlanner(#exerciseId)") public LessonsCategory createExerciseLessonsCategory(@PathVariable String exerciseId, @Valid @RequestBody LessonsCategoryCreateInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); LessonsCategory lessonsCategory = new LessonsCategory(); lessonsCategory.setUpdateAttributes(input); lessonsCategory.setExercise(exercise); @@ -145,7 +146,7 @@ public Iterable emptyExerciseLessons(@PathVariable String exerc @PreAuthorize("isExercisePlanner(#exerciseId)") public LessonsCategory updateExerciseLessonsCategory(@PathVariable String exerciseId, @PathVariable String lessonsCategoryId, @Valid @RequestBody LessonsCategoryUpdateInput input) { - LessonsCategory lessonsTemplateCategory = lessonsCategoryRepository.findById(lessonsCategoryId).orElseThrow(); + LessonsCategory lessonsTemplateCategory = lessonsCategoryRepository.findById(lessonsCategoryId).orElseThrow(ElementNotFoundException::new); lessonsTemplateCategory.setUpdateAttributes(input); lessonsTemplateCategory.setUpdated(now()); return lessonsCategoryRepository.save(lessonsTemplateCategory); @@ -161,7 +162,7 @@ public void deleteExerciseLessonsCategory(@PathVariable String exerciseId, @Path @PreAuthorize("isExercisePlanner(#exerciseId)") public LessonsCategory updateExerciseLessonsCategoryTeams(@PathVariable String exerciseId, @PathVariable String lessonsCategoryId, @Valid @RequestBody LessonsCategoryTeamsInput input) { - LessonsCategory lessonsCategory = lessonsCategoryRepository.findById(lessonsCategoryId).orElseThrow(); + LessonsCategory lessonsCategory = lessonsCategoryRepository.findById(lessonsCategoryId).orElseThrow(ElementNotFoundException::new); Iterable lessonsCategoryTeams = teamRepository.findAllById(input.getTeamIds()); lessonsCategory.setTeams(fromIterable(lessonsCategoryTeams)); return lessonsCategoryRepository.save(lessonsCategory); @@ -186,7 +187,7 @@ public Iterable exerciseLessonsCategoryQuestions(@PathVariable @PreAuthorize("isExercisePlanner(#exerciseId)") public LessonsQuestion createExerciseLessonsQuestion(@PathVariable String exerciseId, @PathVariable String lessonsCategoryId, @Valid @RequestBody LessonsQuestionCreateInput input) { - LessonsCategory lessonsCategory = lessonsCategoryRepository.findById(lessonsCategoryId).orElseThrow(); + LessonsCategory lessonsCategory = lessonsCategoryRepository.findById(lessonsCategoryId).orElseThrow(ElementNotFoundException::new); LessonsQuestion lessonsQuestion = new LessonsQuestion(); lessonsQuestion.setUpdateAttributes(input); lessonsQuestion.setCategory(lessonsCategory); @@ -197,7 +198,7 @@ public LessonsQuestion createExerciseLessonsQuestion(@PathVariable String exerci @PreAuthorize("isExercisePlanner(#exerciseId)") public LessonsQuestion updateExerciseLessonsQuestion(@PathVariable String exerciseId, @PathVariable String lessonsQuestionId, @Valid @RequestBody LessonsQuestionUpdateInput input) { - LessonsQuestion lessonsQuestion = lessonsQuestionRepository.findById(lessonsQuestionId).orElseThrow(); + LessonsQuestion lessonsQuestion = lessonsQuestionRepository.findById(lessonsQuestionId).orElseThrow(ElementNotFoundException::new); lessonsQuestion.setUpdateAttributes(input); lessonsQuestion.setUpdated(now()); return lessonsQuestionRepository.save(lessonsQuestion); @@ -212,7 +213,7 @@ public void deleteExerciseLessonsQuestion(@PathVariable String exerciseId, @Path @PostMapping("/api/exercises/{exerciseId}/lessons_send") @PreAuthorize("isExercisePlanner(#exerciseId)") public void sendExerciseLessons(@PathVariable String exerciseId, @Valid @RequestBody LessonsSendInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); List lessonsCategories = lessonsCategoryRepository.findAll( LessonsCategorySpecification.fromExercise(exerciseId)).stream().toList(); List users = lessonsCategories.stream().flatMap(lessonsCategory -> lessonsCategory.getTeams().stream() @@ -265,7 +266,7 @@ public LessonsAnswer createExerciseLessonsQuestion(@PathVariable String exercise @PathVariable String lessonsQuestionId, @Valid @RequestBody LessonsAnswerCreateInput input, @RequestParam Optional userId) { User user = impersonateUser(userRepository, userId); - LessonsQuestion lessonsQuestion = lessonsQuestionRepository.findById(lessonsQuestionId).orElseThrow(); + LessonsQuestion lessonsQuestion = lessonsQuestionRepository.findById(lessonsQuestionId).orElseThrow(ElementNotFoundException::new); LessonsAnswer lessonsAnswer = new LessonsAnswer(); lessonsAnswer.setQuestion(lessonsQuestion); lessonsAnswer.setScore(input.getScore()); diff --git a/openbas-api/src/main/java/io/openbas/rest/lessons_template/LessonsTemplateApi.java b/openbas-api/src/main/java/io/openbas/rest/lessons_template/LessonsTemplateApi.java index 889f38f67f..72bd6c19bf 100644 --- a/openbas-api/src/main/java/io/openbas/rest/lessons_template/LessonsTemplateApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/lessons_template/LessonsTemplateApi.java @@ -8,6 +8,7 @@ import io.openbas.database.repository.LessonsTemplateRepository; import io.openbas.database.specification.LessonsTemplateCategorySpecification; import io.openbas.database.specification.LessonsTemplateQuestionSpecification; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.lessons_template.form.*; import jakarta.validation.Valid; @@ -58,7 +59,7 @@ public LessonsTemplate createLessonsTemplate(@Valid @RequestBody LessonsTemplate @PutMapping("/api/lessons_templates/{lessonsTemplateId}") public LessonsTemplate updateLessonsTemplate(@PathVariable String lessonsTemplateId, @Valid @RequestBody LessonsTemplateUpdateInput input) { - LessonsTemplate lessonsTemplate = lessonsTemplateRepository.findById(lessonsTemplateId).orElseThrow(); + LessonsTemplate lessonsTemplate = lessonsTemplateRepository.findById(lessonsTemplateId).orElseThrow(ElementNotFoundException::new); lessonsTemplate.setUpdateAttributes(input); lessonsTemplate.setUpdated(now()); return lessonsTemplateRepository.save(lessonsTemplate); @@ -78,7 +79,7 @@ public Iterable lessonsTemplateCategories(@PathVariable @Secured(ROLE_ADMIN) @PostMapping("/api/lessons_templates/{lessonsTemplateId}/lessons_template_categories") public LessonsTemplateCategory createLessonsTemplateCategory(@PathVariable String lessonsTemplateId, @Valid @RequestBody LessonsTemplateCategoryCreateInput input) { - LessonsTemplate lessonsTemplate = lessonsTemplateRepository.findById(lessonsTemplateId).orElseThrow(); + LessonsTemplate lessonsTemplate = lessonsTemplateRepository.findById(lessonsTemplateId).orElseThrow(ElementNotFoundException::new); LessonsTemplateCategory lessonsTemplateCategory = new LessonsTemplateCategory(); lessonsTemplateCategory.setUpdateAttributes(input); lessonsTemplateCategory.setTemplate(lessonsTemplate); @@ -88,7 +89,7 @@ public LessonsTemplateCategory createLessonsTemplateCategory(@PathVariable Strin @Secured(ROLE_ADMIN) @PutMapping("/api/lessons_templates/{lessonsTemplateId}/lessons_template_categories/{lessonsTemplateCategoryId}") public LessonsTemplateCategory updateLessonsTemplateCategory(@PathVariable String lessonsTemplateCategoryId, @Valid @RequestBody LessonsTemplateCategoryUpdateInput input) { - LessonsTemplateCategory lessonsTemplateCategory = lessonsTemplateCategoryRepository.findById(lessonsTemplateCategoryId).orElseThrow(); + LessonsTemplateCategory lessonsTemplateCategory = lessonsTemplateCategoryRepository.findById(lessonsTemplateCategoryId).orElseThrow(ElementNotFoundException::new); lessonsTemplateCategory.setUpdateAttributes(input); lessonsTemplateCategory.setUpdated(now()); return lessonsTemplateCategoryRepository.save(lessonsTemplateCategory); @@ -114,7 +115,7 @@ public Iterable lessonsTemplateCategoryQuestions(@PathV @Secured(ROLE_ADMIN) @PostMapping("/api/lessons_templates/{lessonsTemplateId}/lessons_template_categories/{lessonsTemplateCategoryId}/lessons_template_questions") public LessonsTemplateQuestion createLessonsTemplateQuestion(@PathVariable String lessonsTemplateCategoryId, @Valid @RequestBody LessonsTemplateQuestionCreateInput input) { - LessonsTemplateCategory lessonsTemplateCategory = lessonsTemplateCategoryRepository.findById(lessonsTemplateCategoryId).orElseThrow(); + LessonsTemplateCategory lessonsTemplateCategory = lessonsTemplateCategoryRepository.findById(lessonsTemplateCategoryId).orElseThrow(ElementNotFoundException::new); LessonsTemplateQuestion lessonsTemplateQuestion = new LessonsTemplateQuestion(); lessonsTemplateQuestion.setUpdateAttributes(input); lessonsTemplateQuestion.setCategory(lessonsTemplateCategory); @@ -124,7 +125,7 @@ public LessonsTemplateQuestion createLessonsTemplateQuestion(@PathVariable Strin @Secured(ROLE_ADMIN) @PutMapping("/api/lessons_templates/{lessonsTemplateId}/lessons_template_categories/{lessonsTemplateCategoryId}/lessons_template_questions/{lessonsTemplateQuestionId}") public LessonsTemplateQuestion updateLessonsTemplateQuestion(@PathVariable String lessonsTemplateQuestionId, @Valid @RequestBody LessonsTemplateQuestionUpdateInput input) { - LessonsTemplateQuestion lessonsTemplateQuestion = lessonsTemplateQuestionRepository.findById(lessonsTemplateQuestionId).orElseThrow(); + LessonsTemplateQuestion lessonsTemplateQuestion = lessonsTemplateQuestionRepository.findById(lessonsTemplateQuestionId).orElseThrow(ElementNotFoundException::new); lessonsTemplateQuestion.setUpdateAttributes(input); lessonsTemplateQuestion.setUpdated(now()); return lessonsTemplateQuestionRepository.save(lessonsTemplateQuestion); diff --git a/openbas-api/src/main/java/io/openbas/rest/mitigation/MitigationApi.java b/openbas-api/src/main/java/io/openbas/rest/mitigation/MitigationApi.java index 8c8facf1a2..4daecb0755 100644 --- a/openbas-api/src/main/java/io/openbas/rest/mitigation/MitigationApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/mitigation/MitigationApi.java @@ -5,6 +5,7 @@ import io.openbas.database.repository.AttackPatternRepository; import io.openbas.database.repository.MitigationRepository; import io.openbas.database.specification.AttackPatternSpecification; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.mitigation.form.MitigationCreateInput; import io.openbas.rest.mitigation.form.MitigationUpdateInput; @@ -64,7 +65,7 @@ public Page mitigations(@RequestBody @Valid final SearchPaginationIn @GetMapping("/api/mitigations/{mitigationId}") public Mitigation mitigation(@PathVariable String mitigationId) { - return mitigationRepository.findById(mitigationId).orElseThrow(); + return mitigationRepository.findById(mitigationId).orElseThrow(ElementNotFoundException::new); } @Secured(ROLE_ADMIN) @@ -78,7 +79,7 @@ public Mitigation createMitigation(@Valid @RequestBody MitigationCreateInput inp @GetMapping("/api/mitigations/{mitigationId}/attack_patterns") public Iterable injectorContracts(@PathVariable String mitigationId) { - mitigationRepository.findById(mitigationId).orElseThrow(); + mitigationRepository.findById(mitigationId).orElseThrow(ElementNotFoundException::new); return attackPatternRepository.findAll(AttackPatternSpecification.fromAttackPattern(mitigationId)); } @@ -87,7 +88,7 @@ public Iterable injectorContracts(@PathVariable String mitigation public Mitigation updateMitigation( @NotBlank @PathVariable final String mitigationId, @Valid @RequestBody MitigationUpdateInput input) { - Mitigation mitigation = this.mitigationRepository.findById(mitigationId).orElseThrow(); + Mitigation mitigation = this.mitigationRepository.findById(mitigationId).orElseThrow(ElementNotFoundException::new); mitigation.setUpdateAttributes(input); mitigation.setAttackPatterns(fromIterable(this.attackPatternRepository.findAllById(input.getAttackPatternsIds()))); mitigation.setUpdatedAt(Instant.now()); diff --git a/openbas-api/src/main/java/io/openbas/rest/objective/ObjectiveApi.java b/openbas-api/src/main/java/io/openbas/rest/objective/ObjectiveApi.java index f84199607a..5062f1a1a7 100644 --- a/openbas-api/src/main/java/io/openbas/rest/objective/ObjectiveApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/objective/ObjectiveApi.java @@ -9,16 +9,16 @@ import io.openbas.database.repository.UserRepository; import io.openbas.database.specification.EvaluationSpecification; import io.openbas.database.specification.ObjectiveSpecification; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.objective.form.EvaluationInput; import io.openbas.rest.objective.form.ObjectiveInput; +import jakarta.transaction.Transactional; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import jakarta.transaction.Transactional; -import jakarta.validation.Valid; - import static io.openbas.config.SessionHelper.currentUser; import static io.openbas.helper.DatabaseHelper.resolveRelation; import static java.time.Instant.now; @@ -62,7 +62,7 @@ public Iterable getMainObjectives(@PathVariable String exerciseId) { @PreAuthorize("isExercisePlanner(#exerciseId)") public Objective createObjective(@PathVariable String exerciseId, @Valid @RequestBody ObjectiveInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); Objective objective = new Objective(); objective.setUpdateAttributes(input); objective.setExercise(exercise); @@ -74,7 +74,7 @@ public Objective createObjective(@PathVariable String exerciseId, public Objective updateObjective(@PathVariable String exerciseId, @PathVariable String objectiveId, @Valid @RequestBody ObjectiveInput input) { - Objective objective = objectiveRepository.findById(objectiveId).orElseThrow(); + Objective objective = objectiveRepository.findById(objectiveId).orElseThrow(ElementNotFoundException::new); objective.setUpdateAttributes(input); return objectiveRepository.save(objective); } @@ -90,7 +90,7 @@ public void deleteObjective(@PathVariable String exerciseId, @PathVariable Strin @GetMapping("/api/exercises/{exerciseId}/objectives/{objectiveId}/evaluations/{evaluationId}") @PreAuthorize("isExerciseObserver(#exerciseId)") public Evaluation getEvaluation(@PathVariable String exerciseId, @PathVariable String evaluationId) { - return evaluationRepository.findById(evaluationId).orElseThrow(); + return evaluationRepository.findById(evaluationId).orElseThrow(ElementNotFoundException::new); } @GetMapping("/api/exercises/{exerciseId}/objectives/{objectiveId}/evaluations") @@ -109,11 +109,11 @@ public Evaluation createEvaluation(@PathVariable String exerciseId, evaluation.setUpdateAttributes(input); Objective objective = resolveRelation(objectiveId, objectiveRepository); evaluation.setObjective(objective); - evaluation.setUser(userRepository.findById(currentUser().getId()).orElseThrow()); + evaluation.setUser(userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new)); Evaluation result = evaluationRepository.save(evaluation); objective.setUpdatedAt(now()); objectiveRepository.save(objective); - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); exercise.setUpdatedAt(now()); exerciseRepository.save(exercise); return result; @@ -125,13 +125,13 @@ public Evaluation updateEvaluation(@PathVariable String exerciseId, @PathVariable String objectiveId, @PathVariable String evaluationId, @Valid @RequestBody EvaluationInput input) { - Evaluation evaluation = evaluationRepository.findById(evaluationId).orElseThrow(); + Evaluation evaluation = evaluationRepository.findById(evaluationId).orElseThrow(ElementNotFoundException::new); evaluation.setUpdateAttributes(input); Evaluation result = evaluationRepository.save(evaluation); - Objective objective = objectiveRepository.findById(objectiveId).orElseThrow(); + Objective objective = objectiveRepository.findById(objectiveId).orElseThrow(ElementNotFoundException::new); objective.setUpdatedAt(now()); objectiveRepository.save(objective); - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); exercise.setUpdatedAt(now()); exerciseRepository.save(exercise); return result; diff --git a/openbas-api/src/main/java/io/openbas/rest/organization/OrganizationApi.java b/openbas-api/src/main/java/io/openbas/rest/organization/OrganizationApi.java index 64b1cf9be8..8e160a035b 100644 --- a/openbas-api/src/main/java/io/openbas/rest/organization/OrganizationApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/organization/OrganizationApi.java @@ -8,6 +8,7 @@ import io.openbas.database.repository.OrganizationRepository; import io.openbas.database.repository.TagRepository; import io.openbas.database.repository.UserRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.organization.form.OrganizationCreateInput; import io.openbas.rest.organization.form.OrganizationUpdateInput; @@ -60,7 +61,7 @@ public Iterable organizations() { if (currentUser.isAdmin()) { organizations = fromIterable(organizationRepository.findAll()); } else { - User local = userRepository.findById(currentUser.getId()).orElseThrow(); + User local = userRepository.findById(currentUser.getId()).orElseThrow(ElementNotFoundException::new); organizations = local.getGroups().stream() .flatMap(group -> group.getOrganizations().stream()).toList(); } @@ -82,7 +83,7 @@ public Organization createOrganization(@Valid @RequestBody OrganizationCreateInp public Organization updateOrganization(@PathVariable String organizationId, @Valid @RequestBody OrganizationUpdateInput input) { checkOrganizationAccess(userRepository, organizationId); - Organization organization = organizationRepository.findById(organizationId).orElseThrow(); + Organization organization = organizationRepository.findById(organizationId).orElseThrow(ElementNotFoundException::new); organization.setUpdateAttributes(input); organization.setUpdatedAt(now()); organization.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); diff --git a/openbas-api/src/main/java/io/openbas/rest/payload/PayloadApi.java b/openbas-api/src/main/java/io/openbas/rest/payload/PayloadApi.java index cc42cb4f97..44bab8539e 100644 --- a/openbas-api/src/main/java/io/openbas/rest/payload/PayloadApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/payload/PayloadApi.java @@ -3,6 +3,7 @@ import io.openbas.database.model.Payload; import io.openbas.database.repository.PayloadRepository; import io.openbas.database.repository.TagRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.payload.form.PayloadCreateInput; import io.openbas.rest.payload.form.PayloadUpdateInput; @@ -58,7 +59,7 @@ public Page payloads(@RequestBody @Valid final SearchPaginationInput se @GetMapping("/api/payloads/{payloadId}") public Payload payload(@PathVariable String payloadId) { - return payloadRepository.findById(payloadId).orElseThrow(); + return payloadRepository.findById(payloadId).orElseThrow(ElementNotFoundException::new); } @PostMapping("/api/payloads") @@ -75,7 +76,7 @@ public Payload createPayload(@Valid @RequestBody PayloadCreateInput input) { public Payload updatePayload( @NotBlank @PathVariable final String payloadId, @Valid @RequestBody PayloadUpdateInput input) { - Payload payload = this.payloadRepository.findById(payloadId).orElseThrow(); + Payload payload = this.payloadRepository.findById(payloadId).orElseThrow(ElementNotFoundException::new); payload.setUpdateAttributes(input); payload.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); payload.setUpdatedAt(Instant.now()); diff --git a/openbas-api/src/main/java/io/openbas/rest/report/ReportApi.java b/openbas-api/src/main/java/io/openbas/rest/report/ReportApi.java index 29c5c2509f..6ced2bd151 100644 --- a/openbas-api/src/main/java/io/openbas/rest/report/ReportApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/report/ReportApi.java @@ -1,17 +1,19 @@ package io.openbas.rest.report; -import io.openbas.database.model.*; -import io.openbas.database.repository.*; +import io.openbas.database.model.Exercise; +import io.openbas.database.model.Report; +import io.openbas.database.repository.ExerciseRepository; +import io.openbas.database.repository.ReportRepository; import io.openbas.database.specification.ReportSpecification; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.report.form.ReportCreateInput; import io.openbas.rest.report.form.ReportUpdateInput; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import jakarta.validation.Valid; - import static java.time.Instant.now; @RestController @@ -39,7 +41,7 @@ public Iterable exerciseReports(@PathVariable String exerciseId) { @PostMapping("/api/exercises/{exerciseId}/reports") @PreAuthorize("isExercisePlanner(#exerciseId)") public Report createExerciseReport(@PathVariable String exerciseId, @Valid @RequestBody ReportCreateInput input) { - Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); Report report = new Report(); report.setUpdateAttributes(input); report.setExercise(exercise); @@ -49,7 +51,7 @@ public Report createExerciseReport(@PathVariable String exerciseId, @Valid @Requ @PutMapping("/api/exercises/{exerciseId}/reports/{reportId}") @PreAuthorize("isExercisePlanner(#exerciseId)") public Report updateExerciseReport(@PathVariable String exerciseId,@PathVariable String reportId, @Valid @RequestBody ReportUpdateInput input) { - Report report = reportRepository.findById(reportId).orElseThrow(); + Report report = reportRepository.findById(reportId).orElseThrow(ElementNotFoundException::new); report.setUpdateAttributes(input); report.setUpdated(now()); return reportRepository.save(report); diff --git a/openbas-api/src/main/java/io/openbas/rest/scenario/ScenarioApi.java b/openbas-api/src/main/java/io/openbas/rest/scenario/ScenarioApi.java index 893c6155b0..2c7d6f39f1 100644 --- a/openbas-api/src/main/java/io/openbas/rest/scenario/ScenarioApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/scenario/ScenarioApi.java @@ -6,6 +6,7 @@ import io.openbas.database.repository.TagRepository; import io.openbas.database.repository.TeamRepository; import io.openbas.database.repository.UserRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.exercise.form.ExerciseSimple; import io.openbas.rest.exercise.form.ScenarioTeamPlayersEnableInput; import io.openbas.rest.scenario.form.*; @@ -213,7 +214,7 @@ public Scenario addScenarioTeamPlayers( @PathVariable @NotBlank final String scenarioId, @PathVariable @NotBlank final String teamId, @Valid @RequestBody final ScenarioTeamPlayersEnableInput input) { - Team team = teamRepository.findById(teamId).orElseThrow(); + Team team = teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new); Iterable teamUsers = userRepository.findAllById(input.getPlayersIds()); team.getUsers().addAll(fromIterable(teamUsers)); teamRepository.save(team); @@ -227,7 +228,7 @@ public Scenario removeScenarioTeamPlayers( @PathVariable @NotBlank final String scenarioId, @PathVariable @NotBlank final String teamId, @Valid @RequestBody final ScenarioTeamPlayersEnableInput input) { - Team team = teamRepository.findById(teamId).orElseThrow(); + Team team = teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new); Iterable teamUsers = userRepository.findAllById(input.getPlayersIds()); team.getUsers().removeAll(fromIterable(teamUsers)); teamRepository.save(team); diff --git a/openbas-api/src/main/java/io/openbas/rest/tag/TagApi.java b/openbas-api/src/main/java/io/openbas/rest/tag/TagApi.java index 5487806f84..2bf861a12e 100644 --- a/openbas-api/src/main/java/io/openbas/rest/tag/TagApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/tag/TagApi.java @@ -1,8 +1,8 @@ package io.openbas.rest.tag; -import io.openbas.database.model.KillChainPhase; import io.openbas.database.model.Tag; import io.openbas.database.repository.TagRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.tag.form.TagCreateInput; import io.openbas.rest.tag.form.TagUpdateInput; @@ -49,7 +49,7 @@ public Page tags(@RequestBody @Valid SearchPaginationInput searchPagination @PutMapping("/api/tags/{tagId}") public Tag updateTag(@PathVariable String tagId, @Valid @RequestBody TagUpdateInput input) { - Tag tag = tagRepository.findById(tagId).orElseThrow(); + Tag tag = tagRepository.findById(tagId).orElseThrow(ElementNotFoundException::new); tag.setUpdateAttributes(input); return tagRepository.save(tag); } diff --git a/openbas-api/src/main/java/io/openbas/rest/team/TeamApi.java b/openbas-api/src/main/java/io/openbas/rest/team/TeamApi.java index cfc252f120..47544bfeb6 100644 --- a/openbas-api/src/main/java/io/openbas/rest/team/TeamApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/team/TeamApi.java @@ -5,6 +5,7 @@ import io.openbas.database.model.Team; import io.openbas.database.model.User; import io.openbas.database.repository.*; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.team.form.TeamCreateInput; import io.openbas.rest.team.form.TeamUpdateInput; @@ -81,7 +82,7 @@ public Iterable getTeams() { if (currentUser.isAdmin()) { teams = fromIterable(teamRepository.findAll()); } else { - User local = userRepository.findById(currentUser.getId()).orElseThrow(); + User local = userRepository.findById(currentUser.getId()).orElseThrow(ElementNotFoundException::new); List organizationIds = local.getGroups().stream() .flatMap(group -> group.getOrganizations().stream()) .map(Organization::getId) @@ -100,7 +101,7 @@ public Page teams(@RequestBody @Valid SearchPaginationInput searchPaginati teamsFunction = (Specification specification, Pageable pageable) -> this.teamRepository .findAll(contextual(false).and(specification), pageable); } else { - User local = this.userRepository.findById(currentUser.getId()).orElseThrow(); + User local = this.userRepository.findById(currentUser.getId()).orElseThrow(ElementNotFoundException::new); List organizationIds = local.getGroups().stream() .flatMap(group -> group.getOrganizations().stream()) .map(Organization::getId) @@ -118,13 +119,13 @@ public Page teams(@RequestBody @Valid SearchPaginationInput searchPaginati @GetMapping("/api/teams/{teamId}") @PreAuthorize("isObserver()") public Team getTeam(@PathVariable String teamId) { - return teamRepository.findById(teamId).orElseThrow(); + return teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new); } @GetMapping("/api/teams/{teamId}/players") @PreAuthorize("isObserver()") public Iterable getTeamPlayers(@PathVariable String teamId) { - return teamRepository.findById(teamId).orElseThrow().getUsers(); + return teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new).getUsers(); } @PostMapping("/api/teams") @@ -180,7 +181,7 @@ public void deleteTeam(@PathVariable String teamId) { @PutMapping("/api/teams/{teamId}") @PreAuthorize("isPlanner()") public Team updateTeam(@PathVariable String teamId, @Valid @RequestBody TeamUpdateInput input) { - Team team = teamRepository.findById(teamId).orElseThrow(); + Team team = teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new); team.setUpdateAttributes(input); team.setUpdatedAt(now()); team.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); @@ -191,7 +192,7 @@ public Team updateTeam(@PathVariable String teamId, @Valid @RequestBody TeamUpda @PutMapping("/api/teams/{teamId}/players") @PreAuthorize("isPlanner()") public Team updateTeamUsers(@PathVariable String teamId, @Valid @RequestBody UpdateUsersTeamInput input) { - Team team = teamRepository.findById(teamId).orElseThrow(); + Team team = teamRepository.findById(teamId).orElseThrow(ElementNotFoundException::new); Iterable teamUsers = userRepository.findAllById(input.getUserIds()); team.setUsers(fromIterable(teamUsers)); return teamRepository.save(team); diff --git a/openbas-api/src/main/java/io/openbas/rest/user/MeApi.java b/openbas-api/src/main/java/io/openbas/rest/user/MeApi.java index cba808fd7b..860427240d 100644 --- a/openbas-api/src/main/java/io/openbas/rest/user/MeApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/user/MeApi.java @@ -6,6 +6,7 @@ import io.openbas.database.repository.OrganizationRepository; import io.openbas.database.repository.TokenRepository; import io.openbas.database.repository.UserRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.exception.InputValidationException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.user.form.me.UpdateMePasswordInput; @@ -70,13 +71,13 @@ public ResponseEntity logout() { @Secured(ROLE_USER) @GetMapping("/api/me") public User me() { - return userRepository.findById(currentUser().getId()).orElseThrow(); + return userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new); } @Secured(ROLE_USER) @PutMapping("/api/me/profile") public User updateProfile(@Valid @RequestBody UpdateProfileInput input) { - User user = userRepository.findById(currentUser().getId()).orElseThrow(); + User user = userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new); user.setUpdateAttributes(input); user.setOrganization(updateRelation(input.getOrganizationId(), user.getOrganization(), organizationRepository)); User savedUser = userRepository.save(user); @@ -87,7 +88,7 @@ public User updateProfile(@Valid @RequestBody UpdateProfileInput input) { @Secured(ROLE_USER) @PutMapping("/api/me/information") public User updateInformation(@Valid @RequestBody UpdateUserInfoInput input) { - User user = userRepository.findById(currentUser().getId()).orElseThrow(); + User user = userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new); user.setUpdateAttributes(input); User savedUser = userRepository.save(user); sessionManager.refreshUserSessions(savedUser); @@ -97,7 +98,7 @@ public User updateInformation(@Valid @RequestBody UpdateUserInfoInput input) { @Secured(ROLE_USER) @PutMapping("/api/me/password") public User updatePassword(@Valid @RequestBody UpdateMePasswordInput input) throws InputValidationException { - User user = userRepository.findById(currentUser().getId()).orElseThrow(); + User user = userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new); if (userService.isUserPasswordValid(user, input.getCurrentPassword())) { user.setPassword(userService.encodeUserPassword(input.getPassword())); return userRepository.save(user); @@ -110,8 +111,8 @@ public User updatePassword(@Valid @RequestBody UpdateMePasswordInput input) thro @PostMapping("/api/me/token/refresh") @Transactional(rollbackOn = Exception.class) public Token renewToken(@Valid @RequestBody RenewTokenInput input) throws InputValidationException { - User user = userRepository.findById(currentUser().getId()).orElseThrow(); - Token token = tokenRepository.findById(input.getTokenId()).orElseThrow(); + User user = userRepository.findById(currentUser().getId()).orElseThrow(ElementNotFoundException::new); + Token token = tokenRepository.findById(input.getTokenId()).orElseThrow(ElementNotFoundException::new); if (!user.equals(token.getUser())) { throw new AccessDeniedException("You are not allowed to renew this token"); } diff --git a/openbas-api/src/main/java/io/openbas/rest/user/PlayerApi.java b/openbas-api/src/main/java/io/openbas/rest/user/PlayerApi.java index 2653727002..2f53a39f78 100644 --- a/openbas-api/src/main/java/io/openbas/rest/user/PlayerApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/user/PlayerApi.java @@ -4,6 +4,7 @@ import io.openbas.config.SessionManager; import io.openbas.database.model.*; import io.openbas.database.repository.*; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.user.form.player.CreatePlayerInput; import io.openbas.rest.user.form.player.UpdatePlayerInput; @@ -84,7 +85,7 @@ public Iterable players() { if (currentUser.isAdmin()) { players = fromIterable(userRepository.findAll()); } else { - User local = userRepository.findById(currentUser.getId()).orElseThrow(); + User local = userRepository.findById(currentUser.getId()).orElseThrow(ElementNotFoundException::new); List organizationIds = local.getGroups().stream() .flatMap(group -> group.getOrganizations().stream()) .map(Organization::getId) @@ -102,7 +103,7 @@ public Page players(@RequestBody @Valid SearchPaginationInput searchPagina playersFunction = (Specification specification, Pageable pageable) -> this.userRepository .findAll(specification, pageable); } else { - User local = userRepository.findById(currentUser.getId()).orElseThrow(); + User local = userRepository.findById(currentUser.getId()).orElseThrow(ElementNotFoundException::new); List organizationIds = local.getGroups().stream() .flatMap(group -> group.getOrganizations().stream()) .map(Organization::getId) @@ -176,7 +177,7 @@ public User upsertPlayer(@Valid @RequestBody CreatePlayerInput input) { @PreAuthorize("isPlanner()") public User updatePlayer(@PathVariable String userId, @Valid @RequestBody UpdatePlayerInput input) { checkUserAccess(userRepository, userId); - User user = userRepository.findById(userId).orElseThrow(); + User user = userRepository.findById(userId).orElseThrow(ElementNotFoundException::new); if (!currentUser().isAdmin() && user.isManager() && !currentUser().getId().equals(userId)) { throw new UnsupportedOperationException("You dont have the right to update this user"); } @@ -190,7 +191,7 @@ public User updatePlayer(@PathVariable String userId, @Valid @RequestBody Update @PreAuthorize("isPlanner()") public void deletePlayer(@PathVariable String userId) { checkUserAccess(userRepository, userId); - User user = userRepository.findById(userId).orElseThrow(); + User user = userRepository.findById(userId).orElseThrow(ElementNotFoundException::new); if (!currentUser().isAdmin() && user.isManager()) { throw new UnsupportedOperationException("You dont have the right to delete this user"); } diff --git a/openbas-api/src/main/java/io/openbas/rest/user/UserApi.java b/openbas-api/src/main/java/io/openbas/rest/user/UserApi.java index 242be713d4..23e1dbfca3 100644 --- a/openbas-api/src/main/java/io/openbas/rest/user/UserApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/user/UserApi.java @@ -5,6 +5,7 @@ import io.openbas.database.repository.OrganizationRepository; import io.openbas.database.repository.TagRepository; import io.openbas.database.repository.UserRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.exception.InputValidationException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.user.form.login.LoginUserInput; @@ -119,7 +120,7 @@ public User changePasswordReset(@PathVariable String token, @Valid @RequestBody if (!passwordValidation.equals(password)) { throw new InputValidationException("password_validation", "Bad password validation"); } - User changeUser = userRepository.findById(userId).orElseThrow(); + User changeUser = userRepository.findById(userId).orElseThrow(ElementNotFoundException::new); changeUser.setPassword(userService.encodeUserPassword(password)); User savedUser = userRepository.save(changeUser); resetTokenMap.remove(token); @@ -154,7 +155,7 @@ public Page users(@RequestBody @Valid final SearchPaginationInput searchPa @PutMapping("/api/users/{userId}/password") public User changePassword(@PathVariable String userId, @Valid @RequestBody ChangePasswordInput input) { - User user = userRepository.findById(userId).orElseThrow(); + User user = userRepository.findById(userId).orElseThrow(ElementNotFoundException::new); user.setPassword(userService.encodeUserPassword(input.getPassword())); return userRepository.save(user); } @@ -169,7 +170,7 @@ public User createUser(@Valid @RequestBody CreateUserInput input) { @Secured(ROLE_ADMIN) @PutMapping("/api/users/{userId}") public User updateUser(@PathVariable String userId, @Valid @RequestBody UpdateUserInput input) { - User user = userRepository.findById(userId).orElseThrow(); + User user = userRepository.findById(userId).orElseThrow(ElementNotFoundException::new); user.setUpdateAttributes(input); user.setTags(fromIterable(tagRepository.findAllById(input.getTagIds()))); user.setOrganization(updateRelation(input.getOrganizationId(), user.getOrganization(), organizationRepository)); diff --git a/openbas-api/src/main/java/io/openbas/rest/variable/VariableApi.java b/openbas-api/src/main/java/io/openbas/rest/variable/VariableApi.java index fc378feccb..a3a55957ab 100644 --- a/openbas-api/src/main/java/io/openbas/rest/variable/VariableApi.java +++ b/openbas-api/src/main/java/io/openbas/rest/variable/VariableApi.java @@ -4,6 +4,7 @@ import io.openbas.database.model.Scenario; import io.openbas.database.model.Variable; import io.openbas.database.repository.ExerciseRepository; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.helper.RestBehavior; import io.openbas.rest.variable.form.VariableInput; import io.openbas.service.ScenarioService; @@ -39,7 +40,7 @@ public Variable createVariableForExercise( @Valid @RequestBody final VariableInput input) { Variable variable = new Variable(); variable.setUpdateAttributes(input); - Exercise exercise = this.exerciseRepository.findById(exerciseId).orElseThrow(); + Exercise exercise = this.exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new); variable.setExercise(exercise); return this.variableService.createVariable(variable); } 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 d1379965ba..6df6b82c27 100644 --- a/openbas-api/src/main/java/io/openbas/service/ScenarioService.java +++ b/openbas-api/src/main/java/io/openbas/service/ScenarioService.java @@ -5,6 +5,7 @@ import io.openbas.database.model.*; import io.openbas.database.repository.*; import io.openbas.database.specification.ScenarioSpecification; +import io.openbas.rest.exception.ElementNotFoundException; import io.openbas.rest.exercise.exports.ExerciseExportMixins; import io.openbas.rest.exercise.exports.ExerciseFileExport; import io.openbas.rest.exercise.exports.VariableMixin; @@ -127,12 +128,12 @@ public List recurringScenarios(@NotNull final Instant instant) { public Scenario scenario(@NotBlank final String scenarioId) { return this.scenarioRepository.findById(scenarioId) - .orElseThrow(() -> new IllegalStateException("Scenario not found")); + .orElseThrow(() -> new ElementNotFoundException("Scenario not found")); } public Scenario scenarioByExternalReference(@NotBlank final String scenarioExternalReference) { return this.scenarioRepository.findByExternalReference(scenarioExternalReference) - .orElseThrow(() -> new IllegalStateException("Scenario not found")); + .orElseThrow(() -> new ElementNotFoundException("Scenario not found")); } public Scenario updateScenario(@NotNull final Scenario scenario) { scenario.setUpdatedAt(now());