public async Task SaveFormModelToDbAsync(DynamicForm formModel, string formSubmissionId, string formUrlSlug, string sectionUrlSlug, bool isValid, CancellationToken cancellationToken = default(CancellationToken)) { var formDisplayValues = GetFormDisplayValues(formModel); var formSubmissionGuid = new Guid(formSubmissionId); FormSubmissionDto submission = await _dynamicFormsApplicationServices.FormSubmissionApplicationService.GetByIdAsync(formSubmissionGuid, cancellationToken); bool newSubmission = true; if (submission != null) { newSubmission = false; } FormSectionSubmissionDto sectionSubmission = null; if (!string.IsNullOrEmpty(formSubmissionId) && !string.IsNullOrEmpty(sectionUrlSlug)) { sectionSubmission = await _dynamicFormsApplicationServices.FormSectionSubmissionApplicationService.GetOneAsync(cancellationToken, fss => fss.FormSubmissionId == formSubmissionGuid && fss.UrlSlug == sectionUrlSlug, true); } bool newSectionSubmission = false; if (sectionSubmission == null) { newSectionSubmission = true; sectionSubmission = new FormSectionSubmissionDto() { FormSubmissionId = formSubmissionGuid, UrlSlug = sectionUrlSlug }; } sectionSubmission.Valid = isValid; var form = await GetFormByUrlSlugAsync(formUrlSlug, cancellationToken); var section = await GetSectionByUrlSlugsAsync(formUrlSlug, sectionUrlSlug); foreach (var sectionQuestion in section.Questions) { var question = sectionQuestion.Question; var answer = ""; if (formDisplayValues.ContainsKey(question.FieldName)) { answer = formDisplayValues[question.FieldName]; } var questionAnswer = sectionSubmission.QuestionAnswers.FirstOrDefault(qa => qa.FieldName == question.FieldName); if (questionAnswer == null) { questionAnswer = new FormSectionSubmissionQuestionAnswerDto() { FieldName = question.FieldName, FormSectionSubmissionId = sectionSubmission.Id }; sectionSubmission.QuestionAnswers.Add(questionAnswer); } questionAnswer.Question = question.QuestionText; questionAnswer.Answer = answer; } if (newSubmission) { var newFormSubmission = new FormSubmissionDto() { Id = formSubmissionGuid, FormId = form.Id }; newFormSubmission.Sections.Add(sectionSubmission); await _dynamicFormsApplicationServices.FormSubmissionApplicationService.CreateAsync(newFormSubmission, "", cancellationToken); } else { if (newSectionSubmission) { await _dynamicFormsApplicationServices.FormSectionSubmissionApplicationService.CreateAsync(sectionSubmission, "", cancellationToken); } else { await _dynamicFormsApplicationServices.FormSectionSubmissionApplicationService.UpdateGraphAsync(sectionSubmission.Id, sectionSubmission, "", cancellationToken); } } }
public async Task PopulateFormModelFromDbAsync(DynamicForm formModel, string formSubmissionId, string sectionUrlSlug, CancellationToken cancellationToken = default(CancellationToken)) { FormSectionSubmissionDto sectionSubmission = null; if (!string.IsNullOrEmpty(formSubmissionId) && !string.IsNullOrEmpty(sectionUrlSlug)) { var formSubmissionGuid = new Guid(formSubmissionId); sectionSubmission = await _dynamicFormsApplicationServices.FormSectionSubmissionApplicationService.GetOneAsync(cancellationToken, fss => fss.FormSubmissionId == formSubmissionGuid && fss.UrlSlug == sectionUrlSlug, true); } if (sectionSubmission != null) { var properties = formModel.GetProperties(); foreach (var propertyName in formModel.GetDynamicMemberNames()) { var persistedValue = sectionSubmission.QuestionAnswers.Where(qa => qa.FieldName == propertyName).FirstOrDefault(); if (persistedValue != null) { bool isCollection = formModel.IsCollectionProperty(propertyName); var property = properties.Find(propertyName, true); if (isCollection) { var genericCollectionType = typeof(List <>).MakeGenericType(property.PropertyType.GetGenericArguments()[0]); var newCollection = Activator.CreateInstance(genericCollectionType); formModel[propertyName] = newCollection; var addMethod = genericCollectionType.GetMethod("Add"); foreach (var csvSplit in persistedValue.Answer.Split(',')) { var convertedValue = Convert.ChangeType(csvSplit.Trim(), property.PropertyType.GetGenericArguments()[0]); addMethod.Invoke(newCollection, new object[] { convertedValue }); } } else if (property.PropertyType == typeof(DateTime)) { if (!String.IsNullOrWhiteSpace(persistedValue.Answer)) { //ISO 8601 var parsedValue = DateTime.Parse(persistedValue.Answer, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind); formModel[propertyName] = parsedValue; } else { formModel[propertyName] = new DateTime(); } } else if (property.PropertyType == typeof(bool)) { formModel[propertyName] = BoolParser.GetValue(persistedValue.Answer); } else if (property.PropertyType == typeof(decimal)) { var convertedValue = decimal.Parse(persistedValue.Answer, NumberStyles.Currency); formModel[propertyName] = convertedValue; } else { var convertedValue = Convert.ChangeType(persistedValue.Answer, property.PropertyType); formModel[propertyName] = convertedValue; } } } } }