diff --git a/Backend_Config b/Backend_Config index fecc796..03853da 160000 --- a/Backend_Config +++ b/Backend_Config @@ -1 +1 @@ -Subproject commit fecc796811df62f41fde050e178dd27378808622 +Subproject commit 03853da9fd65f2acf9e61e070cd9148f2c39ebe9 diff --git a/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java b/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java index 6ca21c3..5d175ab 100644 --- a/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java +++ b/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java @@ -1,4 +1,5 @@ -/* 사이퍼 쿼리문 예시 +// 사이퍼 쿼리문 예시 +/* import com.going.server.domain.graph.entity.GraphNode; CREATE (g:KnowledgeGraph { @@ -32,15 +33,15 @@ MATCH (a:GraphNode { nodeId: 2 }), (b:GraphNode { nodeId: 3 }) CREATE (a)-[:RELATED { label: "응고" }]->(b); +// 전체 조회 MATCH (g:KnowledgeGraph { title: "물의 상태 변화" })-[:HAS_NODE]->(n:GraphNode) OPTIONAL MATCH (n)-[r:RELATED]->(m:GraphNode) RETURN g, n, r, m; */ - -/* -package com.going.server.domain.graph; +// 목 데이터 삽입 +/*package com.going.server.domain.graph; import com.going.server.domain.graph.entity.Graph; import com.going.server.domain.graph.entity.GraphEdge; @@ -95,7 +96,7 @@ public void run(String... args) { node.setId(Long.valueOf(arr[0])); node.setLabel(arr[1]); node.setLevel(Integer.parseInt(arr[2])); - node.setDescription(arr[3]); + node.setIncludeSentence(arr[3]); node.setGraph(graph); nodeMap.put(arr[0], node); } @@ -127,4 +128,3 @@ private GraphEdge createEdge(Long edgeId, String label, GraphNode source, GraphN return edge; } }*/ - diff --git a/src/main/java/com/going/server/domain/graph/entity/GraphNode.java b/src/main/java/com/going/server/domain/graph/entity/GraphNode.java index 7281e9c..b0657ed 100644 --- a/src/main/java/com/going/server/domain/graph/entity/GraphNode.java +++ b/src/main/java/com/going/server/domain/graph/entity/GraphNode.java @@ -21,7 +21,7 @@ public class GraphNode { private String label; private int level; - private String description; + private String includeSentence; //해당 노드(단어)가 포함된 문장 @Relationship(type = "HAS_GRAPH", direction = Relationship.Direction.INCOMING) private Graph graph; diff --git a/src/main/java/com/going/server/domain/quiz/controller/QuizController.java b/src/main/java/com/going/server/domain/quiz/controller/QuizController.java index b978861..35890f5 100644 --- a/src/main/java/com/going/server/domain/quiz/controller/QuizController.java +++ b/src/main/java/com/going/server/domain/quiz/controller/QuizController.java @@ -1,6 +1,7 @@ package com.going.server.domain.quiz.controller; import com.going.server.domain.quiz.dto.QuizCreateResponseDto; +import com.going.server.domain.quiz.service.QuizService; import com.going.server.domain.quiz.service.QuizServiceImpl; import com.going.server.global.response.SuccessResponse; import io.swagger.v3.oas.annotations.Operation; @@ -18,9 +19,9 @@ @Tag(name="[캡스톤]ListenUpQuiz", description = "퀴즈 관련 통신을 위한 API") public class QuizController { - private QuizServiceImpl quizService; + private final QuizService quizService; - @PostMapping("/{graphId}?mode={mode}") + @PostMapping("/{graphId}") @Operation(summary = "[퀴즈화면] 퀴즈 생성", description = "퀴즈 화면에서 해당 모드의 퀴즈를 생성합니다.") @ApiResponses({ @ApiResponse( @@ -34,7 +35,7 @@ public class QuizController { }) public SuccessResponse createQuiz(@PathVariable String graphId, @RequestParam String mode) { QuizCreateResponseDto result = quizService.quizCreate(graphId, mode); - return SuccessResponse.of(result); + return SuccessResponse.of(result, "201"); } } diff --git a/src/main/java/com/going/server/domain/quiz/dto/ConnectQuizDto.java b/src/main/java/com/going/server/domain/quiz/dto/ConnectQuizDto.java index 2098b22..564dff5 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/ConnectQuizDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/ConnectQuizDto.java @@ -1,4 +1,9 @@ package com.going.server.domain.quiz.dto; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter public class ConnectQuizDto { } diff --git a/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java b/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java index e4fea1d..ecd81af 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java @@ -1,12 +1,17 @@ package com.going.server.domain.quiz.dto; import lombok.Builder; +import lombok.Getter; + import java.util.List; +@Builder +@Getter public class ListenUpQuizDto { private List quizzes; @Builder + @Getter public static class ListenUpQuiz { private List shuffled; private List answer; diff --git a/src/main/java/com/going/server/domain/quiz/dto/PictureQuizDto.java b/src/main/java/com/going/server/domain/quiz/dto/PictureQuizDto.java index db23b62..d6d5c4b 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/PictureQuizDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/PictureQuizDto.java @@ -1,4 +1,9 @@ package com.going.server.domain.quiz.dto; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter public class PictureQuizDto { } diff --git a/src/main/java/com/going/server/domain/quiz/dto/QuizCreateResponseDto.java b/src/main/java/com/going/server/domain/quiz/dto/QuizCreateResponseDto.java index 35a1f5f..12cd857 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/QuizCreateResponseDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/QuizCreateResponseDto.java @@ -2,9 +2,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; +import lombok.Getter; // 퀴즈 생성 반환 DTO @AllArgsConstructor +@Getter public class QuizCreateResponseDto { private String graphId; private String mode; // listenUp, connect, picture diff --git a/src/main/java/com/going/server/domain/quiz/service/QuizService.java b/src/main/java/com/going/server/domain/quiz/service/QuizService.java index 6126530..544f39c 100644 --- a/src/main/java/com/going/server/domain/quiz/service/QuizService.java +++ b/src/main/java/com/going/server/domain/quiz/service/QuizService.java @@ -3,9 +3,8 @@ import com.going.server.domain.quiz.dto.QuizCreateResponseDto; import org.springframework.stereotype.Service; -@Service public interface QuizService { // 모드 별 퀴즈 생성 - public QuizCreateResponseDto quizCreate(String mode, String graphId); + public QuizCreateResponseDto quizCreate(String graphId, String mode); } diff --git a/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java b/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java index 9239865..926ddd6 100644 --- a/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java +++ b/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java @@ -1,6 +1,7 @@ package com.going.server.domain.quiz.service; import com.going.server.domain.graph.entity.Graph; +import com.going.server.domain.graph.entity.GraphNode; import com.going.server.domain.graph.exception.GraphNotFoundException; import com.going.server.domain.graph.repository.GraphRepository; import com.going.server.domain.quiz.dto.ConnectQuizDto; @@ -8,13 +9,17 @@ import com.going.server.domain.quiz.dto.PictureQuizDto; import com.going.server.domain.quiz.dto.QuizCreateResponseDto; import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import java.util.*; + +@Service @AllArgsConstructor public class QuizServiceImpl implements QuizService{ private final GraphRepository graphRepository; @Override - public QuizCreateResponseDto quizCreate(String mode, String graphIdStr) { + public QuizCreateResponseDto quizCreate(String graphIdStr, String mode) { Long graphId = Long.valueOf(graphIdStr); // 404 : 지식그래프 찾을 수 없음 @@ -42,19 +47,64 @@ public QuizCreateResponseDto quizCreate(String mode, String graphIdStr) { // listenUp 퀴즈 생성 메서드 private ListenUpQuizDto listenUpQuizCreate(Graph graph) { - // TODO : listenUp 퀴즈 생성 로직 작성 - return new ListenUpQuizDto(); + // 최종 리턴할 퀴즈 리스트 (3개) + List quizzes = new ArrayList<>(); + + Random random = new Random(); + + // 몇 개 퀴즈 만들었는지 세기 위한 변수 (3개까지만 만들 거임) + int count = 0; + + // 그래프에 연결된 노드를 하나씩 확인 + for (GraphNode node : graph.getNodes()) { + + // includeSentence가 null이거나 공백이면 건너뛰기 + if (node.getIncludeSentence() == null || node.getIncludeSentence().isBlank()) { + continue; + } + + // includeSentence 문장을 띄어쓰기 기준으로 단어 분리 + String[] words = node.getIncludeSentence().trim().split("\\s+"); + + // 단어 리스트를 정답 리스트로 저장 + List answer = Arrays.asList(words); + + // 정답 리스트를 복사해서 셔플할 리스트로 사용 + List shuffled = new ArrayList<>(answer); + Collections.shuffle(shuffled, random); // 무작위로 단어 순서 섞기 + + // 하나의 퀴즈 생성 + ListenUpQuizDto.ListenUpQuiz quiz = ListenUpQuizDto.ListenUpQuiz.builder() + .answer(answer) // 정답 리스트 + .shuffled(shuffled) // 섞인(문제) 리스트 + .description(node.getIncludeSentence()) // TTS로 읽어줄 원문 문장 + .build(); + + // 퀴즈 리스트에 추가 + quizzes.add(quiz); + count++; + + // 3개 만들었으면 종료 + if (count >= 3) break; + } + + // 최종 퀴즈 DTO에 담아서 리턴 + return ListenUpQuizDto.builder() + .quizzes(quizzes) + .build(); } // connect 퀴즈 생성 메서드 private ConnectQuizDto connectQuizCreate(Graph graph) { // TODO : connect 퀴즈 생성 로직 작성 - return new ConnectQuizDto(); + return ConnectQuizDto.builder() + .build(); } // picture 퀴즈 생성 메서드 private PictureQuizDto pictureQuizCreate(Graph graph) { // TODO : picture 퀴즈 생성 로직 작성 - return new PictureQuizDto(); + return PictureQuizDto.builder() + .build(); } } \ No newline at end of file