Example #1
0
        public ProductQueryModel GetProductDetails(string slug)
        {
            var inventory = _inventoryContext.Inventories
                            .Select(x => new { x.ProductId, x.UnitPrice, x.InStock });

            var dateTime = DateTime.Now;

            var discounts = _discountContext.CustomerDiscounts
                            .Where(x => x.StartDate < dateTime && dateTime < x.EndDate)
                            .Select(x => new { x.ProductId, x.DiscountRate, x.EndDate });

            var products = _shopContext.Products
                           .Include(x => x.Category)
                           .Include(x => x.ProductPictures)
                           .Select(product => new ProductQueryModel
            {
                Id               = product.Id,
                Category         = product.Category.Name,
                PrimaryPicture   = product.PrimaryPicture,
                SecondaryPicture = product.SecondaryPicture,
                PictureAlt       = product.PictureAlt,
                PictureTitle     = product.PictureTitle,
                Slug             = product.Slug,
                Name             = product.Name,
                Seller           = product.Seller,
                CategorySlug     = product.Category.Slug,
                Code             = product.Code,
                View             = product.View,
                Description      = product.Description,
                Keywords         = product.Keywords,
                MetaDescription  = product.MetaDescription,
                ShortDescription = product.ShortDescription,
                Pictures         = MapProductPictures(product.ProductPictures),
            }).FirstOrDefault(x => x.Slug == slug);

            if (products == null)
            {
                return(new ProductQueryModel());
            }

            var productInventory = inventory.FirstOrDefault(x => x.ProductId == products.Id);

            if (productInventory != null)
            {
                products.InStock = productInventory.InStock;
                var price = productInventory.UnitPrice;
                products.Price       = price.ToMoney();
                products.DoublePrice = price;

                var discount = discounts.FirstOrDefault(x => x.ProductId == products.Id);
                if (discount != null)
                {
                    var discountRate = discount.DiscountRate;
                    products.DiscountRate       = discountRate;
                    products.DiscountExpireDate = discount.EndDate.ToDiscountFormat();
                    products.HasDiscount        = discountRate > 0;
                    var discountAmount = Math.Round((price * discountRate) / 100);
                    products.PriceWithDiscount = (price - discountAmount).ToMoney();
                }
            }
            products.Comments = _commentContext.Comments
                                .Where(x => x.Type == CommentTypes.Product)
                                .Where(x => x.OwnerRecordId == products.Id)
                                .Where(x => !x.IsCanceled)
                                .Where(x => x.IsConfirmed)
                                .Select(x => new CommentQueryModel
            {
                Id            = x.Id,
                Name          = x.Name,
                Message       = x.Message,
                OwnerRecordId = x.OwnerRecordId,
                CreationDate  = x.CreationDate.ToFarsi(),
            }).OrderByDescending(x => x.Id).ToList();



            var productView = new EditProductView
            {
                Id   = products.Id,
                View = products.View + 1
            };

            _productApplication.EditProductView(productView);


            return(products);
        }