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

107 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 System.Text.RegularExpressions;
using SchoolContracts.BusinessLogicContracts;
using SchoolContracts.BindingModels;
using SchoolContracts.SearchModels;
using SchoolContracts.ViewModels;
using Microsoft.Extensions.Logging;
using SchoolContracts.StoragesContracts;
namespace SchoolBusinessLogics.BusinessLogics
{
public class ImplementerLogic : IImplementerLogic
{
private readonly ILogger _logger;
private readonly IImplementerStorage _storage;
public ImplementerLogic(ILogger<ImplementerLogic> logger, IImplementerStorage implementerStorage)
{
_logger = logger;
_storage = implementerStorage;
}
public bool Create(ImplementerBindingModel model)
{
try
{
CheckModel(model);
var result = _storage.Insert(model);
if (result == null)
{
throw new ArgumentNullException($"Результат создания клиента оказался нулевым");
}
_logger.LogInformation("Была создана сущность: {@StudentViewModel}", result);
return true;
}
catch (Exception e)
{
_logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@StudentBindingModel}", model);
throw;
}
}
public ImplementerViewModel ReadElement(ImplementerSearchModel model)
{
try
{
var result = _storage.GetElement(model);
if (result == null)
{
throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым");
}
_logger.LogInformation("Извлечение элемента {@StudentViewModel} c клиента по модели: {@StudentSearchModel}", result, model);
return result;
}
catch (Exception e)
{
_logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@StudentSearchModel}", model);
throw;
}
}
private void CheckModel(ImplementerBindingModel model, bool withParams = true)
{
const string txt = "Произошла ошибка на уровне проверки StudentBindingModel.";
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 > 20)
{
throw new ArgumentException(nameof(model.Login), "Логин пользователя должен быть от 5 до 20 символом");
}
if (model.Password.Length < 5)
{
throw new ArgumentException(nameof(model.Password),
"Пароль пользователя должен быть не менее 5 символов");
}
if (!Regex.IsMatch(model.Password, "[0-9]+"))
{
throw new ArgumentException(nameof(model.Password),
"Пароль пользователя должен содержать хотя бы одну цифру");
}
_logger.LogDebug("{level} Проверка логина пользователя на уникальность {@Student}", txt, model);
var element = _storage.GetElement(new ImplementerSearchModel
{
Login = model.Login,
});
if (element != null && element.Id != model.Id)
{
_logger.LogWarning("С логином: {login}, уже есть пользователь: {@ExistStudent}", model.Login, element);
throw new InvalidOperationException($"Клиент с таким логином \"{model.Login}\" уже есть");
}
}
}
}