public async Task <OrderSummaryModel> SubmitOrderAsync(ICollection <RentalItemModel> rentalItems,
                                                               ICollection <ProductModel> products, OrderMatadata orderMatadata)
        {
            using (var uow = UnitOfWorkFactory.Create())
            {
                var mapperConfiguration = createMapper();
                var orderId             = Guid.NewGuid();
                var user = await _userFacade.GetUserByUsername(orderMatadata.User.Email);

                var model = new Order()
                {
                    Id          = orderId,
                    RentalItems = rentalItems?.AsQueryable().ProjectTo <RentalItem>(mapperConfiguration).Select(t => new OrderRentalItem()
                    {
                        ItemId = t.Id, OrderId = orderId
                    }).ToList()
                    ,
                    OrderItems = products?.AsQueryable().ProjectTo <Product>(mapperConfiguration).Select(t => new OrderProduct()
                    {
                        ItemId = t.Id, OrderId = orderId
                    }).ToList()
                    ,
                    RentalSince = orderMatadata.Since
                    ,
                    RentalTill = orderMatadata.Since.AddHours(orderMatadata.CountOfHours)
                    ,
                    LocationAddress = new Address()
                    {
                        Id = Guid.NewGuid()
                        ,
                        City = orderMatadata.Address.City
                        ,
                        PostalCode = orderMatadata.Address.PostalCode
                        ,
                        Street = orderMatadata.Address.Street
                        ,
                        BuildingNumber = orderMatadata.Address.BuildingNumber
                    }
                    ,
                    CustomerId = user.Id,
                    Created    = dateTimeProvider.Now,
                    FinalPrice = GetFinalPrice(rentalItems, products, orderMatadata.CountOfHours)
                };

                _repository.Insert(model);

                var context = (uow as EntityFrameworkUnitOfWork <PhotoBoothContext>)?.Context;
                if (context != null && products != null)
                {
                    foreach (var product in products)
                    {
                        var productFromDb = await context.Products.FindAsync(product.Id);

                        productFromDb.AmountLeft--;
                    }
                }
                await uow.CommitAsync();

                return(await GetOrderSummaryAsync(model.Id));
            }
        }
        public async Task <OrderSummaryModel> PrepareOrderAsync(ICollection <RentalItemModel> rentalItems, ICollection <ProductModel> products, OrderMatadata orderMatadata)
        {
            var rentalTill = orderMatadata.Since.AddHours(orderMatadata.CountOfHours);

            return(await Task.Run(() =>
            {
                return new OrderSummaryModel()
                {
                    RentalItems = rentalItems,
                    OrderItems = products,
                    RentalSince = orderMatadata.Since,
                    RentalTill = rentalTill,
                    LocationAddress = orderMatadata.Address,
                    Customer = orderMatadata.User,
                    Created = dateTimeProvider.Now,
                    FinalPrice = GetFinalPrice(rentalItems, products, orderMatadata.CountOfHours)
                };
            }));
        }