feat: add study content readonly endpoints

This commit is contained in:
xiong
2026-07-26 14:21:42 +08:00
parent 97e7819a34
commit 47613b51bd
8 changed files with 727 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ using Tiku.Application.Catalog;
using Tiku.Application.Content;
using Tiku.Application.QuestionBanks;
using Tiku.Application.Security;
using Tiku.Application.StudyContent;
using Tiku.Domain.Tenancy;
using Tiku.Infrastructure.Persistence;
@@ -19,6 +20,7 @@ public sealed class CatalogController(
ICatalogQueryService catalogQueryService,
IContentNavigationQueryService contentNavigationQueryService,
IQuestionBankQueryService questionBankQueryService,
IStudyContentQueryService studyContentQueryService,
ICurrentTenant currentTenant,
TikuDbContext dbContext) : ControllerBase
{
@@ -236,6 +238,71 @@ public sealed class CatalogController(
cancellationToken));
}
[HttpGet("vocabulary-units")]
[EndpointSummary("查询词汇单元")]
[ProducesResponseType<CatalogList<VocabularyUnitCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<VocabularyUnitCatalogItem>>> GetVocabularyUnits(
[FromQuery] StudyContentQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await studyContentQueryService.GetVocabularyUnitsAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
[HttpGet("vocabulary-words")]
[EndpointSummary("查询词汇单词")]
[ProducesResponseType<CatalogList<VocabularyWordCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<VocabularyWordCatalogItem>>> GetVocabularyWords(
[FromQuery] StudyContentQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await studyContentQueryService.GetVocabularyWordsAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
[HttpGet("handbook-subjects")]
[EndpointSummary("查询知识手册科目")]
[ProducesResponseType<CatalogList<HandbookSubjectCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<HandbookSubjectCatalogItem>>> GetHandbookSubjects(
[FromQuery] StudyContentQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await studyContentQueryService.GetHandbookSubjectsAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
[HttpGet("handbook-chapters")]
[EndpointSummary("查询知识手册章节")]
[ProducesResponseType<CatalogList<HandbookChapterCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<HandbookChapterCatalogItem>>> GetHandbookChapters(
[FromQuery] StudyContentQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await studyContentQueryService.GetHandbookChaptersAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
[HttpGet("handbook-entries")]
[EndpointSummary("查询知识手册条目")]
[ProducesResponseType<CatalogList<HandbookEntryCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<HandbookEntryCatalogItem>>> GetHandbookEntries(
[FromQuery] StudyContentQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await studyContentQueryService.GetHandbookEntriesAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
private async Task<Guid> ResolveTenantIdAsync(
CatalogQueryDto query,
CancellationToken cancellationToken)
@@ -284,6 +351,18 @@ public sealed class CatalogController(
},
cancellationToken);
}
private Task<Guid> ResolveTenantIdAsync(
StudyContentQueryDto query,
CancellationToken cancellationToken)
{
return ResolveTenantIdAsync(
new CatalogQueryDto
{
TenantCode = query.TenantCode
},
cancellationToken);
}
}
public sealed class TenantNotFoundException : Exception