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 : IGenericService where TAuthentication : IGenericAuthentication where TModel : Model where TAudit : AuditModel where TDTO : IAdaptable { private readonly TAuthentication _auth; private readonly SASGContext _context; private readonly ILogger _logger; public ServiceBase(ILogger logger, SASGContext context, TAuthentication auth) { _logger = logger; _context = context; _auth = auth; } public TModel? get(ulong id, User user) { TModel? result = _context.Set().Find(id); if (result == null) return null; return _auth.canGet(result, user) ? result : null; } public IEnumerable? get(User user, Expression>? whereClause = null) { if (!_auth.canGetAll(user)) return null; return whereClause != null ? _context.Set().Where(whereClause) : _context.Set(); } public TModel? getNoAuthentication(ulong id) { return _context.Set().Find(id); } public IEnumerable getNoAuthentication(Expression>? whereClause = null) { return whereClause != null ? _context.Set().Where(whereClause) : _context.Set(); } 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().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().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().Add(model.adaptToAudit()); } } }