From 68cdfa80468e79485dbfa3824d993d607dd7e0e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Janis=20Daniel=20Da=CC=88hne?=
 <janis.daehne2@student.uni-halle.de>
Date: Wed, 12 Jun 2019 18:20:11 +0200
Subject: [PATCH] - performance improvements for creating/editing exercises
 (asset contents are excluded now) - create custom project no longer uses
 assets when frontend sends some

---
 .../EditCustomProjectController.cs            | 21 ++++++----
 .../Exercises/ExerciseEditorController.cs     | 40 +++++++++++++------
 2 files changed, 41 insertions(+), 20 deletions(-)

diff --git a/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs b/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs
index b1dbc39..dfde90a 100644
--- a/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs
+++ b/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs
@@ -216,6 +216,11 @@ namespace ClientServer.Controllers.Core.customProjects
                         "", storedTestResults)));
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="customProjectFromFrontend">the custom project (asset file contents are empty because not needed!)</param>
+        /// <returns></returns>
         [HttpPost("create")]
         public async Task CreateCustomProject([FromBody] CustomProjectFullBase customProjectFromFrontend)
         {
@@ -389,7 +394,6 @@ namespace ClientServer.Controllers.Core.customProjects
 
             #region full cusotm project and description
 
-            //TODO currently we don't allow user assets!!
             customProjectFromFrontend.Description.Assets.Clear();
 
             var customProject = new CustomProject()
@@ -399,12 +403,7 @@ namespace ClientServer.Controllers.Core.customProjects
                 Description = new CustomProjectDescription()
                 {
                     Content = customProjectFromFrontend.Description.Content,
-                    Assets = customProjectFromFrontend.Description.Assets.Select(p => new Asset()
-                    {
-                        DisplayName = p.DisplayName,
-                        Content = p.Content.ToArray(),
-                        MimeType = p.MimeType
-                    }).ToList()
+                    Assets = new List<Asset>() //managed via separate api calls
                 },
                 Tests = tests,
                 Solutions = new List<CustomProjectSolution>() {solution},
@@ -633,6 +632,12 @@ namespace ClientServer.Controllers.Core.customProjects
         }
 
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="customProjectId"></param>
+        /// <param name="descriptionFullBase">the description (asset file contents are empty because not needed!)</param>
+        /// <returns></returns>
         [HttpPost("update/{customProjectId}/description")]
         public async Task ChangeCustomProjectDescription(int customProjectId,
             [FromBody] CustomProjectDescriptionFullBase descriptionFullBase)
@@ -1960,6 +1965,8 @@ namespace ClientServer.Controllers.Core.customProjects
 
         /// <summary>
         /// the contents are not included by default
+        ///
+        /// FROM frontend to backend this should be empty!
         /// </summary>
         public List<FileWithData> Assets { get; set; }
     }
diff --git a/src/ClientServer/Controllers/Core/Exercises/ExerciseEditorController.cs b/src/ClientServer/Controllers/Core/Exercises/ExerciseEditorController.cs
index 4b4aacc..ecd1aca 100644
--- a/src/ClientServer/Controllers/Core/Exercises/ExerciseEditorController.cs
+++ b/src/ClientServer/Controllers/Core/Exercises/ExerciseEditorController.cs
@@ -24,15 +24,22 @@ namespace ClientServer.Controllers.Core.Exercises
         {
         }
 
-        private async Task<ExerciseFromBackend> CreateFrontendExercise(Exercise oldExercise, int numReleases)
+        private async Task<ExerciseFromBackend> CreateFrontendExercise(Exercise oldExercise, int numReleases, bool includeAssetFileData)
         {
-            var markdownFilesIdsToRead = oldExercise.Description.AssetReferences
-                .Select(p => p.FileReferenceMarkdownAssetId)
-                .ToArray();
 
-            var markdownAssetsBasePath = Files.GetUploadFilePath(UploadDirType.MarkdownAssets);
+            Dictionary<int, List<byte>> markdownFilesDict = null;
+            
+            if (includeAssetFileData)
+            {
+                var markdownFilesIdsToRead = oldExercise.Description.AssetReferences
+                    .Select(p => p.FileReferenceMarkdownAssetId)
+                    .ToArray();
 
-            var markdownFilesDict = await Files.ReadUploadedFiles(markdownAssetsBasePath, markdownFilesIdsToRead);
+                var markdownAssetsBasePath = Files.GetUploadFilePath(UploadDirType.MarkdownAssets);
+
+                markdownFilesDict = await Files.ReadUploadedFiles(markdownAssetsBasePath, markdownFilesIdsToRead);
+            }
+            
 
             var exerciseForFrontend = new ExerciseFromBackend()
             {
@@ -59,7 +66,9 @@ namespace ClientServer.Controllers.Core.Exercises
                         Id = p.FileReferenceMarkdownAsset.Id,
                         DisplayName = p.FileReferenceMarkdownAsset.OriginalName,
                         MimeType = p.FileReferenceMarkdownAsset.MimeType,
-                        Content = markdownFilesDict[p.FileReferenceMarkdownAssetId]
+                        Content = (includeAssetFileData && markdownFilesDict != null) 
+                            ? markdownFilesDict[p.FileReferenceMarkdownAssetId] 
+                            : new List<byte>()
                     }).ToList()
                 },
                 MetaData = new ExerciseMetaDataFullBase()
@@ -122,7 +131,7 @@ namespace ClientServer.Controllers.Core.Exercises
             return exerciseForFrontend;
         }
 
-        private async Task<ExerciseFromBackendWithData> CreateFrontendExerciseWithData(Exercise oldExercise,
+        private async Task<ExerciseFromBackendWithData> CreateFrontendExerciseWithTestFilesData(Exercise oldExercise,
             int numReleases)
         {
             var markdownFilesIdsToRead = oldExercise.Description.AssetReferences
@@ -324,7 +333,7 @@ namespace ClientServer.Controllers.Core.Exercises
 
             if (shouldLoadTestAssets)
             {
-                var exerciseForFrontendWithData = await CreateFrontendExerciseWithData(oldExercise, numReleases);
+                var exerciseForFrontendWithData = await CreateFrontendExerciseWithTestFilesData(oldExercise, numReleases);
 
                 await
                     Response.WriteAsync(
@@ -334,7 +343,7 @@ namespace ClientServer.Controllers.Core.Exercises
             }
 
 
-            var exerciseForFrontend = await CreateFrontendExercise(oldExercise, numReleases);
+            var exerciseForFrontend = await CreateFrontendExercise(oldExercise, numReleases, true);
 
             await
                 Response.WriteAsync(
@@ -345,7 +354,7 @@ namespace ClientServer.Controllers.Core.Exercises
         /// <summary>
         /// creates a new exercise
         /// </summary>
-        /// <param name="exerciseFromFrontend">the exercise to create</param>
+        /// <param name="exerciseFromFrontend">the exercise to create (asset file contents are empty because not needed!)</param>
         [HttpPost("create")]
         public async Task CreateFullExercise([FromBody] ExerciseForBackend exerciseFromFrontend)
         {
@@ -616,8 +625,10 @@ namespace ClientServer.Controllers.Core.Exercises
 
         /// <summary>
         /// updates an existing exercise
+        ///
+        /// the returned exercise omits the asset contents!
         /// </summary>
-        /// <param name="exerciseFromFrontend">the exercise to update</param>
+        /// <param name="exerciseFromFrontend">the exercise to update (asset file contents are empty because not needed!)</param>
         [HttpPost("update")]
         public async Task ChangeFullExercise([FromBody] ExerciseForBackend exerciseFromFrontend)
         {
@@ -1283,7 +1294,8 @@ namespace ClientServer.Controllers.Core.Exercises
                     .CountAsync(p => p.ExerciseId == oldExercise.Id)
                 ;
 
-            var exerciseForFrontend = await CreateFrontendExercise(oldExercise, numReleases);
+            //assets are not included on update!!
+            var exerciseForFrontend = await CreateFrontendExercise(oldExercise, numReleases, false);
 
             await
                 Response.WriteAsync(
@@ -2481,6 +2493,8 @@ namespace ClientServer.Controllers.Core.Exercises
         /// <summary>
         /// the assets (files) are only send from backend to frontend
         /// frontend need to add these through separate requests!
+        ///
+        /// FROM frontend to backend this is always empty!
         /// </summary>
         public List<FileWithData> Assets { get; set; }
 
-- 
GitLab