From 587171474c3311e1af3785afbb889752e8825040 Mon Sep 17 00:00:00 2001 From: Danil Date: Tue, 30 Apr 2024 21:48:07 +0400 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D1=80=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D0=BB=D0=B0=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/AccountLogic.cs | 116 ++++++++++++++++ .../BusinessLogics/DisciplineLogic.cs | 131 ++++++++++++++++++ .../BusinessLogics/ImplementerLogic.cs | 106 ++++++++++++++ 3 files changed, 353 insertions(+) create mode 100644 University/UniversityBusinessLogics/BusinessLogics/AccountLogic.cs create mode 100644 University/UniversityBusinessLogics/BusinessLogics/DisciplineLogic.cs create mode 100644 University/UniversityBusinessLogics/BusinessLogics/ImplementerLogic.cs diff --git a/University/UniversityBusinessLogics/BusinessLogics/AccountLogic.cs b/University/UniversityBusinessLogics/BusinessLogics/AccountLogic.cs new file mode 100644 index 0000000..30cadc1 --- /dev/null +++ b/University/UniversityBusinessLogics/BusinessLogics/AccountLogic.cs @@ -0,0 +1,116 @@ +using UniversityContracts.BusinessLogicContracts; +using UniversityContracts.BindingModels; +using UniversityContracts.SearchModels; +using UniversityContracts.ViewModels; +using Microsoft.Extensions.Logging; +using UniversityContracts.StoragesContracts; + +namespace UniversityBusinessLogics.BusinessLogics +{ + public class AccountLogic : IAccountLogic + { + private readonly ILogger _logger; + private readonly IAccountStorage _accountStorage; + private readonly IDisciplineLogic _disciplineStorage; + + public AccountLogic(ILogger logger, IAccountStorage accountStorage, IDisciplineLogic disciplineStorage) + { + _logger = logger; + _accountStorage = accountStorage; + _disciplineStorage = disciplineStorage; + } + public List ReadList(AccountSearchModel? model) + { + try + { + var results = model != null ? _accountStorage.GetFilteredList(model) : _accountStorage.GetFullList(); + _logger.LogDebug("Список полученных счетов: {@accounts}", results); + _logger.LogInformation("Извлечение списка в количестве {Count} c счетовой по модели: {@AccountSearchModel}", results.Count, model); + return results; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить список по модели: {@AccountSearchModel}", model); + throw; + } + } + public AccountViewModel ReadElement(AccountSearchModel model) + { + try + { + var result = _accountStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым"); + } + _logger.LogInformation("Извлечение счета {@AccountViewModel} по модели: {@AccountSearchModel}", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@AccountSearchModel}", model); + throw; + } + } + public bool Create(AccountBindingModel model) + { + try + { + CheckModel(model); + var result = _accountStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Результат создания счета оказался нулевым"); + } + _logger.LogInformation("Была создана сущность: {@AccountViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@AccountBindingModel}", model); + throw; + } + } + private void CheckModel(AccountBindingModel model, bool withParams = true) + { + const string txt = "Произошла ошибка на уровне проверки AccountBindingModel."; + if (model == null) + { + throw new ArgumentNullException(nameof(model), txt); + } + if (!withParams) + { + return; + } + if (model.Price < 0) + { + throw new ArgumentNullException(nameof(model.Price), txt + "Оплаченная стоимость не может быть отрицательной"); + } + } + public bool GetAccountInfo(AccountSearchModel model, + out double currentBalance, + out double paidPrice) + { + try + { + var accounts = ReadList(model); // Вызываем метод из бизнес логики, чтобы залогировать доп информацию + paidPrice = 0; + if (accounts == null || accounts.Count == 0) + { + currentBalance = 0; + return true; + } + currentBalance = accounts.Sum(x => x.Price); + _logger.LogInformation( + "По дисциплине({Id}) и клиенту({Id}) получена полная стоимостиь {fullPrice} и оплаченная стоимость {paidPrice}", + model.DisciplineId, model.ClientId, currentBalance, paidPrice); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "При попытке получения счетов по {@searchModel} произошла ошибка", model); + throw; + } + } + } +} diff --git a/University/UniversityBusinessLogics/BusinessLogics/DisciplineLogic.cs b/University/UniversityBusinessLogics/BusinessLogics/DisciplineLogic.cs new file mode 100644 index 0000000..e494398 --- /dev/null +++ b/University/UniversityBusinessLogics/BusinessLogics/DisciplineLogic.cs @@ -0,0 +1,131 @@ +using UniversityContracts.BindingModels; +using UniversityContracts.BusinessLogicContracts; +using UniversityContracts.SearchModels; +using UniversityContracts.StoragesContracts; +using UniversityContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace UniversityBusinessLogics.BusinessLogics +{ + public class DisciplineLogic : IDisciplineLogic + { + private readonly ILogger _logger; + private readonly IDisciplineStorage _disciplineStorage; + + public DisciplineLogic(ILogger logger, IDisciplineStorage disciplineStorage) + { + _logger = logger; + _disciplineStorage = disciplineStorage; + } + + public void CheckModel(DisciplineBindingModel model, bool checkParams = true) + { + const string txt = "Произошла ошибка на уровне проверки DisciplineBindingModel."; + if (model == null) + { + throw new ArgumentNullException(nameof(model), txt); + } + if (checkParams is false) + { + return; + } + } + + public List ReadList(DisciplineSearchModel? model) + { + try + { + var results = model != null ? _disciplineStorage.GetFilteredList(model) : _disciplineStorage.GetFullList(); + _logger.LogDebug("Список полученных дисциплин на посещение: {@disciplinesVisit}", results); + _logger.LogInformation("Извлечение списка в количестве {Count} c дисциплин на посещение по модели: {@DisciplineSearchModel}", results.Count, model); + return results; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить список по модели: {@DisciplineSearchModel}", model); + throw; + } + } + + public DisciplineViewModel ReadElement(DisciplineSearchModel model) + { + try + { + var result = _disciplineStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым"); + } + _logger.LogInformation("Извлечение элемента {@DisciplineViewModel} c дисциплин на посещение по модели: {@DisciplineSearchModel}", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@DisciplineSearchModel}", model); + throw; + } + } + + public bool Create(DisciplineBindingModel model) + { + try + { + CheckModel(model); + var result = _disciplineStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Результат создания дисциплины на посещение оказался нулевым"); + } + _logger.LogInformation("Была создана сущность: {@DisciplineViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@DisciplineBindingModel}", model); + throw; + } + } + + public bool Update(DisciplineBindingModel model) + { + try + { + CheckModel(model); + var result = _disciplineStorage.Update(model); + if (result == null) + { + throw new ArgumentNullException($"Результат обновления дисциплины на посещение оказался нулевым"); + } + _logger.LogInformation("Была обновлена сущность на: {@DisciplineViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки обновить элемент по модели: {@DisciplineBindingModel}", model); + throw; + } + } + + public bool Delete(DisciplineBindingModel model) + { + try + { + CheckModel(model, false); + var result = _disciplineStorage.Delete(model); + if (result == null) + { + throw new ArgumentNullException($"Результат удаления дисциплины на посещение оказался нулевым"); + } + _logger.LogInformation("Была удалена сущность: {@DisciplineViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки удалить элемент по модели: {@DisciplineBindingModel}", model); + throw; + } + } + } +} + + diff --git a/University/UniversityBusinessLogics/BusinessLogics/ImplementerLogic.cs b/University/UniversityBusinessLogics/BusinessLogics/ImplementerLogic.cs new file mode 100644 index 0000000..8214932 --- /dev/null +++ b/University/UniversityBusinessLogics/BusinessLogics/ImplementerLogic.cs @@ -0,0 +1,106 @@ +using System.Text.RegularExpressions; +using UniversityContracts.BusinessLogicContracts; +using UniversityContracts.BindingModels; +using UniversityContracts.SearchModels; +using UniversityContracts.ViewModels; +using Microsoft.Extensions.Logging; +using UniversityContracts.StoragesContracts; + +namespace UniversityBusinessLogics.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}\" уже есть"); + } + } + } +}