public IHttpActionResult Put(Guid id, FilledFormDTO surveyDTO) { if (id == Guid.Empty) { return(BadRequest("id is empty")); } if (CurrentUser is OrgUser) { if (!HasAccessToEditRecords(surveyDTO.FormTemplateId, surveyDTO.ProjectId)) { return(Unauthorized()); } } var survey = Mapper.Map <FilledForm>(surveyDTO); ModelState.Clear(); Validate(survey); if (!ModelState.IsValid) { return(BadRequest(ModelState)); } try { var dbForm = UnitOfWork.FilledFormsRepository.Find(id); dbForm.SurveyDate = survey.SurveyDate; UnitOfWork.FilledFormsRepository.InsertOrUpdate(dbForm); foreach (var val in surveyDTO.FormValues) { var dbrecord = UnitOfWork.FormValuesRepository.Find(val.Id); if (dbrecord == null) { dbrecord = new FormValue() { FilledFormId = dbForm.Id, MetricId = val.MetricId, RowDataListItemId = val.RowDataListItemId, RowNumber = val.RowNumber }; } dbrecord.NumericValue = val.NumericValue; dbrecord.BoolValue = val.BoolValue; dbrecord.DateValue = val.DateValue; dbrecord.TimeValue = val.TimeValue.HasValue ? new TimeSpan(val.TimeValue.Value.Hour, val.TimeValue.Value.Minute, 0) : (TimeSpan?)null; dbrecord.TextValue = val.TextValue; dbrecord.GuidValue = val.GuidValue; dbrecord.RowNumber = val.RowNumber; if (dbrecord.Metric is DateMetric) { var dateMetric = dbrecord.Metric as DateMetric; if (dbrecord.DateValue.HasValue && !dateMetric.HasTimeValue) { var localDate = TimeZone.CurrentTimeZone.ToLocalTime(dbrecord.DateValue.Value); dbrecord.DateValue = new DateTime(localDate.Year, localDate.Month, localDate.Day, 0, 0, 0, DateTimeKind.Utc); } } if (dbrecord.Metric is AttachmentMetric) { var deletedAttachments = val.Attachments.Where(a => a.isDeleted).ToList(); foreach (var item in deletedAttachments) { UnitOfWork.AttachmentsRepository.Delete(item.Id); } var fileInfos = val.TextValue == string.Empty ? new List <FileInfo>() : val.TextValue.Split(',') .Select(i => HttpContext.Current.Server.MapPath("~/Uploads/" + i)).Select(path => new DirectoryInfo(path).GetFiles().FirstOrDefault()); var attachments = fileInfos.Select(fileInfo => UnitOfWork.AttachmentsRepository.CreateAttachment(fileInfo, dbrecord)); UnitOfWork.AttachmentsRepository.InsertOrUpdate(attachments); dbrecord.TextValue = string.Empty; } UnitOfWork.FormValuesRepository.InsertOrUpdate(dbrecord); } UnitOfWork.Save(); var deletedFormValues = dbForm.FormValues .Where(dv => !survey.FormValues.Any(v => v.Id == dv.Id)) .ToList(); if (deletedFormValues.Any()) { foreach (var deletedFormValue in deletedFormValues) { UnitOfWork.FormValuesRepository.Delete(deletedFormValue); } UnitOfWork.Save(); } var tempAttachments = dbForm.FormValues .SelectMany(v => v.Attachments) .Where(a => a.IsTemp) .ToList(); if (tempAttachments.Any()) { foreach (var attachment in tempAttachments) { UnitOfWork.AttachmentsRepository.StoreFile(attachment); } UnitOfWork.Save(); } MemoryCacher.DeleteStartingWith(CACHE_KEY); return(Ok()); } catch (Exception ex) { return(InternalServerError(ex)); } }
public IHttpActionResult Post(FilledFormDTO survey) { if (CurrentUser is OrgUser) { if (!HasAccessToAddRecords(survey.FormTemplateId, survey.ProjectId)) { return(Unauthorized()); } } var filledForm = Mapper.Map <FilledForm>(survey); filledForm.FilledById = CurrentUser.Id; foreach (var val in filledForm.FormValues.Where(v => UnitOfWork.MetricsRepository.Find(v.MetricId.Value) is DateMetric)) { var dateMetric = val.Metric as DateMetric; // this results in null, it shouldn't! if (dateMetric != null) { if (val.DateValue.HasValue && !dateMetric.HasTimeValue) { var localValue = TimeZone.CurrentTimeZone.ToLocalTime(val.DateValue.Value); val.DateValue = new DateTime(localValue.Year, localValue.Month, localValue.Day, 0, 0, 0, DateTimeKind.Utc); } } } foreach (var val in filledForm.FormValues.Where(v => UnitOfWork.MetricsRepository.Find(v.MetricId.Value) is AttachmentMetric)) { if (val.TextValue == string.Empty) { continue; } var fileInfos = val.TextValue.Split(',') .Select(i => HttpContext.Current.Server.MapPath("~/Uploads/" + i)).Select(path => new DirectoryInfo(path).GetFiles().FirstOrDefault()); var attachments = fileInfos.Select(fileInfo => UnitOfWork.AttachmentsRepository.CreateAttachment(fileInfo, val)); UnitOfWork.AttachmentsRepository.InsertOrUpdate(attachments); val.TextValue = string.Empty; } try { UnitOfWork.FilledFormsRepository.InsertOrUpdate(filledForm); UnitOfWork.Save(disableValidation: true); filledForm.FormValues .SelectMany(v => v.Attachments) .ToList() .ForEach(attachment => UnitOfWork.AttachmentsRepository.StoreFile(attachment)); UnitOfWork.Save(); MemoryCacher.DeleteStartingWith(CACHE_KEY); return(Ok()); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } throw dbEx; } }