using SchoolContracts.BusinessLogicContracts; using SchoolContracts.BindingModels; using SchoolContracts.SearchModels; using SchoolContracts.ViewModels; using Microsoft.Extensions.Logging; using SchoolContracts.StoragesContracts; namespace SchoolBusinessLogics.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; } } } }