From d8d329ed58abf20dd91c19f0b7c66ecf93c164b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=9A=D1=83=D0=BA?= =?UTF-8?q?=D0=BB=D0=B5=D0=B2?= Date: Tue, 30 Apr 2024 18:03:25 +0400 Subject: [PATCH] =?UTF-8?q?=D1=87=D1=82=D0=BE=20=D0=B7=D0=B0=20=D0=B1?= =?UTF-8?q?=D0=B8=D0=B7=D0=BD=D0=B5=D1=81=20=D0=A1=D0=B0=D0=BD=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/ClientLogic.cs | 147 ++++++++++++++++++ .../BusinessLogics/DirectorLogic.cs | 105 +++++++++++++ .../BusinessLogics/RequirementLogic.cs | 139 +++++++++++++++++ 3 files changed, 391 insertions(+) create mode 100644 CarCenterBusinessLogics/BusinessLogics/ClientLogic.cs create mode 100644 CarCenterBusinessLogics/BusinessLogics/DirectorLogic.cs create mode 100644 CarCenterBusinessLogics/BusinessLogics/RequirementLogic.cs diff --git a/CarCenterBusinessLogics/BusinessLogics/ClientLogic.cs b/CarCenterBusinessLogics/BusinessLogics/ClientLogic.cs new file mode 100644 index 0000000..edbf85f --- /dev/null +++ b/CarCenterBusinessLogics/BusinessLogics/ClientLogic.cs @@ -0,0 +1,147 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.BusinessLogicContracts; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using Microsoft.Extensions.Logging; +using static System.Net.Mime.MediaTypeNames; + +namespace CarCenterBusinessLogics.BusinessLogics +{ + public class ClientLogic : IClientLogic + { + private readonly ILogger _logger; + private readonly IClientStorage _clientStorage; + private const string ErrorString = "Произошла ошибка на уровне проверки ClientBindingModel."; + + public ClientLogic(ILogger logger, IClientStorage clientStorage) + { + _logger = logger; + _clientStorage = clientStorage; + } + + private void CheckOnlyModel(ClientBindingModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model), ErrorString); + } + } + + private void CheckUpdateModel(ClientBindingModel model) + { + CheckOnlyModel(model); + + if (model.Course <= 0) + { + throw new ArgumentException(ErrorString + $"Курс (Course={model.Course}) должна быть больше 0"); + } + } + + public void CheckFullModel(ClientBindingModel model) + { + CheckOnlyModel(model); + CheckUpdateModel(model); + if (string.IsNullOrEmpty(model.Name)) + { + throw new ArgumentNullException(ErrorString + $"Имя клиента не должно быть нулевым или пустым. Полученное имя: \"{model.Name}\""); + } + } + + public List ReadList(ClientSearchModel? model) + { + try + { + var results = model != null ? _clientStorage.GetFilteredList(model) : _clientStorage.GetFullList(); + _logger.LogDebug("Список полученных клиентов: {@clients}", results); + _logger.LogInformation("Извлечение списка в количестве {Count} c клиентов по модели: {@ClientSearchModel}", results.Count, model); + return results; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить список по модели: {@ClientSearchModel}", model); + throw; + } + } + + public ClientViewModel ReadElement(ClientSearchModel model) + { + try + { + var result = _clientStorage.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; + } + } + + public bool Create(ClientBindingModel model) + { + try + { + CheckFullModel(model); + var result = _clientStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Результат создания клиентов оказался нулевым"); + } + _logger.LogInformation("Была создана сущность: {@ClientViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@ClientBindingModel}", model); + throw; + } + } + + public bool Update(ClientBindingModel model) + { + try + { + CheckUpdateModel(model); + var result = _clientStorage.Update(model); + if (result == null) + { + throw new ArgumentNullException($"Результат обновления клиентов оказался нулевым"); + } + _logger.LogInformation("Была обновлена сущность на: {@ClientViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки обновить элемент по модели: {@ClientBindingModel}", model); + throw; + } + } + + public bool Delete(ClientBindingModel model) + { + try + { + CheckOnlyModel(model); + var result = _clientStorage.Delete(model); + if (result == null) + { + throw new ArgumentNullException($"Результат удаления клиентов оказался нулевым"); + } + _logger.LogInformation("Была удалена сущность: {@ClientViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки удалить элемент по модели: {@ClientBindingModel}", model); + throw; + } + } + } +} + diff --git a/CarCenterBusinessLogics/BusinessLogics/DirectorLogic.cs b/CarCenterBusinessLogics/BusinessLogics/DirectorLogic.cs new file mode 100644 index 0000000..98a5917 --- /dev/null +++ b/CarCenterBusinessLogics/BusinessLogics/DirectorLogic.cs @@ -0,0 +1,105 @@ +using CarCenterContracts.BusinessLogicContracts; +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.ViewModels; +using Microsoft.Extensions.Logging; +using CarCenterContracts.StoragesContracts; +using System.Text.RegularExpressions; + +namespace CarCenterBusinessLogics.BusinessLogics +{ + public class DirectorLogic : IDirectorLogic + { + private readonly ILogger _logger; + private readonly IDirectorStorage _employeeStorage; + public DirectorLogic(ILogger logger, IDirectorStorage employeeStorage) + { + _logger = logger; + _employeeStorage = employeeStorage; + } + + public bool Create(DirectorBindingModel model) + { + try + { + CheckModel(model); + var result = _employeeStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Результат создания работника оказался нулевым"); + } + _logger.LogInformation("Была создана сущность: {@DirectorViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@DirectorBindingModel}", model); + throw; + } + } + + public DirectorViewModel ReadElement(DirectorSearchModel model) + { + try + { + var result = _employeeStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым"); + } + _logger.LogInformation("Извлечение элемента {@DirectorViewModel} c работника по модели: {@DirectorSearchModel}", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@DirectorSearchModel}", model); + throw; + } + } + + private void CheckModel(DirectorBindingModel model, bool withParams = true) + { + const string txt = "Произошла ошибка на уровне проверки DirectorBindingModel."; + 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 > 50) + { + throw new ArgumentException("Логин пользователя должен быть от 5 до 50 символом", nameof(model.Login)); + } + + if (model.Password.Length < 5) + { + throw new ArgumentException("Пароль пользователя должен быть не менее 5 символов", nameof(model.Password)); + } + if (!Regex.IsMatch(model.Password, "[0-9]+")) + { + throw new ArgumentException("Пароль пользователя должен содержать хотя бы одну цифру", + nameof(model.Password)); + } + _logger.LogDebug("{level} Проверка логина пользователя на уникальность {@Director}", txt, model); + var element = _employeeStorage.GetElement(new DirectorSearchModel + { + Login = model.Login, + }); + if (element != null && element.Id != model.Id) + { + _logger.LogWarning("С логином: {login}, уже есть пользователь: {@ExistDirector}", model.Login, element); + throw new InvalidOperationException($"Работник с таким логином \"{model.Login}\" уже есть"); + } + } + } +} diff --git a/CarCenterBusinessLogics/BusinessLogics/RequirementLogic.cs b/CarCenterBusinessLogics/BusinessLogics/RequirementLogic.cs new file mode 100644 index 0000000..0c93ef9 --- /dev/null +++ b/CarCenterBusinessLogics/BusinessLogics/RequirementLogic.cs @@ -0,0 +1,139 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.BusinessLogicContracts; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace CarCenterBusinessLogics.BusinessLogics +{ + public class RequirementLogic : IRequirementLogic + { + private readonly ILogger _logger; + private readonly IRequirementStorage _requirementStorage; + + public RequirementLogic(ILogger logger, IRequirementStorage requirementStorage) + { + _logger = logger; + _requirementStorage = requirementStorage; + } + + public void CheckModel(RequirementBindingModel model, bool checkParams = true) + { + const string txt = "Произошла ошибка на уровне проверки RequirementBindingModel."; + if (model == null) + { + throw new ArgumentNullException(nameof(model), txt); + } + if (checkParams is false) + { + return; + } + + if (string.IsNullOrEmpty(model.NameOfRequirement)) + { + throw new ArgumentNullException(txt + $"Имя требованийы не должно быть нулевым или пустым. Полученное имя: \"{model.NameOfRequirement}\""); + } + + if (model.Price <= 0) + { + throw new ArgumentException(txt + $"Стоимость требованийы (Price={model.Price}) должна быть больше 0"); + } + } + + public List ReadList(RequirementSearchModel? model) + { + try + { + var results = model != null ? _requirementStorage.GetFilteredList(model) : _requirementStorage.GetFullList(); + _logger.LogDebug("Список полученных статей требований: {@requirements}", results); + _logger.LogInformation("Извлечение списка в количестве {Count} c требований по модели: {@RequirementSearchModel}", results.Count, model); + return results; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить список по модели: {@RequirementSearchModel}", model); + throw; + } + } + + public RequirementViewModel ReadElement(RequirementSearchModel model) + { + try + { + var result = _requirementStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым"); + } + _logger.LogInformation("Извлечение элемента {@RequirementViewModel} c требований по модели: {@RequirementSearchModel}", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@RequirementSearchModel}", model); + throw; + } + } + + public bool Create(RequirementBindingModel model) + { + try + { + CheckModel(model); + var result = _requirementStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Результат создания требований оказался нулевым"); + } + _logger.LogInformation("Была создана сущность: {@RequirementViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@RequirementBindingModel}", model); + throw; + } + } + + public bool Update(RequirementBindingModel model) + { + try + { + CheckModel(model, false); + var result = _requirementStorage.Update(model); + if (result == null) + { + throw new ArgumentNullException($"Результат обновления требований оказался нулевым"); + } + _logger.LogInformation("Была обновлена сущность на: {@RequirementViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки обновить элемент по модели: {@RequirementBindingModel}", model); + throw; + } + } + + public bool Delete(RequirementBindingModel model) + { + try + { + CheckModel(model, false); + var result = _requirementStorage.Delete(model); + if (result == null) + { + throw new ArgumentNullException($"Результат удаления требований оказался нулевым"); + } + _logger.LogInformation("Была удалена сущность: {@RequirementViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки удалить элемент по модели: {@RequirementBindingModel}", model); + throw; + } + } + } +}