diff --git a/questions-server/src/docs/asciidoc/index.adoc b/questions-server/src/docs/asciidoc/index.adoc index 48f7d25..0014cdb 100644 --- a/questions-server/src/docs/asciidoc/index.adoc +++ b/questions-server/src/docs/asciidoc/index.adoc @@ -168,4 +168,12 @@ operation::delete-bookmark[snippets='request-headers,query-parameters,http-reque 사용자가 북마크한 문제 목록을 조회합니다. -operation::bookmarked-questions[snippets='request-headers,query-parameters,http-request,http-response,response-fields'] \ No newline at end of file +operation::bookmarked-questions[snippets='request-headers,query-parameters,http-request,http-response,response-fields'] + + +[[resources-check-bookmark]] +==== 북마크된 문제 번호 조회 + +사용자가 북마크한 문제 번호 목록을 조회합니다. + +operation::check-bookmark[snippets='request-headers,query-parameters,http-request,http-response,response-fields'] \ No newline at end of file diff --git a/questions-server/src/main/java/com/example/questionsserver/config/SecurityConfig.java b/questions-server/src/main/java/com/example/questionsserver/config/SecurityConfig.java index 5ee6804..f88f7f6 100644 --- a/questions-server/src/main/java/com/example/questionsserver/config/SecurityConfig.java +++ b/questions-server/src/main/java/com/example/questionsserver/config/SecurityConfig.java @@ -31,7 +31,9 @@ public PasswordEncoder passwordEncoder() { } private final String [] permitArray={ - "/exam" + "/exam", + "/certification/{certificationId}/*", + "/subject/{subjectId}/*" }; diff --git a/questions-server/src/main/java/com/example/questionsserver/controller/ExamController.java b/questions-server/src/main/java/com/example/questionsserver/controller/ExamController.java index 4639a7b..601ef6b 100644 --- a/questions-server/src/main/java/com/example/questionsserver/controller/ExamController.java +++ b/questions-server/src/main/java/com/example/questionsserver/controller/ExamController.java @@ -116,6 +116,12 @@ public ResponseEntity deleteBookMark(@RequestHeader("Authorizati return ResponseEntity.ok().build(); } + @GetMapping("/book-mark") + public ResponseEntity> checkBookmarkAndQuestions(@RequestHeader("Authorization") String authHeader) { + String username = jwtUtils.extractUsername(authHeader); + return ResponseEntity.ok(userQuestionService.checkBookmarkAndQuestions(username)); + } + @GetMapping("/book-mark/question") public ResponseEntity> getBookMarkQuestions(@RequestHeader("Authorization") String authHeader, @RequestParam Long certificationId) { @@ -124,4 +130,6 @@ public ResponseEntity> getBookMarkQuestions(@RequestHeader("Au } + + } diff --git a/questions-server/src/main/java/com/example/questionsserver/dtos/QuestionInfoDto.java b/questions-server/src/main/java/com/example/questionsserver/dtos/QuestionInfoDto.java new file mode 100644 index 0000000..0fa5d38 --- /dev/null +++ b/questions-server/src/main/java/com/example/questionsserver/dtos/QuestionInfoDto.java @@ -0,0 +1,5 @@ +package com.example.questionsserver.dtos; + +public record QuestionInfoDto(Long questionId) { + +} diff --git a/questions-server/src/main/java/com/example/questionsserver/repository/middle/userBookmark/UserBookmarkRepositoryQuery.java b/questions-server/src/main/java/com/example/questionsserver/repository/middle/userBookmark/UserBookmarkRepositoryQuery.java index 740c698..f9d01ff 100644 --- a/questions-server/src/main/java/com/example/questionsserver/repository/middle/userBookmark/UserBookmarkRepositoryQuery.java +++ b/questions-server/src/main/java/com/example/questionsserver/repository/middle/userBookmark/UserBookmarkRepositoryQuery.java @@ -1,9 +1,12 @@ package com.example.questionsserver.repository.middle.userBookmark; import com.example.questionsserver.dtos.QuestionDto; +import com.example.questionsserver.dtos.QuestionInfoDto; import java.util.List; public interface UserBookmarkRepositoryQuery { List getBookMarkQuestion(String username, Long certificationId); + + List checkBookmarkAndQuestions(String username); } diff --git a/questions-server/src/main/java/com/example/questionsserver/repository/middle/userBookmark/UserBookmarkRepositoryQueryImpl.java b/questions-server/src/main/java/com/example/questionsserver/repository/middle/userBookmark/UserBookmarkRepositoryQueryImpl.java index 9df1c86..aecb7f0 100644 --- a/questions-server/src/main/java/com/example/questionsserver/repository/middle/userBookmark/UserBookmarkRepositoryQueryImpl.java +++ b/questions-server/src/main/java/com/example/questionsserver/repository/middle/userBookmark/UserBookmarkRepositoryQueryImpl.java @@ -1,6 +1,7 @@ package com.example.questionsserver.repository.middle.userBookmark; import com.example.questionsserver.dtos.QuestionDto; +import com.example.questionsserver.dtos.QuestionInfoDto; import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; @@ -32,4 +33,15 @@ public List getBookMarkQuestion(String username, Long certification .where(userBookmark.username.eq(username), certification.id.eq(certificationId)) .fetch(); } + + @Override + public List checkBookmarkAndQuestions(String username) { + return queryFactory.select(Projections.constructor(QuestionInfoDto.class, + question.id.as("questionId"))) + .from(userBookmark) + .join(userBookmark.question, question) + .where(userBookmark.username.eq(username)) + .fetch(); + } + } diff --git a/questions-server/src/main/java/com/example/questionsserver/service/middleTable/UserQuestionService.java b/questions-server/src/main/java/com/example/questionsserver/service/middleTable/UserQuestionService.java index 839c8a6..0e0efb3 100644 --- a/questions-server/src/main/java/com/example/questionsserver/service/middleTable/UserQuestionService.java +++ b/questions-server/src/main/java/com/example/questionsserver/service/middleTable/UserQuestionService.java @@ -3,6 +3,7 @@ import com.example.questionsserver.dtos.AnswerRecordDto; import com.example.questionsserver.dtos.AnswerSubmitDTO; import com.example.questionsserver.dtos.QuestionDto; +import com.example.questionsserver.dtos.QuestionInfoDto; import com.example.questionsserver.entity.middleTable.UserQuestion; import java.util.List; @@ -19,4 +20,6 @@ public interface UserQuestionService { List getBookMarkQuestion(String username, Long certificationId); void deleteBookMark(String username, Long questionId); + + List checkBookmarkAndQuestions(String username); } diff --git a/questions-server/src/main/java/com/example/questionsserver/service/middleTable/UserQuestionServiceImpl.java b/questions-server/src/main/java/com/example/questionsserver/service/middleTable/UserQuestionServiceImpl.java index 7aa296a..0d94aa2 100644 --- a/questions-server/src/main/java/com/example/questionsserver/service/middleTable/UserQuestionServiceImpl.java +++ b/questions-server/src/main/java/com/example/questionsserver/service/middleTable/UserQuestionServiceImpl.java @@ -3,6 +3,7 @@ import com.example.questionsserver.dtos.AnswerRecordDto; import com.example.questionsserver.dtos.AnswerSubmitDTO; import com.example.questionsserver.dtos.QuestionDto; +import com.example.questionsserver.dtos.QuestionInfoDto; import com.example.questionsserver.entity.Question; import com.example.questionsserver.entity.middleTable.UserBookmark; import com.example.questionsserver.entity.middleTable.UserQuestion; @@ -106,6 +107,11 @@ public void deleteBookMark(String username, Long questionId) { } + @Override + public List checkBookmarkAndQuestions(String username) { + return userBookmarkRepository.checkBookmarkAndQuestions(username); + } + @Override @Transactional(readOnly = true) @Cacheable(value = "userBookmarks", key = "#username + '_' + #certificationId") diff --git a/questions-server/src/test/java/com/example/questionsserver/controller/BasicExamControllerTest.java b/questions-server/src/test/java/com/example/questionsserver/controller/BasicExamControllerTest.java index 67ffb49..559d321 100644 --- a/questions-server/src/test/java/com/example/questionsserver/controller/BasicExamControllerTest.java +++ b/questions-server/src/test/java/com/example/questionsserver/controller/BasicExamControllerTest.java @@ -408,6 +408,32 @@ void createBookmark() throws Exception { )); } + + @Test + @DisplayName("북마크 확인 API") + void checkBookmarkAndQuestions() throws Exception { + // given + when(userQuestionService.checkBookmarkAndQuestions(anyString())) + .thenReturn(ExamFixture.createCheckBookmarkAndQuestions()); + // when & then + mockMvc.perform(get("/exam/book-mark") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) + .header(HttpHeaders.AUTHORIZATION, "Bearer jwt-token-here")) + .andDo(print()) + .andExpect(status().isOk()) + .andDo(document("check-bookmark", + ApiDocumentUtils.getDocumentRequest(), + ApiDocumentUtils.getDocumentResponse(), + requestHeaders( + headerWithName("Authorization").description("JWT 인증 토큰") + ), responseFields( + fieldWithPath("[].questionId").type(JsonFieldType.NUMBER) + .description("문제 ID") + ) + )); + } + @Test @DisplayName("북마크 삭제 API") void deleteBookmark() throws Exception { diff --git a/questions-server/src/test/java/com/example/questionsserver/fixtures/ExamFixture.java b/questions-server/src/test/java/com/example/questionsserver/fixtures/ExamFixture.java index 5aac83d..c301275 100644 --- a/questions-server/src/test/java/com/example/questionsserver/fixtures/ExamFixture.java +++ b/questions-server/src/test/java/com/example/questionsserver/fixtures/ExamFixture.java @@ -4,6 +4,7 @@ import com.example.questionsserver.entity.middleTable.UserQuestion; import java.util.Arrays; +import java.util.Collections; import java.util.List; public class ExamFixture { @@ -62,4 +63,12 @@ public static AnswerRecordDto createAnswerRecord() { return new AnswerRecordDto(1L, UserQuestion.Status.CORRECT); } + public static List createCheckBookmarkAndQuestions() { + return Collections.singletonList( + new QuestionInfoDto(1L)); + } + + + + } \ No newline at end of file