From d7670e91fe438dbc10055cc5e07134f91a4efbd1 Mon Sep 17 00:00:00 2001 From: aleksandr chegodaev Date: Mon, 29 Apr 2024 23:44:10 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B8=D0=BB=D0=B8=20=D0=BD=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D0=BB=D0=B4=D0=B0=D0=BA=D0=B8=3F=3F=3F=20XD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => BusinessLogics}/AccountLogic.cs | 0 .../BusinessLogics/CarLogic.cs | 131 ++++++++++++++++++ .../BusinessLogics/ImplementerLogic.cs | 106 ++++++++++++++ .../CarCenterBusinessLogics.csproj | 14 +- 4 files changed, 250 insertions(+), 1 deletion(-) rename CarCenterBusinessLogics/{ => BusinessLogics}/AccountLogic.cs (100%) create mode 100644 CarCenterBusinessLogics/BusinessLogics/CarLogic.cs create mode 100644 CarCenterBusinessLogics/BusinessLogics/ImplementerLogic.cs diff --git a/CarCenterBusinessLogics/AccountLogic.cs b/CarCenterBusinessLogics/BusinessLogics/AccountLogic.cs similarity index 100% rename from CarCenterBusinessLogics/AccountLogic.cs rename to CarCenterBusinessLogics/BusinessLogics/AccountLogic.cs diff --git a/CarCenterBusinessLogics/BusinessLogics/CarLogic.cs b/CarCenterBusinessLogics/BusinessLogics/CarLogic.cs new file mode 100644 index 0000000..a885f75 --- /dev/null +++ b/CarCenterBusinessLogics/BusinessLogics/CarLogic.cs @@ -0,0 +1,131 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.BusinessLogicContracts; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace CarCenterBusinessLogics.BusinessLogics +{ + public class CarLogic : ICarLogic + { + private readonly ILogger _logger; + private readonly ICarStorage _CarStorage; + + public CarLogic(ILogger logger, ICarStorage CarStorage) + { + _logger = logger; + _CarStorage = CarStorage; + } + + public void CheckModel(CarBindingModel model, bool checkParams = true) + { + const string txt = "Произошла ошибка на уровне проверки CarBindingModel."; + if (model == null) + { + throw new ArgumentNullException(nameof(model), txt); + } + if (checkParams is false) + { + return; + } + } + + public List ReadList(CarSearchModel? model) + { + try + { + var results = model != null ? _CarStorage.GetFilteredList(model) : _CarStorage.GetFullList(); + _logger.LogDebug("Список полученных автомобилей: {@CarsVisit}", results); + _logger.LogInformation("Извлечение списка в количестве {Count} c автомобилей по модели: {@CarSearchModel}", results.Count, model); + return results; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить список по модели: {@CarSearchModel}", model); + throw; + } + } + + public CarViewModel ReadElement(CarSearchModel model) + { + try + { + var result = _CarStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым"); + } + _logger.LogInformation("Извлечение элемента {@CarViewModel} c автомобилей по модели: {@CarSearchModel}", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@CarSearchModel}", model); + throw; + } + } + + public bool Create(CarBindingModel model) + { + try + { + CheckModel(model); + var result = _CarStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Результат создания автомобиля оказался нулевым"); + } + _logger.LogInformation("Была создана сущность: {@CarViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@CarBindingModel}", model); + throw; + } + } + + public bool Update(CarBindingModel model) + { + try + { + CheckModel(model); + var result = _CarStorage.Update(model); + if (result == null) + { + throw new ArgumentNullException($"Результат обновления автомобиля оказался нулевым"); + } + _logger.LogInformation("Была обновлена сущность на: {@CarViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки обновить элемент по модели: {@CarBindingModel}", model); + throw; + } + } + + public bool Delete(CarBindingModel model) + { + try + { + CheckModel(model, false); + var result = _CarStorage.Delete(model); + if (result == null) + { + throw new ArgumentNullException($"Результат удаления автомобилей оказался нулевым"); + } + _logger.LogInformation("Была удалена сущность: {@CarViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки удалить элемент по модели: {@CarBindingModel}", model); + throw; + } + } + } +} + + diff --git a/CarCenterBusinessLogics/BusinessLogics/ImplementerLogic.cs b/CarCenterBusinessLogics/BusinessLogics/ImplementerLogic.cs new file mode 100644 index 0000000..b146e08 --- /dev/null +++ b/CarCenterBusinessLogics/BusinessLogics/ImplementerLogic.cs @@ -0,0 +1,106 @@ +using System.Text.RegularExpressions; +using CarCenterContracts.BusinessLogicContracts; +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.ViewModels; +using Microsoft.Extensions.Logging; +using CarCenterContracts.StoragesContracts; + +namespace CarCenterBusinessLogics.BusinessLogics +{ + public class ImplementerLogic : IImplementerLogic + { + private readonly ILogger _logger; + private readonly IImplementerStorage _storage; + public ImplementerLogic(ILogger logger, IImplementerStorage implementerStorage) + { + _logger = logger; + _storage = implementerStorage; + } + + public bool Create(ImplementerBindingModel model) + { + try + { + CheckModel(model); + var result = _storage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Результат создания клиента оказался нулевым"); + } + _logger.LogInformation("Была создана сущность: {@ClientViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@ClientBindingModel}", model); + throw; + } + } + + public ImplementerViewModel ReadElement(ImplementerSearchModel model) + { + try + { + var result = _storage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым"); + } + _logger.LogInformation("Извлечение элемента {@ClientViewModel} c клиента по модели: {@ClientSearchModel}", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@ClientSearchModel}", model); + throw; + } + } + + private void CheckModel(ImplementerBindingModel model, bool withParams = true) + { + const string txt = "Произошла ошибка на уровне проверки ClientBindingModel."; + if (model == null) + { + throw new ArgumentNullException(nameof(model), txt); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.Login)) + { + throw new ArgumentNullException(nameof(model.Login), txt + "Нет логина клиента"); + } + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException(nameof(model.Password), txt + "Нет пароля клиента"); + } + if (model.Login.Length is < 5 or > 20) + { + throw new ArgumentException(nameof(model.Login), "Логин пользователя должен быть от 5 до 20 символом"); + } + + if (model.Password.Length < 5) + { + throw new ArgumentException(nameof(model.Password), + "Пароль пользователя должен быть не менее 5 символов"); + } + if (!Regex.IsMatch(model.Password, "[0-9]+")) + { + throw new ArgumentException(nameof(model.Password), + "Пароль пользователя должен содержать хотя бы одну цифру"); + } + _logger.LogDebug("{level} Проверка логина пользователя на уникальность {@Client}", txt, model); + var element = _storage.GetElement(new ImplementerSearchModel + { + Login = model.Login, + }); + if (element != null && element.Id != model.Id) + { + _logger.LogWarning("С логином: {login}, уже есть пользователь: {@ExistClient}", model.Login, element); + throw new InvalidOperationException($"Клиент с таким логином \"{model.Login}\" уже есть"); + } + } + } +} diff --git a/CarCenterBusinessLogics/CarCenterBusinessLogics.csproj b/CarCenterBusinessLogics/CarCenterBusinessLogics.csproj index cfadb03..8f0b89d 100644 --- a/CarCenterBusinessLogics/CarCenterBusinessLogics.csproj +++ b/CarCenterBusinessLogics/CarCenterBusinessLogics.csproj @@ -1,4 +1,4 @@ - + net7.0 @@ -6,4 +6,16 @@ enable + + + + + + + + + + + +