diff --git a/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/ComponentLogic.cs b/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/ComponentLogic.cs index 27602c1..4daf480 100644 --- a/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/ComponentLogic.cs +++ b/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/ComponentLogic.cs @@ -132,7 +132,7 @@ namespace BlacksmithWorkshopBusinessLogic.BusinessLogic //проверка на наличие нормальной цены у компонента if(model.Cost <= 0) { - throw new ArgumentNullException("Цен компонента должна быть больше 0", nameof(model.Cost)); + throw new ArgumentNullException("Цена компонента должна быть больше 0", nameof(model.Cost)); } _logger.LogInformation("Component. ComponentName:{ComponentName}. Cost:{Cost}. Id:{Id}", diff --git a/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/ProductLogic.cs b/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/ProductLogic.cs index 01086d0..f0d8dbf 100644 --- a/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/ProductLogic.cs +++ b/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/ProductLogic.cs @@ -1,4 +1,10 @@ -using System; +using BlacksmithWorkshopContracts.BindingModels; +using BlacksmithWorkshopContracts.BusinessLogicsContracts; +using BlacksmithWorkshopContracts.SearchModels; +using BlacksmithWorkshopContracts.StoragesContracts; +using BlacksmithWorkshopContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,7 +12,142 @@ using System.Threading.Tasks; namespace BlacksmithWorkshopBusinessLogic.BusinessLogic { - internal class ProductLogic + internal class ProductLogic : IProductLogic { + private readonly ILogger _logger; + + private readonly IProductStorage _productStorage; + + //конструктор + public ProductLogic(ILogger logger, IProductStorage productStorage) + { + _logger = logger; + _productStorage = productStorage; + } + + //вывод отфильтрованного списка + public List? ReadList(ProductSearchModel? model) + { + _logger.LogInformation("ReadList. ProductName:{ProductName}. Id:{Id}", model?.ProductName, model?.Id); + + //list хранит весь список в случае, если model пришло со значением null на вход метода + var list = model == null ? _productStorage.GetFullList() : _productStorage.GetFilteredList(model); + + if(list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + + return list; + } + + //вывод конкретного продукта + public ProductViewModel? ReadProduct(ProductSearchModel model) + { + if(model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + _logger.LogInformation("ReadProduct. ProductName:{ProductName}. Id:{Id}", model.ProductName, model.Id); + + var element = _productStorage.GetElement(model); + + if(element == null) + { + _logger.LogWarning("ReadProduct element not found"); + return null; + } + + _logger.LogInformation("ReadProduct find. Id:{Id}", model.Id); + + return element; + } + + //Создание продукта + public bool Create(ProductBindingModel model) + { + CheckModel(model); + + if(_productStorage.Insert(model) == null) + { + _logger.LogWarning("Create operation failed"); + return false; + } + + return true; + } + + //обновление продукта + public bool Update(ProductBindingModel model) + { + CheckModel(model); + + if(_productStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + + return true; + } + + //удаление продукта + public bool Delete(ProductBindingModel model) + { + CheckModel(model); + + if(_productStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + + return true; + } + + //проверка входного аргумента для методов Insert, Update и Delete + private void CheckModel(ProductBindingModel model, bool withParams = true) + { + if(model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + //если без параметров? + if (!withParams) + { + return; + } + + //проверка на наличие названия продукта + if (string.IsNullOrEmpty(model.ProductName)) + { + throw new ArgumentNullException("Нет названия продукта", nameof(model.ProductName)); + } + + //проверка на наличие нормальной цены у продукта + if(model.Price <= 0) + { + throw new ArgumentNullException("Цена продукта должна быть больше 0", nameof(model.Price)); + } + + _logger.LogInformation("Product. ProductName:{ProductName}. Price:{Price}. Id:{Id}", + model.ProductName, model.Price, model.Id); + + //проверка на наличие такого же продукта в списке + var element = _productStorage.GetElement(new ProductSearchModel + { + ProductName = model.ProductName, + }); + + if(element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Компонент с таким названием уже есть"); + } + } } }