Exemplo n.º 1
0
        public Result Purchase(UserDto userDto, IList <ArticleDto> articles)
        {
            if (!userDto.HasPurchasePermissions)
            {
                return(Result.Failure($"Insufficient Permissions for User: '******'"));
            }
            if (articles.All(a => a.IsArticleInValidRange))
            {
                return(Result.Failure($"{articles.First(a => !a.IsArticleInValidRange)} is not (yet) purchaseable"));
            }

            var transactionDate  = DateTime.UtcNow;
            var distinctArticles = articles.Select(a => a.Id).Distinct();

            var transactions = distinctArticles
                               .Select(articleId => new TransactionDto
            {
                UserId          = userDto.Id,
                ArticleId       = articleId,
                Quantity        = articles.Count(a => a.Id == articleId),
                TransactionDate = transactionDate
            })
                               .ToList();

            var transactionResults = transactions
                                     .Select(_cloudShopDal.AddTransaction);

            var stockOperationResult = transactions
                                       .Select(t => _cloudShopDal.DecreaseStockCount(t.ArticleId, t.Quantity));

            return(Result
                   .Combine(transactionResults.Concat(stockOperationResult))
                   .TapIf(userDto.WantsToReceiveBillingMails, () => _cloudShopMailer.SendBill(userDto.Email, articles)));
        }
Exemplo n.º 2
0
 public Result DecreaseStockCount(long articleId, long quantity)
 {
     return(_cloudShopDal.DecreaseStockCount(articleId, quantity));
 }