From 557b93c41a28c0a5c4db770b72942c8047e79093 Mon Sep 17 00:00:00 2001 From: Hyun Woo Date: Sun, 2 Jun 2024 00:31:08 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat=20:=20=EB=9E=9C=EB=8D=A4=20=ED=80=B4?= =?UTF-8?q?=EC=A6=88=20=EC=9A=94=EC=B2=AD=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/repository/QuizRepository.java | 9 +++++ .../quiz/controller/QuizController.java | 19 +++++++++++ .../domain/quiz/entity/Quiz.java | 2 ++ .../domain/quiz/response/QuizResponse.java | 22 +++++++++++++ .../domain/quiz/service/QuizService.java | 33 +++++++++++++++++++ src/main/resources/application.yml | 1 - 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cmc/cmc15th_hackathon/domain/menu/repository/QuizRepository.java create mode 100644 src/main/java/cmc/cmc15th_hackathon/domain/quiz/controller/QuizController.java create mode 100644 src/main/java/cmc/cmc15th_hackathon/domain/quiz/response/QuizResponse.java create mode 100644 src/main/java/cmc/cmc15th_hackathon/domain/quiz/service/QuizService.java delete mode 100644 src/main/resources/application.yml diff --git a/src/main/java/cmc/cmc15th_hackathon/domain/menu/repository/QuizRepository.java b/src/main/java/cmc/cmc15th_hackathon/domain/menu/repository/QuizRepository.java new file mode 100644 index 0000000..9dd2bc6 --- /dev/null +++ b/src/main/java/cmc/cmc15th_hackathon/domain/menu/repository/QuizRepository.java @@ -0,0 +1,9 @@ +package cmc.cmc15th_hackathon.domain.menu.repository; + +import cmc.cmc15th_hackathon.domain.quiz.entity.Quiz; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface QuizRepository extends JpaRepository { +} diff --git a/src/main/java/cmc/cmc15th_hackathon/domain/quiz/controller/QuizController.java b/src/main/java/cmc/cmc15th_hackathon/domain/quiz/controller/QuizController.java new file mode 100644 index 0000000..300b264 --- /dev/null +++ b/src/main/java/cmc/cmc15th_hackathon/domain/quiz/controller/QuizController.java @@ -0,0 +1,19 @@ +package cmc.cmc15th_hackathon.domain.quiz.controller; + +import cmc.cmc15th_hackathon.domain.quiz.response.QuizResponse; +import cmc.cmc15th_hackathon.domain.quiz.service.QuizService; +import cmc.cmc15th_hackathon.global.common.CustomResponseEntity; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class QuizController { + private final QuizService quizService; + + @GetMapping("/quiz") + public CustomResponseEntity getRandomQuiz() { + return CustomResponseEntity.success(quizService.getRandomQuiz()); + } +} diff --git a/src/main/java/cmc/cmc15th_hackathon/domain/quiz/entity/Quiz.java b/src/main/java/cmc/cmc15th_hackathon/domain/quiz/entity/Quiz.java index e7dd059..0aa777d 100644 --- a/src/main/java/cmc/cmc15th_hackathon/domain/quiz/entity/Quiz.java +++ b/src/main/java/cmc/cmc15th_hackathon/domain/quiz/entity/Quiz.java @@ -5,11 +5,13 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; @Entity @AllArgsConstructor @NoArgsConstructor +@Getter public class Quiz { @Id diff --git a/src/main/java/cmc/cmc15th_hackathon/domain/quiz/response/QuizResponse.java b/src/main/java/cmc/cmc15th_hackathon/domain/quiz/response/QuizResponse.java new file mode 100644 index 0000000..da6bc62 --- /dev/null +++ b/src/main/java/cmc/cmc15th_hackathon/domain/quiz/response/QuizResponse.java @@ -0,0 +1,22 @@ +package cmc.cmc15th_hackathon.domain.quiz.response; + +import lombok.*; + +public class QuizResponse { + + @AllArgsConstructor + @NoArgsConstructor + @Getter + @Builder + public static class Random { + private String content; + private String answer; + + public static QuizResponse.Random to(String content, String answer) { + return Random.builder() + .content(content) + .answer(answer) + .build(); + } + } +} diff --git a/src/main/java/cmc/cmc15th_hackathon/domain/quiz/service/QuizService.java b/src/main/java/cmc/cmc15th_hackathon/domain/quiz/service/QuizService.java new file mode 100644 index 0000000..c16c0ae --- /dev/null +++ b/src/main/java/cmc/cmc15th_hackathon/domain/quiz/service/QuizService.java @@ -0,0 +1,33 @@ +package cmc.cmc15th_hackathon.domain.quiz.service; + +import cmc.cmc15th_hackathon.domain.menu.repository.QuizRepository; +import cmc.cmc15th_hackathon.domain.quiz.entity.Quiz; +import cmc.cmc15th_hackathon.domain.quiz.response.QuizResponse; +import cmc.cmc15th_hackathon.global.common.Result; +import cmc.cmc15th_hackathon.global.exception.CustomException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Random; + +@Service +@RequiredArgsConstructor +public class QuizService { + + private final QuizRepository quizRepository; + + @Transactional(readOnly = true) + public QuizResponse.Random getRandomQuiz() { + Quiz quiz = quizRepository.findById(getRandomNumber()).orElseThrow( + () -> new CustomException(Result.FAIL) + ); + + return QuizResponse.Random.to(quiz.getContent(), quiz.getAnswer()); + } + + public static long getRandomNumber() { + Random random = new Random(); + return random.nextLong(7) + 1; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1 +0,0 @@ - From 32cde3a09ed9fff73a9acf8d162d07ad7ee3bbdb Mon Sep 17 00:00:00 2001 From: Hyun Woo Date: Sun, 2 Jun 2024 00:32:40 +0900 Subject: [PATCH 2/3] =?UTF-8?q?docs/test=20:=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=ED=80=B4=EC=A6=88=20=EC=9A=94=EC=B2=AD=20API=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/quiz/QuizControllerDocsTest.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/test/java/cmc/cmc15th_hackathon/docs/quiz/QuizControllerDocsTest.java diff --git a/src/test/java/cmc/cmc15th_hackathon/docs/quiz/QuizControllerDocsTest.java b/src/test/java/cmc/cmc15th_hackathon/docs/quiz/QuizControllerDocsTest.java new file mode 100644 index 0000000..3d2604d --- /dev/null +++ b/src/test/java/cmc/cmc15th_hackathon/docs/quiz/QuizControllerDocsTest.java @@ -0,0 +1,59 @@ +package cmc.cmc15th_hackathon.docs.quiz; + +import cmc.cmc15th_hackathon.docs.RestDocsSupport; +import cmc.cmc15th_hackathon.domain.quiz.controller.QuizController; +import cmc.cmc15th_hackathon.domain.quiz.response.QuizResponse; +import cmc.cmc15th_hackathon.domain.quiz.service.QuizService; +import com.epages.restdocs.apispec.ResourceSnippetParameters; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; + +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.JsonFieldType.NUMBER; +import static org.springframework.restdocs.payload.JsonFieldType.STRING; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class QuizControllerDocsTest extends RestDocsSupport { + private final QuizService quizService = mock(QuizService.class); + + @Override + protected Object initController() { + return new QuizController(quizService); + } + + @DisplayName("랜덤 퀴즈 요청 API") + @Test + void getRandomQuiz() throws Exception { + // given + given(quizService.getRandomQuiz()) + .willReturn(QuizResponse.Random.builder() + .content("7*6?") + .answer("42") + .build()); + + ResourceSnippetParameters parameters = ResourceSnippetParameters.builder() + .tag("퀴즈 API") + .summary("랜덤 퀴즈 요청 API") + .responseFields( + fieldWithPath("code").type(NUMBER).description("상태 코드"), + fieldWithPath("message").type(STRING).description("상태 메시지"), + fieldWithPath("data.content").type(STRING).description("퀴즈 내용"), + fieldWithPath("data.answer").type(STRING).description("퀴즈 정답")) + .build(); + + RestDocumentationResultHandler document = documentHandler("getRandomQuiz", prettyPrint(), parameters); + + // when // then + mockMvc.perform( + RestDocumentationRequestBuilders.get("/quiz")) + .andDo(print()) + .andExpect(status().isOk()) + .andDo(document); + } +} From 8a80f18102ef1a7344da0bbddb308485258901bc Mon Sep 17 00:00:00 2001 From: Hyun Woo Date: Sun, 2 Jun 2024 00:33:28 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor/test=20:=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=20=EB=94=94=ED=85=8C=EC=9D=BC=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/health/HealthCheckControllerDocsTest.java | 1 - .../cmc15th_hackathon/docs/menu/MenuControllerDocsTest.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/cmc/cmc15th_hackathon/docs/health/HealthCheckControllerDocsTest.java b/src/test/java/cmc/cmc15th_hackathon/docs/health/HealthCheckControllerDocsTest.java index b5b2ad6..18c89b1 100644 --- a/src/test/java/cmc/cmc15th_hackathon/docs/health/HealthCheckControllerDocsTest.java +++ b/src/test/java/cmc/cmc15th_hackathon/docs/health/HealthCheckControllerDocsTest.java @@ -6,7 +6,6 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.http.MediaType; import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; diff --git a/src/test/java/cmc/cmc15th_hackathon/docs/menu/MenuControllerDocsTest.java b/src/test/java/cmc/cmc15th_hackathon/docs/menu/MenuControllerDocsTest.java index d869592..fe0ad75 100644 --- a/src/test/java/cmc/cmc15th_hackathon/docs/menu/MenuControllerDocsTest.java +++ b/src/test/java/cmc/cmc15th_hackathon/docs/menu/MenuControllerDocsTest.java @@ -34,7 +34,7 @@ protected Object initController() { return new MenuController(menuService); } - @DisplayName("모임 장소 추천 조회 리스트 API") + @DisplayName("위치기반 메뉴 추천 조회 API") @Test void keywordCentralizedMeetingSpot() throws Exception { // given @@ -150,7 +150,7 @@ void keywordCentralizedMeetingSpot() throws Exception { parameterWithName("x").description("ex) 37.6823811"), parameterWithName("y").description("ex) 127.232943"), parameterWithName("local").description("역(또는 지역)이름"), - parameterWithName("keyword").description("카페 / 스터디카페 / 식당 / 도서관 / 스터디룸")) + parameterWithName("keyword").description("한식 / 일식 / 양식 / 중식")) .responseFields( fieldWithPath("code").type(NUMBER) .description("상태 코드"),