Exemple #1
0
        public HttpResponseMessage Put([FromBody] WorkoutDiaryEntryDTO workoutDiaryEntryDTO)
        {
            try
            {
                // Выбираем запись из БД для обновления
                var workoutDiaryEntry = unitOfWork.WorkoutDiaryEntryRepository.Get(
                    f =>
                    (f.CreateUserId == currentUserId &&
                     f.WorkoutDiaryEntryId == workoutDiaryEntryDTO.WorkoutDiaryEntryId),
                    null,
                    iE => iE.Exercise,
                    iS => iS.Sets)
                                        .SingleOrDefault();

                // Записи нет в БД FT
                if (workoutDiaryEntry == null)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
                }

                var workoutDiaryEntryUpdateObj = Mapper.Map <WorkoutDiaryEntry>(workoutDiaryEntryDTO);
                foreach (WorkoutSet newSet in workoutDiaryEntryUpdateObj.Sets)
                {
                    var oldSet = workoutDiaryEntry.Sets.Where(
                        i => i.WorkoutSetId == newSet.WorkoutSetId)
                                 .SingleOrDefault();
                    if (oldSet == null)
                    {
                        // Сета нет в БД. Добавляем.
                        unitOfWork.WorkoutSetRepository.Insert(new WorkoutSet
                        {
                            Duration            = newSet.Duration,
                            Distance            = newSet.Distance,
                            IsCompleted         = newSet.IsCompleted,
                            Order               = newSet.Order,
                            Reps                = newSet.Reps,
                            Rest                = newSet.Rest,
                            Weight              = newSet.Weight,
                            WorkoutDiaryEntryId = workoutDiaryEntry.WorkoutDiaryEntryId
                        });
                    }
                    else
                    {
                        // Сет есть в БД. Обновляем.
                        oldSet.Distance    = newSet.Distance;
                        oldSet.Duration    = newSet.Duration;
                        oldSet.IsCompleted = newSet.IsCompleted;
                        oldSet.Order       = newSet.Order;
                        oldSet.Reps        = newSet.Reps;
                        oldSet.Rest        = newSet.Rest;
                        oldSet.Weight      = newSet.Weight;
                    }
                }
                workoutDiaryEntry.DateUTC = workoutDiaryEntryUpdateObj.DateUTC;

                #region __Подсчитываем количество сожженных калорий__
                if (workoutDiaryEntry.Exercise.MET.HasValue && workoutDiaryEntry.Exercise.MET.Value != 0)
                {
                    var setsDuration = workoutDiaryEntry.Sets.Select(s => s.Duration).Sum();
                    if (setsDuration > 0)
                    {
                        // Получаем информацию о пользователе для подсчета сожженных калорий (вес, возраст)
                        var userProfile = unitOfWork.UserProfileRepository.Get(
                            f => (f.UserId == currentUserId),
                            null,
                            i => i.Weights)
                                          .SingleOrDefault();
                        // Пользователя нет в БД
                        if (userProfile == null)
                        {
                            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
                        }

                        if (userProfile.Weights.Any())
                        {
                            var weight = userProfile.Weights.OrderByDescending(d => d.Date).First().Weight;
                            if (weight > 0)
                            {
                                workoutDiaryEntry.BurnedCalories =
                                    WorkoutHelper.GetBurnedCalories(workoutDiaryEntry.Exercise.MET.Value, weight, setsDuration);
                            }
                        }
                    }
                }
                #endregion

                // Информация о изменении
                workoutDiaryEntry.CreationInfo.LastModifiedTimeUTC = TimeHelper.DateTimeUtcNow;

                // Обновляем запись
                unitOfWork.WorkoutDiaryEntryRepository.Update(workoutDiaryEntry);
                unitOfWork.Save();

                //Преобразовываем обратно, чтобы вернуть клиенту
                workoutDiaryEntryDTO = Mapper.Map <WorkoutDiaryEntryDTO>(workoutDiaryEntry);
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException ex)
            {
                // Retrieve the error messages as a list of strings.
                var errorMessages = ex.EntityValidationErrors
                                    .SelectMany(x => x.ValidationErrors)
                                    .Select(x => x.ErrorMessage);
                // Join the list to a single string.
                var fullErrorMessage = string.Join("; ", errorMessages);

                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.InternalServerError));
            }
            catch (Exception ex)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }

            return(Request.CreateResponse <WorkoutDiaryEntryDTO>(HttpStatusCode.OK, workoutDiaryEntryDTO));
        }
Exemple #2
0
        public HttpResponseMessage Post([FromBody] WorkoutDiaryEntryDTO workoutDiaryEntryDTO)
        {
            var currentTime = TimeHelper.UnixMsNow;

            // Информация о создании
            workoutDiaryEntryDTO.CreateUserId = currentUserId;
            workoutDiaryEntryDTO.CreationInfo.CreationTime         =
                workoutDiaryEntryDTO.CreationInfo.LastModifiedTime = currentTime;

            try
            {
                var workoutDiaryEntry = Mapper.Map <WorkoutDiaryEntry>(workoutDiaryEntryDTO);

                // Для избежания повторного добавления упражнения -
                // обнуляем его (сохраняя во временной переменной)и
                // выставляем индекс упражнения в записи
                Exercise tempExercise = null;
                if (workoutDiaryEntry.Exercise != null)
                {
                    // Запоминаем упражнение
                    tempExercise = workoutDiaryEntry.Exercise;
                    // Устанавлиавем идентификатор упражнения
                    workoutDiaryEntry.ExerciseId = workoutDiaryEntry.Exercise.ExerciseId;

                    #region __Подсчитываем количество сожженных калорий__
                    if (workoutDiaryEntry.Exercise.MET.HasValue && workoutDiaryEntry.Exercise.MET.Value != 0)
                    {
                        var setsDuration = workoutDiaryEntry.Sets.Select(s => s.Duration).Sum();
                        if (setsDuration > 0)
                        {
                            // Получаем информацию о пользователе для подсчета сожженных калорий (вес, возраст)
                            var userProfile = unitOfWork.UserProfileRepository.Get(
                                f => (f.UserId == currentUserId),
                                null,
                                i => i.Weights)
                                              .SingleOrDefault();
                            // Пользователя нет в БД
                            if (userProfile == null)
                            {
                                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
                            }

                            if (userProfile.Weights.Any())
                            {
                                var weight = userProfile.Weights.OrderByDescending(d => d.Date).First().Weight;
                                if (weight > 0)
                                {
                                    workoutDiaryEntry.BurnedCalories =
                                        WorkoutHelper.GetBurnedCalories(workoutDiaryEntry.Exercise.MET.Value, weight, setsDuration);
                                }
                            }
                        }
                    }
                    #endregion

                    // Обнуляем упражнение, чтобы не обновлялось в БД
                    workoutDiaryEntry.Exercise = null;
                }

                // Добавляем запись в базу
                unitOfWork.WorkoutDiaryEntryRepository.Insert(workoutDiaryEntry);
                unitOfWork.Save();

                // Восстанавливаем упражение, чтобы вернуть клиенту
                if (tempExercise != null)
                {
                    workoutDiaryEntry.Exercise = tempExercise;
                }
                // Преобразовываем обратно, чтобы вернуть клиенту
                workoutDiaryEntryDTO = Mapper.Map <WorkoutDiaryEntryDTO>(workoutDiaryEntry);
            }
            catch (Exception ex)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }

            return(Request.CreateResponse <WorkoutDiaryEntryDTO>(HttpStatusCode.Created, workoutDiaryEntryDTO));
        }