/// <summary> /// Adds a new food item to a users diary entry for a given date. /// If the user has no diary entry for that date, then one will be created. /// Updates the total calories for the diary entry. /// </summary> /// <param name="resource"></param> /// <returns> /// Unsuccessful FoodItemResponse if the user does not exist; /// Unsuccessful FoodItemResponse if the string date is not in the format dd-mm-yyyy; /// Unsuccessful FoodItemResponse if the date is in the future; /// Unsuccessful FoodItemResponse if there was an issue adding a new diary entry; /// Unsuccessful FoodItemResponse if there was an issue adding the food item to the diary entry; /// Successful FoodItemResponse with the food item /// </returns> public async Task <FoodItemResponse> AddFoodItemAsync(AddFoodItemResource resource) { // validate userId var userResult = await _userService.GetUserByNameAsync(resource.Username); if (!userResult.Success) { return(new FoodItemResponse(userResult.Message)); } // validate and convert stringDate to DateTime DateTime date; try { date = StringDateHelper.ConverStringDateToDate(resource.StringDate); } catch (ArgumentException e) { return(new FoodItemResponse(e.Message)); } DiaryEntry diaryEntry; // check if user has a diary entry for the day var existingDiaryResult = await _diaryEntryService.GetUsersDiaryEntryForDateAsync(userResult.User.Id, date); if (!existingDiaryResult.Success) { // no diary entry for that day, create one var diaryEntryResult = await _diaryEntryService.AddDiaryEntryAsync(userResult.User.Id, date); if (!diaryEntryResult.Success) { return(new FoodItemResponse($"Failed to add a new food item: {diaryEntryResult.Message}")); } diaryEntry = diaryEntryResult.DiaryEntry; } else { // user has a diary entry for that day diaryEntry = existingDiaryResult.DiaryEntry; } // create food item FoodItem foodItem = new FoodItem { Name = resource.Name, Calories = resource.Calories, DiaryEntry = diaryEntry, User = userResult.User }; // update the total calories for the diary entry diaryEntry.TotalCalories += resource.Calories; // save the new food item and the changes to the diary entry try { await _foodItemRepository.AddAsync(foodItem); await _unitOfWork.CompleteAsync(); } catch (Exception e) { return(new FoodItemResponse($"An error occurred when saving the food item: {e}")); } return(new FoodItemResponse(foodItem)); }