using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Tenants.Entities; using TakeoutSaaS.Domain.Tenants.Enums; using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Infrastructure.App.Persistence; namespace TakeoutSaaS.Infrastructure.App.Repositories; /// /// 租户套餐仓储实现。 /// public sealed class EfTenantPackageRepository(TakeoutAppDbContext context) : ITenantPackageRepository { /// public Task FindByIdAsync(long id, CancellationToken cancellationToken = default) { return context.TenantPackages.AsNoTracking().FirstOrDefaultAsync(x => x.Id == id, cancellationToken); } /// public async Task> SearchAsync(string? keyword, bool? isActive, CancellationToken cancellationToken = default) { // 1. 构建基础查询 var query = context.TenantPackages.AsNoTracking(); // 2. 关键字过滤 if (!string.IsNullOrWhiteSpace(keyword)) { var normalized = keyword.Trim(); query = query.Where(x => EF.Functions.ILike(x.Name, $"%{normalized}%") || EF.Functions.ILike(x.Description ?? string.Empty, $"%{normalized}%")); } // 3. 状态过滤 if (isActive.HasValue) { query = query.Where(x => x.IsActive == isActive.Value); } // 4. 排序返回 return await query .OrderBy(x => x.SortOrder) .ThenByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); } /// public async Task> SearchPublicPurchasableAsync(CancellationToken cancellationToken = default) { // 1. 公共可选购套餐仅返回:已发布 + 对外可见 + 允许新购 + 启用 return await context.TenantPackages.AsNoTracking() .Where(x => x.IsActive && x.PublishStatus == TenantPackagePublishStatus.Published && x.IsPublicVisible && x.IsAllowNewTenantPurchase) .OrderBy(x => x.SortOrder) .ThenByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); } /// public Task AddAsync(TenantPackage package, CancellationToken cancellationToken = default) { return context.TenantPackages.AddAsync(package, cancellationToken).AsTask(); } /// public Task UpdateAsync(TenantPackage package, CancellationToken cancellationToken = default) { context.TenantPackages.Update(package); return Task.CompletedTask; } /// public async Task DeleteAsync(long id, CancellationToken cancellationToken = default) { var entity = await context.TenantPackages.FirstOrDefaultAsync(x => x.Id == id, cancellationToken); if (entity != null) { context.TenantPackages.Remove(entity); } } /// public Task SaveChangesAsync(CancellationToken cancellationToken = default) { return context.SaveChangesAsync(cancellationToken); } }