ProductService.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using Microsoft.AspNetCore.JsonPatch;
  2. using Products.Business.Domain;
  3. using Products.Business.Repository;
  4. using Products.Common.Dtos;
  5. using Products.Common.Exceptions;
  6. namespace Products.Business.Service;
  7. public class ProductService : IProductService
  8. {
  9. private readonly IProductRepository _productRepository;
  10. // Inject ProductRepository
  11. public ProductService(IProductRepository productRepository)
  12. {
  13. _productRepository = productRepository;
  14. }
  15. public IEnumerable<ProductDto> GetProducts()
  16. {
  17. var products = _productRepository.GetProducts();
  18. return products.Select(MapProductToProductDto!);
  19. }
  20. public ProductDto GetProduct(int id)
  21. {
  22. var product = _productRepository.GetProduct(id);
  23. if (product == null) throw new RecordNotFoundException("Product not found");
  24. return MapProductToProductDto(product);
  25. }
  26. public ProductDto AddProduct(CreateProductDto product)
  27. {
  28. var createdProduct = _productRepository.AddProduct(new Product
  29. {
  30. Name = product.Name,
  31. Color = product.Color,
  32. Brand = product.Brand
  33. });
  34. return MapProductToProductDto(createdProduct);
  35. }
  36. public void DeleteProduct(int id)
  37. {
  38. if (!_productRepository.ProductExists(id)) throw new RecordNotFoundException("Product not found");
  39. _productRepository.DeleteProduct(id);
  40. }
  41. public ProductDto UpdateProduct(int id, UpdateProductDto productDto)
  42. {
  43. var product = _productRepository.GetProduct(id);
  44. if (product == null) throw new RecordNotFoundException("Product not found");
  45. product.Name = productDto.Name;
  46. product.Color = productDto.Color;
  47. product.Brand = productDto.Brand;
  48. _productRepository.UpdateProduct(product);
  49. return GetProduct(id);
  50. }
  51. public ProductDto PatchProduct(int id,
  52. JsonPatchDocument<UpdateProductDto> productDto)
  53. {
  54. var product = _productRepository.GetProduct(id);
  55. if (product == null) throw new RecordNotFoundException("Product not found");
  56. // Apply the patch
  57. var update = new UpdateProductDto(product.Name, product.Color, product.Brand);
  58. productDto.ApplyTo(update);
  59. // Update the product
  60. product.Name = update.Name;
  61. product.Color = update.Color;
  62. product.Brand = update.Brand;
  63. _productRepository.UpdateProduct(product);
  64. return this.GetProduct(id);
  65. }
  66. // TODO: This can be avoided using AutoMapper, also this should not be in this class
  67. private ProductDto MapProductToProductDto(Product product)
  68. {
  69. return new ProductDto(
  70. product.Name,
  71. product.Color.ToString(),
  72. product.Brand,
  73. product.Id
  74. );
  75. }
  76. }