refactor: 订阅任务按租户上下文执行

This commit is contained in:
root
2026-01-29 14:51:21 +00:00
parent f9053356c2
commit 1622c38043
17 changed files with 177 additions and 218 deletions

View File

@@ -17,29 +17,19 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
/// <inheritdoc />
public async Task<TenantSubscription?> FindByIdAsync(
long subscriptionId,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
var query = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
return await query
return await dbContext.TenantSubscriptions
.FirstOrDefaultAsync(s => s.Id == subscriptionId, cancellationToken);
}
/// <inheritdoc />
public async Task<IReadOnlyList<TenantSubscription>> FindByIdsAsync(
IEnumerable<long> subscriptionIds,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
var ids = subscriptionIds.ToList();
var query = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
return await query
return await dbContext.TenantSubscriptions
.Where(s => ids.Contains(s.Id))
.ToListAsync(cancellationToken);
}
@@ -47,15 +37,10 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
/// <inheritdoc />
public async Task<(IReadOnlyList<SubscriptionWithRelations> Items, int Total)> SearchPagedAsync(
SubscriptionSearchFilter filter,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
// 1. 构建基础查询
var subscriptionQuery = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
var query = subscriptionQuery
var query = dbContext.TenantSubscriptions
.AsNoTracking()
.Join(
dbContext.Tenants,
@@ -133,14 +118,9 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
/// <inheritdoc />
public async Task<SubscriptionDetailInfo?> GetDetailAsync(
long subscriptionId,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
var subscriptionQuery = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
var result = await subscriptionQuery
var result = await dbContext.TenantSubscriptions
.AsNoTracking()
.Where(s => s.Id == subscriptionId)
.Select(s => new
@@ -172,16 +152,11 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
/// <inheritdoc />
public async Task<IReadOnlyList<SubscriptionWithTenant>> FindByIdsWithTenantAsync(
IEnumerable<long> subscriptionIds,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
var ids = subscriptionIds.ToList();
var query = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
return await query
return await dbContext.TenantSubscriptions
.Where(s => ids.Contains(s.Id))
.Join(
dbContext.Tenants,
@@ -200,15 +175,10 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
public async Task<IReadOnlyList<AutoRenewalCandidate>> FindAutoRenewalCandidatesAsync(
DateTime now,
DateTime renewalThreshold,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
// 1. 查询开启自动续费且即将到期的活跃订阅
var subscriptionQuery = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
var query = subscriptionQuery
var query = dbContext.TenantSubscriptions
.Where(s => s.Status == SubscriptionStatus.Active
&& s.AutoRenew
&& s.EffectiveTo <= renewalThreshold
@@ -231,15 +201,10 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
public async Task<IReadOnlyList<RenewalReminderCandidate>> FindRenewalReminderCandidatesAsync(
DateTime startOfDay,
DateTime endOfDay,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
// 1. 查询到期落在指定区间的订阅(且未开启自动续费)
var subscriptionQuery = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
var query = subscriptionQuery
var query = dbContext.TenantSubscriptions
.Where(s => s.Status == SubscriptionStatus.Active
&& !s.AutoRenew
&& s.EffectiveTo >= startOfDay
@@ -267,15 +232,10 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
/// <inheritdoc />
public async Task<IReadOnlyList<TenantSubscription>> FindExpiredActiveSubscriptionsAsync(
DateTime now,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
var query = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
// 1. 查询已到期仍为 Active 的订阅
return await query
return await dbContext.TenantSubscriptions
.Where(s => s.Status == SubscriptionStatus.Active && s.EffectiveTo < now)
.ToListAsync(cancellationToken);
}
@@ -284,15 +244,10 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
public async Task<IReadOnlyList<TenantSubscription>> FindGracePeriodExpiredSubscriptionsAsync(
DateTime now,
int gracePeriodDays,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
var query = ignoreTenantFilter
? dbContext.TenantSubscriptions.IgnoreQueryFilters()
: dbContext.TenantSubscriptions;
// 1. 查询宽限期已结束的订阅
return await query
return await dbContext.TenantSubscriptions
.Where(s => s.Status == SubscriptionStatus.GracePeriod
&& s.EffectiveTo.AddDays(gracePeriodDays) < now)
.ToListAsync(cancellationToken);
@@ -363,14 +318,9 @@ public sealed class EfSubscriptionRepository(TakeoutAppDbContext dbContext, Take
/// <inheritdoc />
public async Task<IReadOnlyList<TenantQuotaUsage>> GetQuotaUsagesAsync(
long tenantId,
CancellationToken cancellationToken = default,
bool ignoreTenantFilter = false)
CancellationToken cancellationToken = default)
{
var query = ignoreTenantFilter
? dbContext.TenantQuotaUsages.IgnoreQueryFilters()
: dbContext.TenantQuotaUsages;
return await query
return await dbContext.TenantQuotaUsages
.AsNoTracking()
.Where(q => q.TenantId == tenantId)
.ToListAsync(cancellationToken);