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

106 lines
4.6 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.BusinessLogicContracts;
using SchoolContracts.BindingModels;
using SchoolContracts.SearchModels;
using SchoolContracts.ViewModels;
using Microsoft.Extensions.Logging;
using SchoolContracts.StoragesContracts;
using System.Text.RegularExpressions;
namespace SchoolBusinessLogics.BusinessLogics
{
public class ExecutorLogic : IExecutorLogic
{
private readonly ILogger _logger;
private readonly IExecutorStorage _employeeStorage;
public ExecutorLogic(ILogger<ExecutorLogic> logger, IExecutorStorage employeeStorage)
{
_logger = logger;
_employeeStorage = employeeStorage;
}
public bool Create(ExecutorBindingModel model)
{
try
{
CheckModel(model);
var result = _employeeStorage.Insert(model);
if (result == null)
{
throw new ArgumentNullException($"Результат создания работника оказался нулевым");
}
_logger.LogInformation("Была создана сущность: {@ExecutorViewModel}", result);
return true;
}
catch (Exception e)
{
_logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@ExecutorBindingModel}", model);
throw;
}
}
public ExecutorViewModel ReadElement(ExecutorSearchModel model)
{
try
{
var result = _employeeStorage.GetElement(model);
if (result == null)
{
throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым");
}
_logger.LogInformation("Извлечение элемента {@DirectorViewModel} c работника по модели: {@ExecutorSearchModel}", result, model);
return result;
}
catch (Exception e)
{
_logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@ExecutorSearchModel}", model);
throw;
}
}
private void CheckModel(ExecutorBindingModel model, bool withParams = true)
{
const string txt = "Произошла ошибка на уровне проверки ExecutorBindingModel.";
if (model == null)
{
throw new ArgumentNullException(nameof(model), txt);
}
if (!withParams)
{
return;
}
if (string.IsNullOrEmpty(model.Login))
{
throw new ArgumentNullException(nameof(model.Login), txt + "Нет логина работника");
}
if (string.IsNullOrEmpty(model.Password))
{
throw new ArgumentNullException(nameof(model.Password), txt + "Нет пароля работника");
}
if (model.Login.Length is < 5 or > 50)
{
throw new ArgumentException("Логин пользователя должен быть от 5 до 50 символом", nameof(model.Login));
}
if (model.Password.Length < 5)
{
throw new ArgumentException("Пароль пользователя должен быть не менее 5 символов", nameof(model.Password));
}
if (!Regex.IsMatch(model.Password, "[0-9]+"))
{
throw new ArgumentException("Пароль пользователя должен содержать хотя бы одну цифру",
nameof(model.Password));
}
_logger.LogDebug("{level} Проверка логина пользователя на уникальность {@Executor}", txt, model);
var element = _employeeStorage.GetElement(new ExecutorSearchModel
{
Login = model.Login,
});
if (element != null && element.Id != model.Id)
{
_logger.LogWarning("С логином: {login}, уже есть пользователь: {@ExistExecutor}", model.Login, element);
throw new InvalidOperationException($"Работник с таким логином \"{model.Login}\" уже есть");
}
}
}
}