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)); }
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)); }