public static async Task OrderAsync() { Customer greatCustomer = null; Article article = null; Article article2 = null; greatCustomer = await GetOrCreateGreatCustomerAsync().ConfigureAwait(false); article = await GetOrCreateAggregateAsync <ArticleViewModel, Article>(readRepository, x => x.Articlenumber == "A12345", () => new Article(ArticleId.Generate(), "A12345", "A great article", Money.EUR(99.99m))) .ConfigureAwait(false); article2 = await GetOrCreateAggregateAsync <ArticleViewModel, Article>(readRepository, x => x.Articlenumber == "B12345", () => new Article(ArticleId.Generate(), "B12345", "Another great article", Money.EUR(59.99m))) .ConfigureAwait(false); var shoppingCart = new ShoppingCart(ShoppingCartId.Generate(), greatCustomer.Id, greatCustomer.StateModel.Name); var shoppingCartArticle1 = await shoppingCart.PlaceArticleAsync(ShoppingCartArticleId.Generate(shoppingCart.Id), article.Id, 1, repository); await shoppingCart.PlaceArticleAsync(ShoppingCartArticleId.Generate(shoppingCart.Id), article2.Id, 1, repository); shoppingCartArticle1.RemoveFromShoppingCart(); shoppingCart.Order(repository); await repository.SaveAsync(shoppingCart); var projection = CustomerState.LoadState(greatCustomer.StateModel); }
public static BusinessRule <ShoppingCart> CanPlaceArticle(ShoppingCartArticleId shoppingCartArticleId, ArticleId articleId, IEventRepository repository) { return(new BusinessRule <ShoppingCart>( "Cannot place article into shopping cart!", rule => { rule.AddCheck(ShoppingCartSpecifications.IsActive, "Shopping cart is deactivated!"); rule.AddCheck(_ => shoppingCartArticleId != ShoppingCartArticleId.Empty, "Id is empty!"); rule.AddCheck(_ => { var article = repository.GetAsync <Article>(articleId).Result; return article?.StateModel.Active == true; }, $"Article does not exist or is deactivated!!"); })); }
public async Task <ShoppingCartArticle> PlaceArticleAsync(ShoppingCartArticleId shoppingCartArticleId, ArticleId articleId, int quantity, IEventRepository repository) { ShoppingCartBusinessRules.CanPlaceArticle(shoppingCartArticleId, articleId, repository).Check(this); var article = await repository.GetAsync <Article>(articleId); var shoppingCartArticle = new ShoppingCartArticle( this, shoppingCartArticleId, article.Id, article.StateModel.Articlenumber, article.StateModel.Description, article.StateModel.Price, quantity, article.StateModel.Price * quantity, DateTime.UtcNow); // or: RaiseEvent(new ShoppingCartArticlePlaced(aggregateRoot.Id, shoppingCartArticleId, articleId, articlenumber, description, price, quantity, total, dateTime ?? DateTime.UtcNow)); // var shoppingCartArticle = GetChildEntity<ShoppingCartArticle>(shoppingCartArticleId); return(shoppingCartArticle); }
public async Task OrderArticle(OrderArticle command) { string wkId = null; ShoppingCart wkAgg = null; var wk = (await Program.readRepository.QueryAsync <ShoppingCartViewModel>(x => x.CustomersId == command.CustomerId && x.Status == (int)ShoppingCartStatus.Open)) .FirstOrDefault(); if (wk == null) { var customer = (await Program.readRepository.QueryAsync <CustomerViewModel>(x => x.Streamname == command.CustomerId)) .FirstOrDefault(); wkId = Guid.NewGuid().ToString(); wkAgg = new ShoppingCart(wkId, command.CustomerId, customer.Name); } else { wkAgg = await Program.repository.GetAsync <ShoppingCart>(wk.Streamname); } await wkAgg.PlaceArticleAsync(ShoppingCartArticleId.Generate(wkAgg.Id), command.ArticleId, command.Quantity, Program.repository); await Program.repository.SaveAsync(wkAgg); }