using Microsoft.Extensions.Logging; using SchoolContracts.BindingModels; using SchoolContracts.BusinessLogicContracts; using SchoolContracts.SearchModels; using SchoolContracts.StoragesContracts; using SchoolContracts.ViewModels; using static System.Net.Mime.MediaTypeNames; namespace SchoolBusinessLogics.BusinessLogics { public class StudentLogic : IStudentLogic { private readonly ILogger _logger; private readonly IStudentStorage _studentStorage; private const string ErrorString = "Произошла ошибка на уровне проверки StudentBindingModel."; public StudentLogic(ILogger logger, IStudentStorage studentStorage) { _logger = logger; _studentStorage = studentStorage; } private void CheckOnlyModel(StudentBindingModel model) { if (model == null) { throw new ArgumentNullException(nameof(model), ErrorString); } } private void CheckUpdateModel(StudentBindingModel model) { CheckOnlyModel(model); if (model.Course <= 0) { throw new ArgumentException(ErrorString + $"Курс (Course={model.Course}) должна быть больше 0"); } } public void CheckFullModel(StudentBindingModel model) { CheckOnlyModel(model); CheckUpdateModel(model); if (string.IsNullOrEmpty(model.Name)) { throw new ArgumentNullException(ErrorString + $"Имя клиента не должно быть нулевым или пустым. Полученное имя: \"{model.Name}\""); } } public List ReadList(StudentSearchModel? model) { try { var results = model != null ? _studentStorage.GetFilteredList(model) : _studentStorage.GetFullList(); _logger.LogDebug("Список полученных клиентов: {@students}", results); _logger.LogInformation("Извлечение списка в количестве {Count} c клиентов по модели: {@StudentSearchModel}", results.Count, model); return results; } catch (Exception e) { _logger.LogError(e, "Произошла ошибка при попытки получить список по модели: {@StudentSearchModel}", model); throw; } } public StudentViewModel ReadElement(StudentSearchModel model) { try { var result = _studentStorage.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; } } public bool Create(StudentBindingModel model) { try { CheckFullModel(model); var result = _studentStorage.Insert(model); if (result == null) { throw new ArgumentNullException($"Результат создания клиентов оказался нулевым"); } _logger.LogInformation("Была создана сущность: {@StudentViewModel}", result); return true; } catch (Exception e) { _logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@StudentBindingModel}", model); throw; } } public bool Update(StudentBindingModel model) { try { CheckUpdateModel(model); var result = _studentStorage.Update(model); if (result == null) { throw new ArgumentNullException($"Результат обновления клиентов оказался нулевым"); } _logger.LogInformation("Была обновлена сущность на: {@StudentViewModel}", result); return true; } catch (Exception e) { _logger.LogError(e, "Произошла ошибка при попытки обновить элемент по модели: {@StudentBindingModel}", model); throw; } } public bool Delete(StudentBindingModel model) { try { CheckOnlyModel(model); var result = _studentStorage.Delete(model); if (result == null) { throw new ArgumentNullException($"Результат удаления клиентов оказался нулевым"); } _logger.LogInformation("Была удалена сущность: {@StudentViewModel}", result); return true; } catch (Exception e) { _logger.LogError(e, "Произошла ошибка при попытки удалить элемент по модели: {@StudentBindingModel}", model); throw; } } } }