Skip to content

Commit

Permalink
[backend/frontend] handle relaunch of an atomic testing
Browse files Browse the repository at this point in the history
  • Loading branch information
isselparra committed Nov 21, 2024
1 parent 64c245b commit e4a1047
Show file tree
Hide file tree
Showing 11 changed files with 294 additions and 167 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.openbas.rest.atomic_testing;

import io.openbas.aop.LogExecutionTime;
import io.openbas.database.model.Inject;
import io.openbas.database.model.InjectExpectation;
import io.openbas.inject_expectation.InjectExpectationService;
import io.openbas.rest.atomic_testing.form.AtomicTestingInput;
Expand Down Expand Up @@ -55,12 +54,6 @@ public InjectResultOverviewOutput createAtomicTesting(
return this.atomicTestingService.createOrUpdate(input, null);
}

@PostMapping("/{atomicTestingId}")
public InjectResultOverviewOutput duplicateAtomicTesting(
@PathVariable final String atomicTestingId) {
return atomicTestingService.getDuplicateAtomicTesting(atomicTestingId);
}

@PutMapping("/{injectId}")
@Transactional(rollbackFor = Exception.class)
public InjectResultOverviewOutput updateAtomicTesting(
Expand All @@ -74,9 +67,22 @@ public void deleteAtomicTesting(@PathVariable @NotBlank final String injectId) {
atomicTestingService.deleteAtomicTesting(injectId);
}

@GetMapping("/try/{injectId}")
public Inject tryAtomicTesting(@PathVariable String injectId) {
return atomicTestingService.tryInject(injectId);
@PostMapping("/{atomicTestingId}/duplicate")
public InjectResultOverviewOutput duplicateAtomicTesting(
@PathVariable final String atomicTestingId) {
return atomicTestingService.duplicate(atomicTestingId);
}

@PostMapping("/{atomicTestingId}/launch")
public InjectResultOverviewOutput launchAtomicTesting(
@PathVariable final String atomicTestingId) {
return atomicTestingService.launch(atomicTestingId);
}

@PostMapping("/{atomicTestingId}/relaunch")
public InjectResultOverviewOutput relaunchAtomicTesting(
@PathVariable final String atomicTestingId) {
return atomicTestingService.relaunch(atomicTestingId);
}

@GetMapping("/{injectId}/target_results/{targetId}/types/{targetType}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ private void getListOfDuplicatedInjects(Exercise exercise, Exercise exerciseOrig
.map(
inject ->
injectDuplicateService.createInjectForExercise(
exercise.getId(), inject.getId(), false))
exercise.getId(), inject.getId()))
.toList();
exercise.setInjects(new ArrayList<>(injectListForExercise));
}
Expand Down
13 changes: 4 additions & 9 deletions openbas-api/src/main/java/io/openbas/rest/inject/InjectApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import io.openbas.rest.helper.RestBehavior;
import io.openbas.rest.inject.form.*;
import io.openbas.rest.inject.service.InjectDuplicateService;
import io.openbas.service.AtomicTestingService;
import io.openbas.service.InjectSearchService;
import io.openbas.service.InjectService;
import io.openbas.service.ScenarioService;
Expand Down Expand Up @@ -82,7 +81,6 @@ public class InjectApi extends RestBehavior {
private final ScenarioService scenarioService;
private final InjectService injectService;
private final InjectSearchService injectSearchService;
private final AtomicTestingService atomicTestingService;
private final InjectDuplicateService injectDuplicateService;

// -- INJECTS --
Expand Down Expand Up @@ -165,11 +163,6 @@ public Inject injectExecutionCallback(
return injectRepository.save(inject);
}

@GetMapping("/api/injects/try/{injectId}")
public Inject tryInject(@PathVariable String injectId) {
return atomicTestingService.tryInject(injectId);
}

@Transactional(rollbackFor = Exception.class)
@PutMapping(INJECT_URI + "/{exerciseId}/{injectId}")
@PreAuthorize("isExercisePlanner(#exerciseId)")
Expand Down Expand Up @@ -376,7 +369,8 @@ public Inject createInjectForExercise(
@PreAuthorize("isExercisePlanner(#exerciseId)")
public Inject duplicateInjectForExercise(
@PathVariable final String exerciseId, @PathVariable final String injectId) {
return injectDuplicateService.createInjectForExercise(exerciseId, injectId, true);
return injectDuplicateService.createInjectWithDuplicateWordInTitleForExercise(
exerciseId, injectId);
}

@Transactional(rollbackFor = Exception.class)
Expand Down Expand Up @@ -607,7 +601,8 @@ public Inject createInjectForScenario(
@PreAuthorize("isScenarioPlanner(#scenarioId)")
public Inject duplicateInjectForScenario(
@PathVariable final String scenarioId, @PathVariable final String injectId) {
return injectDuplicateService.createInjectForScenario(scenarioId, injectId, true);
return injectDuplicateService.createInjectWithDuplicateWordInTitleForScenario(
scenarioId, injectId);
}

@GetMapping(SCENARIO_URI + "/{scenarioId}/injects")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.openbas.rest.inject.service;

import static io.openbas.utils.StringUtils.duplicateString;

import io.openbas.database.model.Exercise;
import io.openbas.database.model.Inject;
import io.openbas.database.model.Scenario;
Expand All @@ -8,7 +10,7 @@
import io.openbas.database.repository.InjectRepository;
import io.openbas.database.repository.ScenarioRepository;
import io.openbas.rest.exception.ElementNotFoundException;
import io.openbas.service.AtomicTestingService;
import io.openbas.service.InjectService;
import jakarta.transaction.Transactional;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
Expand All @@ -25,14 +27,26 @@ public class InjectDuplicateService {
private final ScenarioRepository scenarioRepository;
private final InjectRepository injectRepository;
private final InjectDocumentRepository injectDocumentRepository;
private final AtomicTestingService atomicTestingService;

@Transactional
public Inject createInjectForScenario(
@NotBlank final String scenarioId, @NotBlank final String injectId, boolean isChild) {
@NotBlank final String scenarioId, @NotBlank final String injectId) {
Scenario scenario = scenarioRepository.findById(scenarioId).orElseThrow();
Inject injectOrigin = injectRepository.findById(injectId).orElseThrow();
Inject injectDuplicate = InjectService.copyInject(injectOrigin);
injectDuplicate.setScenario(scenario);
Inject saved = injectRepository.save(injectDuplicate);
getDocumentList(saved, injectId);
return saved;
}

@Transactional
public Inject createInjectWithDuplicateWordInTitleForScenario(
@NotBlank final String scenarioId, @NotBlank final String injectId) {
Scenario scenario = scenarioRepository.findById(scenarioId).orElseThrow();
Inject injectOrigin = injectRepository.findById(injectId).orElseThrow();
Inject injectDuplicate = atomicTestingService.copyInject(injectOrigin, isChild);
Inject injectDuplicate = InjectService.copyInject(injectOrigin);
injectDuplicate.setTitle(duplicateString(injectDuplicate.getTitle()));
injectDuplicate.setScenario(scenario);
Inject saved = injectRepository.save(injectDuplicate);
getDocumentList(saved, injectId);
Expand All @@ -41,11 +55,25 @@ public Inject createInjectForScenario(

@Transactional
public Inject createInjectForExercise(
@NotBlank final String exerciseId, @NotBlank final String injectId, boolean isChild) {
@NotBlank final String exerciseId, @NotBlank final String injectId) {
Exercise exercise =
exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new);
Inject injectOrigin = injectRepository.findById(injectId).orElseThrow();
Inject inject = InjectService.copyInject(injectOrigin);
inject.setExercise(exercise);
Inject saved = injectRepository.save(inject);
getDocumentList(saved, injectId);
return saved;
}

@Transactional
public Inject createInjectWithDuplicateWordInTitleForExercise(
@NotBlank final String exerciseId, @NotBlank final String injectId) {
Exercise exercise =
exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new);
Inject injectOrigin = injectRepository.findById(injectId).orElseThrow();
Inject inject = atomicTestingService.copyInject(injectOrigin, isChild);
Inject inject = InjectService.copyInject(injectOrigin);
inject.setTitle(duplicateString(inject.getTitle()));
inject.setExercise(exercise);
Inject saved = injectRepository.save(inject);
getDocumentList(saved, injectId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import static io.openbas.config.SessionHelper.currentUser;
import static io.openbas.helper.StreamHelper.fromIterable;
import static io.openbas.helper.StreamHelper.iterableToSet;
import static io.openbas.utils.StringUtils.duplicateString;
import static io.openbas.utils.pagination.PaginationUtils.buildPaginationCriteriaBuilder;

import com.fasterxml.jackson.core.JsonProcessingException;
Expand All @@ -27,7 +26,6 @@
import jakarta.persistence.criteria.Predicate;
import jakarta.transaction.Transactional;
import jakarta.validation.constraints.NotBlank;
import java.time.Instant;
import java.util.*;
import java.util.stream.StreamSupport;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -59,6 +57,7 @@ public class AtomicTestingService {
private final AssetGroupService assetGroupService;
private final InjectMapper injectMapper;
private final InjectSearchService injectSearchService;
private final InjectService injectService;

private static final String PRE_DEFINE_EXPECTATIONS = "predefinedExpectations";
private static final String EXPECTATIONS = "expectations";
Expand Down Expand Up @@ -204,70 +203,19 @@ public void deleteAtomicTesting(String injectId) {

// -- ACTIONS --

@Transactional
@Validated
public InjectResultOverviewOutput getDuplicateAtomicTesting(@NotBlank String id) {
Inject injectOrigin = injectRepository.findById(id).orElseThrow(ElementNotFoundException::new);
Inject injectDuplicate = copyInject(injectOrigin, true);
injectDuplicate.setExercise(injectOrigin.getExercise());
injectDuplicate.setScenario(injectOrigin.getScenario());
Inject inject = injectRepository.save(injectDuplicate);
return injectMapper.toInjectResultOverviewOutput(inject);
public InjectResultOverviewOutput duplicate(@NotBlank String id) {
return injectService.duplicateInject(id);
}

public Inject copyInject(@NotNull Inject injectOrigin, boolean isAtomic) {
ObjectMapper objectMapper = new ObjectMapper();
Inject injectDuplicate = new Inject();
injectDuplicate.setUser(injectOrigin.getUser());
if (isAtomic) {
injectDuplicate.setTitle(duplicateString(injectOrigin.getTitle()));
} else {
injectDuplicate.setTitle(injectOrigin.getTitle());
}
injectDuplicate.setDescription(injectOrigin.getDescription());
try {
ObjectNode content =
objectMapper.readValue(
objectMapper.writeValueAsString(injectOrigin.getContent()), ObjectNode.class);
injectDuplicate.setContent(content);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
injectDuplicate.setAllTeams(injectOrigin.isAllTeams());
injectDuplicate.setTeams(injectOrigin.getTeams().stream().toList());
injectDuplicate.setEnabled(injectOrigin.isEnabled());
injectDuplicate.setDependsDuration(injectOrigin.getDependsDuration());
if (injectOrigin.getDependsOn() != null) {
injectDuplicate.setDependsOn(injectOrigin.getDependsOn().stream().toList());
}
injectDuplicate.setCountry(injectOrigin.getCountry());
injectDuplicate.setCity(injectOrigin.getCity());
injectDuplicate.setInjectorContract(injectOrigin.getInjectorContract().orElse(null));
injectDuplicate.setAssetGroups(injectOrigin.getAssetGroups().stream().toList());
injectDuplicate.setAssets(injectOrigin.getAssets().stream().toList());
injectDuplicate.setCommunications(injectOrigin.getCommunications().stream().toList());
injectDuplicate.setPayloads(injectOrigin.getPayloads().stream().toList());
injectDuplicate.setTags(new HashSet<>(injectOrigin.getTags()));
return injectDuplicate;
@Validated
public InjectResultOverviewOutput launch(@NotBlank String id) {
return injectService.launchInject(id);
}

@Transactional
public Inject tryInject(String injectId) {
Inject inject = injectRepository.findById(injectId).orElseThrow();

// Reset injects outcome, communications and expectations
inject.clean();
inject.setUpdatedAt(Instant.now());

// New inject status
InjectStatus injectStatus = new InjectStatus();
injectStatus.setInject(inject);
injectStatus.setTrackingSentDate(Instant.now());
injectStatus.setName(ExecutionStatus.QUEUING);
this.injectStatusRepository.save(injectStatus);

// Return inject
return this.injectRepository.save(inject);
@Validated
public InjectResultOverviewOutput relaunch(@NotBlank String id) {
return injectService.relaunchInject(id);
}

// -- PAGINATION --
Expand Down
Loading

0 comments on commit e4a1047

Please sign in to comment.