Phase 2: Eliminate ApplicationDbContext from domain controllers
Migrated InvoicesController, QuotesController, JobsController, BillsController, PurchaseOrdersController, and CustomersController to route all data access through IUnitOfWork typed/generic repositories instead of injecting ApplicationDbContext directly. New typed repositories added: IJobRepository (GetScheduledJobsForDateAsync, GetActiveJobsForMobileAsync, LoadForCostingAsync), INotificationLogRepository (GetLatestForJobAsync, GetAllForJobAsync), IQuoteRepository (GetItemsWithCoatsAsync with CatalogItem eager load + AsNoTracking), and IJobRepository.GetOrphanedConversionJobAsync. All EF complex include chains relocated into repository methods; controllers now call named query methods rather than composing raw IQueryable chains. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using PowderCoating.Core.Entities;
|
||||
using PowderCoating.Core.Interfaces.Repositories;
|
||||
using PowderCoating.Infrastructure.Data;
|
||||
|
||||
namespace PowderCoating.Infrastructure.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// Typed repository for <see cref="NotificationLog"/> that provides IgnoreQueryFilters-based
|
||||
/// lookups by entity FK (InvoiceId, QuoteId, JobId).
|
||||
/// </summary>
|
||||
public class NotificationLogRepository : Repository<NotificationLog>, INotificationLogRepository
|
||||
{
|
||||
public NotificationLogRepository(ApplicationDbContext context) : base(context) { }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task<NotificationLog?> GetLatestForInvoiceAsync(int invoiceId) =>
|
||||
await _context.Set<NotificationLog>()
|
||||
.IgnoreQueryFilters()
|
||||
.Where(n => n.InvoiceId == invoiceId)
|
||||
.OrderByDescending(n => n.SentAt)
|
||||
.FirstOrDefaultAsync();
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task<List<NotificationLog>> GetAllForInvoiceAsync(int invoiceId) =>
|
||||
await _context.Set<NotificationLog>()
|
||||
.IgnoreQueryFilters()
|
||||
.Where(n => n.InvoiceId == invoiceId)
|
||||
.OrderByDescending(n => n.SentAt)
|
||||
.ToListAsync();
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task<NotificationLog?> GetLatestForQuoteAsync(int quoteId) =>
|
||||
await _context.Set<NotificationLog>()
|
||||
.IgnoreQueryFilters()
|
||||
.Where(n => n.QuoteId == quoteId)
|
||||
.OrderByDescending(n => n.SentAt)
|
||||
.FirstOrDefaultAsync();
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task<List<NotificationLog>> GetAllForQuoteAsync(int quoteId) =>
|
||||
await _context.Set<NotificationLog>()
|
||||
.IgnoreQueryFilters()
|
||||
.Where(n => n.QuoteId == quoteId)
|
||||
.OrderByDescending(n => n.SentAt)
|
||||
.ToListAsync();
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task<NotificationLog?> GetLatestForJobAsync(int jobId) =>
|
||||
await _context.Set<NotificationLog>()
|
||||
.IgnoreQueryFilters()
|
||||
.Where(n => n.JobId == jobId)
|
||||
.OrderByDescending(n => n.SentAt)
|
||||
.FirstOrDefaultAsync();
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task<List<NotificationLog>> GetAllForJobAsync(int jobId) =>
|
||||
await _context.Set<NotificationLog>()
|
||||
.IgnoreQueryFilters()
|
||||
.Where(n => n.JobId == jobId)
|
||||
.OrderByDescending(n => n.SentAt)
|
||||
.ToListAsync();
|
||||
}
|
||||
Reference in New Issue
Block a user