2024-08-31 18:38:07 -05:00

109 lines
2.6 KiB
C#

using API.Authentication.Interfaces;
using API.DTO;
using API.Services.Interfaces;
using DAL.Contexts;
using DAL.Models;
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>
where TModel : Model<TModel, TAudit>
where TAudit : AuditModel<TModel>
where TDTO : IAdaptable<TModel>
{
public readonly TAuthentication _auth;
private readonly ILogger<TLoggerCategory> _logger;
public readonly SASGContext Context;
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;
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;
origModel.updated = DateTime.Now;
origModel.updater = user.id;
Context.SaveChanges();
Context.Remove(origModel);
Context.SaveChanges();
return origModel.adaptToAudit();
}
}
}