PIbd-22_Smirnov_A.A._Securi.../SecuritySystem/SecuritySystemBusinessLogiс/BusinessLogic/SensorLogic.cs
2024-05-07 15:10:34 +04:00

162 lines
5.3 KiB
C#
Raw 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 SecuritySystemContracts.BindingModels;
using SecuritySystemContracts.BusinessLogicsContracts;
using SecuritySystemContracts.SearchModels;
using SecuritySystemContracts.StoragesContracts;
using SecuritySystemContracts.ViewModels;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SecuritySystemBusinessLogic.BusinessLogic
{
//класс, реализующий логику для заготовок
public class SensorLogic : ISensorLogic
{
private readonly ILogger _logger;
private readonly ISensorStorage _sensorStorage;
//конструктор
public SensorLogic(ILogger<SensorLogic> logger, ISensorStorage sensorStorage)
{
_logger = logger;
_sensorStorage = sensorStorage;
}
//вывод отфильтрованного списка компонентов
public List<SensorViewModel>? ReadList(SensorSearchModel? model)
{
_logger.LogInformation("ReadList. SensorName:{SensorName}. Id:{Id}", model?.SensorName, model?.Id);
//list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _sensorStorage.GetFullList() : _sensorStorage.GetFilteredList(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list;
}
//вывод конкретного заготовки
public SensorViewModel? ReadElement(SensorSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. SensorName:{SensorName}. Id:{Id}", model.SensorName, model.Id);
var element = _sensorStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element;
}
//создание заготовки
public bool Create(SensorBindingModel model)
{
CheckModel(model);
if (_sensorStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
//обновление заготовки
public bool Update(SensorBindingModel model)
{
CheckModel(model);
if (_sensorStorage.Update(model) == null)
{
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
//удаление заготовки
public bool Delete(SensorBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_sensorStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
//проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(SensorBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
//так как при удалении передаём как параметр false
if (!withParams)
{
return;
}
//проверка на наличие названия заготовки
if (string.IsNullOrEmpty(model.SensorName))
{
throw new ArgumentNullException("Нет названия заготовки", nameof(model.SensorName));
}
//проверка на наличие нормальной цены у заготовки
if (model.Cost <= 0)
{
throw new ArgumentNullException("Цена заготовки должна быть больше 0", nameof(model.Cost));
}
_logger.LogInformation("Sensor. SensorName:{SensorName}. Cost:{Cost}. Id:{Id}",
model.SensorName, model.Cost, model.Id);
//проверка на наличие такой же заготовки в списке
var element = _sensorStorage.GetElement(new SensorSearchModel
{
SensorName = model.SensorName,
});
//если элемент найден и его Id не совпадает с Id переданного объекта
if (element != null && element.Id != model.Id)
{
throw new InvalidOperationException("Заготовка с таким названием уже есть");
}
}
}
}