feat: restore class training task defaults

main
chenyuan 1 month ago
parent eba5f785e8
commit 885dd604d7

@ -19,4 +19,9 @@ public interface TrainingTaskClassConfigMapper {
List<TrainingTaskClassConfig> selectListByTeachingClass(@Param("teachingClassId") String teachingClassId, List<TrainingTaskClassConfig> selectListByTeachingClass(@Param("teachingClassId") String teachingClassId,
@Param("enabled") Boolean enabled); @Param("enabled") Boolean enabled);
int deleteByTeachingClassAndTaskKey(@Param("teachingClassId") String teachingClassId,
@Param("taskKey") String taskKey);
int deleteByTeachingClass(@Param("teachingClassId") String teachingClassId);
} }

@ -32,6 +32,10 @@ public interface TrainingTaskService {
TrainingTask saveClassTask(String teachingClassId, String taskKey, TrainingTask task, String operatorId); TrainingTask saveClassTask(String teachingClassId, String taskKey, TrainingTask task, String operatorId);
void restoreClassTaskDefault(String teachingClassId, String taskKey, String operatorId);
void restoreClassTasksDefaults(String teachingClassId, String operatorId);
TrainingTask getStudentTaskByTaskKey(String taskKey, String studentUserId); TrainingTask getStudentTaskByTaskKey(String taskKey, String studentUserId);
List<TrainingTask> listForStudent(String studentUserId, Boolean enabledOnly); List<TrainingTask> listForStudent(String studentUserId, Boolean enabledOnly);

@ -249,6 +249,21 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
return toTask(saved == null ? config : saved); return toTask(saved == null ? config : saved);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void restoreClassTaskDefault(String teachingClassId, String taskKey, String operatorId) {
requireOwnedTeachingClass(teachingClassId, operatorId);
trainingTaskClassConfigMapper.deleteByTeachingClassAndTaskKey(
StringUtils.trimToEmpty(teachingClassId), StringUtils.trimToEmpty(taskKey));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void restoreClassTasksDefaults(String teachingClassId, String operatorId) {
requireOwnedTeachingClass(teachingClassId, operatorId);
trainingTaskClassConfigMapper.deleteByTeachingClass(StringUtils.trimToEmpty(teachingClassId));
}
@Override @Override
public TrainingTask getStudentTaskByTaskKey(String taskKey, String studentUserId) { public TrainingTask getStudentTaskByTaskKey(String taskKey, String studentUserId) {
ensureDefaultTasks(null); ensureDefaultTasks(null);

@ -50,6 +50,17 @@
order by sort asc, create_time asc order by sort asc, create_time asc
</select> </select>
<delete id="deleteByTeachingClassAndTaskKey">
delete from training_task_class_config
where teaching_class_id = #{teachingClassId,jdbcType=VARCHAR}
and task_key = #{taskKey,jdbcType=VARCHAR}
</delete>
<delete id="deleteByTeachingClass">
delete from training_task_class_config
where teaching_class_id = #{teachingClassId,jdbcType=VARCHAR}
</delete>
<insert id="insertSelective" parameterType="com.sztzjy.linkCommerce.entity.TrainingTaskClassConfig"> <insert id="insertSelective" parameterType="com.sztzjy.linkCommerce.entity.TrainingTaskClassConfig">
insert into training_task_class_config insert into training_task_class_config
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">

@ -22,12 +22,14 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.ArgumentMatchers.startsWith; import static org.mockito.ArgumentMatchers.startsWith;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
class TrainingTaskServiceImplTest { class TrainingTaskServiceImplTest {
@ -302,6 +304,45 @@ class TrainingTaskServiceImplTest {
assertThrows(IllegalArgumentException.class, () -> service.saveClassTask("class-2", "new-product-survey", task, "teacher-b")); assertThrows(IllegalArgumentException.class, () -> service.saveClassTask("class-2", "new-product-survey", task, "teacher-b"));
} }
@Test
void restoreClassTaskDefaultDeletesOnlySelectedClassTaskCopy() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class);
service.schoolClassMapper = mock(SchoolClassMapper.class);
when(service.schoolClassMapper.selectByPrimaryKey("class-1")).thenReturn(teachingClass("class-1", "teacher-1"));
service.restoreClassTaskDefault("class-1", "new-product-survey", "teacher-1");
verify(service.trainingTaskClassConfigMapper)
.deleteByTeachingClassAndTaskKey("class-1", "new-product-survey");
verify(service.trainingTaskClassConfigMapper, never()).deleteByTeachingClass(anyString());
}
@Test
void restoreClassTasksDefaultsDeletesOnlySelectedClassCopies() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class);
service.schoolClassMapper = mock(SchoolClassMapper.class);
when(service.schoolClassMapper.selectByPrimaryKey("class-1")).thenReturn(teachingClass("class-1", "teacher-1"));
service.restoreClassTasksDefaults("class-1", "teacher-1");
verify(service.trainingTaskClassConfigMapper).deleteByTeachingClass("class-1");
}
@Test
void teacherCannotRestoreAnotherTeachersClass() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class);
service.schoolClassMapper = mock(SchoolClassMapper.class);
when(service.schoolClassMapper.selectByPrimaryKey("class-2")).thenReturn(teachingClass("class-2", "teacher-a"));
assertThrows(IllegalArgumentException.class,
() -> service.restoreClassTasksDefaults("class-2", "teacher-b"));
verifyNoInteractions(service.trainingTaskClassConfigMapper);
}
@Test @Test
void saveClassTaskInsertsNewOverrideWhenNoneExists() { void saveClassTaskInsertsNewOverrideWhenNoneExists() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
@ -430,6 +471,14 @@ class TrainingTaskServiceImplTest {
return task; return task;
} }
private SchoolClass teachingClass(String classId, String createdBy) {
SchoolClass schoolClass = new SchoolClass();
schoolClass.setSchoolClassId(classId);
schoolClass.setClassType("TEACHING");
schoolClass.setCreatedBy(createdBy);
return schoolClass;
}
private TrainingTaskClassConfig overrideTask(String id, String teachingClassId, String taskKey) { private TrainingTaskClassConfig overrideTask(String id, String teachingClassId, String taskKey) {
TrainingTaskClassConfig config = new TrainingTaskClassConfig(); TrainingTaskClassConfig config = new TrainingTaskClassConfig();
config.setId(id); config.setId(id);

Loading…
Cancel
Save