From e875de77da83e761c9df422e7d6c3bedd61c8267 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 16:21:58 +0500 Subject: [PATCH 1/9] Added Links to ProductsController and Changed classes to records in ResourceParameters --- Inflow.Api/Controllers/ProductsController.cs | 91 ++++++++++++++++++- .../CategoryResourceParameters.cs | 3 +- .../CustomerResourceParameters.cs | 2 +- .../ProductResourceParameters.cs | 2 +- .../ResourceParametersBase.cs | 2 +- .../SaleItemResourceParameters.cs | 2 +- .../SaleResourceParameters.cs | 2 +- .../SupplierResourceParameters.cs | 2 +- .../SupplyItemResourceParameters.cs | 2 +- .../SupplyResourceParameters.cs | 2 +- 10 files changed, 95 insertions(+), 15 deletions(-) diff --git a/Inflow.Api/Controllers/ProductsController.cs b/Inflow.Api/Controllers/ProductsController.cs index 59788e2..7de2bf4 100644 --- a/Inflow.Api/Controllers/ProductsController.cs +++ b/Inflow.Api/Controllers/ProductsController.cs @@ -1,5 +1,6 @@ using AutoMapper; using ClosedXML.Excel; +using Inflow.Api.Helper; using Inflow.Domain.DTOs.Product; using Inflow.Domain.Entities; using Inflow.Domain.Interfaces.Services; @@ -27,15 +28,31 @@ public ProductsController(IProductService productService, IMapper mapper) _mapper = mapper; } - [HttpGet] - public ActionResult> GetProductsAsync( - [FromQuery] ProductResourceParameters productResourceParameters) + [HttpGet(Name = "GetProducts")] + public IActionResult GetProductsAsync( + [FromQuery] ProductResourceParameters productResourceParameters) { var products = _productService.GetProducts(productResourceParameters); + var links = GetLinks(productResourceParameters, products.HasNextPage, products.HasPreviousPage); + var metadata = new + { + products.PageNumber, + products.PageSize, + products.HasNextPage, + products.HasPreviousPage, + products.TotalPages, + products.TotalCount + }; - return Ok(products); - } + var result = new + { + data = products.Data, + links, + metadata + }; + return Ok(result); + } [HttpGet("export/xls")] public ActionResult ExportProducts() { @@ -219,5 +236,69 @@ private List ConvertCategoriesToData(IEnumerable products) return data; } + + private List GetLinks( + ProductResourceParameters resourceParameters, + bool hasNext, + bool hasPrevious) + { + List links = new(); + + links.Add(new ResourceLink( + "self", + CreateProductResourceLink(resourceParameters, ResourceType.CurrentPage), + "GET")); + + if (hasNext) + { + links.Add(new ResourceLink( + "next", + CreateProductResourceLink(resourceParameters, ResourceType.NextPage), + "GET")); + } + + if (hasPrevious) + { + links.Add(new ResourceLink( + "previous", + CreateProductResourceLink(resourceParameters, ResourceType.PreviousPage), + "GET")); + } + + // TODO Fix this implementation or remove totally + foreach (var link in links) + { + var lastIndex = link.Href.IndexOf("/api"); + if (lastIndex >= 0) + { + link.Href = "https://0wn6qg77-7258.asse.devtunnels.ms" + link.Href.Substring(lastIndex); + } + } + + return links; + } + + private string? CreateProductResourceLink(ProductResourceParameters resourceParameters, ResourceType type) + { + if (type == ResourceType.PreviousPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber - 1, + }; + return Url.Link("GetProducts", parameters); + } + + if (type == ResourceType.NextPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber + 1, + }; + return Url.Link("GetProducts", parameters); + } + + return Url.Link("GetProducts", resourceParameters); + } } } diff --git a/Inflow.Domain/ResourceParameters/CategoryResourceParameters.cs b/Inflow.Domain/ResourceParameters/CategoryResourceParameters.cs index bd2cf45..157f9b6 100644 --- a/Inflow.Domain/ResourceParameters/CategoryResourceParameters.cs +++ b/Inflow.Domain/ResourceParameters/CategoryResourceParameters.cs @@ -1,9 +1,8 @@ namespace Inflow.Domain.ResourceParameters { - public class CategoryResourceParameters : ResourceParametersBase + public record CategoryResourceParameters : ResourceParametersBase { public override string OrderBy { get; set; } = "name"; - protected override int MaxPageSize { get; set; } = 50; } } diff --git a/Inflow.Domain/ResourceParameters/CustomerResourceParameters.cs b/Inflow.Domain/ResourceParameters/CustomerResourceParameters.cs index a142e31..60c49d4 100644 --- a/Inflow.Domain/ResourceParameters/CustomerResourceParameters.cs +++ b/Inflow.Domain/ResourceParameters/CustomerResourceParameters.cs @@ -1,6 +1,6 @@ namespace Inflow.Domain.ResourceParameters { - public class CustomerResourceParameters : ResourceParametersBase + public record CustomerResourceParameters : ResourceParametersBase { public override string OrderBy { get; set; } = "firstname"; } diff --git a/Inflow.Domain/ResourceParameters/ProductResourceParameters.cs b/Inflow.Domain/ResourceParameters/ProductResourceParameters.cs index 5c26fac..6206c83 100644 --- a/Inflow.Domain/ResourceParameters/ProductResourceParameters.cs +++ b/Inflow.Domain/ResourceParameters/ProductResourceParameters.cs @@ -2,7 +2,7 @@ namespace Inflow.ResourceParameters { - public class ProductResourceParameters : ResourceParametersBase + public record ProductResourceParameters : ResourceParametersBase { public override string OrderBy { get; set; } = "name"; public int? CategoryId { get; set; } diff --git a/Inflow.Domain/ResourceParameters/ResourceParametersBase.cs b/Inflow.Domain/ResourceParameters/ResourceParametersBase.cs index e90dac2..f302e02 100644 --- a/Inflow.Domain/ResourceParameters/ResourceParametersBase.cs +++ b/Inflow.Domain/ResourceParameters/ResourceParametersBase.cs @@ -1,6 +1,6 @@ namespace Inflow.Domain.ResourceParameters { - public abstract class ResourceParametersBase + public abstract record ResourceParametersBase { protected virtual int MaxPageSize { get; set; } = 25; public virtual string? SearchString { get; set; } diff --git a/Inflow.Domain/ResourceParameters/SaleItemResourceParameters.cs b/Inflow.Domain/ResourceParameters/SaleItemResourceParameters.cs index 483798f..1ef6103 100644 --- a/Inflow.Domain/ResourceParameters/SaleItemResourceParameters.cs +++ b/Inflow.Domain/ResourceParameters/SaleItemResourceParameters.cs @@ -1,6 +1,6 @@ namespace Inflow.Domain.ResourceParameters { - public class SaleItemResourceParameters : ResourceParametersBase + public record SaleItemResourceParameters : ResourceParametersBase { public override string OrderBy { get; set; } = "id"; public int? ProductId { get; set; } diff --git a/Inflow.Domain/ResourceParameters/SaleResourceParameters.cs b/Inflow.Domain/ResourceParameters/SaleResourceParameters.cs index 663cad5..d6582ae 100644 --- a/Inflow.Domain/ResourceParameters/SaleResourceParameters.cs +++ b/Inflow.Domain/ResourceParameters/SaleResourceParameters.cs @@ -1,6 +1,6 @@ namespace Inflow.Domain.ResourceParameters { - public class SaleResourceParameters : ResourceParametersBase + public record SaleResourceParameters : ResourceParametersBase { public int? CustomerId { get; set; } public DateTime? SaleDate { get; set; } diff --git a/Inflow.Domain/ResourceParameters/SupplierResourceParameters.cs b/Inflow.Domain/ResourceParameters/SupplierResourceParameters.cs index 4290255..fe56824 100644 --- a/Inflow.Domain/ResourceParameters/SupplierResourceParameters.cs +++ b/Inflow.Domain/ResourceParameters/SupplierResourceParameters.cs @@ -1,6 +1,6 @@ namespace Inflow.Domain.ResourceParameters { - public class SupplierResourceParameters : ResourceParametersBase + public record SupplierResourceParameters : ResourceParametersBase { public override string OrderBy { get; set; } = "firstname"; } diff --git a/Inflow.Domain/ResourceParameters/SupplyItemResourceParameters.cs b/Inflow.Domain/ResourceParameters/SupplyItemResourceParameters.cs index e831b3a..3b1ddbc 100644 --- a/Inflow.Domain/ResourceParameters/SupplyItemResourceParameters.cs +++ b/Inflow.Domain/ResourceParameters/SupplyItemResourceParameters.cs @@ -1,6 +1,6 @@ namespace Inflow.Domain.ResourceParameters { - public class SupplyItemResourceParameters : ResourceParametersBase + public record SupplyItemResourceParameters : ResourceParametersBase { public int? ProductId { get; set; } public int? SupplyId { get; set; } diff --git a/Inflow.Domain/ResourceParameters/SupplyResourceParameters.cs b/Inflow.Domain/ResourceParameters/SupplyResourceParameters.cs index d960297..baf053a 100644 --- a/Inflow.Domain/ResourceParameters/SupplyResourceParameters.cs +++ b/Inflow.Domain/ResourceParameters/SupplyResourceParameters.cs @@ -1,6 +1,6 @@ namespace Inflow.Domain.ResourceParameters { - public class SupplyResourceParameters : ResourceParametersBase + public record SupplyResourceParameters : ResourceParametersBase { public int? SupplierId { get; set; } public DateTime? SupplyDate { get; set; } From 8c3737d1faa9760db4aca81c9d1e4eca70d31247 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 16:23:25 +0500 Subject: [PATCH 2/9] Cleared unnecessary line --- Inflow.Api/Controllers/ProductsController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Inflow.Api/Controllers/ProductsController.cs b/Inflow.Api/Controllers/ProductsController.cs index 7de2bf4..de325d2 100644 --- a/Inflow.Api/Controllers/ProductsController.cs +++ b/Inflow.Api/Controllers/ProductsController.cs @@ -265,7 +265,6 @@ private List GetLinks( "GET")); } - // TODO Fix this implementation or remove totally foreach (var link in links) { var lastIndex = link.Href.IndexOf("/api"); From 4694818435593d6b30c2c6db7c786b0177e1cbf3 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 16:32:17 +0500 Subject: [PATCH 3/9] Added Links to CategoriesController --- .../Controllers/CategoriesController.cs | 89 ++++++++++++++++++- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/Inflow.Api/Controllers/CategoriesController.cs b/Inflow.Api/Controllers/CategoriesController.cs index 5507167..cd49087 100644 --- a/Inflow.Api/Controllers/CategoriesController.cs +++ b/Inflow.Api/Controllers/CategoriesController.cs @@ -1,4 +1,5 @@ using ClosedXML.Excel; +using Inflow.Api.Helper; using Inflow.Domain.DTOs.Category; using Inflow.Domain.DTOs.Product; using Inflow.Domain.Interfaces.Services; @@ -27,13 +28,30 @@ public CategoriesController(ICategoryService categoryService, IProductService pr _productService = productService; } - [HttpGet] - public ActionResult> GetCategories( - [FromQuery] CategoryResourceParameters categoryResourceParameters) + [HttpGet(Name = "GetCategories")] + public IActionResult GetCategoriesAsync( + [FromQuery] CategoryResourceParameters categoryResourceParameters) { var categories = _categoryService.GetCategories(categoryResourceParameters); + var links = GetLinks(categoryResourceParameters , categories.HasNextPage, categories.HasPreviousPage); + var metadata = new + { + categories.PageNumber, + categories.PageSize, + categories.HasNextPage, + categories.HasPreviousPage, + categories.TotalPages, + categories.TotalCount + }; + + var result = new + { + data = categories.Data, + links, + metadata + }; - return Ok(categories); + return Ok(result); } [HttpGet("{id}", Name = "GetCategoryById")] @@ -169,5 +187,68 @@ private static DataTable GetCategoriesDataTable(IEnumerable categor return table; } + private List GetLinks( + CategoryResourceParameters resourceParameters, + bool hasNext, + bool hasPrevious) + { + List links = new(); + + links.Add(new ResourceLink( + "self", + CreateCategoryResourceLink(resourceParameters, ResourceType.CurrentPage), + "GET")); + + if (hasNext) + { + links.Add(new ResourceLink( + "next", + CreateCategoryResourceLink(resourceParameters, ResourceType.NextPage), + "GET")); + } + + if (hasPrevious) + { + links.Add(new ResourceLink( + "previous", + CreateCategoryResourceLink(resourceParameters, ResourceType.PreviousPage), + "GET")); + } + + foreach (var link in links) + { + var lastIndex = link.Href.IndexOf("/api"); + if (lastIndex >= 0) + { + link.Href = "https://0wn6qg77-7258.asse.devtunnels.ms" + link.Href.Substring(lastIndex); + } + } + + return links; + } + + private string? CreateCategoryResourceLink(CategoryResourceParameters resourceParameters, ResourceType type) + { + if (type == ResourceType.PreviousPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber - 1, + }; + return Url.Link("GetCategories", parameters); + } + + if (type == ResourceType.NextPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber + 1, + }; + return Url.Link("GetCategories", parameters); + } + + return Url.Link("GetCategories", resourceParameters); + } } } + From 6a44b4e3ee9c61e8d238348ce000bf1d6a90c393 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 16:40:25 +0500 Subject: [PATCH 4/9] Added Links to CustomersController --- .../Controllers/CategoriesController.cs | 2 +- Inflow.Api/Controllers/CustomersController.cs | 91 ++++++++++++++++++- 2 files changed, 87 insertions(+), 6 deletions(-) diff --git a/Inflow.Api/Controllers/CategoriesController.cs b/Inflow.Api/Controllers/CategoriesController.cs index cd49087..97725da 100644 --- a/Inflow.Api/Controllers/CategoriesController.cs +++ b/Inflow.Api/Controllers/CategoriesController.cs @@ -33,7 +33,7 @@ public IActionResult GetCategoriesAsync( [FromQuery] CategoryResourceParameters categoryResourceParameters) { var categories = _categoryService.GetCategories(categoryResourceParameters); - var links = GetLinks(categoryResourceParameters , categories.HasNextPage, categories.HasPreviousPage); + var links = GetLinks(categoryResourceParameters, categories.HasNextPage, categories.HasPreviousPage); var metadata = new { categories.PageNumber, diff --git a/Inflow.Api/Controllers/CustomersController.cs b/Inflow.Api/Controllers/CustomersController.cs index 2ffff02..befe44a 100644 --- a/Inflow.Api/Controllers/CustomersController.cs +++ b/Inflow.Api/Controllers/CustomersController.cs @@ -1,4 +1,5 @@ using ClosedXML.Excel; +using Inflow.Api.Helper; using Inflow.Domain.DTOs.Customer; using Inflow.Domain.Interfaces.Services; using Inflow.Domain.ResourceParameters; @@ -22,13 +23,31 @@ public CustomersController(ICustomerService customerService) _customerService = customerService; } - [HttpGet] - public ActionResult> GetCustomersAsync( - [FromQuery] CustomerResourceParameters customerResourceParameters) + + [HttpGet(Name = "GetCustomers")] + public IActionResult GetCategoriesAsync( + [FromQuery] CustomerResourceParameters customerResourceParameters) { - var customers = _customerService.GetCustomers(customerResourceParameters); + var categories = _customerService.GetCustomers(customerResourceParameters); + var links = GetLinks(customerResourceParameters, categories.HasNextPage, categories.HasPreviousPage); + var metadata = new + { + categories.PageNumber, + categories.PageSize, + categories.HasNextPage, + categories.HasPreviousPage, + categories.TotalPages, + categories.TotalCount + }; + + var result = new + { + data = categories.Data, + links, + metadata + }; - return Ok(customers); + return Ok(result); } [HttpGet("{id}", Name = "GetCustomerById")] @@ -159,5 +178,67 @@ private static DataTable GetCustomersDataTable(IEnumerable customer return table; } + private List GetLinks( + CustomerResourceParameters resourceParameters, + bool hasNext, + bool hasPrevious) + { + List links = new(); + + links.Add(new ResourceLink( + "self", + CreateCustomerResourceLink(resourceParameters, ResourceType.CurrentPage), + "GET")); + + if (hasNext) + { + links.Add(new ResourceLink( + "next", + CreateCustomerResourceLink(resourceParameters, ResourceType.NextPage), + "GET")); + } + + if (hasPrevious) + { + links.Add(new ResourceLink( + "previous", + CreateCustomerResourceLink(resourceParameters, ResourceType.PreviousPage), + "GET")); + } + + foreach (var link in links) + { + var lastIndex = link.Href.IndexOf("/api"); + if (lastIndex >= 0) + { + link.Href = "https://0wn6qg77-7258.asse.devtunnels.ms" + link.Href.Substring(lastIndex); + } + } + + return links; + } + + private string? CreateCustomerResourceLink(CustomerResourceParameters resourceParameters, ResourceType type) + { + if (type == ResourceType.PreviousPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber - 1, + }; + return Url.Link("GetCustomers", parameters); + } + + if (type == ResourceType.NextPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber + 1, + }; + return Url.Link("GetCustomers", parameters); + } + + return Url.Link("GetCustomers", resourceParameters); + } } } From 88b2652390d1c488285500e7b0139182992b8885 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 17:08:47 +0500 Subject: [PATCH 5/9] Added Links to SalesController --- Inflow.Api/Controllers/CustomersController.cs | 18 ++-- Inflow.Api/Controllers/SaleItemsController.cs | 91 ++++++++++++++++++- Inflow.Api/Controllers/SalesController.cs | 91 ++++++++++++++++++- 3 files changed, 183 insertions(+), 17 deletions(-) diff --git a/Inflow.Api/Controllers/CustomersController.cs b/Inflow.Api/Controllers/CustomersController.cs index befe44a..2f9e0a3 100644 --- a/Inflow.Api/Controllers/CustomersController.cs +++ b/Inflow.Api/Controllers/CustomersController.cs @@ -28,21 +28,21 @@ public CustomersController(ICustomerService customerService) public IActionResult GetCategoriesAsync( [FromQuery] CustomerResourceParameters customerResourceParameters) { - var categories = _customerService.GetCustomers(customerResourceParameters); - var links = GetLinks(customerResourceParameters, categories.HasNextPage, categories.HasPreviousPage); + var customers = _customerService.GetCustomers(customerResourceParameters); + var links = GetLinks(customerResourceParameters, customers.HasNextPage, customers.HasPreviousPage); var metadata = new { - categories.PageNumber, - categories.PageSize, - categories.HasNextPage, - categories.HasPreviousPage, - categories.TotalPages, - categories.TotalCount + customers.PageNumber, + customers.PageSize, + customers.HasNextPage, + customers.HasPreviousPage, + customers.TotalPages, + customers.TotalCount }; var result = new { - data = categories.Data, + data = customers.Data, links, metadata }; diff --git a/Inflow.Api/Controllers/SaleItemsController.cs b/Inflow.Api/Controllers/SaleItemsController.cs index 06e8751..e05ed86 100644 --- a/Inflow.Api/Controllers/SaleItemsController.cs +++ b/Inflow.Api/Controllers/SaleItemsController.cs @@ -1,4 +1,6 @@ using ClosedXML.Excel; +using DiyorMarket.Services; +using Inflow.Api.Helper; using Inflow.Domain.DTOs.SaleItem; using Inflow.Domain.DTOsSaleItem; using Inflow.Domain.Interfaces.Services; @@ -19,15 +21,34 @@ public SaleItemsController(ISaleItemService saleItemService) _saleItemService = saleItemService; } - [HttpGet] - public ActionResult> GetSaleItemsAsync( - [FromQuery] SaleItemResourceParameters saleItemResourceParameters) + + [HttpGet(Name = "GetSaleItems")] + public IActionResult GetSaleItemsAsync( + [FromQuery] SaleItemResourceParameters saleItemResourceParameters) { var saleItems = _saleItemService.GetSaleItems(saleItemResourceParameters); + var links = GetLinks(saleItemResourceParameters, saleItems.HasNextPage, saleItems.HasPreviousPage); + var metadata = new + { + saleItems.PageNumber, + saleItems.PageSize, + saleItems.HasNextPage, + saleItems.HasPreviousPage, + saleItems.TotalPages, + saleItems.TotalCount + }; + + var result = new + { + data = saleItems.Data, + links, + metadata + }; - return Ok(saleItems); + return Ok(result); } + [HttpGet("SalesSaleItems/{salesId}")] public ActionResult> GetSalesSaleItems(int salesId) { @@ -125,5 +146,67 @@ private DataTable GetSaleItemssDataTable(IEnumerable saleItemDtos) return table; } + private List GetLinks( + SaleItemResourceParameters resourceParameters, + bool hasNext, + bool hasPrevious) + { + List links = new(); + + links.Add(new ResourceLink( + "self", + CreateSaleItemResourceLink(resourceParameters, ResourceType.CurrentPage), + "GET")); + + if (hasNext) + { + links.Add(new ResourceLink( + "next", + CreateSaleItemResourceLink(resourceParameters, ResourceType.NextPage), + "GET")); + } + + if (hasPrevious) + { + links.Add(new ResourceLink( + "previous", + CreateSaleItemResourceLink(resourceParameters, ResourceType.PreviousPage), + "GET")); + } + + foreach (var link in links) + { + var lastIndex = link.Href.IndexOf("/api"); + if (lastIndex >= 0) + { + link.Href = "https://0wn6qg77-7258.asse.devtunnels.ms" + link.Href.Substring(lastIndex); + } + } + + return links; + } + + private string? CreateSaleItemResourceLink(SaleItemResourceParameters resourceParameters, ResourceType type) + { + if (type == ResourceType.PreviousPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber - 1, + }; + return Url.Link("GetSaleItems", parameters); + } + + if (type == ResourceType.NextPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber + 1, + }; + return Url.Link("GetSaleItems", parameters); + } + + return Url.Link("GetSaleItems", resourceParameters); + } } } diff --git a/Inflow.Api/Controllers/SalesController.cs b/Inflow.Api/Controllers/SalesController.cs index 0b9392f..e1594e9 100644 --- a/Inflow.Api/Controllers/SalesController.cs +++ b/Inflow.Api/Controllers/SalesController.cs @@ -1,4 +1,5 @@ using ClosedXML.Excel; +using Inflow.Api.Helper; using Inflow.Domain.DTOs.Sale; using Inflow.Domain.Interfaces.Services; using Inflow.Domain.ResourceParameters; @@ -20,15 +21,34 @@ public SalesController(ISaleService saleService, ISaleItemService saleItemServic _saleItemService = saleItemService; } - [HttpGet] - public ActionResult> GetSalesAsync( - [FromQuery] SaleResourceParameters saleResourceParameters) + + [HttpGet(Name = "GetSales")] + public IActionResult GetSalesAsync( + [FromQuery] SaleResourceParameters saleResourceParameters) { var sales = _saleService.GetSales(saleResourceParameters); + var links = GetLinks(saleResourceParameters, sales.HasNextPage, sales.HasPreviousPage); + var metadata = new + { + sales.PageNumber, + sales.PageSize, + sales.HasNextPage, + sales.HasPreviousPage, + sales.TotalPages, + sales.TotalCount + }; + + var result = new + { + data = sales.Data, + links, + metadata + }; - return Ok(sales); + return Ok(result); } + [HttpGet("export")] public ActionResult ExportSales() { @@ -128,5 +148,68 @@ private DataTable GetSalesDataTable(IEnumerable saleDtos) return table; } + + private List GetLinks( + SaleResourceParameters resourceParameters, + bool hasNext, + bool hasPrevious) + { + List links = new(); + + links.Add(new ResourceLink( + "self", + CreateSaleResourceLink(resourceParameters, ResourceType.CurrentPage), + "GET")); + + if (hasNext) + { + links.Add(new ResourceLink( + "next", + CreateSaleResourceLink(resourceParameters, ResourceType.NextPage), + "GET")); + } + + if (hasPrevious) + { + links.Add(new ResourceLink( + "previous", + CreateSaleResourceLink(resourceParameters, ResourceType.PreviousPage), + "GET")); + } + + foreach (var link in links) + { + var lastIndex = link.Href.IndexOf("/api"); + if (lastIndex >= 0) + { + link.Href = "https://0wn6qg77-7258.asse.devtunnels.ms" + link.Href.Substring(lastIndex); + } + } + + return links; + } + + private string? CreateSaleResourceLink(SaleResourceParameters resourceParameters, ResourceType type) + { + if (type == ResourceType.PreviousPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber - 1, + }; + return Url.Link("GetSales", parameters); + } + + if (type == ResourceType.NextPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber + 1, + }; + return Url.Link("GetSales", parameters); + } + + return Url.Link("GetSales", resourceParameters); + } } } From eb33e8abc11a7bf627b593490df20f0b423ba309 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 17:27:27 +0500 Subject: [PATCH 6/9] Added Links to SuppliersController --- Inflow.Api/Controllers/SaleItemsController.cs | 1 - Inflow.Api/Controllers/SuppliersController.cs | 89 ++++++++++++++++++- 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/Inflow.Api/Controllers/SaleItemsController.cs b/Inflow.Api/Controllers/SaleItemsController.cs index e05ed86..3fc3dfc 100644 --- a/Inflow.Api/Controllers/SaleItemsController.cs +++ b/Inflow.Api/Controllers/SaleItemsController.cs @@ -1,5 +1,4 @@ using ClosedXML.Excel; -using DiyorMarket.Services; using Inflow.Api.Helper; using Inflow.Domain.DTOs.SaleItem; using Inflow.Domain.DTOsSaleItem; diff --git a/Inflow.Api/Controllers/SuppliersController.cs b/Inflow.Api/Controllers/SuppliersController.cs index 6c3fc4f..ab3557b 100644 --- a/Inflow.Api/Controllers/SuppliersController.cs +++ b/Inflow.Api/Controllers/SuppliersController.cs @@ -1,4 +1,5 @@ using ClosedXML.Excel; +using Inflow.Api.Helper; using Inflow.Domain.DTOs.Supplier; using Inflow.Domain.Interfaces.Services; using Inflow.Domain.ResourceParameters; @@ -21,13 +22,30 @@ public SuppliersController(ISupplierService supplierService) _supplierService = supplierService; } - [HttpGet] - public ActionResult> GetSuppliersAsync( - [FromQuery] SupplierResourceParameters supplierResourceParameters) + [HttpGet(Name = "GetSuppliers")] + public IActionResult GetSalesAsync( + [FromQuery] SupplierResourceParameters supplierResourceParameters) { var suppliers = _supplierService.GetSuppliers(supplierResourceParameters); + var links = GetLinks(supplierResourceParameters, suppliers.HasNextPage, suppliers.HasPreviousPage); + var metadata = new + { + suppliers.PageNumber, + suppliers.PageSize, + suppliers.HasNextPage, + suppliers.HasPreviousPage, + suppliers.TotalPages, + suppliers.TotalCount + }; + + var result = new + { + data = suppliers.Data, + links, + metadata + }; - return Ok(suppliers); + return Ok(result); } [HttpGet("export/xls")] @@ -165,5 +183,68 @@ private static DataTable GetSuppliersTable(IEnumerable supplierDtos return table; } + private List GetLinks( + SupplierResourceParameters resourceParameters, + bool hasNext, + bool hasPrevious) + { + List links = new(); + + links.Add(new ResourceLink( + "self", + CreateSupplierResourceLink(resourceParameters, ResourceType.CurrentPage), + "GET")); + + if (hasNext) + { + links.Add(new ResourceLink( + "next", + CreateSupplierResourceLink(resourceParameters, ResourceType.NextPage), + "GET")); + } + + if (hasPrevious) + { + links.Add(new ResourceLink( + "previous", + CreateSupplierResourceLink(resourceParameters, ResourceType.PreviousPage), + "GET")); + } + + foreach (var link in links) + { + var lastIndex = link.Href.IndexOf("/api"); + if (lastIndex >= 0) + { + link.Href = "https://0wn6qg77-7258.asse.devtunnels.ms" + link.Href.Substring(lastIndex); + } + } + + return links; + } + + private string? CreateSupplierResourceLink(SupplierResourceParameters resourceParameters, ResourceType type) + { + if (type == ResourceType.PreviousPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber - 1, + }; + return Url.Link("GetSuppliers", parameters); + } + + if (type == ResourceType.NextPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber + 1, + }; + return Url.Link("GetSuppliers", parameters); + } + + return Url.Link("GetSuppliers", resourceParameters); + } } } + From 954e85797597ae54b12f6d2063f1fd35af70ea65 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 17:38:23 +0500 Subject: [PATCH 7/9] Added Lists to SuppliesController --- Inflow.Api/Controllers/SuppliersController.cs | 2 +- Inflow.Api/Controllers/SuppliesController.cs | 89 ++++++++++++++++++- 2 files changed, 86 insertions(+), 5 deletions(-) diff --git a/Inflow.Api/Controllers/SuppliersController.cs b/Inflow.Api/Controllers/SuppliersController.cs index ab3557b..da17f8b 100644 --- a/Inflow.Api/Controllers/SuppliersController.cs +++ b/Inflow.Api/Controllers/SuppliersController.cs @@ -23,7 +23,7 @@ public SuppliersController(ISupplierService supplierService) } [HttpGet(Name = "GetSuppliers")] - public IActionResult GetSalesAsync( + public IActionResult GetSuppliersAsync( [FromQuery] SupplierResourceParameters supplierResourceParameters) { var suppliers = _supplierService.GetSuppliers(supplierResourceParameters); diff --git a/Inflow.Api/Controllers/SuppliesController.cs b/Inflow.Api/Controllers/SuppliesController.cs index e1b1543..223e571 100644 --- a/Inflow.Api/Controllers/SuppliesController.cs +++ b/Inflow.Api/Controllers/SuppliesController.cs @@ -1,4 +1,5 @@ using ClosedXML.Excel; +using Inflow.Api.Helper; using Inflow.Domain.DTOs.Supply; using Inflow.Domain.Interfaces.Services; using Inflow.Domain.ResourceParameters; @@ -18,13 +19,30 @@ public SuppliesController(ISupplyService supplyService) _supplyService = supplyService; } - [HttpGet] - public ActionResult> GetSuppliesAsync( - [FromQuery] SupplyResourceParameters supplyResourceParameters) + [HttpGet(Name = "GetSupplies")] + public IActionResult GetSuppliesAsync( + [FromQuery] SupplyResourceParameters supplyResourceParameters) { var supplies = _supplyService.GetSupplies(supplyResourceParameters); + var links = GetLinks(supplyResourceParameters, supplies.HasNextPage, supplies.HasPreviousPage); + var metadata = new + { + supplies.PageNumber, + supplies.PageSize, + supplies.HasNextPage, + supplies.HasPreviousPage, + supplies.TotalPages, + supplies.TotalCount + }; + + var result = new + { + data = supplies.Data, + links, + metadata + }; - return Ok(supplies); + return Ok(result); } [HttpGet("export")] @@ -118,5 +136,68 @@ private DataTable GetSuppliesDataTable(IEnumerable supplyDtos) return table; } + + private List GetLinks( + SupplyResourceParameters resourceParameters, + bool hasNext, + bool hasPrevious) + { + List links = new(); + + links.Add(new ResourceLink( + "self", + CreateSuppliesResourceLink(resourceParameters, ResourceType.CurrentPage), + "GET")); + + if (hasNext) + { + links.Add(new ResourceLink( + "next", + CreateSuppliesResourceLink(resourceParameters, ResourceType.NextPage), + "GET")); + } + + if (hasPrevious) + { + links.Add(new ResourceLink( + "previous", + CreateSuppliesResourceLink(resourceParameters, ResourceType.PreviousPage), + "GET")); + } + + foreach (var link in links) + { + var lastIndex = link.Href.IndexOf("/api"); + if (lastIndex >= 0) + { + link.Href = "https://0wn6qg77-7258.asse.devtunnels.ms" + link.Href.Substring(lastIndex); + } + } + + return links; + } + + private string? CreateSuppliesResourceLink(SupplyResourceParameters resourceParameters, ResourceType type) + { + if (type == ResourceType.PreviousPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber - 1, + }; + return Url.Link("GetSupplies", parameters); + } + + if (type == ResourceType.NextPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber + 1, + }; + return Url.Link("GetSupplies", parameters); + } + + return Url.Link("GetSupplies", resourceParameters); + } } } From 481d3f89c5869c73cf3d183e8952546b3fc8d866 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 17:47:17 +0500 Subject: [PATCH 8/9] Added Links SupplyItemsController --- .../Controllers/SupplyItemsController.cs | 92 +++++++++++++++++-- 1 file changed, 85 insertions(+), 7 deletions(-) diff --git a/Inflow.Api/Controllers/SupplyItemsController.cs b/Inflow.Api/Controllers/SupplyItemsController.cs index ea9b1e6..de3615f 100644 --- a/Inflow.Api/Controllers/SupplyItemsController.cs +++ b/Inflow.Api/Controllers/SupplyItemsController.cs @@ -1,4 +1,5 @@ -using Inflow.Domain.DTOs.SupplyItem; +using Inflow.Api.Helper; +using Inflow.Domain.DTOs.SupplyItem; using Inflow.Domain.Interfaces.Services; using Inflow.Domain.ResourceParameters; using Microsoft.AspNetCore.Mvc; @@ -15,16 +16,31 @@ public SupplyItemsController(ISupplyItemService supplyItemService) { _supplyItemService = supplyItemService; } - - [HttpGet] - public ActionResult> Get( - [FromQuery] SupplyItemResourceParameters supplyItemResourceParameters) + [HttpGet(Name = "GetSupplyItems")] + public IActionResult GetSupplyItemsAsync( + [FromQuery] SupplyItemResourceParameters supplyItemResourceParameters) { var supplyItems = _supplyItemService.GetSupplyItems(supplyItemResourceParameters); + var links = GetLinks(supplyItemResourceParameters, supplyItems.HasNextPage, supplyItems.HasPreviousPage); + var metadata = new + { + supplyItems.PageNumber, + supplyItems.PageSize, + supplyItems.HasNextPage, + supplyItems.HasPreviousPage, + supplyItems.TotalPages, + supplyItems.TotalCount + }; - return Ok(supplyItems); - } + var result = new + { + data = supplyItems.Data, + links, + metadata + }; + return Ok(result); + } [HttpGet("{id}", Name = "GetSupplyItemById")] public ActionResult Get(int id) { @@ -67,5 +83,67 @@ public ActionResult Delete(int id) return NoContent(); } + private List GetLinks( + SupplyItemResourceParameters resourceParameters, + bool hasNext, + bool hasPrevious) + { + List links = new(); + + links.Add(new ResourceLink( + "self", + CreateSupplItemsResourceLink(resourceParameters, ResourceType.CurrentPage), + "GET")); + + if (hasNext) + { + links.Add(new ResourceLink( + "next", + CreateSupplItemsResourceLink(resourceParameters, ResourceType.NextPage), + "GET")); + } + + if (hasPrevious) + { + links.Add(new ResourceLink( + "previous", + CreateSupplItemsResourceLink(resourceParameters, ResourceType.PreviousPage), + "GET")); + } + + foreach (var link in links) + { + var lastIndex = link.Href.IndexOf("/api"); + if (lastIndex >= 0) + { + link.Href = "https://0wn6qg77-7258.asse.devtunnels.ms" + link.Href.Substring(lastIndex); + } + } + + return links; + } + + private string? CreateSupplItemsResourceLink(SupplyItemResourceParameters resourceParameters, ResourceType type) + { + if (type == ResourceType.PreviousPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber - 1, + }; + return Url.Link("GetSupplyItems", parameters); + } + + if (type == ResourceType.NextPage) + { + var parameters = resourceParameters with + { + PageNumber = resourceParameters.PageNumber + 1, + }; + return Url.Link("GetSupplyItems", parameters); + } + + return Url.Link("GetSupplyItems", resourceParameters); + } } } From f5a19949dfa9d8a7ac393c37d8eb9b484d87b929 Mon Sep 17 00:00:00 2001 From: SharifovDeveloper Date: Mon, 8 Apr 2024 17:49:12 +0500 Subject: [PATCH 9/9] throwed a line --- Inflow.Api/Controllers/SupplyItemsController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Inflow.Api/Controllers/SupplyItemsController.cs b/Inflow.Api/Controllers/SupplyItemsController.cs index de3615f..b325e7a 100644 --- a/Inflow.Api/Controllers/SupplyItemsController.cs +++ b/Inflow.Api/Controllers/SupplyItemsController.cs @@ -16,6 +16,7 @@ public SupplyItemsController(ISupplyItemService supplyItemService) { _supplyItemService = supplyItemService; } + [HttpGet(Name = "GetSupplyItems")] public IActionResult GetSupplyItemsAsync( [FromQuery] SupplyItemResourceParameters supplyItemResourceParameters)