public bool Validate(DeleteShippingAddressDto request)
        {
            if (_context.ShippingAddresses.Any(x => x.Id == request.ShippingAddressId))
            {
                throw new EntityNotFoundException($"Shipping address with id {request.ShippingAddressId}");
            }

            if (_context.Users.Any(x => x.Id == request.UserId))
            {
                throw new EntityNotFoundException($"User with id {request.ShippingAddressId}");
            }

            if (_context.ShippingAddresses
                .Include(sa => sa.User)
                .AsQueryable()
                .Where(sa => sa.Id == request.ShippingAddressId)
                .Where(sa => sa.User.Id == request.UserId)
                .Count()
                == 0)
            {
                throw new EntityMissmatchException($"Shipping address with id {request.ShippingAddressId}", $"User with id {request.ShippingAddressId}");
            }

            return(true);
        }
        public IActionResult Delete(int addressId, int userId)
        {
            var dto = new DeleteShippingAddressDto
            {
                ShippingAddressId = addressId,
                UserId            = userId
            };

            try
            {
                _deleteShippingAddress.Execute(dto);
                return(Ok());
            }
            catch (EntityNotFoundException e)
            {
                return(NotFound(e.Message));
            }
            catch (EntityMissmatchException e)
            {
                return(UnprocessableEntity(e.Message));
            }
            catch (Exception e)
            {
                return(StatusCode(500, e));
            }
        }
        public void Execute(DeleteShippingAddressDto request)
        {
            if (Validate(request))
            {
                var shippingAddress = _context.ShippingAddresses
                                      .Include(sa => sa.User)
                                      .Include(sa => sa.Orders)
                                      .ThenInclude(o => o.OrderCoupons)
                                      .Include(sa => sa.Orders)
                                      .ThenInclude(o => o.OrderProducts)
                                      .AsQueryable()
                                      .Where(sa => sa.Id == request.ShippingAddressId)
                                      .First();

                if (shippingAddress.Orders.Count() != 0)
                {
                    foreach (var order in shippingAddress.Orders)
                    {
                        if (order.DateShipped == null)
                        {
                            MailMessage message = new MailMessage();
                            message.From = new MailAddress("*****@*****.**", "OnlineMarketPlace");
                            message.To.Add(new MailAddress(order.User.Email, order.User.FirstName + " " + order.User.LastName));
                            message.Subject = "OnlineMarketPlace - Order cancelation";

                            string body = $"We would like to inform you that your order with id {order.Id} is cancelled. ";
                            body        += $"Reason: Shipping address for this order has been deleted and for safety, we have cancelled the order. ";
                            body        += "We are sorry for any inconviniences caused.";
                            message.Body = body;

                            Functions.SmtpClient.Send(message);
                        }

                        foreach (var product in order.OrderProducts)
                        {
                            product.Active = false;
                        }

                        if (order.OrderCoupons.Count() == 0)
                        {
                            foreach (var coupon in order.OrderCoupons)
                            {
                                coupon.Active = false;
                            }
                        }

                        order.Active = false;
                    }
                }

                shippingAddress.Active = false;

                _context.SaveChanges();
            }
        }