22
22
import io .openbas .database .specification .*;
23
23
import io .openbas .rest .exception .ElementNotFoundException ;
24
24
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 .*;
29
26
import io .openbas .rest .exercise .form .*;
30
27
import io .openbas .rest .exercise .response .ExercisesGlobalScoresOutput ;
31
28
import io .openbas .rest .exercise .service .ExerciseService ;
@@ -752,119 +749,15 @@ public void exerciseExport(
752
749
@ RequestParam (required = false ) final boolean isWithVariableValues ,
753
750
HttpServletResponse response )
754
751
throws IOException {
755
- // Setup the mapper for export
756
- List <String > documentIds = new ArrayList <>();
757
752
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
+
765
754
Exercise exercise =
766
755
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
+
868
761
// Build the response
869
762
String infos =
870
763
"("
@@ -882,10 +775,14 @@ public void exerciseExport(
882
775
ZipEntry zipEntry = new ZipEntry (exercise .getName () + ".json" );
883
776
zipEntry .setComment (EXPORT_ENTRY_EXERCISE );
884
777
zipExport .putNextEntry (zipEntry );
885
- zipExport .write (objectMapper .writerWithDefaultPrettyPrinter ().writeValueAsBytes (importExport ));
778
+ zipExport .write (
779
+ importExport
780
+ .getObjectMapper ()
781
+ .writerWithDefaultPrettyPrinter ()
782
+ .writeValueAsBytes (importExport ));
886
783
zipExport .closeEntry ();
887
784
// Add the documents
888
- documentIds .stream ()
785
+ importExport . getAllDocumentIds () .stream ()
889
786
.distinct ()
890
787
.forEach (
891
788
docId -> {
0 commit comments