Skip to content

Commit 70d2f9f

Browse files
committed
♻️ refactor : 퀴즈 수정, 문제 수정 API 리팩토링
1 parent e480e7b commit 70d2f9f

File tree

6 files changed

+40
-69
lines changed

6 files changed

+40
-69
lines changed

backend/src/main/java/io/f1/backend/domain/question/api/QuestionController.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,6 @@ public class QuestionController {
2020

2121
private final QuestionService questionService;
2222

23-
@PutMapping("/{questionId}")
24-
public ResponseEntity<Void> updateQuestion(
25-
@PathVariable Long questionId, @RequestBody QuestionUpdateRequest request) {
26-
27-
if (request.content() != null) {
28-
questionService.updateQuestionContent(questionId, request.content());
29-
}
30-
31-
if (request.content() != null) {
32-
questionService.updateQuestionAnswer(questionId, request.answer());
33-
}
34-
35-
return ResponseEntity.noContent().build();
36-
}
37-
3823
@DeleteMapping("/{questionId}")
3924
public ResponseEntity<Void> deleteQuestion(@PathVariable Long questionId) {
4025
questionService.deleteQuestion(questionId);

backend/src/main/java/io/f1/backend/domain/question/app/QuestionService.java

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import static io.f1.backend.domain.question.mapper.QuestionMapper.questionRequestToQuestion;
44
import static io.f1.backend.domain.question.mapper.TextQuestionMapper.questionRequestToTextQuestion;
5+
import static io.f1.backend.domain.quiz.app.QuizService.verifyUserAuthority;
56

67
import io.f1.backend.domain.question.dao.QuestionRepository;
78
import io.f1.backend.domain.question.dao.TextQuestionRepository;
89
import io.f1.backend.domain.question.dto.QuestionRequest;
10+
import io.f1.backend.domain.question.dto.QuestionUpdateRequest;
911
import io.f1.backend.domain.question.entity.Question;
1012
import io.f1.backend.domain.question.entity.TextQuestion;
1113
import io.f1.backend.domain.quiz.entity.Quiz;
@@ -41,45 +43,28 @@ public void saveQuestion(Quiz quiz, QuestionRequest request) {
4143
question.addTextQuestion(textQuestion);
4244
}
4345

44-
@Transactional
45-
public void updateQuestionContent(Long questionId, String content) {
46-
47-
validateContent(content);
46+
public void updateQuestions(QuestionUpdateRequest request) {
4847

4948
Question question =
50-
questionRepository
51-
.findById(questionId)
52-
.orElseThrow(
53-
() -> new CustomException(QuestionErrorCode.QUESTION_NOT_FOUND));
49+
questionRepository
50+
.findById(request.id())
51+
.orElseThrow(
52+
() -> new CustomException(QuestionErrorCode.QUESTION_NOT_FOUND));
5453

55-
verifyUserAuthority(question.getQuiz());
54+
updateQuestionContent(question, request.content());
55+
updateQuestionAnswer(question, request.answer());
5656

57-
TextQuestion textQuestion = question.getTextQuestion();
58-
textQuestion.changeContent(content);
5957
}
6058

61-
private static void verifyUserAuthority(Quiz quiz) {
62-
if (SecurityUtils.getCurrentUserRole() == Role.ADMIN) {
63-
return;
64-
}
65-
if (!Objects.equals(SecurityUtils.getCurrentUserId(), quiz.getCreator().getId())) {
66-
throw new CustomException(AuthErrorCode.FORBIDDEN);
67-
}
68-
}
59+
private void updateQuestionContent(Question question, String content) {
60+
validateContent(content);
6961

70-
@Transactional
71-
public void updateQuestionAnswer(Long questionId, String answer) {
62+
TextQuestion textQuestion = question.getTextQuestion();
63+
textQuestion.changeContent(content);
64+
}
7265

66+
private void updateQuestionAnswer(Question question, String answer) {
7367
validateAnswer(answer);
74-
75-
Question question =
76-
questionRepository
77-
.findById(questionId)
78-
.orElseThrow(
79-
() -> new CustomException(QuestionErrorCode.QUESTION_NOT_FOUND));
80-
81-
verifyUserAuthority(question.getQuiz());
82-
8368
question.changeAnswer(answer);
8469
}
8570

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package io.f1.backend.domain.question.dto;
22

3-
public record QuestionUpdateRequest(String content, String answer) {}
3+
public record QuestionUpdateRequest(Long id, String content, String answer) {}

backend/src/main/java/io/f1/backend/domain/quiz/api/QuizController.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,7 @@ public ResponseEntity<Void> updateQuiz(
5959
@RequestPart(required = false) MultipartFile thumbnailFile,
6060
@RequestPart QuizUpdateRequest request) {
6161

62-
if (request.title() != null) {
63-
quizService.updateQuizTitle(quizId, request.title());
64-
}
65-
66-
if (request.description() != null) {
67-
quizService.updateQuizDesc(quizId, request.description());
68-
}
62+
quizService.updateQuizAndQuestions(quizId, request);
6963

7064
if (thumbnailFile != null && !thumbnailFile.isEmpty()) {
7165
quizService.updateThumbnail(quizId, thumbnailFile);

backend/src/main/java/io/f1/backend/domain/quiz/app/QuizService.java

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import io.f1.backend.domain.question.app.QuestionService;
88
import io.f1.backend.domain.question.dto.QuestionRequest;
9+
import io.f1.backend.domain.question.dto.QuestionUpdateRequest;
910
import io.f1.backend.domain.question.entity.Question;
1011
import io.f1.backend.domain.quiz.dao.QuizRepository;
1112
import io.f1.backend.domain.quiz.dto.QuizCreateRequest;
@@ -14,6 +15,7 @@
1415
import io.f1.backend.domain.quiz.dto.QuizListResponse;
1516
import io.f1.backend.domain.quiz.dto.QuizMinData;
1617
import io.f1.backend.domain.quiz.dto.QuizQuestionListResponse;
18+
import io.f1.backend.domain.quiz.dto.QuizUpdateRequest;
1719
import io.f1.backend.domain.quiz.entity.Quiz;
1820
import io.f1.backend.domain.user.dao.UserRepository;
1921
import io.f1.backend.domain.user.entity.User;
@@ -138,7 +140,7 @@ public void deleteQuiz(Long quizId) {
138140
quizRepository.deleteById(quizId);
139141
}
140142

141-
private static void verifyUserAuthority(Quiz quiz) {
143+
public static void verifyUserAuthority(Quiz quiz) {
142144
if (SecurityUtils.getCurrentUserRole() == Role.ADMIN) {
143145
return;
144146
}
@@ -148,28 +150,30 @@ private static void verifyUserAuthority(Quiz quiz) {
148150
}
149151

150152
@Transactional
151-
public void updateQuizTitle(Long quizId, String title) {
153+
public void updateQuizAndQuestions(Long quizId, QuizUpdateRequest request) {
152154
Quiz quiz =
153-
quizRepository
154-
.findById(quizId)
155-
.orElseThrow(() -> new CustomException(QuizErrorCode.QUIZ_NOT_FOUND));
155+
quizRepository
156+
.findById(quizId)
157+
.orElseThrow(() -> new CustomException(QuizErrorCode.QUIZ_NOT_FOUND));
156158

157159
verifyUserAuthority(quiz);
158160

159-
validateTitle(title);
160-
quiz.changeTitle(title);
161-
}
161+
updateQuizTitle(quiz, request.title());
162+
updateQuizDesc(quiz, request.description());
162163

163-
@Transactional
164-
public void updateQuizDesc(Long quizId, String description) {
164+
List<QuestionUpdateRequest> questionReqList = request.questions();
165165

166-
Quiz quiz =
167-
quizRepository
168-
.findById(quizId)
169-
.orElseThrow(() -> new CustomException(QuizErrorCode.QUIZ_NOT_FOUND));
166+
for(QuestionUpdateRequest questionReq : questionReqList) {
167+
questionService.updateQuestions(questionReq);
168+
}
169+
}
170170

171-
verifyUserAuthority(quiz);
171+
private void updateQuizTitle(Quiz quiz, String title) {
172+
validateTitle(title);
173+
quiz.changeTitle(title);
174+
}
172175

176+
private void updateQuizDesc(Quiz quiz, String description) {
173177
validateDesc(description);
174178
quiz.changeDescription(description);
175179
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
package io.f1.backend.domain.quiz.dto;
22

3-
public record QuizUpdateRequest(String title, String description) {}
3+
import io.f1.backend.domain.question.dto.QuestionUpdateRequest;
4+
import java.util.List;
5+
6+
public record QuizUpdateRequest(String title, String description, List<QuestionUpdateRequest> questions) {}

0 commit comments

Comments
 (0)