public void DonateBook(Guid bookId, Guid userId, string note)
        {
            var bookUserAccepted = _bookUserRepository.Get()
                                   .Include(u => u.Book).ThenInclude(b => b.UserFacilitator)
                                   .Include(u => u.Book).ThenInclude(b => b.User)
                                   .Include(u => u.User).ThenInclude(u => u.Address)
                                   .Where(x => x.UserId == userId &&
                                          x.BookId == bookId &&
                                          x.Status == DonationStatus.WaitingAction)
                                   .FirstOrDefault();

            if (bookUserAccepted == null)
            {
                throw new ShareBookException("Não existe a relação de usuário e livro para a doação.");
            }

            bookUserAccepted.UpdateBookUser(DonationStatus.Donated, note);

            _bookUserRepository.Update(bookUserAccepted);

            DeniedBookUsers(bookId);

            _bookService.HideBook(bookId);

            // não usamos await nas notificações, pra serem assíncronas de verdade e retornar mais rápido.

            // avisa o ganhador
            var taskWinner = _bookUsersEmailService.SendEmailBookDonated(bookUserAccepted);

            // avisa os perdedores :/
            var taskLoosers = NotifyInterestedAboutBooksWinner(bookId);

            // avisa o doador
            var taskDonator = _bookUsersEmailService.SendEmailBookDonatedNotifyDonor(bookUserAccepted.Book, bookUserAccepted.User);
        }
Ejemplo n.º 2
0
        public void DonateBook(Guid bookId, Guid userId, string note)
        {
            var book = _bookService.Find(bookId);

            if (!book.MayChooseWinner())
            {
                throw new ShareBookException(ShareBookException.Error.BadRequest, "Aguarde a data de decisão.");
            }

            var bookUserAccepted = _bookUserRepository.Get()
                                   .Include(u => u.Book).ThenInclude(b => b.UserFacilitator)
                                   .Include(u => u.Book).ThenInclude(b => b.User)
                                   .Include(u => u.User).ThenInclude(u => u.Address)
                                   .Where(x => x.UserId == userId &&
                                          x.BookId == bookId &&
                                          x.Status == DonationStatus.WaitingAction)
                                   .FirstOrDefault();

            if (bookUserAccepted == null)
            {
                throw new ShareBookException("Não existe a relação de usuário e livro para a doação.");
            }

            bookUserAccepted.UpdateBookUser(DonationStatus.Donated, note);

            _bookUserRepository.Update(bookUserAccepted);

            DeniedBookUsers(bookId);

            _bookService.UpdateBookStatus(bookId, BookStatus.WaitingSend);

            // usamos await nas notificações porque eventualmente tem risco da taks
            // não completar o trabalho dela. Talvez tenha a ver com o garbage collector.

            // avisa o ganhador
            _bookUsersEmailService.SendEmailBookDonated(bookUserAccepted).Wait();

            // avisa os perdedores :/
            NotifyInterestedAboutBooksWinner(bookId).Wait();

            // avisa o doador
            _bookUsersEmailService.SendEmailBookDonatedNotifyDonor(bookUserAccepted.Book, bookUserAccepted.User).Wait();
        }