119 lines
2.7 KiB
C#
Raw Normal View History

using API.Authentication.Interfaces;
using API.DTO;
using API.Services.Interfaces;
using DAL.Contexts;
using DAL.Models;
2024-05-20 10:46:56 -05:00
using DAL.Models.Audits;
using System.Linq.Expressions;
namespace API.Services
{
public class ServiceBase<TLoggerCategory, TDTO, TModel, TAudit, TAuthentication> : IGenericService<TDTO, TModel, TAudit>
where TAuthentication : IGenericAuthentication<TDTO, TModel>
2024-04-24 16:04:15 -05:00
where TModel : Model<TModel, TAudit>
2024-05-20 10:46:56 -05:00
where TAudit : AuditModel<TModel>
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);
2024-04-24 16:04:15 -05:00
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());
}
}
}