feat: add student video and profile experience

This commit is contained in:
2026-07-28 15:23:42 +08:00
parent 5e993298e7
commit 7a3cf09a99
31 changed files with 19821 additions and 170 deletions

View File

@@ -4,6 +4,7 @@ using Tiku.Api.Contracts;
using Tiku.Application.Assets;
using Tiku.Application.Catalog;
using Tiku.Application.Content;
using Tiku.Application.Jobs;
using Tiku.Application.Security;
using Tiku.Domain.Catalog;
using Tiku.Domain.Content;
@@ -16,6 +17,7 @@ namespace Tiku.Api.Controllers;
[Route("api/tenant-content")]
public sealed class TenantContentDirectController(
IDirectContentService directContentService,
IBackgroundJobService backgroundJobService,
ICurrentUser currentUser,
ITenantContext currentTenant) : ControllerBase
{
@@ -318,14 +320,53 @@ public sealed class TenantContentDirectController(
[HttpPost("imports/{importType}")]
[Authorize(Policy = TikuPolicies.TenantContentManageAllScope)]
[EndpointSummary("执行同步内容导入")]
[EndpointSummary("执行或排队内容导入")]
[ProducesResponseType<SimpleImportResult>(StatusCodes.Status200OK)]
public async Task<ActionResult<SimpleImportResult>> ExecuteImport(
[ProducesResponseType<BackgroundJobItem>(StatusCodes.Status202Accepted)]
public async Task<ActionResult<object>> ExecuteImport(
string importType,
DirectImportDto request,
CancellationToken cancellationToken)
{
return Ok(await directContentService.ExecuteImportAsync(ResolveActor(), request.ToCommand(importType, dryRun: false), cancellationToken));
var actor = ResolveActor();
var command = request.ToCommand(importType, dryRun: false);
if (request.Async == true || command.Items.Count > 100)
{
var job = await backgroundJobService.EnqueueAsync(
new CreateBackgroundJobCommand(
actor.TenantId,
"content_import",
System.Text.Json.JsonSerializer.SerializeToElement(new
{
createdBy = actor.UserId,
importType = command.ImportType,
sourceFormat = command.SourceFormat,
sourceName = command.SourceName,
regionId = command.RegionId,
entryId = command.EntryId,
contentNodeId = command.ContentNodeId,
subjectId = command.SubjectId,
categoryId = command.CategoryId,
questionBankId = command.QuestionBankId,
collectionId = command.CollectionId,
items = command.Items
})),
cancellationToken);
return Accepted(job);
}
return Ok(await directContentService.ExecuteImportAsync(actor, command, cancellationToken));
}
[HttpGet("imports/detail")]
[Authorize(Policy = TikuPolicies.TenantContentManageAllScope)]
[EndpointSummary("查询内容导入任务详情")]
[ProducesResponseType<ContentImportJobDetail>(StatusCodes.Status200OK)]
public async Task<ActionResult<ContentImportJobDetail>> GetImportDetail(
[FromQuery] DirectImportJobDto query,
CancellationToken cancellationToken)
{
return Ok(await directContentService.GetImportJobAsync(ResolveActor(), query.JobId, cancellationToken));
}
[HttpGet("imports/issues")]