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); }
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(); }
public async void DonateBook(Guid bookId, Guid userId, string note) { var bookUserAccepted = _bookUserRepository.Get().Include(u => u.Book).Include(u => u.User) .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); await _bookUsersEmailService.SendEmailBookDonated(bookUserAccepted); }