diff --git a/ComputerShopBusinessLogic/BusinessLogics/UserLogic.cs b/ComputerShopBusinessLogic/BusinessLogics/UserLogic.cs new file mode 100644 index 0000000..5bafe23 --- /dev/null +++ b/ComputerShopBusinessLogic/BusinessLogics/UserLogic.cs @@ -0,0 +1,137 @@ +using ComputerShopContracts.BindingModels; +using ComputerShopContracts.BusinessLogicContracts; +using ComputerShopContracts.SearchModels; +using ComputerShopContracts.StorageContracts; +using ComputerShopContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ComputerShopBusinessLogic.BusinessLogics +{ + public class UserLogic : IUserLogic + { + private readonly ILogger _logger; + private readonly IUserStorage _userStorage; + + public UserLogic(ILogger logger, IUserStorage userStorage) + { + _logger = logger; + _userStorage = userStorage; + } + + //!!!мб поменять текст для логов + public List? ReadList(UserSearchModel? model) + { + _logger.LogInformation("User ReadList. Login:{Login} Emain:{Email} Id:{Id}", model?.Login, model?.Email, model?.Id); + var list = model == null ? _userStorage.GetFullList() : _userStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + + public UserViewModel? ReadElement(UserSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. Login:{Login}. Email:{Email}. Id:{Id}", model?.Login, model?.Email, model?.Id); + var element = _userStorage.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(UserBindingModel model) + { + CheckModel(model); + if (_userStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + + public bool Update(UserBindingModel model) + { + CheckModel(model); + if (_userStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + + public bool Delete(UserBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_userStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + + private void CheckModel(UserBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.Login)) + { + throw new ArgumentNullException("Нет логина пользователя", nameof(model.Login)); + } + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password)); + } + if (string.IsNullOrEmpty(model.Email)) + { + throw new ArgumentNullException("Нет почты пользователя", nameof(model.Email)); + } + //Проверка на уникальность. Проверить одной сущностью или 2-мя (один с таким же логином, второй с такой же почтой)? + + //проверка уникальности логина + var user1 = _userStorage.GetElement(new UserSearchModel + { + Login = model.Login + }); + + if (user1 != null && user1.Id != model.Id) + { + throw new InvalidOperationException("Пользователь с таким логином уже есть"); + } + + //проверка уникальности почты + var user2 = _userStorage.GetElement(new UserSearchModel + { + Email = model.Email + }); + + if (user2 != null && user2.Id != model.Id) { + throw new InvalidOperationException("Пользователь с такой почтой уже есть"); + } + } + } +} diff --git a/ComputerShopBusinessLogic/ComputerShopBusinessLogic.csproj b/ComputerShopBusinessLogic/ComputerShopBusinessLogic.csproj index bb69535..4a07bc8 100644 --- a/ComputerShopBusinessLogic/ComputerShopBusinessLogic.csproj +++ b/ComputerShopBusinessLogic/ComputerShopBusinessLogic.csproj @@ -14,8 +14,4 @@ - - - - diff --git a/ComputerShopDatabaseImplement/Implements/UserStorage.cs b/ComputerShopDatabaseImplement/Implements/UserStorage.cs new file mode 100644 index 0000000..eeabf9a --- /dev/null +++ b/ComputerShopDatabaseImplement/Implements/UserStorage.cs @@ -0,0 +1,80 @@ +using ComputerShopContracts.BindingModels; +using ComputerShopContracts.SearchModels; +using ComputerShopContracts.StorageContracts; +using ComputerShopContracts.ViewModels; +using ComputerShopDatabaseImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ComputerShopDatabaseImplement.Implements +{ + public class UserStorage : IUserStorage + { + //!!!ТУТ МБ РАЗДЕЛИТЬ НА 2 МЕТОДА: исполнителя и поручителя и добавить where + public List GetFullList() + { + using var context = new ComputerShopDatabase(); + return context.Users.Select(x => x.GetViewModel).ToList(); + } + + //!!!ТУТ МБ РАЗДЕЛИТЬ НА 2 МЕТОДА: исполнителя и поручителя и добавить where + //!!!ДОПИСАТЬ + public List GetFilteredList(UserSearchModel model) + { + if (string.IsNullOrEmpty(model.Login)) + { + return new(); + } + using var context = new ComputerShopDatabase(); + + } + + //!!!ДОПИСАТЬ + public UserViewModel? GetElement(UserSearchModel model) + { + + } + + public UserViewModel? Insert(UserBindingModel model) + { + var newUser = User.Create(model); + if (newUser == null) + { + return null; + } + using var context = new ComputerShopDatabase(); + context.Users.Add(newUser); + context.SaveChanges(); + return newUser.GetViewModel; + } + + public UserViewModel? Update(UserBindingModel model) + { + using var context = new ComputerShopDatabase(); + var user = context.Users.FirstOrDefault(x => x.Id == model.Id); + if (user == null) + { + return null; + } + user.Update(model); + context.SaveChanges(); + return user.GetViewModel; + } + + public UserViewModel? Delete(UserBindingModel model) + { + using var context = new ComputerShopDatabase(); + var implementer = context.Users.FirstOrDefault(rec => rec.Id == model.Id); + if (implementer != null) + { + context.Users.Remove(implementer); + context.SaveChanges(); + return implementer.GetViewModel; + } + return null; + } + } +}