fix: keep class task list reads pure

main
chenyuan 1 month ago
parent 61a129af96
commit 3e192621ab

@ -197,16 +197,8 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
@Override @Override
public List<TrainingTask> listForTeachingClass(String teachingClassId, Boolean enabledOnly, JwtUser operator) { public List<TrainingTask> listForTeachingClass(String teachingClassId, Boolean enabledOnly, JwtUser operator) {
SchoolClass teachingClass = requireReadableTeachingClass(teachingClassId, operator); requireReadableTeachingClass(teachingClassId, operator);
boolean ownedByOperator = StringUtils.equals(teachingClass.getCreatedBy(), operator.getUserId());
if (ownedByOperator) {
ensureDefaultTasks(null);
}
List<TrainingTask> defaults = trainingTaskMapper.selectList(null, null, null); List<TrainingTask> defaults = trainingTaskMapper.selectList(null, null, null);
if (ownedByOperator) {
List<TrainingTaskClassConfig> classTasks = ensureClassTasksInitialized(teachingClassId, defaults, operator.getUserId());
return filterEnabled(toTasks(classTasks), enabledOnly);
}
return filterEnabled(readClassTasks(teachingClassId, defaults), enabledOnly); return filterEnabled(readClassTasks(teachingClassId, defaults), enabledOnly);
} }

@ -362,6 +362,32 @@ class TrainingTaskServiceImplTest {
verify(service.trainingTaskClassConfigMapper, never()).deleteByTeachingClassAndTaskKey(anyString(), anyString()); verify(service.trainingTaskClassConfigMapper, never()).deleteByTeachingClassAndTaskKey(anyString(), anyString());
} }
@Test
void ownerClassTaskReadDoesNotWriteConfigurations() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
service.trainingTaskMapper = mock(TrainingTaskMapper.class);
service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class);
service.schoolClassMapper = mock(SchoolClassMapper.class);
SchoolClass schoolClass = teachingClass("class-2", "teacher-a");
schoolClass.setSchoolId("school-1");
when(service.schoolClassMapper.selectByPrimaryKey("class-2")).thenReturn(schoolClass);
TrainingTask defaultTask = storedTask("task-1", "new-product-survey");
when(service.trainingTaskMapper.selectList(null, null, null)).thenReturn(Collections.singletonList(defaultTask));
when(service.trainingTaskClassConfigMapper.selectListByTeachingClass("class-2", null)).thenReturn(Collections.emptyList());
JwtUser owner = new JwtUser();
owner.setUserId("teacher-a");
owner.setSchoolId("school-1");
List<TrainingTask> result = service.listForTeachingClass("class-2", false, owner);
assertEquals(1, result.size());
verify(service.trainingTaskClassConfigMapper, never()).insertSelective(any());
verify(service.trainingTaskClassConfigMapper, never()).updateByPrimaryKeySelective(any());
verify(service.trainingTaskClassConfigMapper, never()).deleteByTeachingClass(anyString());
verify(service.trainingTaskClassConfigMapper, never()).deleteByTeachingClassAndTaskKey(anyString(), anyString());
}
@Test @Test
void teacherCannotReadTeachingClassWhenSchoolIdIsMissing() { void teacherCannotReadTeachingClassWhenSchoolIdIsMissing() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
@ -376,6 +402,21 @@ class TrainingTaskServiceImplTest {
() -> service.requireReadableTeachingClass("class-2", reader)); () -> service.requireReadableTeachingClass("class-2", reader));
} }
@Test
void teacherCannotReadTeachingClassWhenClassSchoolIdIsMissing() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
service.schoolClassMapper = mock(SchoolClassMapper.class);
SchoolClass schoolClass = teachingClass("class-2", "teacher-a");
when(service.schoolClassMapper.selectByPrimaryKey("class-2")).thenReturn(schoolClass);
JwtUser reader = new JwtUser();
reader.setUserId("teacher-b");
reader.setSchoolId("school-1");
assertThrows(IllegalArgumentException.class,
() -> service.requireReadableTeachingClass("class-2", reader));
}
@Test @Test
void restoreClassTaskDefaultDeletesOnlySelectedClassTaskCopy() { void restoreClassTaskDefaultDeletesOnlySelectedClassTaskCopy() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();

Loading…
Cancel
Save