DepartmentProject/DepartmentPortal/Common/ModuleTools/BusinessLogics/GenericBusinessLogic.cs

221 lines
4.9 KiB
C#
Raw 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 ModuleTools.BindingModels;
using ModuleTools.Enums;
using ModuleTools.Interfaces;
using ModuleTools.ViewModels;
using System;
using System.Threading.Tasks;
namespace ModuleTools.BusinessLogics
{
/// <summary>
/// Базовый класс для логики сущности
/// </summary>
/// <typeparam name="G"></typeparam>
/// <typeparam name="S"></typeparam>
/// <typeparam name="L"></typeparam>
/// <typeparam name="E"></typeparam>
public class GenericBusinessLogic<G, S, L, E> : CoreBusinessLogic
where G : GetBindingModel
where S : SetBindingModel
where L : ListViewModel<E>
where E : ElementViewModel
{
/// <summary>
/// Сервис с хранилищем данных
/// </summary>
protected IGenerticEntityService<G, S> Service { get; set; }
/// <summary>
/// Возможен ли просмотр без авторизации
/// </summary>
protected bool _allowSimpleView = true;
public GenericBusinessLogic(IGenerticEntityService<G, S> service, string entity, AccessOperation serviceOperation)
{
Service = service;
_entity = entity;
_serviceOperation = serviceOperation;
}
/// <summary>
/// Получение списка записей
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<L> GetListAsync(G model)
{
Errors.Clear();
try
{
model.HaveRight = !NoAccess(model, AccessType.View);
if (model.HaveRight && !_allowSimpleView)
{
throw new MethodAccessException("Нет прав на получение списка");
}
var result = await Service.ReadAsync(model);
if (!result.IsSucceeded)
{
Errors.AddRange(result.Errors);
return null;
}
return result.Result as L;
}
catch (Exception ex)
{
Errors.Add(("Ошибка получения", ex.Message));
}
return null;
}
/// <summary>
/// Получение записи
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<E> GetElementAsync(G model)
{
Errors.Clear();
try
{
model.HaveRight = !NoAccess(model, AccessType.View);
if (model.HaveRight && !_allowSimpleView)
{
throw new MethodAccessException("Нет прав на получение списка");
}
var result = await Service.ReadAsync(model);
if (!result.IsSucceeded)
{
Errors.AddRange(result.Errors);
return null;
}
return result.Result as E;
}
catch (Exception ex)
{
Errors.Add(("Ошибка получения", ex.Message));
}
return null;
}
/// <summary>
/// Создание записи
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public virtual async Task<E> CreateAsync(S model)
{
Errors.Clear();
try
{
if (NoAccess(model, AccessType.Change))
{
return null;
}
var result = await Service.CreateAsync(model);
if (!result.IsSucceeded)
{
Errors.AddRange(result.Errors);
return null;
}
return result.Result as E;
}
catch (Exception ex)
{
Errors.Add(("Ошибка создания", ex.Message));
}
return null;
}
/// <summary>
/// Изменение записи
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public virtual async Task<E> UpdateAsync(S model)
{
Errors.Clear();
try
{
if (NoAccess(model, AccessType.Change))
{
return null;
}
var result = await Service.UpdateAsync(model);
if (!result.IsSucceeded)
{
Errors.AddRange(result.Errors);
return null;
}
return result.Result as E;
}
catch (Exception ex)
{
Errors.Add(("Ошибка изменения", ex.Message));
}
return null;
}
/// <summary>
/// Удаление записи
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public virtual async Task<bool> DeleteAsync(G model)
{
Errors.Clear();
try
{
if (NoAccess(model, AccessType.Delete))
{
return false;
}
var result = await Service.DeleteAsync(model);
if (!result.IsSucceeded)
{
Errors.AddRange(result.Errors);
return false;
}
return true;
}
catch (Exception ex)
{
Errors.Add(("Ошибка удаления", ex.Message));
}
return false;
}
/// <summary>
/// Восстанолвение записи
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public virtual async Task<E> RestoreAsync(G model)
{
Errors.Clear();
try
{
if (NoAccess(model, AccessType.Change))
{
return null;
}
var result = await Service.RestoreAsync(model);
if (!result.IsSucceeded)
{
Errors.AddRange(result.Errors);
return null;
}
return result.Result as E;
}
catch (Exception ex)
{
Errors.Add(("Ошибка удаления", ex.Message));
}
return null;
}
}
}