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