public async Task <ActionResult> Add(AddingReadingSessionDto readingSession) { try { var status = await readingSessionService.AddAsync(readingSession); return(Ok(status)); } catch (NotFoundException) { return(NotFound()); } }
public async Task <AddingReadingSessionResponse> AddAsync(AddingReadingSessionDto readingSessionDto) { bool bookExists = (await unitOfWork.BookRepository.GetByReaderIdAsync(readingSessionDto.ReaderId)) .Where(b => b.Id == readingSessionDto.BookId).Any(); bool userExists = await unitOfWork.UserRepository.Exists(u => u.Id == readingSessionDto.ReaderId); if (bookExists && userExists) { var addingReadingSessionResponse = new AddingReadingSessionResponse { Response = ReadingSessionResponse.None }; var book = await unitOfWork.BookRepository.GetAsync(readingSessionDto.BookId); bool hasReachedDailyGoal = false; if (book.Status == BookStatus.Open) { var user = await unitOfWork.UserRepository.GetAsync(readingSessionDto.ReaderId); int noReadPagesToday = await GetNoReadPagesForToday(book.Id); int totalNoReadPagesToday = noReadPagesToday + readingSessionDto.NumberOfPages; if (noReadPagesToday >= book.DailyReadingGoal && totalNoReadPagesToday >= book.DailyReadingGoal || totalNoReadPagesToday < book.DailyReadingGoal) { book.NumberOfReadPages += readingSessionDto.NumberOfPages; } else if (noReadPagesToday < book.DailyReadingGoal && totalNoReadPagesToday >= book.DailyReadingGoal || totalNoReadPagesToday == book.DailyReadingGoal) { book.NumberOfReadPages += readingSessionDto.NumberOfPages; user.NumberOfCoins += Constants.NoCoinsForAchievingDailyReadingGoal; addingReadingSessionResponse.Response = ReadingSessionResponse.ReachedDailyReadingGoal; hasReachedDailyGoal = true; } if (book.NumberOfReadPages >= book.NumberOfPages) { book.Status = BookStatus.Finished; book.NumberOfReadPages = book.NumberOfPages; user.NumberOfCoins += Constants.NoCoinsForFinishingBook; user.AvailableSpotsOnBookshelf++; addingReadingSessionResponse.Response = hasReachedDailyGoal ? ReadingSessionResponse.ReachedGoalAndFinishedBook : ReadingSessionResponse.FinishedBook; } await unitOfWork.BookRepository.UpdateAsync(book); await unitOfWork.UserRepository.UpdateAsync(user); var readingSession = mapper.Map <ReadingSession>(readingSessionDto); readingSession.Id = Guid.NewGuid(); readingSession.Date = DateTime.Now; await unitOfWork.ReadingSessionRepository.AddAsync(readingSession); return(addingReadingSessionResponse); } throw new Exception("The book is not open!"); } throw new NotFoundException("Not found"); }