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("租户端-班级学习授权")] [Authorize(Policy = BackendPermissions.TenantStudentManage)] [Produces("application/json")] [Route("api/tenant/classes/learning-assignments")] public sealed class TenantClassLearningAssignmentController( ILearningAccessAdministrationService service, TenantAdminActorResolver actorResolver) : ControllerBase { [HttpGet] [EndpointSummary("查询班级题集和练习蓝图授权")] public Task> Get( [FromQuery] Guid classId, CancellationToken cancellationToken) { var actor = actorResolver.Resolve(); return service.GetClassAssignmentsAsync(actor.TenantId, classId, cancellationToken); } [HttpPut] [EndpointSummary("新增或更新班级题集和练习蓝图授权")] public Task Upsert( UpsertClassContentAssignmentDto request, CancellationToken cancellationToken) { var actor = actorResolver.Resolve(); return service.UpsertClassAssignmentAsync( actor.TenantId, actor.UserId, request.ToCommand(), cancellationToken); } [HttpPost("{assignmentId:guid}/revoke")] [EndpointSummary("撤回班级学习授权并强制撤销活动会话")] public Task Revoke( Guid assignmentId, RevokeClassContentAssignmentDto request, CancellationToken cancellationToken) { var actor = actorResolver.Resolve(); return service.RevokeClassAssignmentAsync( actor.TenantId, actor.UserId, assignmentId, request.Reason, cancellationToken); } } [ApiController] [Tags("租户端-学生学习授权")] [Authorize(Policy = BackendPermissions.TenantStudentManage)] [Produces("application/json")] [Route("api/tenant/students/{userId:guid}/learning/target-region")] public sealed class TenantStudentLearningAccessController( ILearningAccessAdministrationService service, TenantAdminActorResolver actorResolver) : ControllerBase { [HttpPut] [EndpointSummary("管理员强制调整学生目标地区")] public Task Override( Guid userId, OverrideStudentTargetRegionDto request, CancellationToken cancellationToken) { var actor = actorResolver.Resolve(); return service.OverrideTargetRegionAsync( actor.TenantId, request.ToCommand(userId, actor.UserId), cancellationToken); } }