From f9f0104bb88b82204805fe11085849fd58a499dc Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 7 Sep 2020 18:04:34 +0000 Subject: [PATCH] --- .../AyaNova/Controllers/ReportController.cs | 106 ++++++++++++++++-- 1 file changed, 97 insertions(+), 9 deletions(-) diff --git a/server/AyaNova/Controllers/ReportController.cs b/server/AyaNova/Controllers/ReportController.cs index bd3b4488..6009bedc 100644 --- a/server/AyaNova/Controllers/ReportController.cs +++ b/server/AyaNova/Controllers/ReportController.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -12,6 +13,7 @@ using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; using AyaNova.Util; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace AyaNova.Api.Controllers { @@ -260,7 +262,7 @@ namespace AyaNova.Api.Controllers { await Task.Delay(ServerBootConfig.FAILED_AUTH_DELAY);//DOS protection return StatusCode(401, new ApiErrorResponse(ApiErrorCode.AUTHENTICATION_FAILED)); - } + } if (!FileUtil.TemporaryFileExists(fileName)) { @@ -305,24 +307,110 @@ namespace AyaNova.Api.Controllers var asText = Newtonsoft.Json.JsonConvert.SerializeObject( o, Newtonsoft.Json.Formatting.None, - new JsonSerializerSettings { ContractResolver = new AyaNova.Util.JsonUtil.ShouldSerializeContractResolver(new string[] { "Concurrency", "Id", "ReportId" }) }); + new JsonSerializerSettings { ContractResolver = new AyaNova.Util.JsonUtil.ShouldSerializeContractResolver(new string[] { "Concurrency", "Id" }) }); var bytes = System.Text.Encoding.UTF8.GetBytes(asText); var file = new FileContentResult(bytes, "application/octet-stream"); - file.FileDownloadName = Util.FileUtil.StringToSafeFileName(o.Name) + ".json"; + file.FileDownloadName = Util.FileUtil.StringToSafeFileName(o.Name) + ".ayrt"; return file; } + + + + /// + /// Upload Reprot template export file + /// Max 15mb total + /// + /// Accepted + [Authorize] + [HttpPost("upload")] + [DisableFormValueModelBinding] + [RequestSizeLimit(15000000)]//currently the largest v7 export for a report template is 828kb, I'm guessing 15mb is more than enough + public async Task UploadAsync() + { + //Adapted from the example found here: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads#uploading-large-files-with-streaming + + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + + // AyaTypeId attachToObject = null; + ApiUploadProcessor.ApiUploadedFilesResult uploadFormData = null; + try + { + if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType)) + return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, $"Expected a multipart request, but got {Request.ContentType}")); + + //Save uploads to disk under temporary file names until we decide how to handle them + uploadFormData = await ApiUploadProcessor.ProcessUploadAsync(HttpContext); + + + + List FileData = new List(); + + if (!uploadFormData.FormFieldData.ContainsKey("FileData"))//only filedata is required + { + return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "Missing required FormFieldData value: FileData")); + } + + //fileData in JSON stringify format which contains the actual last modified dates etc + //"[{\"name\":\"Client.csv\",\"lastModified\":1582822079618},{\"name\":\"wmi4fu06nrs41.jpg\",\"lastModified\":1586900220990}]" + FileData = Newtonsoft.Json.JsonConvert.DeserializeObject>(uploadFormData.FormFieldData["FileData"].ToString()); + + + + + // long UserId = UserIdFromContext.Id(HttpContext.Items); + //Instantiate the business object handler + TranslationBiz biz = TranslationBiz.GetBiz(ct, HttpContext); + + + //We have our files now can parse and insert into db + if (uploadFormData.UploadedFiles.Count > 0) + { + //deserialize each file and import + foreach (UploadedFileInfo a in uploadFormData.UploadedFiles) + { + JObject o = JObject.Parse(System.IO.File.ReadAllText(a.InitialUploadedPathName)); + if (!await biz.ImportAsync(o)) + { + //delete all the files temporarily uploaded and return bad request + DeleteTempUploadFile(uploadFormData); + return BadRequest(new ApiErrorResponse(biz.Errors)); + } + } + } + } + catch (System.IO.InvalidDataException ex) + { + return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, ex.Message)); + } + finally + { + //delete all the files temporarily uploaded and return bad request + + DeleteTempUploadFile(uploadFormData); + } + + //Return the list of attachment ids and filenames + return Accepted(); + } + + private static void DeleteTempUploadFile(ApiUploadProcessor.ApiUploadedFilesResult uploadFormData) + { + if (uploadFormData.UploadedFiles.Count > 0) + { + foreach (UploadedFileInfo a in uploadFormData.UploadedFiles) + { + System.IO.File.Delete(a.InitialUploadedPathName); + } + } + } //----------------------------------------- - //------------ - /* - NOTES/TODO during testing - Need job to automatically erase any temp files older than 5 minutes (or whatever) - - */ }//eoc }//eons \ No newline at end of file