using BankContracts.BindingModels; using BankContracts.BusinessLogicContracts; using BankContracts.SearchModels; using BankContracts.StoragesContracts; using BankContracts.ViewModels; using Microsoft.Extensions.Logging; namespace BankBusinessLogics.BusinessLogic { 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; } } } }