using System.Linq;
using Microsoft.EntityFrameworkCore;
using TakeoutSaaS.Domain.Merchants.Entities;
using TakeoutSaaS.Domain.Merchants.Enums;
using TakeoutSaaS.Domain.Merchants.Repositories;
using TakeoutSaaS.Infrastructure.App.Persistence;
namespace TakeoutSaaS.Infrastructure.App.Repositories;
///
/// 商户聚合的 EF Core 仓储实现。
///
public sealed class EfMerchantRepository : IMerchantRepository
{
private readonly TakeoutAppDbContext _context;
///
/// 初始化仓储。
///
public EfMerchantRepository(TakeoutAppDbContext context)
{
_context = context;
}
///
public Task FindByIdAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
{
return _context.Merchants
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.Id == merchantId)
.FirstOrDefaultAsync(cancellationToken);
}
///
public async Task> SearchAsync(long tenantId, MerchantStatus? status, CancellationToken cancellationToken = default)
{
var query = _context.Merchants
.AsNoTracking()
.Where(x => x.TenantId == tenantId);
if (status.HasValue)
{
query = query.Where(x => x.Status == status.Value);
}
return await query
.OrderByDescending(x => x.CreatedAt)
.ToListAsync(cancellationToken);
}
///
public async Task> GetStaffAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
{
var staffs = await _context.MerchantStaff
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.MerchantId == merchantId)
.OrderBy(x => x.Name)
.ToListAsync(cancellationToken);
return staffs;
}
///
public async Task> GetContractsAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
{
var contracts = await _context.MerchantContracts
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.MerchantId == merchantId)
.OrderByDescending(x => x.CreatedAt)
.ToListAsync(cancellationToken);
return contracts;
}
///
public async Task> GetDocumentsAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
{
var documents = await _context.MerchantDocuments
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.MerchantId == merchantId)
.OrderBy(x => x.CreatedAt)
.ToListAsync(cancellationToken);
return documents;
}
///
public Task AddMerchantAsync(Merchant merchant, CancellationToken cancellationToken = default)
{
return _context.Merchants.AddAsync(merchant, cancellationToken).AsTask();
}
///
public Task AddStaffAsync(MerchantStaff staff, CancellationToken cancellationToken = default)
{
return _context.MerchantStaff.AddAsync(staff, cancellationToken).AsTask();
}
///
public Task AddContractAsync(MerchantContract contract, CancellationToken cancellationToken = default)
{
return _context.MerchantContracts.AddAsync(contract, cancellationToken).AsTask();
}
///
public Task AddDocumentAsync(MerchantDocument document, CancellationToken cancellationToken = default)
{
return _context.MerchantDocuments.AddAsync(document, cancellationToken).AsTask();
}
///
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
return _context.SaveChangesAsync(cancellationToken);
}
}