public async Task <bool> Handle(PlaceOrderCommand request, CancellationToken cancellationToken)
        {
            IEnumerable <Game> cartItems = _cartService.GetGames(request.UserCartID);

            var user = await _userManager.FindByIdAsync(request.UserID);

            var itemsOwner = await _userManager.FindByIdAsync(cartItems.First().OwnerID);

            var totalPrice = CalculateTotalPrice(cartItems);

            request.OrderModel.Placed      = DateTime.UtcNow;
            request.OrderModel.TotalPrice  = totalPrice;
            request.OrderModel.Email       = (string.IsNullOrEmpty(request.OrderModel.AlternativeEmailAdress)) ? user.Email : request.OrderModel.AlternativeEmailAdress;
            request.OrderModel.PhoneNumber = (string.IsNullOrEmpty(request.OrderModel.AlternativePhoneNumber)) ? user.PhoneNumber : request.OrderModel.AlternativePhoneNumber;

            var result  = _mapper.Map <Order>(request.OrderModel);
            var orderID = _dbContext.Orders.Last().ID;

            string gameTitles = string.Empty;

            foreach (var item in cartItems)
            {
                gameTitles = gameTitles.Concat(item.Title).ToString();
                _dbContext.OrderItems.Add(new OrderItem
                {
                    GameID  = item.ID,
                    CartID  = user.CartID,
                    OrderID = orderID
                });
            }

            var message = new GamingShop.Data.Models.Message
            {
                Content        = $"Ordered items: {gameTitles}",
                RecipientEmail = itemsOwner.Email,
                RecipientID    = itemsOwner.Id,
                SenderID       = user.Id,
                Sent           = DateTime.UtcNow,
                Subject        = $"A {user.UserName} ordered your game(s)"
            };

            _dbContext.Messages.Add(message);

            await _emailSender.SendOrderDetailsEmail(request.OrderModel.Email, "Order", cartItems, new Address { Street = request.OrderModel.Street, City = request.OrderModel.City, Country = request.OrderModel.Country, PhoneNumber = request.OrderModel.PhoneNumber }, totalPrice);

            await _emailSender.SendEmail(message);

            await _cartService.ClearCart(request.UserCartID);

            await _orderService.MarkGameAsSold(cartItems);

            if (await _dbContext.SaveChangesAsync() > 0)
            {
                return(true);
            }

            return(false);
        }
Beispiel #2
0
        public async Task <bool> Handle(SendMessageCommand request, CancellationToken cancellationToken)
        {
            using (_dbContext = _dbContextFactory.CreateDbContext())
            {
                GamingShop.Data.Models.Message msg;

                if (request.Message.Replying == false)
                {
                    var recipientID = _gameService.GetByID(request.Message.GameID).OwnerID;
                    var recipient   = await _userManager.FindByIdAsync(recipientID);

                    var sender = await _userManager.FindByIdAsync(request.Message.SenderID);

                    msg = new GamingShop.Data.Models.Message
                    {
                        Content        = request.Message.Content,
                        Read           = false,
                        RecipientEmail = recipient.Email,
                        RecipientID    = recipientID,
                        SenderID       = request.Message.SenderID,
                        Sent           = DateTime.UtcNow,
                        Subject        = request.Message.Subject,
                        SenderEmail    = sender.Email
                    };
                }
                else
                {
                    msg = _mapper.Map <GamingShop.Data.Models.Message>(request.Message);
                }

                _dbContext.Messages.Add(msg);

                if (await _dbContext.SaveChangesAsync() > 0)
                {
                    return(true);
                }

                return(false);
            }
        }