using ModuleTools.BindingModels; using ModuleTools.Enums; using ModuleTools.Interfaces; using ModuleTools.Models; using ModuleTools.ViewModels; using System; using System.Collections.Generic; namespace ModuleTools.BusinessLogics { /// /// Базовый класс для логики сущности /// /// /// /// /// public class BusinessLogicCore where G : GetBindingModel where S : SetBindingModel where L : ListViewModel where E : ElementViewModel { /// /// Перечень ошибок при выполнении операции /// public List<(string Title, string Message)> Errors { get; protected set; } /// /// Сервис с хранилищем данных /// protected IEntityService Service { get; set; } /// /// Менеджер безопасности /// protected ISecurityManager Security { get; set; } /// /// Тип операции, скоторым работает логика /// protected readonly AccessOperation _serviceOperation; /// /// Название сущности /// protected readonly string _entity; /// /// Возможен ли просмотр без авторизации /// protected bool _allowSimpleView = true; public BusinessLogicCore(IEntityService service, string entity, AccessOperation serviceOperation) { Service = service; Errors = new List<(string Title, string Message)>(); Security = DependencyManager.Instance.Resolve(); _entity = entity; _serviceOperation = serviceOperation; } /// /// Проверка доступности операции для пользователя /// /// /// /// protected bool NoAccess(AccessBindingModel model, AccessType type) { if (Security.CheckAccess(new SecurityManagerCheckAccessModel(model, _serviceOperation, type, _entity))) { return false; } Errors.Add(("Ошибка безопасности", Security.ErrorMessage)); return true; } /// /// Получение списка записей /// /// /// public L GetList(G model) { Errors.Clear(); try { var fullView = NoAccess(model, AccessType.View); if (fullView && !_allowSimpleView) { throw new MethodAccessException("Нет прав на получение списка"); } var result = Service.Read(model); if (!result.IsSucceeded) { Errors.AddRange(Errors); return null; } return result.Result as L; } catch (Exception ex) { Errors.Add(("Ошибка получения", ex.Message)); } return null; } /// /// Получение записи /// /// /// public E GetElement(G model) { Errors.Clear(); try { var fullView = NoAccess(model, AccessType.View); if (fullView && !_allowSimpleView) { throw new MethodAccessException("Нет прав на получение списка"); } var result = Service.Read(model); if (!result.IsSucceeded) { Errors.AddRange(Errors); return null; } return result.Result as E; } catch (Exception ex) { Errors.Add(("Ошибка получения", ex.Message)); } return null; } /// /// Создание записи /// /// /// public E Create(S model) { Errors.Clear(); try { if (NoAccess(model, AccessType.Change)) { return null; } var result = Service.Create(model); if (!result.IsSucceeded) { Errors.AddRange(Errors); return null; } return result.Result as E; } catch (Exception ex) { Errors.Add(("Ошибка создания", ex.Message)); } return null; } /// /// Изменение записи /// /// /// public E Update(S model) { Errors.Clear(); try { if (NoAccess(model, AccessType.Change)) { return null; } var result = Service.Update(model); if (!result.IsSucceeded) { Errors.AddRange(Errors); return null; } return result.Result as E; } catch (Exception ex) { Errors.Add(("Ошибка изменения", ex.Message)); } return null; } /// /// Удаление записи /// /// /// public bool Delete(G model) { Errors.Clear(); try { if (NoAccess(model, AccessType.Delete)) { return false; } var result = Service.Delete(model); if (!result.IsSucceeded) { Errors.AddRange(Errors); return false; } return true; } catch (Exception ex) { Errors.Add(("Ошибка удаления", ex.Message)); } return false; } } }