using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tiku.Api.Contracts; using Tiku.Api.Security; using Tiku.Application.Learning; using Tiku.Application.Security; namespace Tiku.Api.Controllers; [ApiController] [Tags("学生端-学习上下文")] [Authorize(Policy = TikuPolicies.CurrentTenantMember)] [RequireSaasFeature(SaasFeatureCatalog.Practice)] [Produces("application/json")] [Route("api/student")] public sealed class StudentLearningContextController( IStudentLearningTargetService service, IStudentLearningCatalogService catalog, LearningActorResolver actorResolver) : ControllerBase { [HttpGet("learning-context")] [EndpointSummary("查询学生可用业务与当前学习目标")] [ProducesResponseType(StatusCodes.Status200OK)] public Task GetContext(CancellationToken cancellationToken) { return service.GetContextAsync(actorResolver.Resolve(), cancellationToken); } [HttpGet("learning-targets")] [EndpointSummary("查询当前业务可选目标")] [ProducesResponseType>(StatusCodes.Status200OK)] public Task> GetTargets( [FromQuery] Guid businessLineId, CancellationToken cancellationToken) { return service.GetTargetsAsync(actorResolver.Resolve(), businessLineId, cancellationToken); } [HttpGet("catalog/resources")] [EndpointSummary("查询由当前套餐、目标和班级授权编译出的认证学习目录")] [ProducesResponseType(StatusCodes.Status200OK)] public Task GetCatalog( [FromQuery] Guid businessLineId, CancellationToken cancellationToken) { return catalog.GetAsync(actorResolver.Resolve(), businessLineId, cancellationToken); } [HttpPut("learning-targets/{businessLineId:guid}")] [EndpointSummary("变更当前业务的主目标和备选目标")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status409Conflict)] public Task ChangeTargets( Guid businessLineId, ChangeLearningTargetsDto request, CancellationToken cancellationToken) { return service.ChangeTargetsAsync( actorResolver.Resolve(), businessLineId, request.ToCommand(), cancellationToken); } }