Пример #1
0
        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));
            }
        }
Пример #2
0
        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;
            }
        }