public void SaveAnswers(Dictionary <string, dynamic> viewModel, string guid, string form, IEnumerable <CustomFormFile> files, bool isPageValid, bool appendMultipleFileUploadParts = false) { var formData = _distributedCache.GetString(guid); var convertedAnswers = new FormAnswers { Pages = new List <PageAnswers>() }; var currentPageAnswers = new PageAnswers(); if (!string.IsNullOrEmpty(formData)) { convertedAnswers = JsonConvert.DeserializeObject <FormAnswers>(formData); } if (convertedAnswers.Pages != null && convertedAnswers.Pages.Any(_ => _.PageSlug == viewModel["Path"].ToLower())) { currentPageAnswers = convertedAnswers.Pages.Where(_ => _.PageSlug == viewModel["Path"].ToLower()).ToList().FirstOrDefault(); convertedAnswers.Pages = convertedAnswers.Pages.Where(_ => _.PageSlug != viewModel["Path"].ToLower()).ToList(); } var answers = new List <Answers>(); foreach (var item in viewModel) { if (!_disallowedKeys.DisallowedAnswerKeys.Any(key => item.Key.Contains(key))) { answers.Add(new Answers { QuestionId = item.Key, Response = item.Value }); } } if ((files == null || !files.Any()) && currentPageAnswers.Answers != null && currentPageAnswers.Answers.Any() && isPageValid && appendMultipleFileUploadParts) { answers = currentPageAnswers.Answers; } if (files != null && files.Any() && isPageValid) { answers = SaveFormFileAnswers(answers, files, appendMultipleFileUploadParts, currentPageAnswers); } convertedAnswers.Pages?.Add(new PageAnswers { PageSlug = viewModel["Path"].ToLower(), Answers = answers }); convertedAnswers.Path = viewModel["Path"]; convertedAnswers.FormName = form; _distributedCache.SetStringAsync(guid, JsonConvert.SerializeObject(convertedAnswers)); }
public List <Answers> SaveFormFileAnswers(List <Answers> answers, IEnumerable <CustomFormFile> files, bool isMultipleFileUploadElementType, PageAnswers currentAnswersForFileUpload) { files.GroupBy(_ => _.QuestionId).ToList().ForEach(file => { var fileUploadModel = new List <FileUploadModel>(); var filsToAdd = file.ToList(); if (isMultipleFileUploadElementType) { var data = currentAnswersForFileUpload.Answers?.FirstOrDefault(_ => _.QuestionId.Equals(file.Key))?.Response; if (data != null) { List <FileUploadModel> response = JsonConvert.DeserializeObject <List <FileUploadModel> >(data.ToString()); fileUploadModel.AddRange(response); filsToAdd = filsToAdd.Where(_ => !response.Any(x => WebUtility.HtmlEncode(_.UntrustedOriginalFileName) == x.TrustedOriginalFileName)).ToList(); } } var keys = filsToAdd.Select(_ => $"file-{file.Key}-{Guid.NewGuid()}").ToArray(); var fileContent = filsToAdd.Select(_ => _.Base64EncodedContent).ToList(); for (int i = 0; i < fileContent.Count; i++) { _distributedCache.SetStringAsync(keys[i], JsonConvert.SerializeObject(fileContent[i]), _distributedCacheExpirationConfiguration.FileUpload); } fileUploadModel.AddRange(filsToAdd.Select((_, index) => new FileUploadModel { Key = keys[index], TrustedOriginalFileName = WebUtility.HtmlEncode(_.UntrustedOriginalFileName), UntrustedOriginalFileName = _.UntrustedOriginalFileName, FileSize = _.Length }).ToList()); if (answers.Exists(_ => _.QuestionId == file.Key)) { var fileUploadAnswer = answers.FirstOrDefault(_ => _.QuestionId == file.Key); if (fileUploadAnswer != null) { fileUploadAnswer.Response = fileUploadModel; } } else { answers.Add(new Answers { QuestionId = file.Key, Response = fileUploadModel }); } }); return(answers); }