in src/Modules/SimplCommerce.Module.Catalog/Areas/Catalog/Controllers/ProductApiController.cs [82:210]
public async Task<IActionResult> Get(long id)
{
var product = _productRepository.Query()
.Include(x => x.ThumbnailImage)
.Include(x => x.Medias).ThenInclude(m => m.Media)
.Include(x => x.ProductLinks).ThenInclude(p => p.LinkedProduct).ThenInclude(m => m.ThumbnailImage)
.Include(x => x.OptionValues).ThenInclude(o => o.Option)
.Include(x => x.AttributeValues).ThenInclude(a => a.Attribute).ThenInclude(g => g.Group)
.Include(x => x.Categories)
.FirstOrDefault(x => x.Id == id);
var currentUser = await _workContext.GetCurrentUser();
if (!User.IsInRole("admin") && product.VendorId != currentUser.VendorId)
{
return BadRequest(new { error = "You don't have permission to manage this product" });
}
var productVm = new ProductVm
{
Id = product.Id,
Name = product.Name,
Slug = product.Slug,
MetaTitle = product.MetaTitle,
MetaKeywords = product.MetaKeywords,
MetaDescription = product.MetaDescription,
Sku = product.Sku,
Gtin = product.Gtin,
ShortDescription = product.ShortDescription,
Description = product.Description,
Specification = product.Specification,
OldPrice = product.OldPrice,
Price = product.Price,
SpecialPrice = product.SpecialPrice,
SpecialPriceStart = product.SpecialPriceStart,
SpecialPriceEnd = product.SpecialPriceEnd,
IsFeatured = product.IsFeatured,
IsPublished = product.IsPublished,
IsCallForPricing = product.IsCallForPricing,
IsAllowToOrder = product.IsAllowToOrder,
CategoryIds = product.Categories.Select(x => x.CategoryId).ToList(),
ThumbnailImageUrl = _mediaService.GetThumbnailUrl(product.ThumbnailImage),
BrandId = product.BrandId,
TaxClassId = product.TaxClassId,
StockTrackingIsEnabled = product.StockTrackingIsEnabled
};
foreach (var productMedia in product.Medias.Where(x => x.Media.MediaType == MediaType.Image))
{
productVm.ProductImages.Add(new ProductMediaVm
{
Id = productMedia.Id,
MediaUrl = _mediaService.GetThumbnailUrl(productMedia.Media)
});
}
foreach (var productMedia in product.Medias.Where(x => x.Media.MediaType == MediaType.File))
{
productVm.ProductDocuments.Add(new ProductMediaVm
{
Id = productMedia.Id,
Caption = productMedia.Media.Caption,
MediaUrl = _mediaService.GetMediaUrl(productMedia.Media)
});
}
productVm.Options = product.OptionValues.OrderBy(x => x.SortIndex).Select(x =>
new ProductOptionVm
{
Id = x.OptionId,
Name = x.Option.Name,
DisplayType = x.DisplayType,
Values = JsonConvert.DeserializeObject<IList<ProductOptionValueVm>>(x.Value)
}).ToList();
foreach (var variation in product.ProductLinks.Where(x => x.LinkType == ProductLinkType.Super).Select(x => x.LinkedProduct).Where(x => !x.IsDeleted).OrderBy(x => x.Id))
{
productVm.Variations.Add(new ProductVariationVm
{
Id = variation.Id,
Name = variation.Name,
Sku = variation.Sku,
Gtin = variation.Gtin,
Price = variation.Price,
OldPrice = variation.OldPrice,
NormalizedName = variation.NormalizedName,
ThumbnailImageUrl = _mediaService.GetMediaUrl(variation.ThumbnailImage),
ImageUrls = GetProductImageUrls(variation.Id).ToList(),
OptionCombinations = variation.OptionCombinations.Select(x => new ProductOptionCombinationVm
{
OptionId = x.OptionId,
OptionName = x.Option.Name,
Value = x.Value,
SortIndex = x.SortIndex
}).OrderBy(x => x.SortIndex).ToList()
});
}
foreach (var relatedProduct in product.ProductLinks.Where(x => x.LinkType == ProductLinkType.Related).Select(x => x.LinkedProduct).Where(x => !x.IsDeleted).OrderBy(x => x.Id))
{
productVm.RelatedProducts.Add(new ProductLinkVm
{
Id = relatedProduct.Id,
Name = relatedProduct.Name,
IsPublished = relatedProduct.IsPublished
});
}
foreach (var crossSellProduct in product.ProductLinks.Where(x => x.LinkType == ProductLinkType.CrossSell).Select(x => x.LinkedProduct).Where(x => !x.IsDeleted).OrderBy(x => x.Id))
{
productVm.CrossSellProducts.Add(new ProductLinkVm
{
Id = crossSellProduct.Id,
Name = crossSellProduct.Name,
IsPublished = crossSellProduct.IsPublished
});
}
productVm.Attributes = product.AttributeValues.Select(x => new ProductAttributeVm
{
AttributeValueId = x.Id,
Id = x.AttributeId,
Name = x.Attribute.Name,
GroupName = x.Attribute.Group.Name,
Value = x.Value
}).ToList();
return Json(productVm);
}