private Task PublishPurchaseFailure(SellTicketsRequest request, string concertName)
 {
     return(_eventPublisher.Publish(new PurchaseFailedEvent(
                                        Guid.NewGuid().ToString(),
                                        Guid.NewGuid().ToString(),
                                        request.ConcertId,
                                        concertName,
                                        request.BuyerId,
                                        request.Quantity)));
 }
        public async Task <Result <Purchase> > SellTickets(SellTicketsRequest request)
        {
            var possibleConcert = await _concertRepository.GetConcert(request.ConcertId);

            var result = await possibleConcert
                         .ToResult(Errors.ConcertNotFound)
                         .OnFailure(error => PublishPurchaseFailure(request, "Unknown"))
                         .Bind(async concert =>
            {
                var possibleBuyer = await _buyerRepository.GetBuyer(request.BuyerId);
                return(await possibleBuyer
                       .ToResult(Errors.BuyerNotFound)
                       .Bind(buyer => _ticketsService.SellTickets(concert, buyer, new TicketQuantity(request.Quantity)))
                       .Tap(purchase => PublishPurchaseSuccess(purchase))
                       .OnFailure(error => PublishPurchaseFailure(request, concert.Name)));
            });

            return(result);
        }