(feat): shop item dataprovider and controllers
This commit is contained in:
parent
5cf3a7f7f7
commit
3506afda39
@ -6,7 +6,7 @@
|
|||||||
"slug": "shop-catalog-item",
|
"slug": "shop-catalog-item",
|
||||||
"sku": "SKU-01",
|
"sku": "SKU-01",
|
||||||
"image": { "src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", "alt": "..." },
|
"image": { "src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", "alt": "..." },
|
||||||
"title": "Shop item title",
|
"title": "Mongo Shop item title",
|
||||||
"brandName": "Brand & Name",
|
"brandName": "Brand & Name",
|
||||||
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
"created": { "$date": "2022-01-01T00:00:00.000Z" },
|
"created": { "$date": "2022-01-01T00:00:00.000Z" },
|
||||||
@ -21,7 +21,7 @@
|
|||||||
"slug": "shop-catalog-item",
|
"slug": "shop-catalog-item",
|
||||||
"sku": "SKU-02",
|
"sku": "SKU-02",
|
||||||
"image": { "src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", "alt": "..." },
|
"image": { "src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", "alt": "..." },
|
||||||
"title": "Shop item title",
|
"title": "Mongo Shop item title",
|
||||||
"brandName": "Brand & Name",
|
"brandName": "Brand & Name",
|
||||||
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
"created": { "$date": "2022-01-01T00:00:00.000Z" },
|
"created": { "$date": "2022-01-01T00:00:00.000Z" },
|
||||||
@ -36,7 +36,7 @@
|
|||||||
"slug": "shop-catalog-item",
|
"slug": "shop-catalog-item",
|
||||||
"sku": "SKU-03",
|
"sku": "SKU-03",
|
||||||
"image": { "src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", "alt": "..." },
|
"image": { "src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", "alt": "..." },
|
||||||
"title": "Shop item title",
|
"title": "Mongo Shop item title",
|
||||||
"brandName": "Brand & Name",
|
"brandName": "Brand & Name",
|
||||||
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
"created": { "$date": "2022-01-01T00:00:00.000Z" },
|
"created": { "$date": "2022-01-01T00:00:00.000Z" },
|
||||||
|
|||||||
187
db/DML/shopcatalog.json
Normal file
187
db/DML/shopcatalog.json
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"_id": "e2dd785c-f036-453a-886b-d842b7c31366",
|
||||||
|
"siteId": "404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
|
"slug": "shop-catalog-item",
|
||||||
|
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg",
|
||||||
|
"alt": "..."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Shop item title",
|
||||||
|
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
|
"text": "",
|
||||||
|
"author": {
|
||||||
|
"_id": "fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
|
"image": {
|
||||||
|
"src": "https://dummyimage.com/40x40/ced4da/6c757d",
|
||||||
|
"alt": "..."
|
||||||
|
},
|
||||||
|
"nickName": "Admin"
|
||||||
|
},
|
||||||
|
"created": {
|
||||||
|
"$date": "2022-01-01T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
"badges": [
|
||||||
|
"sale"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"react",
|
||||||
|
"redux",
|
||||||
|
"webapi"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"_id": "e154e33f-3cc7-468d-bb66-e0390ddb9ae0",
|
||||||
|
"slug": "default",
|
||||||
|
"text": "Default category"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"brandName": "Mongodb Brand & Name",
|
||||||
|
"sku": "SKU-01",
|
||||||
|
"rating": 4.5,
|
||||||
|
"price": 20,
|
||||||
|
"newPrice": 10,
|
||||||
|
"quantity": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "055ede3f-7449-47d1-83b1-387dc3573711",
|
||||||
|
"siteId": "404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
|
"slug": "shop-catalog-item",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg",
|
||||||
|
"alt": "..."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Shop item title",
|
||||||
|
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
|
"text": "",
|
||||||
|
"author": {
|
||||||
|
"_id": "fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
|
"image": {
|
||||||
|
"src": "https://dummyimage.com/40x40/ced4da/6c757d",
|
||||||
|
"alt": "..."
|
||||||
|
},
|
||||||
|
"nickName": "Admin"
|
||||||
|
},
|
||||||
|
"created": {
|
||||||
|
"$date": "2022-01-01T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
"badges": [
|
||||||
|
"sale"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"react",
|
||||||
|
"redux",
|
||||||
|
"webapi"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"_id": "e154e33f-3cc7-468d-bb66-e0390ddb9ae0",
|
||||||
|
"slug": "default",
|
||||||
|
"text": "Default category"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"brandName": "Mongodb Brand & Name",
|
||||||
|
"sku": "SKU-02",
|
||||||
|
"rating": 4.5,
|
||||||
|
"price": 20,
|
||||||
|
"newPrice": 10,
|
||||||
|
"quantity": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "d17accca-6666-43ef-a91f-b63604e6113c",
|
||||||
|
"siteId": "404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
|
"slug": "shop-catalog-item",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg",
|
||||||
|
"alt": "..."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"brandName": "Brand & Name",
|
||||||
|
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
|
"text": "",
|
||||||
|
"author": {
|
||||||
|
"_id": "fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
|
"image": {
|
||||||
|
"src": "https://dummyimage.com/40x40/ced4da/6c757d",
|
||||||
|
"alt": "..."
|
||||||
|
},
|
||||||
|
"nickName": "Admin"
|
||||||
|
},
|
||||||
|
"created": {
|
||||||
|
"$date": "2022-01-01T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
"badges": [
|
||||||
|
"sale"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"react",
|
||||||
|
"redux",
|
||||||
|
"webapi"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"_id": "e154e33f-3cc7-468d-bb66-e0390ddb9ae0",
|
||||||
|
"slug": "default",
|
||||||
|
"text": "Default category"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"brandName": "Mongodb Brand & Name",
|
||||||
|
"sku": "SKU-03",
|
||||||
|
"rating": 4.5,
|
||||||
|
"price": 20,
|
||||||
|
"newPrice": 10,
|
||||||
|
"quantity": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "0dc37621-0925-41d8-90db-552224d59c2a",
|
||||||
|
"siteId": "404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
|
"slug": "shop-catalog-item",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"src": "https://dummyimage.com/450x300/dee2e6/6c757d.jpg",
|
||||||
|
"alt": "..."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Shop item title",
|
||||||
|
"shortText": "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
|
"text": "",
|
||||||
|
"author": {
|
||||||
|
"_id": "fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
|
"image": {
|
||||||
|
"src": "https://dummyimage.com/40x40/ced4da/6c757d",
|
||||||
|
"alt": "..."
|
||||||
|
},
|
||||||
|
"nickName": "Admin"
|
||||||
|
},
|
||||||
|
"created": {
|
||||||
|
"$date": "2022-01-01T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
"badges": [
|
||||||
|
"sale"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"react",
|
||||||
|
"redux",
|
||||||
|
"webapi"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"_id": "e154e33f-3cc7-468d-bb66-e0390ddb9ae0",
|
||||||
|
"slug": "default",
|
||||||
|
"text": "Default category"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"brandName": "Mongodb Brand & Name",
|
||||||
|
"sku": "SKU-04",
|
||||||
|
"rating": 4.5,
|
||||||
|
"price": 20,
|
||||||
|
"newPrice": 10,
|
||||||
|
"quantity": 100
|
||||||
|
}
|
||||||
|
]
|
||||||
@ -9,7 +9,7 @@
|
|||||||
"name": "Content",
|
"name": "Content",
|
||||||
"item": [
|
"item": [
|
||||||
{
|
{
|
||||||
"name": "GetContent",
|
"name": "01-Get",
|
||||||
"request": {
|
"request": {
|
||||||
"method": "GET",
|
"method": "GET",
|
||||||
"header": [
|
"header": [
|
||||||
@ -49,10 +49,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ShopCart",
|
"name": "ShopCartItems",
|
||||||
"item": [
|
"item": [
|
||||||
{
|
{
|
||||||
"name": "GetShopCart",
|
"name": "01-Get",
|
||||||
"request": {
|
"request": {
|
||||||
"method": "GET",
|
"method": "GET",
|
||||||
"header": [
|
"header": [
|
||||||
@ -68,7 +68,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"url": {
|
"url": {
|
||||||
"raw": "https://localhost:7151/api/ShopCart/404c8232-9048-4519-bfba-6e78dc7005ca/fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
"raw": "https://localhost:7151/api/ShopCartItems/404c8232-9048-4519-bfba-6e78dc7005ca/fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
"protocol": "https",
|
"protocol": "https",
|
||||||
"host": [
|
"host": [
|
||||||
"localhost"
|
"localhost"
|
||||||
@ -76,7 +76,7 @@
|
|||||||
"port": "7151",
|
"port": "7151",
|
||||||
"path": [
|
"path": [
|
||||||
"api",
|
"api",
|
||||||
"ShopCart",
|
"ShopCartItems",
|
||||||
"404c8232-9048-4519-bfba-6e78dc7005ca",
|
"404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
"fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60"
|
"fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60"
|
||||||
]
|
]
|
||||||
@ -85,6 +85,155 @@
|
|||||||
"response": []
|
"response": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ShopCartItem",
|
||||||
|
"item": [
|
||||||
|
{
|
||||||
|
"name": "01-Get",
|
||||||
|
"request": {
|
||||||
|
"method": "GET",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json",
|
||||||
|
"type": "default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Accept",
|
||||||
|
"value": "application/json",
|
||||||
|
"type": "default"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"url": {
|
||||||
|
"raw": "https://localhost:7151/api/ShopCartItem/404c8232-9048-4519-bfba-6e78dc7005ca/fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60/SKU-01",
|
||||||
|
"protocol": "https",
|
||||||
|
"host": [
|
||||||
|
"localhost"
|
||||||
|
],
|
||||||
|
"port": "7151",
|
||||||
|
"path": [
|
||||||
|
"api",
|
||||||
|
"ShopCartItem",
|
||||||
|
"404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
|
"fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
|
"SKU-01"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "02-Post",
|
||||||
|
"request": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json",
|
||||||
|
"type": "default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Accept",
|
||||||
|
"value": "application/json",
|
||||||
|
"type": "default"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\r\n \"slug\": \"shop-catalog-item\",\r\n \"image\": {\r\n \"src\": \"https://dummyimage.com/450x300/dee2e6/6c757d.jpg\",\r\n \"alt\": \"...\"\r\n },\r\n \"title\": \"Shop item title\",\r\n \"brandName\": \"Brand & Name\",\r\n \"shortText\": \"Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...\",\r\n \"created\": \"2022-01-01T00:00:00Z\",\r\n \"price\": 20,\r\n \"newPrice\": 10,\r\n \"quantity\": 1\r\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "https://localhost:7151/api/ShopCartItem/404c8232-9048-4519-bfba-6e78dc7005ca/fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60/SKU-04",
|
||||||
|
"protocol": "https",
|
||||||
|
"host": [
|
||||||
|
"localhost"
|
||||||
|
],
|
||||||
|
"port": "7151",
|
||||||
|
"path": [
|
||||||
|
"api",
|
||||||
|
"ShopCartItem",
|
||||||
|
"404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
|
"fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
|
"SKU-04"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "03-Put",
|
||||||
|
"request": {
|
||||||
|
"method": "PUT",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json",
|
||||||
|
"type": "default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Accept",
|
||||||
|
"value": "application/json",
|
||||||
|
"type": "default"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\r\n \"slug\": \"shop-catalog-item\",\r\n \"image\": {\r\n \"src\": \"https://dummyimage.com/450x300/dee2e6/6c757d.jpg\",\r\n \"alt\": \"...\"\r\n },\r\n \"title\": \"Shop item title\",\r\n \"brandName\": \"New Brand & Name\",\r\n \"shortText\": \"Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...\",\r\n \"created\": \"2022-01-01T00:00:00Z\",\r\n \"price\": 40,\r\n \"newPrice\": 50,\r\n \"quantity\": 2\r\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "https://localhost:7151/api/ShopCartItem/404c8232-9048-4519-bfba-6e78dc7005ca/fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60/SKU-04",
|
||||||
|
"protocol": "https",
|
||||||
|
"host": [
|
||||||
|
"localhost"
|
||||||
|
],
|
||||||
|
"port": "7151",
|
||||||
|
"path": [
|
||||||
|
"api",
|
||||||
|
"ShopCartItem",
|
||||||
|
"404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
|
"fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
|
"SKU-04"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "04-Delete",
|
||||||
|
"request": {
|
||||||
|
"method": "DELETE",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json",
|
||||||
|
"type": "default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Accept",
|
||||||
|
"value": "application/json",
|
||||||
|
"type": "default"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"url": {
|
||||||
|
"raw": "https://localhost:7151/api/ShopCartItem/404c8232-9048-4519-bfba-6e78dc7005ca/fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60/SKU-04",
|
||||||
|
"protocol": "https",
|
||||||
|
"host": [
|
||||||
|
"localhost"
|
||||||
|
],
|
||||||
|
"port": "7151",
|
||||||
|
"path": [
|
||||||
|
"api",
|
||||||
|
"ShopCartItem",
|
||||||
|
"404c8232-9048-4519-bfba-6e78dc7005ca",
|
||||||
|
"fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60",
|
||||||
|
"SKU-04"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": []
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -7,6 +7,7 @@ using System.Threading.Tasks;
|
|||||||
namespace Core.Abstractions.DomainObjects {
|
namespace Core.Abstractions.DomainObjects {
|
||||||
public class Category {
|
public class Category {
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
public string Slug { get; set; }
|
||||||
public string Text { get; set; }
|
public string Text { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,28 +9,28 @@ namespace Core.Abstractions.DomainObjects {
|
|||||||
|
|
||||||
public abstract class PostItemBase<T> : DomainObjectDocumentBase<T> {
|
public abstract class PostItemBase<T> : DomainObjectDocumentBase<T> {
|
||||||
|
|
||||||
public List<Image> Images { get; set; }
|
public Guid SiteId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
public string Slug { get; set; }
|
||||||
/// Author / Owner
|
|
||||||
/// </summary>
|
public List<Image> Images { get; set; }
|
||||||
public Guid UserId { get; set; }
|
|
||||||
|
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
|
|
||||||
public string Text { get; set; }
|
public string Text { get; set; }
|
||||||
|
|
||||||
public string Badge { get; set; }
|
public string ShortText { get; set; }
|
||||||
|
|
||||||
public List<string> Tags { get; set; }
|
public Author Author { get; set; }
|
||||||
|
|
||||||
public List<string> Categories { get; set; }
|
|
||||||
|
|
||||||
public DateTime Created { get; set; }
|
public DateTime Created { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
public List<string> Badges { get; set; }
|
||||||
/// Edit dateTime, and Author
|
|
||||||
/// </summary>
|
public List<string> Tags { get; set; }
|
||||||
public Dictionary<DateTime, Guid> Edited { get; set; }
|
|
||||||
|
public List<Category> Categories { get; set; }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,5 +11,11 @@ namespace Core.Models {
|
|||||||
public int TotalPages { get; set; }
|
public int TotalPages { get; set; }
|
||||||
public int CurrentPage { get; set; }
|
public int CurrentPage { get; set; }
|
||||||
public List<T> Items { get; set; }
|
public List<T> Items { get; set; }
|
||||||
|
|
||||||
|
public PaginationModelBase(int currentPage, int totalPages, List<T> items) {
|
||||||
|
CurrentPage = currentPage;
|
||||||
|
TotalPages = totalPages;
|
||||||
|
Items = items;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ using System.Text;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Core.Abstractions.Models {
|
namespace Core.Abstractions.Models {
|
||||||
public abstract class RequestModelBase<T> : ModelBase {
|
public abstract class PostItemRequestModel<T> : ModelBase {
|
||||||
public abstract T ToDomainObject();
|
public abstract T ToDomainObject();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +1,19 @@
|
|||||||
using Core.Abstractions.DomainObjects;
|
using Core.Abstractions.DomainObjects;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Core.DomainObjects {
|
namespace Core.DomainObjects {
|
||||||
public class Author : PersonBase<Author>{
|
public class Author : PersonBase<Author>{
|
||||||
public string NickName { get; set; }
|
public string NickName { get; set; }
|
||||||
|
|
||||||
public override int GetHashCode() {
|
public override int GetHashCode() {
|
||||||
throw new NotImplementedException();
|
unchecked {
|
||||||
|
int hash = 17;
|
||||||
|
hash = hash * 23 + Id.GetHashCode();
|
||||||
|
if(Image != null)
|
||||||
|
hash = hash * 23 + Image.GetHashCode();
|
||||||
|
hash = hash * 23 + NickName.GetHashCode();
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,9 +3,9 @@
|
|||||||
namespace Core.DomainObjects.Documents {
|
namespace Core.DomainObjects.Documents {
|
||||||
public class BlogItem : PostItemBase<BlogItem> {
|
public class BlogItem : PostItemBase<BlogItem> {
|
||||||
|
|
||||||
public int? ReadTime { get; set; }
|
public uint? ReadTime { get; set; }
|
||||||
|
|
||||||
public int? Likes { get; set; }
|
public uint? Likes { get; set; }
|
||||||
|
|
||||||
public override int GetHashCode() {
|
public override int GetHashCode() {
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
|
|||||||
@ -19,9 +19,9 @@ namespace Core.DomainObjects.Documents {
|
|||||||
// https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-overriding-gethashcode
|
// https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-overriding-gethashcode
|
||||||
// Overflow is fine, just wrap
|
// Overflow is fine, just wrap
|
||||||
unchecked {
|
unchecked {
|
||||||
|
|
||||||
int hash = 17;
|
int hash = 17;
|
||||||
// Suitable nullity checks etc, of course :)
|
// Suitable nullity checks etc, of course :)
|
||||||
|
hash = hash * 23 + Id.GetHashCode();
|
||||||
hash = hash * 23 + SiteId.GetHashCode();
|
hash = hash * 23 + SiteId.GetHashCode();
|
||||||
hash = hash * 23 + UserId.GetHashCode();
|
hash = hash * 23 + UserId.GetHashCode();
|
||||||
hash = hash * 23 + Slug.GetHashCode();
|
hash = hash * 23 + Slug.GetHashCode();
|
||||||
@ -35,7 +35,7 @@ namespace Core.DomainObjects.Documents {
|
|||||||
hash = hash * 23 + NewPrice.GetHashCode();
|
hash = hash * 23 + NewPrice.GetHashCode();
|
||||||
hash = hash * 23 + Quantity.GetHashCode();
|
hash = hash * 23 + Quantity.GetHashCode();
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +0,0 @@
|
|||||||
using Core.Abstractions.DomainObjects;
|
|
||||||
|
|
||||||
namespace Core.DomainObjects.Documents {
|
|
||||||
public class ShopCatalogItem : PostItemBase<ShopCatalogItem> {
|
|
||||||
|
|
||||||
public string Sku { get; set; }
|
|
||||||
public int Rating { get; set; }
|
|
||||||
public int Price { get; set; }
|
|
||||||
public int NewPrice { get; set; }
|
|
||||||
public int Quantity { get; set; }
|
|
||||||
|
|
||||||
public override int GetHashCode() {
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
39
webapi/Core/DomainObjects/Documents/ShopItem.cs
Normal file
39
webapi/Core/DomainObjects/Documents/ShopItem.cs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
using Core.Abstractions.DomainObjects;
|
||||||
|
|
||||||
|
namespace Core.DomainObjects.Documents {
|
||||||
|
public class ShopItem : PostItemBase<ShopItem> {
|
||||||
|
public string BrandName { get; set; }
|
||||||
|
public string Sku { get; set; }
|
||||||
|
public decimal? Rating { get; set; }
|
||||||
|
public double Price { get; set; }
|
||||||
|
public double? NewPrice { get; set; }
|
||||||
|
public uint? Quantity { get; set; }
|
||||||
|
|
||||||
|
public override int GetHashCode() {
|
||||||
|
unchecked {
|
||||||
|
int hash = 17;
|
||||||
|
hash = hash * 23 + Id.GetHashCode();
|
||||||
|
hash = hash * 23 + SiteId.GetHashCode();
|
||||||
|
hash = hash * 23 + Slug.GetHashCode();
|
||||||
|
hash = hash * 23 + Images.Sum(x => x.GetHashCode());
|
||||||
|
hash = hash * 23 + Title.GetHashCode();
|
||||||
|
hash = hash * 23 + Text.GetHashCode();
|
||||||
|
hash = hash * 23 + ShortText.GetHashCode();
|
||||||
|
hash = hash * 23 + Author.GetHashCode();
|
||||||
|
hash = hash * 23 + Created.GetHashCode();
|
||||||
|
hash = hash * 23 + Badges.Sum(x => x.GetHashCode());
|
||||||
|
hash = hash * 23 + Tags.Sum(x => x.GetHashCode());
|
||||||
|
hash = hash * 23 + Categories.Sum(x => x.GetHashCode());
|
||||||
|
|
||||||
|
hash = hash * 23 + BrandName.GetHashCode();
|
||||||
|
hash = hash * 23 + Sku.GetHashCode();
|
||||||
|
hash = hash * 23 + Rating.GetHashCode();
|
||||||
|
hash = hash * 23 + Price.GetHashCode();
|
||||||
|
hash = hash * 23 + NewPrice.GetHashCode();
|
||||||
|
hash = hash * 23 + Quantity.GetHashCode();
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -85,7 +85,9 @@ namespace DataProviders.Abstractions {
|
|||||||
|
|
||||||
#region Get
|
#region Get
|
||||||
private protected (List<T>?, IDomainResult) GetWithPredicate(Expression<Func<T, bool>> predicate, string collectionName) =>
|
private protected (List<T>?, IDomainResult) GetWithPredicate(Expression<Func<T, bool>> predicate, string collectionName) =>
|
||||||
GetWithPredicateCore(predicate, collectionName);
|
GetWithPredicateCore(predicate, 0, 0, collectionName);
|
||||||
|
private protected (List<T>?, IDomainResult) GetWithPredicate(Expression<Func<T, bool>> predicate, int skip, int limit, string collectionName) =>
|
||||||
|
GetWithPredicateCore(predicate, skip, limit, collectionName);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Update
|
#region Update
|
||||||
@ -104,7 +106,7 @@ namespace DataProviders.Abstractions {
|
|||||||
|
|
||||||
#region Exists
|
#region Exists
|
||||||
private protected (Guid?, IDomainResult) Exists(Guid id, string collectionName) {
|
private protected (Guid?, IDomainResult) Exists(Guid id, string collectionName) {
|
||||||
var (_resultList, result) = GetWithPredicate(x => x.Id == id, collectionName);
|
var (_resultList, result) = GetWithPredicate(x => x.Id == id, 0, 0, collectionName);
|
||||||
|
|
||||||
return (result.Status != DomainOperationStatus.Failed && _resultList != null && _resultList.Count > 0
|
return (result.Status != DomainOperationStatus.Failed && _resultList != null && _resultList.Count > 0
|
||||||
? id
|
? id
|
||||||
@ -189,7 +191,7 @@ namespace DataProviders.Abstractions {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private (List<T>?, IDomainResult) GetWithPredicateCore(Expression<Func<T, bool>> predicate, string collectionName) {
|
private (List<T>?, IDomainResult) GetWithPredicateCore(Expression<Func<T, bool>> predicate, int skip, int limit, string collectionName) {
|
||||||
try {
|
try {
|
||||||
List<T>? result;
|
List<T>? result;
|
||||||
|
|
||||||
@ -199,7 +201,7 @@ namespace DataProviders.Abstractions {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = _client.GetDatabase(_databaseName).GetCollection<T>(collectionName)
|
result = _client.GetDatabase(_databaseName).GetCollection<T>(collectionName)
|
||||||
.Find(predicate).ToList();
|
.Find(predicate).Skip(skip).Limit(limit).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return result != null && result.Count > 0
|
return result != null && result.Count > 0
|
||||||
|
|||||||
@ -23,7 +23,7 @@ namespace DataProviders {
|
|||||||
|
|
||||||
public (Content?, IDomainResult) Get(Guid siteId, string locale) {
|
public (Content?, IDomainResult) Get(Guid siteId, string locale) {
|
||||||
var (list, result) = GetWithPredicate(x => x.SiteId == siteId
|
var (list, result) = GetWithPredicate(x => x.SiteId == siteId
|
||||||
&& (x.Localization.Locale == null || x.Localization.Locale.ToLower() == locale.ToLower()), _collectionName);
|
&& (x.Localization.Locale == null || x.Localization.Locale.ToLower() == locale.ToLower()), 0, 0, _collectionName);
|
||||||
|
|
||||||
if (!result.IsSuccess || list == null || list.Count == 0)
|
if (!result.IsSuccess || list == null || list.Count == 0)
|
||||||
return (null, result);
|
return (null, result);
|
||||||
|
|||||||
@ -16,6 +16,7 @@ namespace DataProviders.Extensions
|
|||||||
services.AddSingleton<ISessionService, SessionService>();
|
services.AddSingleton<ISessionService, SessionService>();
|
||||||
|
|
||||||
services.AddSingleton<IContentDataProvider, ContentDataProvider>();
|
services.AddSingleton<IContentDataProvider, ContentDataProvider>();
|
||||||
|
services.AddSingleton<IShopCatalogDataProvider, ShopCatalogDataProvider>();
|
||||||
services.AddSingleton<IShopCartDataProvider, ShopCartDataProvider>();
|
services.AddSingleton<IShopCartDataProvider, ShopCartDataProvider>();
|
||||||
|
|
||||||
Mappings.RegisterClassMap();
|
Mappings.RegisterClassMap();
|
||||||
|
|||||||
@ -290,8 +290,8 @@ namespace DataProviders {
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ShopItem
|
#region ShopItem
|
||||||
if (!BsonClassMap.IsClassMapRegistered(typeof(ShopCatalogItem))) {
|
if (!BsonClassMap.IsClassMapRegistered(typeof(ShopItem))) {
|
||||||
BsonClassMap.RegisterClassMap<ShopCatalogItem>(cm => {
|
BsonClassMap.RegisterClassMap<ShopItem>(cm => {
|
||||||
cm.AutoMap();
|
cm.AutoMap();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,10 +31,10 @@ namespace DataProviders {
|
|||||||
Insert(obj, _collectionName);
|
Insert(obj, _collectionName);
|
||||||
|
|
||||||
public (List<ShopCartItem>?, IDomainResult) GetAll(Guid siteId, Guid userId) =>
|
public (List<ShopCartItem>?, IDomainResult) GetAll(Guid siteId, Guid userId) =>
|
||||||
GetWithPredicate(x => x.SiteId == siteId && x.UserId == userId, _collectionName);
|
GetWithPredicate(x => x.SiteId == siteId && x.UserId == userId, 0, 0,_collectionName);
|
||||||
|
|
||||||
public (ShopCartItem?, IDomainResult) Get(Guid siteId, Guid userId, string sku) {
|
public (ShopCartItem?, IDomainResult) Get(Guid siteId, Guid userId, string sku) {
|
||||||
var (list, result) = GetWithPredicate(x => x.SiteId == siteId && x.UserId == userId && x.Sku == sku, _collectionName);
|
var (list, result) = GetWithPredicate(x => x.SiteId == siteId && x.UserId == userId && x.Sku == sku, 0, 0, _collectionName);
|
||||||
|
|
||||||
if (!result.IsSuccess || list == null || list.Count == 0)
|
if (!result.IsSuccess || list == null || list.Count == 0)
|
||||||
return (null, result);
|
return (null, result);
|
||||||
|
|||||||
52
webapi/DataProviders/ShopCatalogDataProvider.cs
Normal file
52
webapi/DataProviders/ShopCatalogDataProvider.cs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
using DomainResults.Common;
|
||||||
|
|
||||||
|
using MongoDB.Bson.Serialization;
|
||||||
|
using MongoDB.Driver;
|
||||||
|
|
||||||
|
using Core.DomainObjects.Documents;
|
||||||
|
using DataProviders.Abstractions;
|
||||||
|
|
||||||
|
namespace DataProviders {
|
||||||
|
public interface IShopCatalogDataProvider {
|
||||||
|
(Guid?, IDomainResult) Insert(ShopItem obj);
|
||||||
|
(ShopItem?, IDomainResult) Get(Guid siteId, string sku);
|
||||||
|
(List<ShopItem>?, IDomainResult) GetAll(Guid siteId, int skip, int take);
|
||||||
|
(Guid?, IDomainResult) Update(ShopItem shopCart);
|
||||||
|
IDomainResult Delete(Guid id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ShopCatalogDataProvider : DataProviderBase<ShopItem>, IShopCatalogDataProvider {
|
||||||
|
|
||||||
|
private const string _collectionName = "shopcatalog";
|
||||||
|
|
||||||
|
public ShopCatalogDataProvider(
|
||||||
|
ILogger<DataProviderBase<ShopItem>> logger,
|
||||||
|
IMongoClient client,
|
||||||
|
IIdGenerator idGenerator,
|
||||||
|
ISessionService sessionService) : base(logger, client, idGenerator, sessionService) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public (Guid?, IDomainResult) Insert(ShopItem obj) =>
|
||||||
|
Insert(obj, _collectionName);
|
||||||
|
|
||||||
|
public (ShopItem?, IDomainResult) Get(Guid siteId, string sku) {
|
||||||
|
var (list, result) = GetWithPredicate(x => x.SiteId == siteId && x.Sku == sku, _collectionName);
|
||||||
|
|
||||||
|
if (!result.IsSuccess || list == null || list.Count == 0)
|
||||||
|
return (null, result);
|
||||||
|
|
||||||
|
return (list.First(), result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public (List<ShopItem>?, IDomainResult) GetAll(Guid siteId, int skip, int take) =>
|
||||||
|
GetWithPredicate(x => x.SiteId == siteId, skip, take, _collectionName);
|
||||||
|
|
||||||
|
public (Guid?, IDomainResult) Update(ShopItem shopCart) =>
|
||||||
|
UpdateWithPredicate(shopCart, x => x.Id == shopCart.Id, _collectionName);
|
||||||
|
|
||||||
|
public IDomainResult Delete(Guid id) =>
|
||||||
|
DeleteWithPredicate(x => x.Id == id, _collectionName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -32,31 +32,31 @@ public class BlogCatalogController : ControllerBase {
|
|||||||
public IActionResult Get([FromQuery] Guid? category, [FromQuery] string? searchText, [FromQuery] int currentPage = 1, [FromQuery] int itemsPerPage = 4) {
|
public IActionResult Get([FromQuery] Guid? category, [FromQuery] string? searchText, [FromQuery] int currentPage = 1, [FromQuery] int itemsPerPage = 4) {
|
||||||
|
|
||||||
|
|
||||||
var blogModels = new List<BlogItemModel>();
|
//var blogModels = new List<BlogItemModel>();
|
||||||
for (int i = 0; i < 100; i++) {
|
//for (int i = 0; i < 100; i++) {
|
||||||
var blogItemModel = new BlogItemModel {
|
// var blogItemModel = new BlogItemModel {
|
||||||
Id = Guid.NewGuid(),
|
// Id = Guid.NewGuid(),
|
||||||
Slug = "blog-post-title",
|
// Slug = "blog-post-title",
|
||||||
Image = new ImageModel { Src = "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", Alt = "..." },
|
// Image = new ImageModel { Src = "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", Alt = "..." },
|
||||||
Badge = "news",
|
// Badge = "news",
|
||||||
Title = $"Blog post title {i}",
|
// Title = $"Blog post title {i}",
|
||||||
ShortText = "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
// ShortText = "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
||||||
Text = "",
|
// Text = "",
|
||||||
Author = new AuthorModel {
|
// Author = new AuthorModel {
|
||||||
Image = new ImageModel { Src = "https://dummyimage.com/40x40/ced4da/6c757d", Alt = "..." },
|
// Image = new ImageModel { Src = "https://dummyimage.com/40x40/ced4da/6c757d", Alt = "..." },
|
||||||
NickName = "Admin"
|
// NickName = "Admin"
|
||||||
},
|
// },
|
||||||
Created = DateTime.UtcNow,
|
// Created = DateTime.UtcNow,
|
||||||
Tags = new List<string> { "react", "redux", "webapi" },
|
// Tags = new List<string> { "react", "redux", "webapi" },
|
||||||
|
|
||||||
ReadTime = 10,
|
// ReadTime = 10,
|
||||||
Likes = 200,
|
// Likes = 200,
|
||||||
};
|
// };
|
||||||
|
|
||||||
blogModels.Add(blogItemModel);
|
// blogModels.Add(blogItemModel);
|
||||||
}
|
//}
|
||||||
|
|
||||||
var totalPages = blogModels.Count() / itemsPerPage;
|
//var totalPages = blogModels.Count() / itemsPerPage;
|
||||||
|
|
||||||
var blogCatalogResponse = new GetBlogCatalogResponseModel {
|
var blogCatalogResponse = new GetBlogCatalogResponseModel {
|
||||||
|
|
||||||
|
|||||||
@ -22,36 +22,9 @@ namespace WeatherForecast.Controllers {
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult Get() {
|
public IActionResult Get() {
|
||||||
#if MOCK_SERVER
|
|
||||||
var blogItems = new List<BlogItemModel>();
|
|
||||||
for (int i = 0; i < 3; i++) {
|
|
||||||
blogItems.Add(new BlogItemModel {
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
Slug = "blog-post-title",
|
|
||||||
Image = new ImageModel { Src = "https://dummyimage.com/600x350/ced4da/6c757d", Alt = "..." },
|
|
||||||
Badge = "news",
|
|
||||||
Title = "C# Blog post title",
|
|
||||||
ShortText = "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
|
||||||
Text = "",
|
|
||||||
Author = new AuthorModel {
|
|
||||||
//Id = Guid.NewGuid(),
|
|
||||||
Image = new ImageModel { Src = "https://dummyimage.com/40x40/ced4da/6c757d", Alt = "..." },
|
|
||||||
NickName = "Admin"
|
|
||||||
},
|
|
||||||
Created = DateTime.UtcNow,
|
|
||||||
Tags = new List<string> { "react", "redux", "webapi" },
|
|
||||||
|
|
||||||
ReadTime = 10,
|
|
||||||
Likes = 200,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var result = new GetBlogFeaturedResponseModel(blogItems);
|
|
||||||
|
|
||||||
return Ok(result);
|
|
||||||
#else
|
|
||||||
return Ok();
|
return Ok();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ public class ContentController : ControllerBase {
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{siteId}")]
|
[HttpGet("{siteId}")]
|
||||||
public IActionResult Get([FromRoute] Guid siteId, [FromQuery] string? locale) {
|
public IActionResult Get([FromRoute] Guid siteId, [FromQuery] string? locale) {
|
||||||
var result = _contentService.GetContent(siteId, locale ?? "en-Us") ;
|
var result = _contentService.GetContent(siteId, locale ?? "en-US") ;
|
||||||
return result.ToActionResult();
|
return result.ToActionResult();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,72 +0,0 @@
|
|||||||
using Core.Abstractions.Models;
|
|
||||||
using Core.Models;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using WeatherForecast.Models;
|
|
||||||
using WeatherForecast.Models.Responses;
|
|
||||||
|
|
||||||
namespace WeatherForecast.Controllers;
|
|
||||||
|
|
||||||
[AllowAnonymous]
|
|
||||||
[ApiController]
|
|
||||||
[Route("api/[controller]")]
|
|
||||||
public class ShopCatalogController : ControllerBase {
|
|
||||||
|
|
||||||
private readonly ILogger<ShopCatalogController> _logger;
|
|
||||||
|
|
||||||
public ShopCatalogController(ILogger<ShopCatalogController> logger) {
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="category"></param>
|
|
||||||
/// <param name="searchText"></param>
|
|
||||||
/// <param name="currentPage"></param>
|
|
||||||
/// <param name="itemsPerPage"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult Get([FromQuery] Guid? category, [FromQuery] string? searchText, [FromQuery] int currentPage = 1, [FromQuery] int itemsPerPage = 8) {
|
|
||||||
|
|
||||||
var shopModels = new List<ShopItemModel>();
|
|
||||||
for (int i = 0; i < 8; i++) {
|
|
||||||
var shopItemModel = new ShopItemModel {
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
Sku = "SKU-0",
|
|
||||||
Slug = "shop-catalog-item",
|
|
||||||
Image = new ImageModel { Src = "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", Alt = "..." },
|
|
||||||
Badge = "sale",
|
|
||||||
Title = "Shop item title",
|
|
||||||
|
|
||||||
ShortText = "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
|
|
||||||
Text = "",
|
|
||||||
Author = new AuthorModel {
|
|
||||||
// Id = Guid.NewGuid(),
|
|
||||||
Image = new ImageModel { Src = "https://dummyimage.com/40x40/ced4da/6c757d", Alt = "..." },
|
|
||||||
NickName = "Admin"
|
|
||||||
},
|
|
||||||
Created = DateTime.UtcNow,
|
|
||||||
|
|
||||||
Tags = new List<string> { "react", "redux", "webapi" },
|
|
||||||
|
|
||||||
Rating = 4.5,
|
|
||||||
Price = 20,
|
|
||||||
NewPrice = 10
|
|
||||||
};
|
|
||||||
|
|
||||||
shopModels.Add(shopItemModel);
|
|
||||||
}
|
|
||||||
|
|
||||||
var shopCatalogResponse = new GetShopCatalogResponseModel {
|
|
||||||
/*ShopItemsPagination = new PaginationModelBase<ShopItemModel> {
|
|
||||||
CurrentPage = currentPage,
|
|
||||||
TotalPages = 100,
|
|
||||||
Items = shopModels
|
|
||||||
}*/
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
return Ok(shopCatalogResponse);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,5 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using WeatherForecast.Services;
|
||||||
|
using DomainResults.Mvc;
|
||||||
|
|
||||||
namespace WeatherForecast.Controllers {
|
namespace WeatherForecast.Controllers {
|
||||||
|
|
||||||
@ -9,18 +11,26 @@ namespace WeatherForecast.Controllers {
|
|||||||
public class ShopItemController : ControllerBase {
|
public class ShopItemController : ControllerBase {
|
||||||
|
|
||||||
private readonly ILogger<ShopItemController> _logger;
|
private readonly ILogger<ShopItemController> _logger;
|
||||||
|
private readonly IShopItemService _shopItemService;
|
||||||
|
|
||||||
public ShopItemController(ILogger<ShopItemController> logger) {
|
public ShopItemController(
|
||||||
|
ILogger<ShopItemController> logger,
|
||||||
|
IShopItemService shopItemService
|
||||||
|
) {
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_shopItemService = shopItemService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="siteId"></param>
|
||||||
|
/// <param name="sku"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet]
|
[HttpGet("{siteId}/{sku}")]
|
||||||
public IActionResult Get() {
|
public IActionResult Get([FromRoute] Guid siteId, [FromRoute] string sku) {
|
||||||
return Ok();
|
var result = _shopItemService.Get(siteId, sku);
|
||||||
|
return result.ToActionResult();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
42
webapi/WeatherForecast/Controllers/ShopItemsController.cs
Normal file
42
webapi/WeatherForecast/Controllers/ShopItemsController.cs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
using Core.Abstractions.Models;
|
||||||
|
using Core.Models;
|
||||||
|
using DomainResults.Mvc;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using WeatherForecast.Models;
|
||||||
|
using WeatherForecast.Models.Responses;
|
||||||
|
using WeatherForecast.Services;
|
||||||
|
|
||||||
|
namespace WeatherForecast.Controllers;
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/[controller]")]
|
||||||
|
public class ShopItemsController : ControllerBase {
|
||||||
|
|
||||||
|
private readonly ILogger<ShopItemsController> _logger;
|
||||||
|
private readonly IShopItemsService _shopItemsService;
|
||||||
|
|
||||||
|
public ShopItemsController(
|
||||||
|
ILogger<ShopItemsController> logger,
|
||||||
|
IShopItemsService shopCatalogService
|
||||||
|
) {
|
||||||
|
_logger = logger;
|
||||||
|
_shopItemsService = shopCatalogService;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="category"></param>
|
||||||
|
/// <param name="searchText"></param>
|
||||||
|
/// <param name="currentPage"></param>
|
||||||
|
/// <param name="itemsPerPage"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("{siteId}")]
|
||||||
|
public IActionResult Get([FromRoute] Guid siteId, [FromQuery] Guid? category, [FromQuery] int? currentPage, [FromQuery] int? itemsPerPage, [FromQuery] string? searchText) {
|
||||||
|
var result = _shopItemsService.Get(siteId, category, currentPage ?? 1, itemsPerPage ?? 8, searchText);
|
||||||
|
return result.ToActionResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -10,6 +10,9 @@ namespace WeatherForecast.Controllers {
|
|||||||
|
|
||||||
private readonly ILogger<ShopRelatedController> _logger;
|
private readonly ILogger<ShopRelatedController> _logger;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public ShopRelatedController(ILogger<ShopRelatedController> logger) {
|
public ShopRelatedController(ILogger<ShopRelatedController> logger) {
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,16 @@
|
|||||||
using Core.Abstractions.Models;
|
using Core.Abstractions.DomainObjects;
|
||||||
|
using Core.Abstractions.Models;
|
||||||
using Core.DomainObjects;
|
using Core.DomainObjects;
|
||||||
|
|
||||||
namespace WeatherForecast.Models.Abstractions {
|
namespace WeatherForecast.Models.Abstractions {
|
||||||
public abstract class PersonModelBase : ModelBase {
|
public abstract class PersonModelBase<T> : ModelBase {
|
||||||
public ImageModel? Image { get; set; }
|
public ImageModel? Image { get; set; }
|
||||||
|
|
||||||
public PersonModelBase() { }
|
public PersonModelBase() { }
|
||||||
|
|
||||||
public PersonModelBase(Image? image) {
|
public PersonModelBase(PersonBase<T> person) {
|
||||||
Image = new ImageModel(image);
|
if(person.Image != null)
|
||||||
|
Image = new ImageModel(person.Image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
using Core.Abstractions.Models;
|
using Core.Abstractions.DomainObjects;
|
||||||
|
using Core.Abstractions.Models;
|
||||||
|
|
||||||
namespace WeatherForecast.Models.Abstractions {
|
namespace WeatherForecast.Models.Abstractions {
|
||||||
public abstract class PostItemModelBase : ModelBase {
|
public abstract class PostItemRequestModelBase<T> : PostItemRequestModel<T> {
|
||||||
public Guid Id { get; set; }
|
|
||||||
|
|
||||||
public string Slug { get; set; }
|
public string Slug { get; set; }
|
||||||
|
|
||||||
public ImageModel Image { get; set; }
|
public List<ImageModel> Images { get; set; }
|
||||||
|
|
||||||
public string Badge { get; set; }
|
public List<string> Badges { get; set; }
|
||||||
|
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
|
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
using Core.Abstractions.DomainObjects;
|
||||||
|
using Core.Abstractions.Models;
|
||||||
|
|
||||||
|
namespace WeatherForecast.Models.Abstractions {
|
||||||
|
public abstract class PostItemResponseModelBase<T> : ResponseModelBase {
|
||||||
|
|
||||||
|
public string Slug { get; set; }
|
||||||
|
|
||||||
|
public List<ImageModel> Images { get; set; }
|
||||||
|
|
||||||
|
public List<string> Badges { get; set; }
|
||||||
|
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
public string? ShortText { get; set; }
|
||||||
|
|
||||||
|
public string? Text { get; set; }
|
||||||
|
|
||||||
|
public AuthorModel Author { get; set; }
|
||||||
|
|
||||||
|
public DateTime Created { get; set; }
|
||||||
|
|
||||||
|
public List<string> Tags { get; set; }
|
||||||
|
|
||||||
|
public PostItemResponseModelBase(PostItemBase<T> postItem) {
|
||||||
|
Slug = postItem.Slug;
|
||||||
|
Images = postItem.Images.Select(x => new ImageModel(x)).ToList();
|
||||||
|
Badges = postItem.Badges;
|
||||||
|
Title = postItem.Title;
|
||||||
|
Text = postItem.Text;
|
||||||
|
ShortText = postItem.ShortText;
|
||||||
|
Author = new AuthorModel(postItem.Author);
|
||||||
|
Created = postItem.Created;
|
||||||
|
Tags = postItem.Tags;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,7 +1,12 @@
|
|||||||
using WeatherForecast.Models.Abstractions;
|
using Core.DomainObjects;
|
||||||
|
using WeatherForecast.Models.Abstractions;
|
||||||
|
|
||||||
namespace WeatherForecast.Models {
|
namespace WeatherForecast.Models {
|
||||||
public class AuthorModel : PersonModelBase {
|
public class AuthorModel : PersonModelBase<Author> {
|
||||||
public string NickName { get; set; }
|
public string NickName { get; set; }
|
||||||
|
|
||||||
|
public AuthorModel(Author author) {
|
||||||
|
NickName = author.NickName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,17 @@
|
|||||||
using WeatherForecast.Models.Abstractions;
|
using Core.Abstractions.DomainObjects;
|
||||||
|
using Core.DomainObjects.Documents;
|
||||||
|
using WeatherForecast.Models.Abstractions;
|
||||||
|
|
||||||
namespace WeatherForecast.Models {
|
namespace WeatherForecast.Models {
|
||||||
public class BlogItemModel : PostItemModelBase {
|
public class BlogItemModel : PostItemResponseModelBase<BlogItem> {
|
||||||
|
|
||||||
|
public uint? ReadTime { get; set; }
|
||||||
|
|
||||||
public int? ReadTime { get; set; }
|
public uint? Likes { get; set; }
|
||||||
|
|
||||||
public int? Likes { get; set; }
|
public BlogItemModel(BlogItem postItem) : base(postItem) {
|
||||||
|
ReadTime = postItem.ReadTime;
|
||||||
|
Likes = postItem.Likes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ using Core.DomainObjects;
|
|||||||
using Core.DomainObjects.Documents;
|
using Core.DomainObjects.Documents;
|
||||||
|
|
||||||
namespace WeatherForecast.Models.Requests {
|
namespace WeatherForecast.Models.Requests {
|
||||||
public class PostShopCartItemRequestModel : RequestModelBase<ShopCartItem> {
|
public class PostShopCartItemRequestModel : PostItemRequestModel<ShopCartItem> {
|
||||||
|
|
||||||
public string Slug { get; set; }
|
public string Slug { get; set; }
|
||||||
public ImageModel Image { get; set; }
|
public ImageModel Image { get; set; }
|
||||||
|
|||||||
@ -0,0 +1,32 @@
|
|||||||
|
using Core.Abstractions.Models;
|
||||||
|
using Core.DomainObjects;
|
||||||
|
using Core.DomainObjects.Documents;
|
||||||
|
|
||||||
|
namespace WeatherForecast.Models.Requests {
|
||||||
|
public class PostShopItemRequestModel : PostItemRequestModel<ShopItem> {
|
||||||
|
public string Slug { get; set; }
|
||||||
|
public List<ImageModel> Images { get; set; }
|
||||||
|
public string Title { get; set; }
|
||||||
|
public string BrandName { get; set; }
|
||||||
|
public string ShortText { get; set; }
|
||||||
|
public DateTime Created { get; set; }
|
||||||
|
public double Price { get; set; }
|
||||||
|
public double NewPrice { get; set; }
|
||||||
|
public uint Quantity { get; set; }
|
||||||
|
|
||||||
|
public override ShopItem ToDomainObject() => new ShopItem {
|
||||||
|
Slug = Slug,
|
||||||
|
Images = Images.Select(x => new Image {
|
||||||
|
Src = x.Src,
|
||||||
|
Alt = x.Alt
|
||||||
|
}).ToList(),
|
||||||
|
Title = Title,
|
||||||
|
BrandName = BrandName,
|
||||||
|
ShortText = ShortText,
|
||||||
|
Created = Created,
|
||||||
|
Price = Price,
|
||||||
|
NewPrice = NewPrice,
|
||||||
|
Quantity = Quantity
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,7 +3,7 @@ using Core.DomainObjects;
|
|||||||
using Core.DomainObjects.Documents;
|
using Core.DomainObjects.Documents;
|
||||||
|
|
||||||
namespace WeatherForecast.Models.Requests {
|
namespace WeatherForecast.Models.Requests {
|
||||||
public class PutShopCartItemRequestModel : RequestModelBase<ShopCartItem> {
|
public class PutShopCartItemRequestModel : PostItemRequestModel<ShopCartItem> {
|
||||||
|
|
||||||
public string Slug { get; set; }
|
public string Slug { get; set; }
|
||||||
public ImageModel Image { get; set; }
|
public ImageModel Image { get; set; }
|
||||||
|
|||||||
@ -0,0 +1,10 @@
|
|||||||
|
using Core.Abstractions.Models;
|
||||||
|
using Core.DomainObjects.Documents;
|
||||||
|
|
||||||
|
namespace WeatherForecast.Models.Requests {
|
||||||
|
public class PutShopItemRequestModel : PostItemRequestModel<ShopItem> {
|
||||||
|
public override ShopItem ToDomainObject() {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,8 +0,0 @@
|
|||||||
using Core.Abstractions.Models;
|
|
||||||
using Core.Models;
|
|
||||||
|
|
||||||
namespace WeatherForecast.Models.Responses {
|
|
||||||
public class GetShopCatalogResponseModel : ResponseModelBase {
|
|
||||||
public PaginationModelBase<ShopItemModel> ShopItemsPagination { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
using Core.DomainObjects.Documents;
|
||||||
|
using Core.DomainObjects.Pages;
|
||||||
|
using WeatherForecast.Models.Abstractions;
|
||||||
|
|
||||||
|
namespace WeatherForecast.Models {
|
||||||
|
public class GetShopItemResponseModel : PostItemResponseModelBase<ShopItem> {
|
||||||
|
public List<ImageModel>? Images { get; set; }
|
||||||
|
public string Sku { get; set; }
|
||||||
|
public decimal? Rating { get; set; }
|
||||||
|
public double Price { get; set; }
|
||||||
|
public double? NewPrice { get; set; }
|
||||||
|
public uint? Quantity { get; set; }
|
||||||
|
|
||||||
|
public GetShopItemResponseModel(ShopItem shopCatalogItem) : base(shopCatalogItem) {
|
||||||
|
Images = shopCatalogItem.Images.Select(x => new ImageModel(x)).ToList();
|
||||||
|
Sku = shopCatalogItem.Sku;
|
||||||
|
Rating = shopCatalogItem.Rating;
|
||||||
|
Price = shopCatalogItem.Price;
|
||||||
|
NewPrice = shopCatalogItem.NewPrice;
|
||||||
|
Quantity = shopCatalogItem.Quantity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
using Core.Abstractions.Models;
|
||||||
|
using Core.Models;
|
||||||
|
|
||||||
|
namespace WeatherForecast.Models.Responses {
|
||||||
|
public class GetShopItemsResponseModel : PaginationModelBase<GetShopItemResponseModel> {
|
||||||
|
public GetShopItemsResponseModel(int currentPage, int totalPages, List<GetShopItemResponseModel> items)
|
||||||
|
: base(currentPage, totalPages, items) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2,11 +2,11 @@
|
|||||||
using WeatherForecast.Models.Abstractions;
|
using WeatherForecast.Models.Abstractions;
|
||||||
|
|
||||||
namespace WeatherForecast.Models {
|
namespace WeatherForecast.Models {
|
||||||
public class ReviewerModel : PersonModelBase {
|
public class ReviewerModel : PersonModelBase<Reviewer> {
|
||||||
public string FullName { get; set; }
|
public string FullName { get; set; }
|
||||||
public string Position { get; set; }
|
public string Position { get; set; }
|
||||||
|
|
||||||
public ReviewerModel(Reviewer reviewer) : base(reviewer.Image) {
|
public ReviewerModel(Reviewer reviewer) : base(reviewer) {
|
||||||
FullName = reviewer.FullName;
|
FullName = reviewer.FullName;
|
||||||
Position = reviewer.Position;
|
Position = reviewer.Position;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +0,0 @@
|
|||||||
using Core.DomainObjects.Documents;
|
|
||||||
using Core.DomainObjects.Pages;
|
|
||||||
using WeatherForecast.Models.Abstractions;
|
|
||||||
|
|
||||||
namespace WeatherForecast.Models {
|
|
||||||
public class ShopItemModel : PostItemModelBase {
|
|
||||||
public List<ImageModel>? Images { get; set; }
|
|
||||||
public string Sku { get; set; }
|
|
||||||
public double? Rating { get; set; }
|
|
||||||
public double Price { get; set; }
|
|
||||||
public double? NewPrice { get; set; }
|
|
||||||
public int? Quantity { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
85
webapi/WeatherForecast/Services/ShopItemService.cs
Normal file
85
webapi/WeatherForecast/Services/ShopItemService.cs
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
using DataProviders;
|
||||||
|
using DomainResults.Common;
|
||||||
|
using WeatherForecast.Models;
|
||||||
|
using WeatherForecast.Models.Requests;
|
||||||
|
|
||||||
|
namespace WeatherForecast.Services {
|
||||||
|
|
||||||
|
public interface IShopItemService {
|
||||||
|
(GetShopItemResponseModel, IDomainResult) Get(Guid siteId, string sku);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ShopItemService : IShopItemService {
|
||||||
|
|
||||||
|
private readonly ILogger<ShopItemService> _logger;
|
||||||
|
private readonly IShopCatalogDataProvider _shopCatalogDataProvider;
|
||||||
|
|
||||||
|
public ShopItemService(
|
||||||
|
ILogger<ShopItemService> logger,
|
||||||
|
IShopCatalogDataProvider shopCatalogDataProvider
|
||||||
|
) {
|
||||||
|
_logger = logger;
|
||||||
|
_shopCatalogDataProvider = shopCatalogDataProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public (Guid?, IDomainResult) Post(Guid siteId, string sku, PostShopItemRequestModel requestModel) {
|
||||||
|
var (_, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
|
||||||
|
if (getResult.IsSuccess)
|
||||||
|
return IDomainResult.Failed<Guid?>();
|
||||||
|
|
||||||
|
var item = requestModel.ToDomainObject();
|
||||||
|
|
||||||
|
item.SiteId = siteId;
|
||||||
|
item.Sku = sku;
|
||||||
|
|
||||||
|
var (id, insertResult) = _shopCatalogDataProvider.Insert(item);
|
||||||
|
|
||||||
|
if (!insertResult.IsSuccess)
|
||||||
|
return IDomainResult.Failed<Guid?>();
|
||||||
|
|
||||||
|
return IDomainResult.Success(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public (GetShopItemResponseModel?, IDomainResult) Get(Guid siteId, string sku) {
|
||||||
|
var (item, result) = _shopCatalogDataProvider.Get(siteId, sku);
|
||||||
|
|
||||||
|
if (!result.IsSuccess || item == null)
|
||||||
|
return (null, result);
|
||||||
|
|
||||||
|
return IDomainResult.Success(new GetShopItemResponseModel(item));
|
||||||
|
}
|
||||||
|
|
||||||
|
public (Guid?, IDomainResult) Update(Guid siteId, string sku, PutShopItemRequestModel requestData) {
|
||||||
|
var (item, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
|
||||||
|
if (!getResult.IsSuccess || item == null)
|
||||||
|
return (null, getResult);
|
||||||
|
|
||||||
|
// construct domain object from model
|
||||||
|
var newItem = requestData.ToDomainObject();
|
||||||
|
newItem.Id = item.Id;
|
||||||
|
newItem.SiteId = siteId;
|
||||||
|
newItem.Sku = sku;
|
||||||
|
|
||||||
|
if (!item.Equals(newItem)) {
|
||||||
|
var (id, updateResult) = _shopCatalogDataProvider.Update(newItem);
|
||||||
|
if (!updateResult.IsSuccess || id == null)
|
||||||
|
return (null, updateResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
return IDomainResult.Success(item.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IDomainResult Delete(Guid siteId, string sku) {
|
||||||
|
var (item, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
|
||||||
|
if (!getResult.IsSuccess || item == null)
|
||||||
|
return getResult;
|
||||||
|
|
||||||
|
var result = _shopCatalogDataProvider.Delete(item.Id);
|
||||||
|
if (!result.IsSuccess)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
return IDomainResult.Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
33
webapi/WeatherForecast/Services/ShopItemsService.cs
Normal file
33
webapi/WeatherForecast/Services/ShopItemsService.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using DataProviders;
|
||||||
|
using DomainResults.Common;
|
||||||
|
using WeatherForecast.Models;
|
||||||
|
using WeatherForecast.Models.Responses;
|
||||||
|
|
||||||
|
namespace WeatherForecast.Services {
|
||||||
|
|
||||||
|
public interface IShopItemsService {
|
||||||
|
(GetShopItemsResponseModel?, IDomainResult) Get(Guid siteId, Guid? category, int currentPage, int itemsPerPage, string? searchText);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ShopItemsService : IShopItemsService {
|
||||||
|
ILogger<ShopItemsService> _logger;
|
||||||
|
IShopCatalogDataProvider _shopCatalogDataProvider;
|
||||||
|
|
||||||
|
public ShopItemsService(
|
||||||
|
ILogger<ShopItemsService> logger,
|
||||||
|
IShopCatalogDataProvider shopCatalogDataprovider
|
||||||
|
) {
|
||||||
|
_logger = logger;
|
||||||
|
_shopCatalogDataProvider = shopCatalogDataprovider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public (GetShopItemsResponseModel?, IDomainResult) Get(Guid siteId, Guid? category, int currentPage, int itemsPerPage, string? searchText) {
|
||||||
|
var (items, result) = _shopCatalogDataProvider.GetAll(siteId, currentPage > 0 ? ((currentPage - 1) * itemsPerPage) : 0, itemsPerPage);
|
||||||
|
|
||||||
|
if (!result.IsSuccess || items == null)
|
||||||
|
return (null, result);
|
||||||
|
|
||||||
|
return IDomainResult.Success(new GetShopItemsResponseModel(currentPage, 0, items.Select(x => new GetShopItemResponseModel(x)).ToList()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -58,6 +58,8 @@ namespace WeatherForecast {
|
|||||||
services.AddHttpContextAccessor();
|
services.AddHttpContextAccessor();
|
||||||
|
|
||||||
services.AddScoped<IContentService, ContentService>();
|
services.AddScoped<IContentService, ContentService>();
|
||||||
|
services.AddScoped<IShopItemService, ShopItemService>();
|
||||||
|
services.AddScoped<IShopItemsService, ShopItemsService>();
|
||||||
services.AddScoped<IShopCartItemService, ShopCartItemService>();
|
services.AddScoped<IShopCartItemService, ShopCartItemService>();
|
||||||
services.AddScoped<IShopCartItemsService, ShopCartItemsService>();
|
services.AddScoped<IShopCartItemsService, ShopCartItemsService>();
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user