ISEbd-22_CourseWork_School/School/SchoolBusinessLogics/BusinessLogics/RequirementLogic.cs

140 lines
5.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<RequirementLogic> 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<RequirementViewModel> 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;
}
}
}
}