@@ -23,20 +23,13 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
entry.TenantId == filter.TenantId &&
|
||||
entry.IsActive);
|
||||
|
||||
if (!filter.IncludeHidden)
|
||||
{
|
||||
query = query.Where(entry => entry.Visibility != ContentVisibility.Hidden);
|
||||
}
|
||||
if (!filter.IncludeHidden) query = query.Where(entry => entry.Visibility != ContentVisibility.Hidden);
|
||||
|
||||
if (filter.RegionId.HasValue)
|
||||
{
|
||||
query = query.Where(entry => entry.RegionId == filter.RegionId.Value || entry.RegionId == null);
|
||||
}
|
||||
|
||||
if (TryParseEntryType(filter.EntryType, out var entryType))
|
||||
{
|
||||
query = query.Where(entry => entry.EntryType == entryType);
|
||||
}
|
||||
|
||||
query = ApplyKeyword(query, filter.Keyword);
|
||||
|
||||
@@ -67,10 +60,7 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
ContentNavigationFilter filter,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (!filter.EntryId.HasValue)
|
||||
{
|
||||
throw new RequiredFieldException("entryId is required.");
|
||||
}
|
||||
if (!filter.EntryId.HasValue) throw new RequiredFieldException("entryId is required.");
|
||||
|
||||
var query = dbContext.ContentNodes
|
||||
.AsNoTracking()
|
||||
@@ -78,27 +68,18 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
node.TenantId == filter.TenantId &&
|
||||
node.EntryId == filter.EntryId.Value);
|
||||
|
||||
if (!filter.IncludeInactive)
|
||||
{
|
||||
query = query.Where(node => node.IsActive);
|
||||
}
|
||||
if (!filter.IncludeInactive) query = query.Where(node => node.IsActive);
|
||||
|
||||
if (filter.RegionId.HasValue)
|
||||
{
|
||||
query = query.Where(node => node.RegionId == filter.RegionId.Value || node.RegionId == null);
|
||||
}
|
||||
|
||||
if (filter.ParentWasSpecified)
|
||||
{
|
||||
query = filter.ParentIsRoot
|
||||
? query.Where(node => node.ParentId == null)
|
||||
: query.Where(node => node.ParentId == filter.ParentId);
|
||||
}
|
||||
|
||||
if (TryParseMarkerType(filter.MarkerType, out var markerType))
|
||||
{
|
||||
query = query.Where(node => node.MarkerType == markerType);
|
||||
}
|
||||
|
||||
query = ApplyKeyword(query, filter.Keyword);
|
||||
|
||||
@@ -142,24 +123,15 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
collection.Status == ContentStatus.Active);
|
||||
|
||||
if (filter.RegionId.HasValue)
|
||||
{
|
||||
query = query.Where(collection => collection.RegionId == filter.RegionId.Value || collection.RegionId == null);
|
||||
}
|
||||
query = query.Where(collection =>
|
||||
collection.RegionId == filter.RegionId.Value || collection.RegionId == null);
|
||||
|
||||
if (filter.EntryId.HasValue)
|
||||
{
|
||||
query = query.Where(collection => collection.EntryId == filter.EntryId.Value);
|
||||
}
|
||||
if (filter.EntryId.HasValue) query = query.Where(collection => collection.EntryId == filter.EntryId.Value);
|
||||
|
||||
if (filter.NodeId.HasValue)
|
||||
{
|
||||
query = query.Where(collection => collection.NodeId == filter.NodeId.Value);
|
||||
}
|
||||
if (filter.NodeId.HasValue) query = query.Where(collection => collection.NodeId == filter.NodeId.Value);
|
||||
|
||||
if (TryParseCollectionType(filter.CollectionType, out var collectionType))
|
||||
{
|
||||
query = query.Where(collection => collection.CollectionType == collectionType);
|
||||
}
|
||||
|
||||
query = ApplyKeyword(query, filter.Keyword);
|
||||
|
||||
@@ -203,29 +175,16 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
blueprint.Status == ContentStatus.Active);
|
||||
|
||||
if (filter.RegionId.HasValue)
|
||||
{
|
||||
query = query.Where(blueprint => blueprint.RegionId == filter.RegionId.Value || blueprint.RegionId == null);
|
||||
}
|
||||
|
||||
if (filter.EntryId.HasValue)
|
||||
{
|
||||
query = query.Where(blueprint => blueprint.EntryId == filter.EntryId.Value);
|
||||
}
|
||||
if (filter.EntryId.HasValue) query = query.Where(blueprint => blueprint.EntryId == filter.EntryId.Value);
|
||||
|
||||
if (filter.NodeId.HasValue)
|
||||
{
|
||||
query = query.Where(blueprint => blueprint.NodeId == filter.NodeId.Value);
|
||||
}
|
||||
if (filter.NodeId.HasValue) query = query.Where(blueprint => blueprint.NodeId == filter.NodeId.Value);
|
||||
|
||||
if (filter.CollectionId.HasValue)
|
||||
{
|
||||
query = query.Where(blueprint => blueprint.CollectionId == filter.CollectionId.Value);
|
||||
}
|
||||
|
||||
if (TryParsePracticeMode(filter.Mode, out var mode))
|
||||
{
|
||||
query = query.Where(blueprint => blueprint.Mode == mode);
|
||||
}
|
||||
if (TryParsePracticeMode(filter.Mode, out var mode)) query = query.Where(blueprint => blueprint.Mode == mode);
|
||||
|
||||
query = ApplyKeyword(query, filter.Keyword);
|
||||
|
||||
@@ -261,10 +220,7 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
ContentNavigationFilter filter,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (!filter.CollectionId.HasValue)
|
||||
{
|
||||
throw new RequiredFieldException("collectionId is required.");
|
||||
}
|
||||
if (!filter.CollectionId.HasValue) throw new RequiredFieldException("collectionId is required.");
|
||||
|
||||
var collectionExists = await dbContext.QuestionCollections
|
||||
.AsNoTracking()
|
||||
@@ -275,10 +231,7 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
collection.Status == ContentStatus.Active,
|
||||
cancellationToken);
|
||||
|
||||
if (!collectionExists)
|
||||
{
|
||||
throw new ContentNavigationNotFoundException("Question collection was not found.");
|
||||
}
|
||||
if (!collectionExists) throw new ContentNavigationNotFoundException("Question collection was not found.");
|
||||
|
||||
var emptyOptions = JsonDefaults.Array();
|
||||
var emptyCorrectOptionIndices = JsonDefaults.Array();
|
||||
@@ -286,7 +239,7 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
var query =
|
||||
from item in dbContext.QuestionCollectionItems.AsNoTracking()
|
||||
join question in dbContext.Questions.AsNoTracking()
|
||||
on new { item.TenantId, QuestionId = item.QuestionId } equals new { question.TenantId, QuestionId = question.Id }
|
||||
on new { item.TenantId, item.QuestionId } equals new { question.TenantId, QuestionId = question.Id }
|
||||
join version in dbContext.QuestionVersions.AsNoTracking()
|
||||
on new { question.TenantId, QuestionId = question.Id, VersionId = question.CurrentVersionId }
|
||||
equals new { version.TenantId, version.QuestionId, VersionId = (Guid?)version.Id }
|
||||
@@ -336,10 +289,7 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
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(ContentEntry.Name)).Contains(trimmed));
|
||||
@@ -352,22 +302,22 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
|
||||
private static bool TryParseEntryType(string? value, out ContentEntryType type)
|
||||
{
|
||||
return Enum.TryParse(NormalizeEnumValue(value), ignoreCase: true, out type);
|
||||
return Enum.TryParse(NormalizeEnumValue(value), true, out type);
|
||||
}
|
||||
|
||||
private static bool TryParseCollectionType(string? value, out QuestionCollectionType type)
|
||||
{
|
||||
return Enum.TryParse(NormalizeEnumValue(value), ignoreCase: true, out type);
|
||||
return Enum.TryParse(NormalizeEnumValue(value), true, out type);
|
||||
}
|
||||
|
||||
private static bool TryParsePracticeMode(string? value, out PracticeMode mode)
|
||||
{
|
||||
return Enum.TryParse(NormalizeEnumValue(value), ignoreCase: true, out mode);
|
||||
return Enum.TryParse(NormalizeEnumValue(value), true, out mode);
|
||||
}
|
||||
|
||||
private static bool TryParseMarkerType(string? value, out ContentMarkerType type)
|
||||
{
|
||||
return Enum.TryParse(NormalizeEnumValue(value), ignoreCase: true, out type);
|
||||
return Enum.TryParse(NormalizeEnumValue(value), true, out type);
|
||||
}
|
||||
|
||||
private static string? NormalizeEnumValue(string? value)
|
||||
@@ -377,4 +327,4 @@ public sealed class ContentNavigationQueryService(TikuDbContext dbContext) : ICo
|
||||
: value.Replace("_", string.Empty, StringComparison.Ordinal)
|
||||
.Replace("-", string.Empty, StringComparison.Ordinal);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user