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) }; })); }