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 ILogger _logger; public readonly SASGContext Context; 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; 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; origModel.updated = DateTime.Now; origModel.updater = user.id; Context.SaveChanges(); Context.Remove(origModel); Context.SaveChanges(); return origModel.adaptToAudit(); } } }