diff --git a/docs/8.0/ayanova/docs/form-adm-import.md b/docs/8.0/ayanova/docs/form-adm-import.md new file mode 100644 index 00000000..16e6c65e --- /dev/null +++ b/docs/8.0/ayanova/docs/form-adm-import.md @@ -0,0 +1,3 @@ +# ADM-IMPORT Placeholder + +TODO: How to use the IMPORT feature, limitations, auto tag, etc diff --git a/docs/8.0/ayanova/mkdocs.yml b/docs/8.0/ayanova/mkdocs.yml index a113ab01..803b169f 100644 --- a/docs/8.0/ayanova/mkdocs.yml +++ b/docs/8.0/ayanova/mkdocs.yml @@ -74,7 +74,8 @@ nav: - 'Translations': 'form-adm-translations.md' - 'Report templates': 'form-adm-report-templates.md' - 'Attached files': 'form-adm-attachments.md' - - 'History': 'form-adm-history.md' + - 'History': 'form-adm-history.md' + - 'Import': 'form-adm-import.md' - 'Vendors': 'form-vendors.md' - Misc: - 'About': 'form-ay-about.md' diff --git a/server/AyaNova/Controllers/ImportController.cs b/server/AyaNova/Controllers/ImportController.cs index d79c949f..fae741a1 100644 --- a/server/AyaNova/Controllers/ImportController.cs +++ b/server/AyaNova/Controllers/ImportController.cs @@ -68,35 +68,35 @@ namespace AyaNova.Api.Controllers //Save uploads to disk under temporary file names until we decide how to handle them uploadFormData = await ApiUploadProcessor.ProcessUploadAsync(HttpContext); - bool badRequest = false; + string UploadObjectType = string.Empty; string errorMessage = string.Empty; string Notes = string.Empty; List FileData = new List(); - if ( - !uploadFormData.FormFieldData.ContainsKey("FileData"))//only filedata is required - { - badRequest = true; - errorMessage = "Missing required FormFieldData value: FileData"; - } - if (!badRequest) - { - if (uploadFormData.FormFieldData.ContainsKey("ObjectType")) - UploadObjectType = uploadFormData.FormFieldData["ObjectType"].ToString(); + if (!uploadFormData.FormFieldData.ContainsKey("FileData"))//only filedata is required + return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "Missing required FormFieldData value: FileData")); + + + if (uploadFormData.FormFieldData.ContainsKey("ObjectType")) + UploadObjectType = uploadFormData.FormFieldData["ObjectType"].ToString(); + else + return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "Missing required FormFieldData value: ObjectType")); + + //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()); - //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()); - } //Instantiate the business object handler AyaType TheType = System.Enum.Parse(UploadObjectType, true); log.LogDebug($"Instantiating biz object handler for {TheType}"); var biz = BizObjectFactory.GetBizObject(TheType, ct); + if (!(biz is IImportAbleObject)) + return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, $"Import not supported for {TheType} objects")); //We have our files now can parse and insert into db if (uploadFormData.UploadedFiles.Count > 0) diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 91501cc5..5366b214 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -336,25 +336,26 @@ namespace AyaNova.Biz public async Task> ImportData(JArray ja) { List ImportResult = new List(); + string ImportTag=$"imported-{FileUtil.GetSafeDateFileName()}"; + var jsset = JsonSerializer.CreateDefault(new JsonSerializerSettings { ContractResolver = new AyaNova.Util.JsonUtil.ShouldSerializeContractResolver(new string[] { "Concurrency", "Id", "CustomFields" }) }); foreach (JObject j in ja) { var w = j.ToObject(jsset); if (j["CustomFields"] != null) w.CustomFields = j["CustomFields"].ToString(); + w.Tags.Add(ImportTag);//so user can find them all and revert later if necessary var res = await CreateAsync(w); if (res == null) { - ImportResult.Add($"{w.Name} - {this.GetErrorsAsString()}"); + ImportResult.Add($"* {w.Name} - {this.GetErrorsAsString()}"); this.ClearErrors(); } else { ImportResult.Add($"{w.Name} - ok"); } - } - return ImportResult; }