80b0e547cc
Six IUnitOfWork properties upgraded from generic IRepository<T> to domain-specific typed interfaces (IJobRepository, IQuoteRepository, IInvoiceRepository, ICustomerRepository, IBillRepository, IPurchaseOrderRepository). Each backed by a concrete typed repository that encapsulates complex include chains previously inlined in controllers. Also adds IFinancialReportService and IOperationalReportService stub implementations (NotImplementedException placeholders) to Application.Interfaces and Infrastructure.Services, registered in Program.cs. These are the migration targets for ReportsController's aggregate query methods in Phase 2. No controller behaviour changed in this commit — all callers still compile because typed interfaces extend IRepository<T>. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
33 lines
1.1 KiB
C#
33 lines
1.1 KiB
C#
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="Customer"/> that adds domain-specific queries on top of
|
|
/// the generic CRUD interface.
|
|
/// </summary>
|
|
public class CustomerRepository : Repository<Customer>, ICustomerRepository
|
|
{
|
|
public CustomerRepository(ApplicationDbContext context) : base(context) { }
|
|
|
|
/// <inheritdoc/>
|
|
public async Task<Customer?> LoadForDetailsAsync(int id)
|
|
{
|
|
return await _context.Customers
|
|
.Where(c => c.Id == id && !c.IsDeleted)
|
|
.Include(c => c.PricingTier)
|
|
.Include(c => c.CustomerNotes.Where(n => !n.IsDeleted))
|
|
.FirstOrDefaultAsync();
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public async Task<Customer?> FindByEmailAsync(string email)
|
|
{
|
|
return await _context.Customers
|
|
.FirstOrDefaultAsync(c => c.Email == email && !c.IsDeleted);
|
|
}
|
|
}
|