@@ -29,25 +29,26 @@ public sealed class QuestionBankQueryService(
|
||||
var tenantItems = filter.Source == QuestionSource.Platform
|
||||
? []
|
||||
: await dbContext.QuestionBanks
|
||||
.AsNoTracking()
|
||||
.Where(bank =>
|
||||
bank.TenantId == filter.TenantId &&
|
||||
bank.Status == QuestionBankStatus.Active &&
|
||||
(!filter.RegionId.HasValue || bank.RegionId == filter.RegionId.Value || bank.RegionId == null) &&
|
||||
(string.IsNullOrWhiteSpace(filter.Keyword) || bank.Name.Contains(filter.Keyword.Trim())))
|
||||
.OrderBy(bank => bank.Name)
|
||||
.ThenBy(bank => bank.CreatedAt)
|
||||
.Take(limit)
|
||||
.Select(bank => new QuestionBankCatalogItem(
|
||||
bank.Id,
|
||||
bank.RegionId,
|
||||
bank.Name,
|
||||
QuestionSource.Tenant,
|
||||
bank.Status,
|
||||
bank.Metadata))
|
||||
.ToArrayAsync(cancellationToken);
|
||||
.AsNoTracking()
|
||||
.Where(bank =>
|
||||
bank.TenantId == filter.TenantId &&
|
||||
bank.Status == QuestionBankStatus.Active &&
|
||||
(!filter.RegionId.HasValue || bank.RegionId == filter.RegionId.Value || bank.RegionId == null) &&
|
||||
(string.IsNullOrWhiteSpace(filter.Keyword) || bank.Name.Contains(filter.Keyword.Trim())))
|
||||
.OrderBy(bank => bank.Name)
|
||||
.ThenBy(bank => bank.CreatedAt)
|
||||
.Take(limit)
|
||||
.Select(bank => new QuestionBankCatalogItem(
|
||||
bank.Id,
|
||||
bank.RegionId,
|
||||
bank.Name,
|
||||
QuestionSource.Tenant,
|
||||
bank.Status,
|
||||
bank.Metadata))
|
||||
.ToArrayAsync(cancellationToken);
|
||||
|
||||
var platformItems = filter.Source == QuestionSource.Tenant || !await CanAccessPlatformAsync(filter.TenantId, cancellationToken)
|
||||
var platformItems = filter.Source == QuestionSource.Tenant ||
|
||||
!await CanAccessPlatformAsync(filter.TenantId, cancellationToken)
|
||||
? []
|
||||
: await tenantExecutionScope.ExecuteAsync(
|
||||
new SystemScopeRequest(
|
||||
@@ -58,13 +59,15 @@ public sealed class QuestionBankQueryService(
|
||||
var systemDbContext = provider.GetRequiredService<TikuDbContext>();
|
||||
return await systemDbContext.QuestionBanks.AsNoTracking()
|
||||
.Join(
|
||||
systemDbContext.Tenants.AsNoTracking().Where(tenant => tenant.Mode == TenantMode.PlatformOwned),
|
||||
systemDbContext.Tenants.AsNoTracking()
|
||||
.Where(tenant => tenant.Mode == TenantMode.PlatformOwned),
|
||||
bank => bank.TenantId,
|
||||
tenant => tenant.Id,
|
||||
(bank, tenant) => bank)
|
||||
.Where(bank =>
|
||||
bank.Status == QuestionBankStatus.Active &&
|
||||
(!filter.RegionId.HasValue || bank.RegionId == filter.RegionId.Value || bank.RegionId == null) &&
|
||||
(!filter.RegionId.HasValue || bank.RegionId == filter.RegionId.Value ||
|
||||
bank.RegionId == null) &&
|
||||
(string.IsNullOrWhiteSpace(filter.Keyword) || bank.Name.Contains(filter.Keyword.Trim())))
|
||||
.OrderBy(bank => bank.Name)
|
||||
.Take(limit)
|
||||
@@ -100,7 +103,8 @@ public sealed class QuestionBankQueryService(
|
||||
.Take(limit),
|
||||
QuestionSource.Tenant)
|
||||
.ToArrayAsync(cancellationToken);
|
||||
var platformItems = filter.Source == QuestionSource.Tenant || !await CanAccessPlatformAsync(filter.TenantId, cancellationToken)
|
||||
var platformItems = filter.Source == QuestionSource.Tenant ||
|
||||
!await CanAccessPlatformAsync(filter.TenantId, cancellationToken)
|
||||
? []
|
||||
: await GetPlatformQuestionsAsync(filter, limit, cancellationToken);
|
||||
return new CatalogList<QuestionCatalogItem>(tenantItems.Concat(platformItems).Take(limit).ToArray());
|
||||
@@ -110,10 +114,7 @@ public sealed class QuestionBankQueryService(
|
||||
QuestionBankFilter filter,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (!filter.QuestionId.HasValue)
|
||||
{
|
||||
throw new QuestionBankRequiredFieldException("questionId is required.");
|
||||
}
|
||||
if (!filter.QuestionId.HasValue) throw new QuestionBankRequiredFieldException("questionId is required.");
|
||||
|
||||
var result = await GetQuestionsAsync(filter with { Limit = 2 }, cancellationToken);
|
||||
return result.Items.SingleOrDefault()
|
||||
@@ -124,15 +125,13 @@ public sealed class QuestionBankQueryService(
|
||||
QuestionBankFilter filter,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (!filter.QuestionId.HasValue)
|
||||
{
|
||||
throw new QuestionBankRequiredFieldException("questionId is required.");
|
||||
}
|
||||
if (!filter.QuestionId.HasValue) throw new QuestionBankRequiredFieldException("questionId is required.");
|
||||
|
||||
if (filter.Source == QuestionSource.Platform)
|
||||
{
|
||||
await accessPolicy.EnsureCanStartAsync(filter.TenantId, cancellationToken);
|
||||
var platformItems = await GetPlatformVersionsAsync(filter.QuestionId.Value, filter.TenantId, cancellationToken);
|
||||
var platformItems =
|
||||
await GetPlatformVersionsAsync(filter.QuestionId.Value, filter.TenantId, cancellationToken);
|
||||
return new CatalogList<QuestionVersionCatalogItem>(platformItems);
|
||||
}
|
||||
|
||||
@@ -145,10 +144,7 @@ public sealed class QuestionBankQueryService(
|
||||
question.Status == QuestionStatus.Published,
|
||||
cancellationToken);
|
||||
|
||||
if (!questionExists)
|
||||
{
|
||||
throw new QuestionBankNotFoundException("Question was not found.");
|
||||
}
|
||||
if (!questionExists) throw new QuestionBankNotFoundException("Question was not found.");
|
||||
|
||||
var items = await dbContext.QuestionVersions
|
||||
.AsNoTracking()
|
||||
@@ -189,49 +185,28 @@ public sealed class QuestionBankQueryService(
|
||||
query = query.Where(question => question.TenantId == filter.TenantId);
|
||||
|
||||
if (filter.QuestionBankId.HasValue)
|
||||
{
|
||||
query = query.Where(question => question.QuestionBankId == filter.QuestionBankId.Value);
|
||||
}
|
||||
|
||||
if (filter.SubjectId.HasValue)
|
||||
{
|
||||
query = query.Where(question => question.SubjectId == filter.SubjectId.Value);
|
||||
}
|
||||
if (filter.SubjectId.HasValue) query = query.Where(question => question.SubjectId == filter.SubjectId.Value);
|
||||
|
||||
if (filter.CategoryId.HasValue)
|
||||
{
|
||||
query = query.Where(question => question.CategoryId == filter.CategoryId.Value);
|
||||
}
|
||||
if (filter.CategoryId.HasValue) query = query.Where(question => question.CategoryId == filter.CategoryId.Value);
|
||||
|
||||
if (filter.NodeId.HasValue)
|
||||
{
|
||||
query = query.Where(question => question.NodeId == filter.NodeId.Value);
|
||||
}
|
||||
if (filter.NodeId.HasValue) query = query.Where(question => question.NodeId == filter.NodeId.Value);
|
||||
|
||||
if (filter.EntryId.HasValue)
|
||||
{
|
||||
query = query.Where(question => question.EntryId == filter.EntryId.Value);
|
||||
}
|
||||
if (filter.EntryId.HasValue) query = query.Where(question => question.EntryId == filter.EntryId.Value);
|
||||
|
||||
if (filter.ContentNodeId.HasValue)
|
||||
{
|
||||
query = query.Where(question => question.ContentNodeId == filter.ContentNodeId.Value);
|
||||
}
|
||||
|
||||
if (filter.CollectionId.HasValue)
|
||||
{
|
||||
query = query.Where(question =>
|
||||
question.PrimaryCollectionId == filter.CollectionId.Value ||
|
||||
dbContext.QuestionCollectionItems.Any(item =>
|
||||
item.TenantId == question.TenantId &&
|
||||
item.QuestionId == question.Id &&
|
||||
item.CollectionId == filter.CollectionId.Value));
|
||||
}
|
||||
|
||||
if (filter.QuestionIds?.Count > 0)
|
||||
{
|
||||
query = query.Where(question => filter.QuestionIds.Contains(question.Id));
|
||||
}
|
||||
if (filter.QuestionIds?.Count > 0) query = query.Where(question => filter.QuestionIds.Contains(question.Id));
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(filter.Type))
|
||||
{
|
||||
@@ -259,10 +234,7 @@ public sealed class QuestionBankQueryService(
|
||||
private static IQueryable<T> ApplyKeyword<T>(IQueryable<T> query, string? keyword)
|
||||
where T : class
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(keyword))
|
||||
{
|
||||
return query;
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(keyword)) return query;
|
||||
|
||||
var trimmed = keyword.Trim();
|
||||
return query.Where(entity => EF.Property<string>(entity, nameof(QuestionBank.Name)).Contains(trimmed));
|
||||
@@ -357,7 +329,8 @@ public sealed class QuestionBankQueryService(
|
||||
(!filter.NodeId.HasValue || question.NodeId == filter.NodeId.Value) &&
|
||||
(!filter.EntryId.HasValue || question.EntryId == filter.EntryId.Value) &&
|
||||
(!filter.ContentNodeId.HasValue || question.ContentNodeId == filter.ContentNodeId.Value) &&
|
||||
(filter.QuestionIds == null || filter.QuestionIds.Count == 0 || filter.QuestionIds.Contains(question.Id)) &&
|
||||
(filter.QuestionIds == null || filter.QuestionIds.Count == 0 ||
|
||||
filter.QuestionIds.Contains(question.Id)) &&
|
||||
(string.IsNullOrWhiteSpace(filter.Type) || question.Type == filter.Type.Trim()));
|
||||
if (!string.IsNullOrWhiteSpace(filter.Keyword))
|
||||
{
|
||||
@@ -396,10 +369,7 @@ public sealed class QuestionBankQueryService(
|
||||
tenant => tenant.Id,
|
||||
(question, tenant) => new { question.TenantId, question.Id })
|
||||
.SingleOrDefaultAsync(token);
|
||||
if (platformQuestion is null)
|
||||
{
|
||||
throw new QuestionBankNotFoundException("Question was not found.");
|
||||
}
|
||||
if (platformQuestion is null) throw new QuestionBankNotFoundException("Question was not found.");
|
||||
|
||||
return await systemDbContext.QuestionVersions.AsNoTracking()
|
||||
.Where(version =>
|
||||
@@ -429,4 +399,4 @@ public sealed class QuestionBankQueryService(
|
||||
{
|
||||
return Math.Clamp(limit ?? defaultLimit, 1, maxLimit);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user