Example #1
0
        public async Task <bool> BookAsync(DateTime from, DateTime to, Guid userId)
        {
            var transactionId = Guid.NewGuid();

            var commitRequestTasks = new Task <bool>[3]
            {
                _flightsService.CheckAvailablityAsync(from, to, transactionId),
                _hotelsService.CheckAvailablityAsync(from, to, transactionId),
                _carsService.CheckAvailablityAsync(from, to, transactionId),
            };

            await Task.WhenAll(commitRequestTasks);

            var isSucceeded = commitRequestTasks.All(t => t.Result);

            if (!isSucceeded)
            {
                await UnlockAsync(transactionId);

                return(false);
            }

            var model = new VacationsBookingModel
            {
                From          = from,
                To            = to,
                TransactionId = transactionId,
                UserId        = userId
            };

            var commitRequests = new Task[3]
            {
                _flightsService.BookAsync(model),
                _hotelsService.BookAsync(model),
                _carsService.RentAsync(model),
            };

            await Task.WhenAll(commitRequests);

            return(true);
        }