From a254af4259dc95e31239934056eba2d6c7449b80 Mon Sep 17 00:00:00 2001 From: "trofimova.05" Date: Sun, 28 Apr 2024 21:16:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=B5=D0=B3=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D1=8F=20=D1=85=D0=B2=D0=B0=D1=82=D0=B8=D1=82,=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=20=D1=81=D0=BF=D0=B0=D1=82=D1=8C))))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogic/ClientLogic.cs | 105 ++++++++++++- .../BusinessLogic/OperationLogic.cs | 143 +++++++++++++++++- .../BusinessLogic/PaymentLogic.cs | 115 +++++++++++++- .../BusinessLogic/PurchaseLogic.cs | 128 +++++++++++++++- 4 files changed, 467 insertions(+), 24 deletions(-) diff --git a/Bank/BankBusinessLogics/BusinessLogic/ClientLogic.cs b/Bank/BankBusinessLogics/BusinessLogic/ClientLogic.cs index 8fa21c3..5e752ff 100644 --- a/Bank/BankBusinessLogics/BusinessLogic/ClientLogic.cs +++ b/Bank/BankBusinessLogics/BusinessLogic/ClientLogic.cs @@ -1,12 +1,105 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using BankContracts.BindingModels; +using BankContracts.BusinessLogicContracts; +using BankContracts.SearchModels; +using BankContracts.StoragesContracts; +using BankContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System.Text.RegularExpressions; namespace BankBusinessLogics.BusinessLogic { - internal class ClientLogic + public class ClientLogic : IClientLogic { + private readonly ILogger _logger; + private readonly IClientStorage _clientStorage; + public ClientLogic(ILogger logger, IClientStorage clientStorage) + { + _logger = logger; + _clientStorage = clientStorage; + } + + private void CheckModel(ClientBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.PhoneNumber)) + { + throw new ArgumentNullException(nameof(model.PhoneNumber), "Нет логина клиента"); + } + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException(nameof(model.Password), "Нет пароля клиента"); + } + if (model.PhoneNumber.Length is < 11) + { + throw new ArgumentException(nameof(model.PhoneNumber), "Длина номера телефона должна быть 11 цифр"); + } + + 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}", model); + var element = _clientStorage.GetElement(new ClientSearchModel + { + PhoneNumber = model.PhoneNumber, + }); + if (element != null && element.Id != model.Id) + { + _logger.LogWarning("С номером {PhoneNumber}, уже есть пользователь: {@ExistClient}", model.PhoneNumber, element); + throw new InvalidOperationException($"Клиент с таким номером телефона уже есть"); + } + } + + public bool Create(ClientBindingModel model) + { + try + { + CheckModel(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 ClientViewModel ReadElement(ClientSearchModel model) + { + try + { + var result = _clientStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Результат получения элемента с id {model.Id} оказался нулевым"); + } + _logger.LogInformation("Извлечение элемента {@ClientViewModel} c клиента по модели: {@ClientSearchModel}", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@ClientSearchModel}", model); + throw; + } + } } } diff --git a/Bank/BankBusinessLogics/BusinessLogic/OperationLogic.cs b/Bank/BankBusinessLogics/BusinessLogic/OperationLogic.cs index 075248b..0bf52c1 100644 --- a/Bank/BankBusinessLogics/BusinessLogic/OperationLogic.cs +++ b/Bank/BankBusinessLogics/BusinessLogic/OperationLogic.cs @@ -1,12 +1,143 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using BankContracts.BindingModels; +using BankContracts.BusinessLogicContracts; +using BankContracts.SearchModels; +using BankContracts.StoragesContracts; +using BankContracts.ViewModels; +using Microsoft.Extensions.Logging; namespace BankBusinessLogics.BusinessLogic { - internal class OperationLogic + public class OperationLogic : IOperationLogic { + private readonly ILogger _logger; + private readonly IOperationStorage _opationStorage; + + public OperationLogic(ILogger logger, IOperationStorage operationStorage) + { + _logger = logger; + _opationStorage = operationStorage; + } + + public void CheckOnlyModel(OperationBindingModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model), "Произошла ошибка на уровне проверки OperationBindingModel"); + } + } + + private void CheckUpdateModel(OperationBindingModel model) + { + CheckOnlyModel(model); + if (model.Price <= 0) + { + throw new ArgumentException($"Произошла ошибка на уровне проверки OperationBindingModel. Стоимость операции (Price={model.Price}) должна быть больше 0"); + } + } + + public void CheckFullModel(OperationBindingModel model) + { + CheckOnlyModel(model); + CheckUpdateModel(model); + if (string.IsNullOrEmpty(model.Model) && string.IsNullOrEmpty(model.Mark)) + { + throw new ArgumentNullException($"Произошла ошибка на уровне проверки OperationBindingModel.Вид и тип операции не должна быть нулевыми или пустыми."); + } + } + + public List ReadList(OperationSearchModel? model) + { + try + { + var results = model != null ? _opationStorage.GetFilteredList(model) : _opationStorage.GetFullList(); + _logger.LogDebug("Список операций: {@operations}", results); + _logger.LogInformation("Извлечение списка операций по {@OperationSearchModel} модели", model); + return results; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить список по {@OperationSearchModel} модели", model); + throw; + } + } + + public OperationViewModel ReadElement(OperationSearchModel model) + { + try + { + var result = _opationStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Не получилось получить эдемент с id {model.Id}"); + } + _logger.LogInformation("Извлечение элемента {@OperationViewModel} c обследований по {@OperationSearchModel} модели", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по {@OperationSearchModel} модели:", model); + throw; + } + } + + public bool Create(OperationBindingModel model) + { + try + { + CheckFullModel(model); + var result = _opationStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Не получилось создать операцию"); + } + _logger.LogInformation("Создана сущность {@OperationViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по {@OperationBindingModel} модели", model); + throw; + } + } + + public bool Update(OperationBindingModel model) + { + try + { + CheckFullModel(model); + var result = _opationStorage.Update(model); + if (result == null) + { + throw new ArgumentNullException($"Результат обновления обследований оказался нулевым"); + } + _logger.LogInformation("Была обновлена сущность на: {@OperationViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки обновить элемент по модели: {@OperationBindingModel}", model); + throw; + } + } + + public bool Delete(OperationBindingModel model) + { + try + { + CheckOnlyModel(model); + var result = _opationStorage.Delete(model); + if (result == null) + { + throw new ArgumentNullException($"Не получилось удалить операциб"); + } + _logger.LogInformation("Удалена сущность {@OperationViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки удалить элемент по {@OperationBindingModel} модели", model); + throw; + } + } } } diff --git a/Bank/BankBusinessLogics/BusinessLogic/PaymentLogic.cs b/Bank/BankBusinessLogics/BusinessLogic/PaymentLogic.cs index cece61b..7e29d2c 100644 --- a/Bank/BankBusinessLogics/BusinessLogic/PaymentLogic.cs +++ b/Bank/BankBusinessLogics/BusinessLogic/PaymentLogic.cs @@ -1,12 +1,115 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using BankContracts.BindingModels; +using BankContracts.BusinessLogicContracts; +using BankContracts.SearchModels; +using BankContracts.StoragesContracts; +using BankContracts.ViewModels; +using Microsoft.Extensions.Logging; namespace BankBusinessLogics.BusinessLogic { - internal class PaymentLogic + public class PaymentLogic : IPaymentLogic { + private readonly ILogger _logger; + private readonly IPaymentStorage _paymentStorage; + private readonly IOperationStorage _operationStorage; + public PaymentLogic(ILogger logger, IPaymentStorage paymentStorage, IOperationStorage operationStorage) + { + _logger = logger; + _paymentStorage = paymentStorage; + _operationStorage = operationStorage; + } + + private void CheckModel(PaymentBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (model.PaidPrice < 0) + { + throw new ArgumentNullException(nameof(model.PaidPrice), "Оплаченная стоимость отрицательна"); + } + } + + public bool Create(PaymentBindingModel model) + { + try + { + CheckModel(model); + var result = _paymentStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Оплата не создалась"); + } + _logger.LogInformation("Создана сущность: {@PaymentViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Ошибка при попытки создать элемент по {@PaymentBindingModel} модели", model); + throw; + } + } + + public PaymentViewModel ReadElement(PaymentSearchModel model) + { + try + { + var result = _paymentStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Не получилось получить эдемент с id {model.Id}"); + } + _logger.LogInformation("Извлечение оплаты {@PaymentViewModel} по {@PaymentSearchModel} модели", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по {@PaymentSearchModel} модели", model); + throw; + } + } + + public List ReadList(PaymentSearchModel model) + { + try + { + var results = model != null ? _paymentStorage.GetFilteredList(model) : _paymentStorage.GetFullList(); + _logger.LogDebug("Список оплат {@payments}", results); + _logger.LogInformation("Извлечение списка в количестве {Count} c оплатой по модели: {@PaymentSearchModel}", results.Count, model); + return results; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить список по {@PaymentSearchModel} модели", model); + throw; + } + } + public bool GetPaymentInfo(PaymentSearchModel model, out double fullPrice, out double paidPrice) + { + try + { + var payments = ReadList(model); // Вызываем метод из бизнес логики, чтобы залогировать доп информацию + if (payments == null || payments.Count == 0) + { + fullPrice = _operationStorage.GetElement(new() { Id = model.OperationId })?.Price ?? throw new InvalidOperationException("Не получена операция для оплаты"); ; + paidPrice = 0; + return true; + } + fullPrice = payments[0].FullPrice; + paidPrice = payments.Sum(x => x.PaidPrice); + _logger.LogInformation("По покупке({Id}) и операцийе({Id}) получена полная стоимостиь {fullPrice} и оплаченная стоимость {paidPrice}", model.PurchaseId, model.OperationId, fullPrice, paidPrice); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "При попытке получения оплат по {@searchModel} произошла ошибка", model); + throw; + } + } } } diff --git a/Bank/BankBusinessLogics/BusinessLogic/PurchaseLogic.cs b/Bank/BankBusinessLogics/BusinessLogic/PurchaseLogic.cs index a6ae6dd..97dcd1e 100644 --- a/Bank/BankBusinessLogics/BusinessLogic/PurchaseLogic.cs +++ b/Bank/BankBusinessLogics/BusinessLogic/PurchaseLogic.cs @@ -1,12 +1,128 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using BankContracts.BindingModels; +using BankContracts.BusinessLogicContracts; +using BankContracts.SearchModels; +using BankContracts.StoragesContracts; +using BankContracts.ViewModels; +using Microsoft.Extensions.Logging; namespace BankBusinessLogics.BusinessLogic { - internal class PurchaseLogic + public class PurchaseLogic : IPurchaseLogic { + private readonly ILogger _logger; + private readonly IPurchaseStorage _purchaseVisitStorage; + + public PurchaseLogic(ILogger logger, IPurchaseStorage purchaseVisitStorage) + { + _logger = logger; + _purchaseVisitStorage = purchaseVisitStorage; + } + + public void CheckModel(PurchaseBindingModel model, bool checkParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (checkParams is false) + { + return; + } + } + + public List ReadList(PurchaseSearchModel? model) + { + try + { + var results = model != null ? _purchaseVisitStorage.GetFilteredList(model) : _purchaseVisitStorage.GetFullList(); + _logger.LogDebug("Полученные покупки: {@purchasesVisit}", results); + _logger.LogInformation("Извлечение списка в количестве {Count} c покупки по {@PurchaseSearchModel} модели", results.Count, model); + return results; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить список по {@PurchaseSearchModel} модели", model); + throw; + } + } + + public PurchaseViewModel ReadElement(PurchaseSearchModel model) + { + try + { + var result = _purchaseVisitStorage.GetElement(model); + if (result == null) + { + throw new ArgumentNullException($"Не получилось получить эдемент с id {model.Id}"); + } + _logger.LogInformation("Извлечение элемента {@PurchaseViewModel} c покупки по {@PurchaseSearchModel} модели", result, model); + return result; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки получить элемент по {@PurchaseSearchModel} модели", model); + throw; + } + } + + public bool Create(PurchaseBindingModel model) + { + try + { + CheckModel(model); + var result = _purchaseVisitStorage.Insert(model); + if (result == null) + { + throw new ArgumentNullException($"Не удалось создать покупку"); + } + _logger.LogInformation("Создана сущность {@PurchaseViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки создать элемент по {@PurchaseBindingModel} модели", model); + throw; + } + } + + public bool Update(PurchaseBindingModel model) + { + try + { + CheckModel(model); + var result = _purchaseVisitStorage.Update(model); + if (result == null) + { + throw new ArgumentNullException($"Не удалось обновить покупку"); + } + _logger.LogInformation("Была обновлена сущность на: {@PurchaseViewModel}", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки обновить элемент по {@PurchaseBindingModel} модели", model); + throw; + } + } + + public bool Delete(PurchaseBindingModel model) + { + try + { + CheckModel(model, false); + var result = _purchaseVisitStorage.Delete(model); + if (result == null) + { + throw new ArgumentNullException($"Ну удалось удалить покупку"); + } + _logger.LogInformation("Сущность {@PurchaseViewModel} удалена ", result); + return true; + } + catch (Exception e) + { + _logger.LogError(e, "Произошла ошибка при попытки удалить элемент по {@PurchaseBindingModel} модели", model); + throw; + } + } } }