@ -1,3 +1,46 @@ |
|||
@page |
|||
@model EShopOnAbp.PublicWeb.Pages.Catalog |
|||
<h2>Catalog page!</h2> |
|||
@{ |
|||
const int columnSize = 3; |
|||
} |
|||
@section styles{ |
|||
<abp-style src="/Pages/Catalog.css" /> |
|||
} |
|||
<h3 class="pt-5 pb-4 text-center">Our Products</h3> |
|||
<div class="product-list"> |
|||
@for (int i = 0; i < Math.Ceiling(Model.Products.Count / (double)columnSize); i++) |
|||
{ |
|||
<abp-row> |
|||
@for (int j = 0; j < columnSize; j++) |
|||
{ |
|||
<abp-column size-lg="_4" size-md="_6" size-sm="_12"> |
|||
@if ((i * columnSize) + j < Model.Products.Count) |
|||
{ |
|||
var product = Model.Products[(i * columnSize) + j]; |
|||
<div class="product-list-item"> |
|||
@if (!product.ImageName.IsNullOrEmpty()) |
|||
{ |
|||
<img src="/product-images/@product.ImageName" /> |
|||
} |
|||
else |
|||
{ |
|||
<img src="/product-images/noimage.jpg" /> |
|||
} |
|||
<div class="row mt-5"> |
|||
<div class="col"> |
|||
<div class="product-info-box"> |
|||
<h6>@product.Name</h6> |
|||
<em class="d-block text-muted">@product.Code - Stock count: @product.StockCount</em> |
|||
</div> |
|||
</div> |
|||
<div class="col-auto text-right text-danger"> |
|||
<strong class="product-price">$@product.Price</strong> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
} |
|||
</abp-column> |
|||
} |
|||
</abp-row> |
|||
} |
|||
</div> |
|||
@ -1,11 +1,22 @@ |
|||
using Microsoft.AspNetCore.Mvc.RazorPages; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Mvc.RazorPages; |
|||
using EShopOnAbp.CatalogService.Products; |
|||
|
|||
namespace EShopOnAbp.PublicWeb.Pages; |
|||
|
|||
public class Catalog : PageModel |
|||
{ |
|||
public void OnGet() |
|||
public IReadOnlyList<ProductDto> Products { get; private set; } |
|||
private readonly IPublicProductAppService _productAppService; |
|||
|
|||
public Catalog(IPublicProductAppService productAppService) |
|||
{ |
|||
_productAppService = productAppService; |
|||
} |
|||
|
|||
public async Task OnGetAsync() |
|||
{ |
|||
|
|||
Products = (await _productAppService.GetListAsync()).Items; |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
body { |
|||
background-color: #f9f9f9; |
|||
} |
|||
|
|||
.product-list-item { |
|||
background-color: #fff; |
|||
padding: 2em; |
|||
border: 1px solid #eee; |
|||
border-radius: 3px; |
|||
box-shadow: 0 0 10px rgba(0, 0, 0, .05); |
|||
margin-bottom: 2em; |
|||
transition: all .2s; |
|||
} |
|||
|
|||
.product-list-item:hover { |
|||
box-shadow: 0 0 20px rgba(0, 0, 0, .1); |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.product-list-item img { |
|||
width: 100%; |
|||
} |
|||
|
|||
.product-list-item .text-muted { |
|||
opacity: .8 |
|||
} |
|||
|
|||
.product-info-box { |
|||
min-height: 80px; |
|||
} |
|||
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 66 KiB |
@ -0,0 +1,64 @@ |
|||
// This file is automatically generated by ABP framework to use MVC Controllers from CSharp
|
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Http.Client; |
|||
using Volo.Abp.Http.Modeling; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Http.Client.ClientProxying; |
|||
using EShopOnAbp.CatalogService.Products; |
|||
|
|||
// ReSharper disable once CheckNamespace
|
|||
namespace EShopOnAbp.CatalogService.Products.ClientProxies |
|||
{ |
|||
[Dependency(ReplaceServices = true)] |
|||
[ExposeServices(typeof(IProductAppService), typeof(ProductClientProxy))] |
|||
public partial class ProductClientProxy : ClientProxyBase<IProductAppService>, IProductAppService |
|||
{ |
|||
public virtual async Task<PagedResultDto<ProductDto>> GetListPagedAsync(PagedAndSortedResultRequestDto input) |
|||
{ |
|||
return await RequestAsync<PagedResultDto<ProductDto>>(nameof(GetListPagedAsync), new ClientProxyRequestTypeValue |
|||
{ |
|||
{ typeof(PagedAndSortedResultRequestDto), input } |
|||
}); |
|||
} |
|||
|
|||
public virtual async Task<ListResultDto<ProductDto>> GetListAsync() |
|||
{ |
|||
return await RequestAsync<ListResultDto<ProductDto>>(nameof(GetListAsync)); |
|||
} |
|||
|
|||
public virtual async Task<ProductDto> GetAsync(Guid id) |
|||
{ |
|||
return await RequestAsync<ProductDto>(nameof(GetAsync), new ClientProxyRequestTypeValue |
|||
{ |
|||
{ typeof(Guid), id } |
|||
}); |
|||
} |
|||
|
|||
public virtual async Task<ProductDto> CreateAsync(CreateProductDto input) |
|||
{ |
|||
return await RequestAsync<ProductDto>(nameof(CreateAsync), new ClientProxyRequestTypeValue |
|||
{ |
|||
{ typeof(CreateProductDto), input } |
|||
}); |
|||
} |
|||
|
|||
public virtual async Task<ProductDto> UpdateAsync(Guid id, UpdateProductDto input) |
|||
{ |
|||
return await RequestAsync<ProductDto>(nameof(UpdateAsync), new ClientProxyRequestTypeValue |
|||
{ |
|||
{ typeof(Guid), id }, |
|||
{ typeof(UpdateProductDto), input } |
|||
}); |
|||
} |
|||
|
|||
public virtual async Task DeleteAsync(Guid id) |
|||
{ |
|||
await RequestAsync(nameof(DeleteAsync), new ClientProxyRequestTypeValue |
|||
{ |
|||
{ typeof(Guid), id } |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
// This file is part of ProductClientProxy, you can customize it here
|
|||
// ReSharper disable once CheckNamespace
|
|||
namespace EShopOnAbp.CatalogService.Products.ClientProxies |
|||
{ |
|||
public partial class ProductClientProxy |
|||
{ |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
// This file is automatically generated by ABP framework to use MVC Controllers from CSharp
|
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Http.Client; |
|||
using Volo.Abp.Http.Modeling; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Http.Client.ClientProxying; |
|||
using EShopOnAbp.CatalogService.Products; |
|||
|
|||
// ReSharper disable once CheckNamespace
|
|||
namespace EShopOnAbp.CatalogService.Products.ClientProxies |
|||
{ |
|||
[Dependency(ReplaceServices = true)] |
|||
[ExposeServices(typeof(IPublicProductAppService), typeof(PublicProductClientProxy))] |
|||
public partial class PublicProductClientProxy : ClientProxyBase<IPublicProductAppService>, IPublicProductAppService |
|||
{ |
|||
public virtual async Task<ListResultDto<ProductDto>> GetListAsync() |
|||
{ |
|||
return await RequestAsync<ListResultDto<ProductDto>>(nameof(GetListAsync)); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
// This file is part of PublicProductClientProxy, you can customize it here
|
|||
// ReSharper disable once CheckNamespace
|
|||
namespace EShopOnAbp.CatalogService.Products.ClientProxies |
|||
{ |
|||
public partial class PublicProductClientProxy |
|||
{ |
|||
} |
|||
} |
|||
@ -0,0 +1,312 @@ |
|||
{ |
|||
"modules": { |
|||
"catalog": { |
|||
"rootPath": "catalog", |
|||
"remoteServiceName": "Catalog", |
|||
"controllers": { |
|||
"EShopOnAbp.CatalogService.Products.ProductAppService": { |
|||
"controllerName": "Product", |
|||
"controllerGroupName": "Product", |
|||
"type": "EShopOnAbp.CatalogService.Products.ProductAppService", |
|||
"interfaces": [ |
|||
{ |
|||
"type": "Volo.Abp.Validation.IValidationEnabled" |
|||
}, |
|||
{ |
|||
"type": "Volo.Abp.Auditing.IAuditingEnabled" |
|||
}, |
|||
{ |
|||
"type": "Volo.Abp.GlobalFeatures.IGlobalFeatureCheckingEnabled" |
|||
}, |
|||
{ |
|||
"type": "EShopOnAbp.CatalogService.Products.IProductAppService" |
|||
} |
|||
], |
|||
"actions": { |
|||
"GetListPagedAsyncByInput": { |
|||
"uniqueName": "GetListPagedAsyncByInput", |
|||
"name": "GetListPagedAsync", |
|||
"httpMethod": "GET", |
|||
"url": "api/catalog/product/paged", |
|||
"supportedVersions": [], |
|||
"parametersOnMethod": [ |
|||
{ |
|||
"name": "input", |
|||
"typeAsString": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto, Volo.Abp.Ddd.Application.Contracts", |
|||
"type": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", |
|||
"typeSimple": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", |
|||
"isOptional": false, |
|||
"defaultValue": null |
|||
} |
|||
], |
|||
"parameters": [ |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "Sorting", |
|||
"jsonName": null, |
|||
"type": "System.String", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "SkipCount", |
|||
"jsonName": null, |
|||
"type": "System.Int32", |
|||
"typeSimple": "number", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "MaxResultCount", |
|||
"jsonName": null, |
|||
"type": "System.Int32", |
|||
"typeSimple": "number", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
} |
|||
], |
|||
"returnValue": { |
|||
"type": "Volo.Abp.Application.Dtos.PagedResultDto<EShopOnAbp.CatalogService.Products.ProductDto>", |
|||
"typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto<EShopOnAbp.CatalogService.Products.ProductDto>" |
|||
}, |
|||
"allowAnonymous": false, |
|||
"implementFrom": "EShopOnAbp.CatalogService.Products.IProductAppService" |
|||
}, |
|||
"GetListAsync": { |
|||
"uniqueName": "GetListAsync", |
|||
"name": "GetListAsync", |
|||
"httpMethod": "GET", |
|||
"url": "api/catalog/product", |
|||
"supportedVersions": [], |
|||
"parametersOnMethod": [], |
|||
"parameters": [], |
|||
"returnValue": { |
|||
"type": "Volo.Abp.Application.Dtos.ListResultDto<EShopOnAbp.CatalogService.Products.ProductDto>", |
|||
"typeSimple": "Volo.Abp.Application.Dtos.ListResultDto<EShopOnAbp.CatalogService.Products.ProductDto>" |
|||
}, |
|||
"allowAnonymous": false, |
|||
"implementFrom": "EShopOnAbp.CatalogService.Products.IProductAppService" |
|||
}, |
|||
"GetAsyncById": { |
|||
"uniqueName": "GetAsyncById", |
|||
"name": "GetAsync", |
|||
"httpMethod": "GET", |
|||
"url": "api/catalog/product/{id}", |
|||
"supportedVersions": [], |
|||
"parametersOnMethod": [ |
|||
{ |
|||
"name": "id", |
|||
"typeAsString": "System.Guid, System.Private.CoreLib", |
|||
"type": "System.Guid", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null |
|||
} |
|||
], |
|||
"parameters": [ |
|||
{ |
|||
"nameOnMethod": "id", |
|||
"name": "id", |
|||
"jsonName": null, |
|||
"type": "System.Guid", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": [], |
|||
"bindingSourceId": "Path", |
|||
"descriptorName": "" |
|||
} |
|||
], |
|||
"returnValue": { |
|||
"type": "EShopOnAbp.CatalogService.Products.ProductDto", |
|||
"typeSimple": "EShopOnAbp.CatalogService.Products.ProductDto" |
|||
}, |
|||
"allowAnonymous": false, |
|||
"implementFrom": "EShopOnAbp.CatalogService.Products.IProductAppService" |
|||
}, |
|||
"CreateAsyncByInput": { |
|||
"uniqueName": "CreateAsyncByInput", |
|||
"name": "CreateAsync", |
|||
"httpMethod": "POST", |
|||
"url": "api/catalog/product", |
|||
"supportedVersions": [], |
|||
"parametersOnMethod": [ |
|||
{ |
|||
"name": "input", |
|||
"typeAsString": "EShopOnAbp.CatalogService.Products.CreateProductDto, EShopOnAbp.CatalogService.Application.Contracts", |
|||
"type": "EShopOnAbp.CatalogService.Products.CreateProductDto", |
|||
"typeSimple": "EShopOnAbp.CatalogService.Products.CreateProductDto", |
|||
"isOptional": false, |
|||
"defaultValue": null |
|||
} |
|||
], |
|||
"parameters": [ |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "input", |
|||
"jsonName": null, |
|||
"type": "EShopOnAbp.CatalogService.Products.CreateProductDto", |
|||
"typeSimple": "EShopOnAbp.CatalogService.Products.CreateProductDto", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "Body", |
|||
"descriptorName": "" |
|||
} |
|||
], |
|||
"returnValue": { |
|||
"type": "EShopOnAbp.CatalogService.Products.ProductDto", |
|||
"typeSimple": "EShopOnAbp.CatalogService.Products.ProductDto" |
|||
}, |
|||
"allowAnonymous": false, |
|||
"implementFrom": "EShopOnAbp.CatalogService.Products.IProductAppService" |
|||
}, |
|||
"UpdateAsyncByIdAndInput": { |
|||
"uniqueName": "UpdateAsyncByIdAndInput", |
|||
"name": "UpdateAsync", |
|||
"httpMethod": "PUT", |
|||
"url": "api/catalog/product/{id}", |
|||
"supportedVersions": [], |
|||
"parametersOnMethod": [ |
|||
{ |
|||
"name": "id", |
|||
"typeAsString": "System.Guid, System.Private.CoreLib", |
|||
"type": "System.Guid", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null |
|||
}, |
|||
{ |
|||
"name": "input", |
|||
"typeAsString": "EShopOnAbp.CatalogService.Products.UpdateProductDto, EShopOnAbp.CatalogService.Application.Contracts", |
|||
"type": "EShopOnAbp.CatalogService.Products.UpdateProductDto", |
|||
"typeSimple": "EShopOnAbp.CatalogService.Products.UpdateProductDto", |
|||
"isOptional": false, |
|||
"defaultValue": null |
|||
} |
|||
], |
|||
"parameters": [ |
|||
{ |
|||
"nameOnMethod": "id", |
|||
"name": "id", |
|||
"jsonName": null, |
|||
"type": "System.Guid", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": [], |
|||
"bindingSourceId": "Path", |
|||
"descriptorName": "" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "input", |
|||
"jsonName": null, |
|||
"type": "EShopOnAbp.CatalogService.Products.UpdateProductDto", |
|||
"typeSimple": "EShopOnAbp.CatalogService.Products.UpdateProductDto", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "Body", |
|||
"descriptorName": "" |
|||
} |
|||
], |
|||
"returnValue": { |
|||
"type": "EShopOnAbp.CatalogService.Products.ProductDto", |
|||
"typeSimple": "EShopOnAbp.CatalogService.Products.ProductDto" |
|||
}, |
|||
"allowAnonymous": false, |
|||
"implementFrom": "EShopOnAbp.CatalogService.Products.IProductAppService" |
|||
}, |
|||
"DeleteAsyncById": { |
|||
"uniqueName": "DeleteAsyncById", |
|||
"name": "DeleteAsync", |
|||
"httpMethod": "DELETE", |
|||
"url": "api/catalog/product/{id}", |
|||
"supportedVersions": [], |
|||
"parametersOnMethod": [ |
|||
{ |
|||
"name": "id", |
|||
"typeAsString": "System.Guid, System.Private.CoreLib", |
|||
"type": "System.Guid", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null |
|||
} |
|||
], |
|||
"parameters": [ |
|||
{ |
|||
"nameOnMethod": "id", |
|||
"name": "id", |
|||
"jsonName": null, |
|||
"type": "System.Guid", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": [], |
|||
"bindingSourceId": "Path", |
|||
"descriptorName": "" |
|||
} |
|||
], |
|||
"returnValue": { |
|||
"type": "System.Void", |
|||
"typeSimple": "System.Void" |
|||
}, |
|||
"allowAnonymous": false, |
|||
"implementFrom": "EShopOnAbp.CatalogService.Products.IProductAppService" |
|||
} |
|||
} |
|||
}, |
|||
"EShopOnAbp.CatalogService.Products.PublicProductAppService": { |
|||
"controllerName": "PublicProduct", |
|||
"controllerGroupName": "PublicProduct", |
|||
"type": "EShopOnAbp.CatalogService.Products.PublicProductAppService", |
|||
"interfaces": [ |
|||
{ |
|||
"type": "Volo.Abp.Validation.IValidationEnabled" |
|||
}, |
|||
{ |
|||
"type": "Volo.Abp.Auditing.IAuditingEnabled" |
|||
}, |
|||
{ |
|||
"type": "Volo.Abp.GlobalFeatures.IGlobalFeatureCheckingEnabled" |
|||
}, |
|||
{ |
|||
"type": "EShopOnAbp.CatalogService.Products.IPublicProductAppService" |
|||
} |
|||
], |
|||
"actions": { |
|||
"GetListAsync": { |
|||
"uniqueName": "GetListAsync", |
|||
"name": "GetListAsync", |
|||
"httpMethod": "GET", |
|||
"url": "api/catalog/public-product", |
|||
"supportedVersions": [], |
|||
"parametersOnMethod": [], |
|||
"parameters": [], |
|||
"returnValue": { |
|||
"type": "Volo.Abp.Application.Dtos.ListResultDto<EShopOnAbp.CatalogService.Products.ProductDto>", |
|||
"typeSimple": "Volo.Abp.Application.Dtos.ListResultDto<EShopOnAbp.CatalogService.Products.ProductDto>" |
|||
}, |
|||
"allowAnonymous": null, |
|||
"implementFrom": "EShopOnAbp.CatalogService.Products.IPublicProductAppService" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
"types": {} |
|||
} |
|||
@ -0,0 +1,110 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using EShopOnAbp.CatalogService.Products; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Domain.Repositories; |
|||
using Volo.Abp.Uow; |
|||
|
|||
namespace EShopOnAbp.CatalogService.DbMigrations |
|||
{ |
|||
public class ProductServiceDataSeeder : ITransientDependency |
|||
{ |
|||
private readonly ProductManager _productManager; |
|||
private readonly IRepository<Product, Guid> _productRepository; |
|||
|
|||
public ProductServiceDataSeeder( |
|||
IRepository<Product, Guid> productRepository, |
|||
ProductManager productManager) |
|||
{ |
|||
_productRepository = productRepository; |
|||
_productManager = productManager; |
|||
} |
|||
|
|||
[UnitOfWork] |
|||
public virtual async Task SeedAsync() |
|||
{ |
|||
await AddProductsAsync(); |
|||
} |
|||
|
|||
private async Task AddProductsAsync() |
|||
{ |
|||
if (await _productRepository.GetCountAsync() > 0) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP04918", |
|||
"Lego Star Wars - 75059 Sandcrawler UCS", |
|||
999, |
|||
42, |
|||
"lego.jpg" |
|||
); |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP23849", |
|||
"Nikon AF-S 50mm f/1.8 G Lens", |
|||
1499, |
|||
56, |
|||
"nikon.jpg" |
|||
); |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP82731", |
|||
"Beats Solo3 Wireless On-Ear Headphone", |
|||
97, |
|||
20, |
|||
"beats.jpg" |
|||
); |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP12322", |
|||
"Rampage Sn-Rw2 Gamer Headphone", |
|||
654, |
|||
42, |
|||
"rampage.jpg" |
|||
); |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP00291", |
|||
"Asus Transformer Book T300CHI-FH011H", |
|||
1249, |
|||
3, |
|||
"asus.jpg" |
|||
); |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP02918", |
|||
"OKI C332DN Dublex + Network A4 Laser Printer", |
|||
215, |
|||
6, |
|||
"oki.jpg" |
|||
); |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP11121", |
|||
"Bluecat Rd810 Mini Led", |
|||
449, |
|||
13, |
|||
"bluecat.jpg" |
|||
); |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP44432", |
|||
"Sunny 55\" TV 4K Ultra HD Curved Smart Led TV", |
|||
2249, |
|||
1, |
|||
"sunny.jpg" |
|||
); |
|||
|
|||
await _productManager.CreateAsync( |
|||
"ABP37182", |
|||
"Sony Playstation 4 Slim 500 GB (PAL)", |
|||
699, |
|||
120, |
|||
"playstation.jpg" |
|||
); |
|||
} |
|||
} |
|||
} |
|||