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