refactor(architecture): harden module boundaries
Some checks failed
ci / release-gate (push) Has been cancelled
Some checks failed
ci / release-gate (push) Has been cancelled
This commit is contained in:
@@ -12,7 +12,7 @@ using Tiku.Infrastructure.Persistence;
|
||||
namespace Tiku.Infrastructure.QuestionBanks;
|
||||
|
||||
public sealed class QuestionBankQueryService(
|
||||
TikuDbContext dbContext,
|
||||
IQuestionBankPersistence questionBankPersistence,
|
||||
IPublicQuestionAccessPolicy accessPolicy,
|
||||
ITenantExecutionScope tenantExecutionScope) : IQuestionBankQueryService
|
||||
{
|
||||
@@ -28,7 +28,7 @@ public sealed class QuestionBankQueryService(
|
||||
var limit = ResolveLimit(filter.Limit, DefaultBankLimit, MaxBankLimit);
|
||||
var tenantItems = filter.Source == QuestionSource.Platform
|
||||
? []
|
||||
: await dbContext.QuestionBanks
|
||||
: await questionBankPersistence.QuestionBanks
|
||||
.AsNoTracking()
|
||||
.Where(bank =>
|
||||
bank.TenantId == filter.TenantId &&
|
||||
@@ -56,10 +56,11 @@ public sealed class QuestionBankQueryService(
|
||||
"List platform question banks for an entitled tenant", Guid.NewGuid().ToString("N")),
|
||||
async (provider, token) =>
|
||||
{
|
||||
var systemDbContext = provider.GetRequiredService<TikuDbContext>();
|
||||
return await systemDbContext.QuestionBanks.AsNoTracking()
|
||||
var systemQuestionBank = provider.GetRequiredService<IQuestionBankPersistence>();
|
||||
var systemTenancy = provider.GetRequiredService<ITenancyPersistence>();
|
||||
return await systemQuestionBank.QuestionBanks.AsNoTracking()
|
||||
.Join(
|
||||
systemDbContext.Tenants.AsNoTracking()
|
||||
systemTenancy.Tenants.AsNoTracking()
|
||||
.Where(tenant => tenant.Mode == TenantMode.PlatformOwned),
|
||||
bank => bank.TenantId,
|
||||
tenant => tenant.Id,
|
||||
@@ -97,7 +98,7 @@ public sealed class QuestionBankQueryService(
|
||||
var tenantItems = filter.Source == QuestionSource.Platform
|
||||
? []
|
||||
: await ProjectQuestions(
|
||||
dbContext,
|
||||
questionBankPersistence,
|
||||
ApplyQuestionFilters(BaseQuestionQuery(), filter)
|
||||
.OrderByDescending(question => question.CreatedAt)
|
||||
.Take(limit),
|
||||
@@ -135,7 +136,7 @@ public sealed class QuestionBankQueryService(
|
||||
return new CatalogList<QuestionVersionCatalogItem>(platformItems);
|
||||
}
|
||||
|
||||
var questionExists = await dbContext.Questions
|
||||
var questionExists = await questionBankPersistence.Questions
|
||||
.AsNoTracking()
|
||||
.AnyAsync(
|
||||
question =>
|
||||
@@ -146,7 +147,7 @@ public sealed class QuestionBankQueryService(
|
||||
|
||||
if (!questionExists) throw new QuestionBankNotFoundException("Question was not found.");
|
||||
|
||||
var items = await dbContext.QuestionVersions
|
||||
var items = await questionBankPersistence.QuestionVersions
|
||||
.AsNoTracking()
|
||||
.Where(version =>
|
||||
version.TenantId == filter.TenantId &&
|
||||
@@ -173,7 +174,7 @@ public sealed class QuestionBankQueryService(
|
||||
|
||||
private IQueryable<Question> BaseQuestionQuery()
|
||||
{
|
||||
return dbContext.Questions
|
||||
return questionBankPersistence.Questions
|
||||
.AsNoTracking()
|
||||
.Where(question => question.Status == QuestionStatus.Published);
|
||||
}
|
||||
@@ -201,7 +202,7 @@ public sealed class QuestionBankQueryService(
|
||||
if (filter.CollectionId.HasValue)
|
||||
query = query.Where(question =>
|
||||
question.PrimaryCollectionId == filter.CollectionId.Value ||
|
||||
dbContext.QuestionCollectionItems.Any(item =>
|
||||
questionBankPersistence.QuestionCollectionItems.Any(item =>
|
||||
item.TenantId == question.TenantId &&
|
||||
item.QuestionId == question.Id &&
|
||||
item.CollectionId == filter.CollectionId.Value));
|
||||
@@ -220,7 +221,7 @@ public sealed class QuestionBankQueryService(
|
||||
query = query.Where(question =>
|
||||
question.Type.Contains(keyword) ||
|
||||
(question.TypeLabel != null && question.TypeLabel.Contains(keyword)) ||
|
||||
dbContext.QuestionVersions.Any(version =>
|
||||
questionBankPersistence.QuestionVersions.Any(version =>
|
||||
version.TenantId == question.TenantId &&
|
||||
version.QuestionId == question.Id &&
|
||||
version.Id == question.CurrentVersionId &&
|
||||
@@ -241,7 +242,7 @@ public sealed class QuestionBankQueryService(
|
||||
}
|
||||
|
||||
private static IQueryable<QuestionCatalogItem> ProjectQuestions(
|
||||
TikuDbContext context,
|
||||
IQuestionBankPersistence context,
|
||||
IQueryable<Question> questions,
|
||||
QuestionSource source)
|
||||
{
|
||||
@@ -314,12 +315,13 @@ public sealed class QuestionBankQueryService(
|
||||
"List platform questions for an entitled tenant", Guid.NewGuid().ToString("N")),
|
||||
async (provider, token) =>
|
||||
{
|
||||
var systemDbContext = provider.GetRequiredService<TikuDbContext>();
|
||||
var platformTenantId = await systemDbContext.Tenants.AsNoTracking()
|
||||
var systemQuestionBank = provider.GetRequiredService<IQuestionBankPersistence>();
|
||||
var systemTenancy = provider.GetRequiredService<ITenancyPersistence>();
|
||||
var platformTenantId = await systemTenancy.Tenants.AsNoTracking()
|
||||
.Where(tenant => tenant.Mode == TenantMode.PlatformOwned)
|
||||
.Select(tenant => tenant.Id)
|
||||
.SingleAsync(token);
|
||||
var query = systemDbContext.Questions.AsNoTracking().Where(question =>
|
||||
var query = systemQuestionBank.Questions.AsNoTracking().Where(question =>
|
||||
question.TenantId == platformTenantId &&
|
||||
question.Status == QuestionStatus.Published &&
|
||||
(!filter.QuestionId.HasValue || question.Id == filter.QuestionId.Value) &&
|
||||
@@ -341,7 +343,7 @@ public sealed class QuestionBankQueryService(
|
||||
}
|
||||
|
||||
return await ProjectQuestions(
|
||||
systemDbContext,
|
||||
systemQuestionBank,
|
||||
query.OrderByDescending(question => question.CreatedAt).Take(limit),
|
||||
QuestionSource.Platform)
|
||||
.ToArrayAsync(token);
|
||||
@@ -360,18 +362,19 @@ public sealed class QuestionBankQueryService(
|
||||
"Read platform question versions for an entitled tenant", Guid.NewGuid().ToString("N")),
|
||||
async (provider, token) =>
|
||||
{
|
||||
var systemDbContext = provider.GetRequiredService<TikuDbContext>();
|
||||
var platformQuestion = await systemDbContext.Questions.AsNoTracking()
|
||||
var systemQuestionBank = provider.GetRequiredService<IQuestionBankPersistence>();
|
||||
var systemTenancy = provider.GetRequiredService<ITenancyPersistence>();
|
||||
var platformQuestion = await systemQuestionBank.Questions.AsNoTracking()
|
||||
.Where(question => question.Id == questionId && question.Status == QuestionStatus.Published)
|
||||
.Join(
|
||||
systemDbContext.Tenants.AsNoTracking().Where(tenant => tenant.Mode == TenantMode.PlatformOwned),
|
||||
systemTenancy.Tenants.AsNoTracking().Where(tenant => tenant.Mode == TenantMode.PlatformOwned),
|
||||
question => question.TenantId,
|
||||
tenant => tenant.Id,
|
||||
(question, tenant) => new { question.TenantId, question.Id })
|
||||
.SingleOrDefaultAsync(token);
|
||||
if (platformQuestion is null) throw new QuestionBankNotFoundException("Question was not found.");
|
||||
|
||||
return await systemDbContext.QuestionVersions.AsNoTracking()
|
||||
return await systemQuestionBank.QuestionVersions.AsNoTracking()
|
||||
.Where(version =>
|
||||
version.TenantId == platformQuestion.TenantId &&
|
||||
version.QuestionId == platformQuestion.Id)
|
||||
@@ -399,4 +402,4 @@ public sealed class QuestionBankQueryService(
|
||||
{
|
||||
return Math.Clamp(limit ?? defaultLimit, 1, maxLimit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user