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);
}
}