118 lines
2.7 KiB
C#
118 lines
2.7 KiB
C#
using API.Authentication.Interfaces;
|
|
using API.DTO;
|
|
using API.Services.Interfaces;
|
|
using DAL.Contexts;
|
|
using DAL.Models;
|
|
using System.Linq.Expressions;
|
|
|
|
namespace API.Services
|
|
{
|
|
public class ServiceBase<TLoggerCategory, TDTO, TModel, TAudit, TAuthentication> : IGenericService<TDTO, TModel, TAudit>
|
|
where TAuthentication : IGenericAuthentication<TDTO, TModel>
|
|
where TModel : Model<TModel, TAudit>
|
|
where TAudit : class
|
|
where TDTO : IAdaptable<TModel>
|
|
{
|
|
private readonly TAuthentication _auth;
|
|
private readonly SASGContext _context;
|
|
private readonly ILogger<TLoggerCategory> _logger;
|
|
|
|
public ServiceBase(ILogger<TLoggerCategory> logger, SASGContext context, TAuthentication auth)
|
|
{
|
|
_logger = logger;
|
|
_context = context;
|
|
_auth = auth;
|
|
}
|
|
|
|
public TModel? get(ulong id, User user)
|
|
{
|
|
TModel? result = _context.Set<TModel>().Find(id);
|
|
if (result == null)
|
|
return null;
|
|
|
|
return _auth.canGet(result, user) ? result : null;
|
|
}
|
|
|
|
public IEnumerable<TModel>? get(User user, Expression<Func<TModel, bool>>? whereClause = null)
|
|
{
|
|
if (!_auth.canGetAll(user))
|
|
return null;
|
|
|
|
return whereClause != null ? _context.Set<TModel>().Where(whereClause) : _context.Set<TModel>();
|
|
}
|
|
|
|
public TModel? getNoAuthentication(ulong id)
|
|
{
|
|
return _context.Set<TModel>().Find(id);
|
|
}
|
|
|
|
public IEnumerable<TModel> getNoAuthentication(Expression<Func<TModel, bool>>? whereClause = null)
|
|
{
|
|
return whereClause != null ? _context.Set<TModel>().Where(whereClause) : _context.Set<TModel>();
|
|
}
|
|
|
|
public TModel? add(TDTO item, User user)
|
|
{
|
|
if (!_auth.canAdd(item, user))
|
|
return null;
|
|
|
|
TModel model = item.adaptToModel();
|
|
|
|
model.updater = user.id;
|
|
model.updated = DateTime.Now;
|
|
_context.Add(model);
|
|
_context.SaveChanges();
|
|
|
|
return model;
|
|
}
|
|
|
|
public TModel? update(TModel model, User user)
|
|
{
|
|
if (!_auth.canUpdate(model, user))
|
|
return null;
|
|
|
|
TModel? origModel = _context.Set<TModel>().Find(model.id);
|
|
if (origModel == null)
|
|
return null;
|
|
|
|
copyToAudit(origModel);
|
|
|
|
model.updateModel(ref origModel);
|
|
|
|
origModel.updated = DateTime.Now;
|
|
origModel.updater = user.id;
|
|
|
|
_context.SaveChanges();
|
|
|
|
return origModel;
|
|
}
|
|
|
|
public TAudit? delete(TModel model, User user)
|
|
{
|
|
if (!_auth.canDelete(model, user))
|
|
return null;
|
|
|
|
TModel? origModel = _context.Set<TModel>().Find(model.id);
|
|
if (origModel == null)
|
|
return null;
|
|
|
|
copyToAudit(origModel);
|
|
|
|
origModel.updated = DateTime.Now;
|
|
origModel.updater = user.id;
|
|
|
|
copyToAudit(origModel);
|
|
|
|
_context.Remove(origModel);
|
|
_context.SaveChanges();
|
|
|
|
return origModel.adaptToAudit();
|
|
}
|
|
|
|
private void copyToAudit(TModel model)
|
|
{
|
|
_context.Set<TAudit>().Add(model.adaptToAudit());
|
|
}
|
|
}
|
|
}
|