using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; using PowderCoating.Core.Interfaces; using PowderCoating.Infrastructure.Data; namespace PowderCoating.Infrastructure.Repositories; /// /// Generic repository for platform-level entities that do not inherit BaseEntity /// (Announcement, BannedIp, DashboardTip, ReleaseNote). No global query filters apply /// to these entities, so no IgnoreQueryFilters support is needed. All writes are staged /// in the EF change tracker — call IUnitOfWork.CompleteAsync() to flush. /// public class PlainRepository : IPlainRepository where T : class { protected readonly ApplicationDbContext _context; protected readonly DbSet _dbSet; public PlainRepository(ApplicationDbContext context) { _context = context; _dbSet = context.Set(); } public virtual async Task GetByIdAsync(int id) => await _dbSet.FindAsync(id); public virtual async Task> GetAllAsync() => await _dbSet.ToListAsync(); public virtual async Task> FindAsync(Expression> predicate) => await _dbSet.Where(predicate).ToListAsync(); public virtual async Task FirstOrDefaultAsync(Expression> predicate) => await _dbSet.FirstOrDefaultAsync(predicate); public virtual async Task AnyAsync(Expression> predicate) => await _dbSet.AnyAsync(predicate); public virtual async Task CountAsync(Expression>? predicate = null) => predicate == null ? await _dbSet.CountAsync() : await _dbSet.CountAsync(predicate); public virtual async Task AddAsync(T entity) { await _dbSet.AddAsync(entity); return entity; } public virtual async Task> AddRangeAsync(IEnumerable entities) { await _dbSet.AddRangeAsync(entities); return entities; } public virtual Task UpdateAsync(T entity) { _dbSet.Update(entity); return Task.CompletedTask; } public virtual async Task DeleteAsync(T entity) { _dbSet.Remove(entity); await Task.CompletedTask; } public virtual async Task DeleteAsync(int id) { var entity = await GetByIdAsync(id); if (entity != null) await DeleteAsync(entity); } }