|
@@ -15,8 +15,10 @@ import space.anyi.serve.mapper.ProblemMapper;
|
|
|
import space.anyi.serve.mapper.ProblemTestMapper;
|
|
import space.anyi.serve.mapper.ProblemTestMapper;
|
|
|
import space.anyi.serve.service.ProblemService;
|
|
import space.anyi.serve.service.ProblemService;
|
|
|
import space.anyi.serve.service.UserService;
|
|
import space.anyi.serve.service.UserService;
|
|
|
|
|
+import space.anyi.serve.util.SecurityUtils;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
+import java.util.Objects;
|
|
|
|
|
|
|
|
@Service
|
|
@Service
|
|
|
public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> implements ProblemService {
|
|
public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> implements ProblemService {
|
|
@@ -42,10 +44,11 @@ public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> impl
|
|
|
LambdaQueryWrapper<Problem> wrapper = new LambdaQueryWrapper<Problem>()
|
|
LambdaQueryWrapper<Problem> wrapper = new LambdaQueryWrapper<Problem>()
|
|
|
.like(StringUtils.hasText(title), Problem::getTitle, title)
|
|
.like(StringUtils.hasText(title), Problem::getTitle, title)
|
|
|
.eq(StringUtils.hasText(difficulty), Problem::getDifficulty, difficulty)
|
|
.eq(StringUtils.hasText(difficulty), Problem::getDifficulty, difficulty)
|
|
|
- .eq(isPublic != null, Problem::getIsPublic, isPublic)
|
|
|
|
|
.orderByDesc(Problem::getId);
|
|
.orderByDesc(Problem::getId);
|
|
|
if (onlyPublic) {
|
|
if (onlyPublic) {
|
|
|
wrapper.eq(Problem::getIsPublic, Problem.IS_PUBLIC_YES);
|
|
wrapper.eq(Problem::getIsPublic, Problem.IS_PUBLIC_YES);
|
|
|
|
|
+ } else if (isPublic != null) {
|
|
|
|
|
+ wrapper.eq(Problem::getIsPublic, isPublic);
|
|
|
}
|
|
}
|
|
|
if (categoryId != null) {
|
|
if (categoryId != null) {
|
|
|
List<ProblemCategoryRel> rels = problemCategoryRelMapper.selectList(
|
|
List<ProblemCategoryRel> rels = problemCategoryRelMapper.selectList(
|
|
@@ -108,6 +111,7 @@ public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> impl
|
|
|
if (problem == null) {
|
|
if (problem == null) {
|
|
|
throw new IllegalArgumentException("题目不存在");
|
|
throw new IllegalArgumentException("题目不存在");
|
|
|
}
|
|
}
|
|
|
|
|
+ assertCoachOwner(problem);
|
|
|
problem.setTitle(dto.getTitle());
|
|
problem.setTitle(dto.getTitle());
|
|
|
problem.setDescription(dto.getDescription());
|
|
problem.setDescription(dto.getDescription());
|
|
|
problem.setTimeLimitMs(dto.getTimeLimitMs());
|
|
problem.setTimeLimitMs(dto.getTimeLimitMs());
|
|
@@ -142,6 +146,7 @@ public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> impl
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Boolean addCase(ProblemCaseDto dto) {
|
|
public Boolean addCase(ProblemCaseDto dto) {
|
|
|
|
|
+ assertCoachCanManage(dto.getProblemId());
|
|
|
ProblemCase problemCase = new ProblemCase();
|
|
ProblemCase problemCase = new ProblemCase();
|
|
|
BeanUtils.copyProperties(dto, problemCase);
|
|
BeanUtils.copyProperties(dto, problemCase);
|
|
|
return problemCaseMapper.insert(problemCase) > 0;
|
|
return problemCaseMapper.insert(problemCase) > 0;
|
|
@@ -149,6 +154,7 @@ public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> impl
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Boolean updateCase(ProblemCaseDto dto) {
|
|
public Boolean updateCase(ProblemCaseDto dto) {
|
|
|
|
|
+ assertCoachCanManage(dto.getProblemId());
|
|
|
ProblemCase problemCase = new ProblemCase();
|
|
ProblemCase problemCase = new ProblemCase();
|
|
|
BeanUtils.copyProperties(dto, problemCase);
|
|
BeanUtils.copyProperties(dto, problemCase);
|
|
|
return problemCaseMapper.updateById(problemCase) > 0;
|
|
return problemCaseMapper.updateById(problemCase) > 0;
|
|
@@ -156,11 +162,17 @@ public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> impl
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Boolean deleteCase(Long id) {
|
|
public Boolean deleteCase(Long id) {
|
|
|
|
|
+ ProblemCase problemCase = problemCaseMapper.selectById(id);
|
|
|
|
|
+ if (problemCase == null) {
|
|
|
|
|
+ throw new IllegalArgumentException("样例不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+ assertCoachCanManage(problemCase.getProblemId());
|
|
|
return problemCaseMapper.deleteById(id) > 0;
|
|
return problemCaseMapper.deleteById(id) > 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Boolean addTest(ProblemTestDto dto) {
|
|
public Boolean addTest(ProblemTestDto dto) {
|
|
|
|
|
+ assertCoachCanManage(dto.getProblemId());
|
|
|
ProblemTest problemTest = new ProblemTest();
|
|
ProblemTest problemTest = new ProblemTest();
|
|
|
BeanUtils.copyProperties(dto, problemTest);
|
|
BeanUtils.copyProperties(dto, problemTest);
|
|
|
return problemTestMapper.insert(problemTest) > 0;
|
|
return problemTestMapper.insert(problemTest) > 0;
|
|
@@ -168,6 +180,7 @@ public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> impl
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Boolean updateTest(ProblemTestDto dto) {
|
|
public Boolean updateTest(ProblemTestDto dto) {
|
|
|
|
|
+ assertCoachCanManage(dto.getProblemId());
|
|
|
ProblemTest problemTest = new ProblemTest();
|
|
ProblemTest problemTest = new ProblemTest();
|
|
|
BeanUtils.copyProperties(dto, problemTest);
|
|
BeanUtils.copyProperties(dto, problemTest);
|
|
|
return problemTestMapper.updateById(problemTest) > 0;
|
|
return problemTestMapper.updateById(problemTest) > 0;
|
|
@@ -175,15 +188,38 @@ public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> impl
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Boolean deleteTest(Long id) {
|
|
public Boolean deleteTest(Long id) {
|
|
|
|
|
+ ProblemTest problemTest = problemTestMapper.selectById(id);
|
|
|
|
|
+ if (problemTest == null) {
|
|
|
|
|
+ throw new IllegalArgumentException("评测用例不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+ assertCoachCanManage(problemTest.getProblemId());
|
|
|
return problemTestMapper.deleteById(id) > 0;
|
|
return problemTestMapper.deleteById(id) > 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public List<ProblemTestVo> queryTests(Long problemId) {
|
|
public List<ProblemTestVo> queryTests(Long problemId) {
|
|
|
|
|
+ assertCoachCanManage(problemId);
|
|
|
List<ProblemTest> tests = problemTestMapper.selectList(
|
|
List<ProblemTest> tests = problemTestMapper.selectList(
|
|
|
new LambdaQueryWrapper<ProblemTest>()
|
|
new LambdaQueryWrapper<ProblemTest>()
|
|
|
.eq(ProblemTest::getProblemId, problemId)
|
|
.eq(ProblemTest::getProblemId, problemId)
|
|
|
.orderByAsc(ProblemTest::getSortOrder));
|
|
.orderByAsc(ProblemTest::getSortOrder));
|
|
|
return ProblemTestVo.from(tests);
|
|
return ProblemTestVo.from(tests);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private void assertCoachOwner(Problem problem) {
|
|
|
|
|
+ if (User.ROLE_COACH.equals(SecurityUtils.getCurrentRole())) {
|
|
|
|
|
+ Long userId = SecurityUtils.getCurrentUserId();
|
|
|
|
|
+ if (!Objects.equals(problem.getCreatedBy(), userId)) {
|
|
|
|
|
+ throw new IllegalArgumentException("教练只能管理自己创建的题目");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void assertCoachCanManage(Long problemId) {
|
|
|
|
|
+ Problem problem = getById(problemId);
|
|
|
|
|
+ if (problem == null) {
|
|
|
|
|
+ throw new IllegalArgumentException("题目不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+ assertCoachOwner(problem);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|