public static PurchaseTicketResponse ConvertToPurchaseTicketResponse(this TicketPurchase ticketPurchase)
        {
            PurchaseTicketResponse response = new PurchaseTicketResponse();
            response.TicketId = ticketPurchase.Id.ToString();
            response.EventName = ticketPurchase.Event.Name;
            response.NoOfTickets = ticketPurchase.TicketQuantity;

            return response;
        }
        public PurchaseTicketResponse PurchaseTicket(PurchaseTicketRequest purchaseTicketRequest)
        {
            PurchaseTicketResponse response = new PurchaseTicketResponse();
            try
            {
                // check for a duplicate transaction using the Idempotent pattern;
                // the Domain Logic could cope but you can't be sure.
                if (_reservationResponse.IsAUniqueRequest(purchaseTicketRequest.CorrelationId))
                {
                    TicketPurchase ticket;
                    Event Event = _eventRepository.FindBy(new Guid(purchaseTicketRequest.EventId));
                    if (Event.CanPurchaseTicketWith(new Guid(purchaseTicketRequest.ReservationId)))
                    {
                        ticket = Event.PurchaseTicketWith(new Guid(purchaseTicketRequest.ReservationId));
                        _eventRepository.Save(Event);
                        response = ticket.ConvertToPurchaseTicketResponse();
                        response.Success = true;
                    }
                    else
                    {
                        response.Message = Event.DetermineWhyATicketCannotbePurchasedWith(new Guid(purchaseTicketRequest.ReservationId));
                        response.Success = false;
                    }
                    _reservationResponse.LogResponse(purchaseTicketRequest.CorrelationId, response);
                }
                else
                {
                    response = _reservationResponse.RetrievePreviousResponseFor(purchaseTicketRequest.CorrelationId);
                }
            }
            catch (Exception ex)
            {
                response.Message = ErrorLog.GenerateErrorRefMessageAndLog(ex);
                response.Success = false;
            }

            return response;
        }