using ModelTools.BindingModels; using ModelTools.Enums; using ModelTools.Interfaces; using ModelTools.Models; using ModelTools.ViewModels; using System; using System.Collections.Generic; namespace ModelTools.BusinessLogics { /// /// Базовый класс для логики сущности /// /// /// /// /// public abstract 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; public BusinessLogicCore(IEntityService service, string entity, AccessOperation serviceOperation) { Service = service; Errors = new List<(string Title, string Message)>(); Security = UnityContainerConfigurator.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 { if (NoAccess(model, AccessType.SimpleView) && NoAccess(model, AccessType.FullView)) { return null; } var result = Service.Read(model); if (!result.IsSucceeded) { Errors.AddRange(Errors); return null; } return ConvertToL(result); } catch (Exception ex) { Errors.Add(("Ошибка получения", ex.Message)); } return null; } /// /// Получение записи /// /// /// public E GetElement(G model) { Errors.Clear(); try { if (NoAccess(model, AccessType.SimpleView) && NoAccess(model, AccessType.FullView)) { return null; } var result = Service.Read(model); if (!result.IsSucceeded) { Errors.AddRange(Errors); return null; } return ConvertToE(result); } 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 ConvertToE(result); } 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 ConvertToE(result); } 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; } /// /// Получить список элементов /// /// /// protected abstract L ConvertToL(OperationResultModel model); /// /// Получить элемент /// /// /// protected abstract E ConvertToE(OperationResultModel model); } }