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