Skip to content

Commit f9139f7

Browse files
authored
[backend/tests] export of simulations, JSON (chunk 1) (#1489) (#2156)
Signed-off-by: Antoine MAZEAS <[email protected]>
1 parent 2be0f4e commit f9139f7

29 files changed

+1811
-129
lines changed

openbas-api/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,12 @@
253253
<artifactId>logback-jackson</artifactId>
254254
<version>0.1.5</version>
255255
</dependency>
256+
<dependency>
257+
<groupId>net.javacrumbs.json-unit</groupId>
258+
<artifactId>json-unit-assertj</artifactId>
259+
<version>4.1.0</version>
260+
<scope>test</scope>
261+
</dependency>
256262
</dependencies>
257263

258264
<build>

openbas-api/src/main/java/io/openbas/rest/exercise/ExerciseApi.java

Lines changed: 13 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@
2222
import io.openbas.database.specification.*;
2323
import io.openbas.rest.exception.ElementNotFoundException;
2424
import io.openbas.rest.exception.InputValidationException;
25-
import io.openbas.rest.exercise.exports.ExerciseExportMixins;
26-
import io.openbas.rest.exercise.exports.ExerciseFileExport;
27-
import io.openbas.rest.exercise.exports.VariableMixin;
28-
import io.openbas.rest.exercise.exports.VariableWithValueMixin;
25+
import io.openbas.rest.exercise.exports.*;
2926
import io.openbas.rest.exercise.form.*;
3027
import io.openbas.rest.exercise.response.ExercisesGlobalScoresOutput;
3128
import io.openbas.rest.exercise.service.ExerciseService;
@@ -752,119 +749,15 @@ public void exerciseExport(
752749
@RequestParam(required = false) final boolean isWithVariableValues,
753750
HttpServletResponse response)
754751
throws IOException {
755-
// Setup the mapper for export
756-
List<String> documentIds = new ArrayList<>();
757752
ObjectMapper objectMapper = mapper.copy();
758-
if (!isWithPlayers) {
759-
objectMapper.addMixIn(
760-
ExerciseFileExport.class, ExerciseExportMixins.ExerciseFileExport.class);
761-
}
762-
// Start exporting exercise
763-
ExerciseFileExport importExport = new ExerciseFileExport();
764-
importExport.setVersion(1);
753+
765754
Exercise exercise =
766755
exerciseRepository.findById(exerciseId).orElseThrow(ElementNotFoundException::new);
767-
objectMapper.addMixIn(Exercise.class, ExerciseExportMixins.Exercise.class);
768-
// Build the export
769-
importExport.setExercise(exercise);
770-
importExport.setDocuments(exercise.getDocuments());
771-
documentIds.addAll(exercise.getDocuments().stream().map(Document::getId).toList());
772-
objectMapper.addMixIn(Document.class, ExerciseExportMixins.Document.class);
773-
List<Tag> exerciseTags = new ArrayList<>(exercise.getTags());
774-
// Objectives
775-
List<Objective> objectives = exercise.getObjectives();
776-
importExport.setObjectives(objectives);
777-
objectMapper.addMixIn(Objective.class, ExerciseExportMixins.Objective.class);
778-
// Lessons categories
779-
List<LessonsCategory> lessonsCategories = exercise.getLessonsCategories();
780-
importExport.setLessonsCategories(lessonsCategories);
781-
objectMapper.addMixIn(LessonsCategory.class, ExerciseExportMixins.LessonsCategory.class);
782-
// Lessons questions
783-
List<LessonsQuestion> lessonsQuestions =
784-
lessonsCategories.stream().flatMap(category -> category.getQuestions().stream()).toList();
785-
importExport.setLessonsQuestions(lessonsQuestions);
786-
objectMapper.addMixIn(LessonsQuestion.class, ExerciseExportMixins.LessonsQuestion.class);
787-
if (isWithTeams) {
788-
// Teams
789-
List<Team> teams = exercise.getTeams();
790-
importExport.setTeams(teams);
791-
objectMapper.addMixIn(
792-
Team.class,
793-
isWithPlayers ? ExerciseExportMixins.Team.class : ExerciseExportMixins.EmptyTeam.class);
794-
exerciseTags.addAll(teams.stream().flatMap(team -> team.getTags().stream()).toList());
795-
}
796-
if (isWithPlayers) {
797-
// players
798-
List<User> players =
799-
exercise.getTeams().stream()
800-
.flatMap(team -> team.getUsers().stream())
801-
.distinct()
802-
.toList();
803-
exerciseTags.addAll(players.stream().flatMap(user -> user.getTags().stream()).toList());
804-
importExport.setUsers(players);
805-
objectMapper.addMixIn(User.class, ExerciseExportMixins.User.class);
806-
// organizations
807-
List<Organization> organizations =
808-
players.stream().map(User::getOrganization).filter(Objects::nonNull).distinct().toList();
809-
exerciseTags.addAll(organizations.stream().flatMap(org -> org.getTags().stream()).toList());
810-
importExport.setOrganizations(organizations);
811-
objectMapper.addMixIn(Organization.class, ExerciseExportMixins.Organization.class);
812-
}
813-
// Injects
814-
List<Inject> injects = exercise.getInjects();
815-
injects.forEach(
816-
inject -> {
817-
exerciseTags.addAll(inject.getTags());
818-
inject
819-
.getInjectorContract()
820-
.ifPresent(
821-
injectorContract -> {
822-
if (injectorContract.getPayload() != null) {
823-
exerciseTags.addAll(injectorContract.getPayload().getTags());
824-
}
825-
});
826-
exerciseTags.addAll(inject.getTags());
827-
});
828-
exerciseTags.addAll(injects.stream().flatMap(inject -> inject.getTags().stream()).toList());
829-
importExport.setInjects(injects);
830-
objectMapper.addMixIn(Inject.class, ExerciseExportMixins.Inject.class);
831-
// Documents
832-
exerciseTags.addAll(
833-
exercise.getDocuments().stream().flatMap(doc -> doc.getTags().stream()).toList());
834-
// Articles / Channels
835-
List<Article> articles = exercise.getArticles();
836-
importExport.setArticles(articles);
837-
objectMapper.addMixIn(Article.class, ExerciseExportMixins.Article.class);
838-
List<Channel> channels = articles.stream().map(Article::getChannel).distinct().toList();
839-
documentIds.addAll(
840-
channels.stream()
841-
.flatMap(channel -> channel.getLogos().stream())
842-
.map(Document::getId)
843-
.toList());
844-
importExport.setChannels(channels);
845-
objectMapper.addMixIn(Channel.class, ExerciseExportMixins.Channel.class);
846-
// Challenges
847-
List<Challenge> challenges = fromIterable(challengeService.getExerciseChallenges(exerciseId));
848-
importExport.setChallenges(challenges);
849-
documentIds.addAll(
850-
challenges.stream()
851-
.flatMap(challenge -> challenge.getDocuments().stream())
852-
.map(Document::getId)
853-
.toList());
854-
objectMapper.addMixIn(Challenge.class, ExerciseExportMixins.Challenge.class);
855-
exerciseTags.addAll(
856-
challenges.stream().flatMap(challenge -> challenge.getTags().stream()).toList());
857-
// Tags
858-
importExport.setTags(exerciseTags.stream().distinct().toList());
859-
objectMapper.addMixIn(Tag.class, ExerciseExportMixins.Tag.class);
860-
// -- Variables --
861-
List<Variable> variables = this.variableService.variablesFromExercise(exerciseId);
862-
importExport.setVariables(variables);
863-
if (isWithVariableValues) {
864-
objectMapper.addMixIn(Variable.class, VariableWithValueMixin.class);
865-
} else {
866-
objectMapper.addMixIn(Variable.class, VariableMixin.class);
867-
}
756+
ExerciseFileExport importExport =
757+
ExerciseFileExport.fromExercise(
758+
exercise, objectMapper, this.variableService, this.challengeService)
759+
.withOptions(ExportOptions.mask(isWithPlayers, isWithTeams, isWithVariableValues));
760+
868761
// Build the response
869762
String infos =
870763
"("
@@ -882,10 +775,14 @@ public void exerciseExport(
882775
ZipEntry zipEntry = new ZipEntry(exercise.getName() + ".json");
883776
zipEntry.setComment(EXPORT_ENTRY_EXERCISE);
884777
zipExport.putNextEntry(zipEntry);
885-
zipExport.write(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(importExport));
778+
zipExport.write(
779+
importExport
780+
.getObjectMapper()
781+
.writerWithDefaultPrettyPrinter()
782+
.writeValueAsBytes(importExport));
886783
zipExport.closeEntry();
887784
// Add the documents
888-
documentIds.stream()
785+
importExport.getAllDocumentIds().stream()
889786
.distinct()
890787
.forEach(
891788
docId -> {

0 commit comments

Comments
 (0)