public async Task <ProductDetailViewModel> BuildModelAsync(ComponentModelBase componentModel) { var viewModel = new ProductDetailViewModel { ByLabel = this.globalLocalizer.GetString("By"), DescriptionLabel = this.globalLocalizer.GetString("Description"), IsAuthenticated = componentModel.IsAuthenticated, ProductInformationLabel = this.productLocalizer.GetString("ProductInformation"), PricesLabel = this.globalLocalizer.GetString("Prices"), SuccessfullyAddedProduct = this.globalLocalizer.GetString("SuccessfullyAddedProduct"), SignInToSeePricesLabel = this.globalLocalizer.GetString("SignInToSeePrices"), SignInUrl = "#", UpdateBasketUrl = this.linkGenerator.GetPathByAction("Index", "BasketsApi", new { Area = "Orders", culture = CultureInfo.CurrentUICulture.Name }), BasketLabel = this.globalLocalizer.GetString("BasketLabel"), SkuLabel = this.productLocalizer.GetString("Sku"), InStockLabel = this.globalLocalizer.GetString("InStock"), BasketId = componentModel.BasketId, AddedProduct = this.orderResources.GetString("AddedProduct"), Sidebar = await this.sidebarModelBuilder.BuildModelAsync(componentModel) }; var product = await this.productsRepository.GetProductAsync(componentModel.Id, componentModel.Language, null); if (product != null) { viewModel.ProductId = product.Id; viewModel.Title = product.Name; viewModel.BrandName = product.BrandName; viewModel.BrandUrl = this.linkGenerator.GetPathByAction("Index", "Brand", new { Area = "Products", culture = CultureInfo.CurrentUICulture.Name, Id = product.SellerId }); viewModel.Description = product.Description; viewModel.Sku = product.Sku; viewModel.IsProductVariant = product.PrimaryProductId.HasValue; viewModel.Features = product.ProductAttributes?.Select(x => new ProductFeatureViewModel { Key = x.Name, Value = string.Join(", ", x.Values.OrEmptyIfNull()) }); var images = new List <ImageViewModel>(); foreach (var image in product.Images.OrEmptyIfNull()) { var imageViewModel = new ImageViewModel { Id = image, Original = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, image, ProductConstants.OriginalMaxWidth, ProductConstants.OriginalMaxHeight, true)), Thumbnail = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, image, ProductConstants.ThumbnailMaxWidth, ProductConstants.ThumbnailMaxHeight, true)) }; images.Add(imageViewModel); } viewModel.Images = images; viewModel.Files = await this.filesModelBuilder.BuildModelAsync(new FilesComponentModel { Id = componentModel.Id, IsAuthenticated = componentModel.IsAuthenticated, Language = componentModel.Language, Token = componentModel.Token, Files = product.Files }); var inventory = await this.productsRepository.GetProductStockAsync(componentModel.Id); if (inventory != null && inventory.AvailableQuantity.HasValue && inventory.AvailableQuantity.Value > 0) { viewModel.InStock = true; viewModel.AvailableQuantity = inventory.AvailableQuantity; viewModel.ExpectedDelivery = inventory.ExpectedDelivery; viewModel.ExpectedDeliveryLabel = this.inventoryResources.GetString("ExpectedDeliveryLabel"); viewModel.RestockableInDays = inventory.RestockableInDays; viewModel.RestockableInDaysLabel = this.inventoryResources.GetString("RestockableInDaysLabel"); } if (componentModel.IsAuthenticated && componentModel.BasketId.HasValue) { var basketItems = await this.basketService.GetBasketAsync(componentModel.BasketId, componentModel.Token, componentModel.Language); if (basketItems is not null) { viewModel.OrderItems = basketItems; } } if (product.ProductVariants is not null) { var productVariants = await this.productsRepository.GetProductsAsync(product.ProductVariants, null, null, componentModel.Language, null, PaginationConstants.DefaultPageIndex, PaginationConstants.DefaultPageSize, componentModel.Token, nameof(Product.CreatedDate)); if (productVariants != null) { var carouselItems = new List <CarouselGridCarouselItemViewModel>(); foreach (var productVariant in productVariants.Data.OrEmptyIfNull()) { var carouselItem = new CarouselGridCarouselItemViewModel { Id = productVariant.Id, Title = productVariant.Name, Subtitle = productVariant.Sku, ImageAlt = productVariant.Name, Url = this.linkGenerator.GetPathByAction("Index", "Product", new { Area = "Products", culture = CultureInfo.CurrentUICulture.Name, productVariant.Id }) }; if (productVariant.Images != null && productVariant.Images.Any()) { carouselItem.ImageUrl = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, productVariant.Images.FirstOrDefault(), CarouselGridConstants.CarouselItemImageMaxWidth, CarouselGridConstants.CarouselItemImageMaxHeight, true)); } carouselItems.Add(carouselItem); } viewModel.ProductVariants = new List <CarouselGridItemViewModel> { new CarouselGridItemViewModel { Id = product.Id, Title = this.productLocalizer.GetString("ProductVariants"), CarouselItems = carouselItems } }; } } } return(viewModel); }
public async Task <IActionResult> GetProductVariants(Guid?id) { var language = CultureInfo.CurrentUICulture.Name; var product = await this.productsRepository.GetProductAsync(id, language, null); if (product?.ProductVariants is not null) { var token = await HttpContext.GetTokenAsync(ApiExtensionsConstants.TokenName); var productVariants = await this.productsRepository.GetProductsAsync( product.ProductVariants, null, null, language, null, PaginationConstants.DefaultPageIndex, PaginationConstants.DefaultPageSize, token, $"{nameof(Product.Name)} ASC"); var availableProducts = await this.inventoryRepository.GetAvailbleProductsInventory( language, PaginationConstants.DefaultPageIndex, AvailableProductsConstants.Pagination.ItemsPerPage, null); var carouselItems = new List <CarouselGridCarouselItemViewModel>(); foreach (var productVariant in productVariants.Data.OrEmptyIfNull()) { var carouselItem = new CarouselGridCarouselItemViewModel { Id = productVariant.Id, Title = productVariant.Name, Subtitle = productVariant.Sku, ImageAlt = productVariant.Name, Url = this.linkGenerator.GetPathByAction("Index", "Product", new { Area = "Products", culture = CultureInfo.CurrentUICulture.Name, productVariant.Id }), Attributes = productVariant.ProductAttributes.Select(x => new CarouselGridProductAttributesViewModel { Key = x.Key, Value = string.Join(", ", x.Values.OrEmptyIfNull()) }) }; if (productVariant.Images != null && productVariant.Images.Any()) { var variantImage = productVariant.Images.FirstOrDefault(); carouselItem.Sources = new List <SourceViewModel> { new SourceViewModel { Media = MediaConstants.FullHdMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, 1024, 1024, true, MediaConstants.WebpExtension)) }, new SourceViewModel { Media = MediaConstants.DesktopMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, 352, 352, true, MediaConstants.WebpExtension)) }, new SourceViewModel { Media = MediaConstants.TabletMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, 608, 608, true, MediaConstants.WebpExtension)) }, new SourceViewModel { Media = MediaConstants.MobileMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, 768, 768, true, MediaConstants.WebpExtension)) }, new SourceViewModel { Media = MediaConstants.FullHdMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, 1024, 1024, true)) }, new SourceViewModel { Media = MediaConstants.DesktopMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, 352, 352, true)) }, new SourceViewModel { Media = MediaConstants.TabletMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, 608, 608, true)) }, new SourceViewModel { Media = MediaConstants.MobileMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, 768, 768, true)) } }; var variantImages = new List <ImageVariantViewModel>(); foreach (var image in productVariant.Images) { var imageVariantViewModel = new ImageVariantViewModel { Id = image }; variantImages.Add(imageVariantViewModel); } carouselItem.Images = variantImages; carouselItem.ImageUrl = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(this.options.Value.MediaUrl, variantImage, CarouselGridConstants.CarouselItemImageMaxWidth, CarouselGridConstants.CarouselItemImageMaxHeight, true)); } var availableProduct = availableProducts.Data.FirstOrDefault(x => x.ProductSku == productVariant.Sku); if (availableProduct is not null) { carouselItem.AvailableQuantity = availableProduct.AvailableQuantity; carouselItem.ExpectedDelivery = availableProduct.ExpectedDelivery; } carouselItems.Add(carouselItem); } var response = new List <CarouselGridItemViewModel> { new CarouselGridItemViewModel { Id = product.Id, Title = this.productLocalizer.GetString("ProductVariants"), CarouselItems = carouselItems } }; return(this.StatusCode((int)HttpStatusCode.OK, response)); } return(this.StatusCode((int)HttpStatusCode.OK)); }
public async Task <HomePageCarouselGridViewModel> BuildModelAsync(ComponentModelBase componentModel) { var items = new List <CarouselGridItemViewModel>(); var newProducts = await this.catalogService.GetCatalogProductsAsync( componentModel.Token, componentModel.Language, null, false, true, null, Foundation.GenericRepository.Definitions.Constants.DefaultPageIndex, Foundation.GenericRepository.Definitions.Constants.DefaultItemsPerPage); if (newProducts != null && newProducts.Total > 0) { var contentGridCarouselItems = new List <CarouselGridCarouselItemViewModel>(); foreach (var newProduct in newProducts.Data) { var carouselItem = new CarouselGridCarouselItemViewModel { Id = newProduct.Id, Title = newProduct.Title, Subtitle = newProduct.Sku, ImageAlt = newProduct.ImageAlt, ImageUrl = this.cdnService.GetCdnUrl(newProduct.ImageUrl), Url = this.linkGenerator.GetPathByAction("Index", "Product", new { Area = "Products", culture = CultureInfo.CurrentUICulture.Name, newProduct.Id }), Sources = new List <SourceViewModel> { new SourceViewModel { Media = MediaConstants.FullHdMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(newProduct.ImageUrl, 1024, 1024, true, MediaConstants.WebpExtension)) }, new SourceViewModel { Media = MediaConstants.DesktopMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(newProduct.ImageUrl, 352, 352, true, MediaConstants.WebpExtension)) }, new SourceViewModel { Media = MediaConstants.TabletMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(newProduct.ImageUrl, 608, 608, true, MediaConstants.WebpExtension)) }, new SourceViewModel { Media = MediaConstants.MobileMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(newProduct.ImageUrl, 768, 768, true, MediaConstants.WebpExtension)) }, new SourceViewModel { Media = MediaConstants.FullHdMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(newProduct.ImageUrl, 1024, 1024, true)) }, new SourceViewModel { Media = MediaConstants.DesktopMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(newProduct.ImageUrl, 352, 352, true)) }, new SourceViewModel { Media = MediaConstants.TabletMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(newProduct.ImageUrl, 608, 608, true)) }, new SourceViewModel { Media = MediaConstants.MobileMediaQuery, Srcset = this.cdnService.GetCdnUrl(this.mediaService.GetFileUrl(newProduct.ImageUrl, 768, 768, true)) } } }; contentGridCarouselItems.Add(carouselItem); } items.Add(new CarouselGridItemViewModel { Id = CarouselGridConstants.Novelties.NoveltiesId, Title = this.globalLocalizer.GetString("Novelties"), CarouselItems = contentGridCarouselItems }); } var viewModel = new HomePageCarouselGridViewModel { Items = items }; return(viewModel); }