feat: add asset and video readonly endpoints

This commit is contained in:
xiong
2026-07-26 14:48:15 +08:00
parent c6051f95f2
commit 0ff97e86cd
7 changed files with 798 additions and 0 deletions

View File

@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Tiku.Application.Assets;
using Tiku.Api.Contracts;
using Tiku.Application.Catalog;
using Tiku.Application.Content;
@@ -21,6 +22,7 @@ public sealed class CatalogController(
IContentNavigationQueryService contentNavigationQueryService,
IQuestionBankQueryService questionBankQueryService,
IStudyContentQueryService studyContentQueryService,
IAssetQueryService assetQueryService,
ICurrentTenant currentTenant,
TikuDbContext dbContext) : ControllerBase
{
@@ -303,6 +305,71 @@ public sealed class CatalogController(
cancellationToken));
}
[HttpGet("content-assets")]
[EndpointSummary("查询内容资源")]
[ProducesResponseType<CatalogList<ContentAssetCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<ContentAssetCatalogItem>>> GetContentAssets(
[FromQuery] AssetQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await assetQueryService.GetContentAssetsAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
[HttpGet("images")]
[EndpointSummary("查询图片资源")]
[ProducesResponseType<CatalogList<ImageAssetCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<ImageAssetCatalogItem>>> GetImages(
[FromQuery] AssetQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await assetQueryService.GetImagesAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
[HttpGet("app-assets")]
[EndpointSummary("查询应用资源")]
[ProducesResponseType<CatalogList<AppAssetCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<AppAssetCatalogItem>>> GetAppAssets(
[FromQuery] AssetQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await assetQueryService.GetAppAssetsAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
[HttpGet("video-explanations")]
[EndpointSummary("查询视频讲解")]
[ProducesResponseType<CatalogList<VideoExplanationCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<VideoExplanationCatalogItem>>> GetVideoExplanations(
[FromQuery] AssetQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await assetQueryService.GetVideoExplanationsAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
[HttpGet("question-videos")]
[EndpointSummary("查询题目关联视频")]
[ProducesResponseType<CatalogList<QuestionVideoCatalogItem>>(StatusCodes.Status200OK)]
[ProducesResponseType<ProblemDetails>(StatusCodes.Status404NotFound)]
public async Task<ActionResult<CatalogList<QuestionVideoCatalogItem>>> GetQuestionVideos(
[FromQuery] AssetQueryDto query,
CancellationToken cancellationToken)
{
return Ok(await assetQueryService.GetQuestionVideosAsync(
query.ToFilter(await ResolveTenantIdAsync(query, cancellationToken)),
cancellationToken));
}
private async Task<Guid> ResolveTenantIdAsync(
CatalogQueryDto query,
CancellationToken cancellationToken)
@@ -363,6 +430,18 @@ public sealed class CatalogController(
},
cancellationToken);
}
private Task<Guid> ResolveTenantIdAsync(
AssetQueryDto query,
CancellationToken cancellationToken)
{
return ResolveTenantIdAsync(
new CatalogQueryDto
{
TenantCode = query.TenantCode
},
cancellationToken);
}
}
public sealed class TenantNotFoundException : Exception