diff --git a/src/Jiaowu.Api/Controllers/ExperimentsController.cs b/src/Jiaowu.Api/Controllers/ExperimentsController.cs index 56ea887..01bf2a4 100644 --- a/src/Jiaowu.Api/Controllers/ExperimentsController.cs +++ b/src/Jiaowu.Api/Controllers/ExperimentsController.cs @@ -196,12 +196,11 @@ public sealed class ExperimentsController( int page = 1, int pageSize = 20) { + // 项目列表按任课教学任务授权。场次的名单、取消和代选仍由 + // CanManageSession 限制到已绑定的指导教师,不能以此反向过滤项目: + // 草稿尚未安排场次,集中安排项目也没有独立的场次指导教师绑定。 var source = ScopedProjects().AsNoTracking(); var scope = currentUserDataScope.Current; - if (scope.Scope == DataScope.Self && scope.IsInRole(SystemRoles.Teacher)) - source = source.Where(x => x.Sessions.Any(session => - session.Instructors.Any(instructor => - instructor.Teacher!.UserId == scope.UserId))); if (academicTermId.HasValue) source = source.Where(x => x.TeachingTask!.AcademicTermId == academicTermId); diff --git a/tests/Jiaowu.Api.Tests/ExperimentsControllerTests.cs b/tests/Jiaowu.Api.Tests/ExperimentsControllerTests.cs index f63e382..7285fe8 100644 --- a/tests/Jiaowu.Api.Tests/ExperimentsControllerTests.cs +++ b/tests/Jiaowu.Api.Tests/ExperimentsControllerTests.cs @@ -7,11 +7,45 @@ using Jiaowu.Api.Infrastructure.Timetables; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; +using System.Text.Json; namespace Jiaowu.Api.Tests; public sealed class ExperimentsControllerTests { + [Fact] + public async Task TeacherManagement_ListsOwnDraftAndPublishedProjectsWithoutSessionInstructorBinding() + { + await using var fixture = await ExperimentFixture.CreateAsync(); + var teacherScope = new FixedScope(new CurrentUserScope( + fixture.ManagerScope.Current.UserId, + fixture.ManagerScope.Current.DisplayName, + fixture.ManagerScope.Current.CollegeId, + DataScope.Self, + new HashSet([SystemRoles.Teacher]))); + var controller = fixture.Controller(teacherScope); + + Assert.IsType(await controller.CreateProject( + fixture.ProjectRequest(ExperimentArrangementMode.SelfScheduled), + CancellationToken.None)); + Assert.IsType(await controller.CreateProject( + fixture.ProjectRequest(ExperimentArrangementMode.Centralized), + CancellationToken.None)); + var centralized = await fixture.Db.ExperimentProjects.SingleAsync(x => + x.ArrangementMode == ExperimentArrangementMode.Centralized); + Assert.IsType(await controller.PublishProject( + centralized.Id, CancellationToken.None)); + + var result = Assert.IsType( + await controller.GetManagementProjects( + null, null, null, null, null, null, null, null, + CancellationToken.None)); + using var response = JsonDocument.Parse(JsonSerializer.Serialize(result.Value)); + + Assert.Equal(1, response.RootElement.GetProperty("Total").GetInt32()); + Assert.Equal(2, response.RootElement.GetProperty("Items").GetArrayLength()); + } + [Fact] public async Task BatchProjects_CreateSameDefinitionForSameCourseTasks() {