using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tiku.Api.Contracts; using Tiku.Application.Learning; using Tiku.Application.Security; namespace Tiku.Api.Controllers; [ApiController] [Tags("租户端-班级学习授权 V2")] [Authorize(Policy = BackendPermissions.TenantStudentManage)] [Produces("application/json")] [Route("api/tenant/classes/{classId:guid}/learning-assignments")] public sealed class TenantClassLearningAssignmentController( IV2LearningAccessAdministrationService service, TenantAdminActorResolver actorResolver) : ControllerBase { [HttpGet] [EndpointSummary("查询班级的 V2 题集和蓝图授权")] public Task> Get( Guid classId, CancellationToken cancellationToken) { var actor = actorResolver.Resolve(); return service.GetClassGrantsAsync(actor.TenantId, classId, cancellationToken); } [HttpPut] [EndpointSummary("新增或更新班级的 V2 题集和蓝图授权")] public Task Upsert( Guid classId, UpsertClassAssignmentGrantDto request, CancellationToken cancellationToken) { var actor = actorResolver.Resolve(); return service.UpsertClassGrantAsync( actor.TenantId, actor.UserId, request.ToCommand(classId), cancellationToken); } [HttpPost("{grantId:guid}/revoke")] [EndpointSummary("撤回班级 V2 学习授权;已开始会话继续使用锁定快照")] public Task Revoke( Guid classId, Guid grantId, RevokeClassAssignmentGrantDto request, CancellationToken cancellationToken) { var actor = actorResolver.Resolve(); return service.RevokeClassGrantAsync( actor.TenantId, actor.UserId, classId, grantId, request.Reason, cancellationToken); } } [ApiController] [Tags("租户端-学生学习目标 V2")] [Authorize(Policy = BackendPermissions.TenantStudentManage)] [Produces("application/json")] [Route("api/tenant/students/{userId:guid}/learning-targets/{businessLineId:guid}")] public sealed class TenantStudentLearningAccessController( IStudentLearningTargetService service, TenantAdminActorResolver actorResolver) : ControllerBase { [HttpPut] [EndpointSummary("管理员带原因强制调整学生复合考试目标")] public Task Override( Guid userId, Guid businessLineId, OverrideStudentLearningTargetsDto request, CancellationToken cancellationToken) { var actor = actorResolver.Resolve(); return service.OverrideTargetsAsync( new LearningActor(actor.TenantId, userId), businessLineId, request.ToCommand(), actor.UserId, request.Reason, cancellationToken); } }