using ModuleTools.BindingModels;
using ModuleTools.Enums;
using ModuleTools.Interfaces;
using ModuleTools.ViewModels;
using System;
using System.Threading.Tasks;
namespace ModuleTools.BusinessLogics
{
///
/// Базовый класс для логики сущности
///
///
///
///
///
public class GenericBusinessLogic : CoreBusinessLogic
where G : GetBindingModel
where S : SetBindingModel
where L : ListViewModel
where E : ElementViewModel
{
///
/// Сервис с хранилищем данных
///
protected IGenerticEntityService Service { get; set; }
///
/// Возможен ли просмотр без авторизации
///
protected bool _allowSimpleView = true;
public GenericBusinessLogic(IGenerticEntityService service, string entity, AccessOperation serviceOperation)
{
Service = service;
_entity = entity;
_serviceOperation = serviceOperation;
}
///
/// Получение списка записей
///
///
///
public async Task 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;
}
///
/// Получение записи
///
///
///
public async Task 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;
}
///
/// Создание записи
///
///
///
public async Task 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;
}
///
/// Изменение записи
///
///
///
public async Task 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;
}
///
/// Удаление записи
///
///
///
public async Task 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;
}
///
/// Восстанолвение записи
///
///
///
public async Task 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;
}
}
}