Skip to content

Commit

Permalink
Merge pull request #4 from Hackathon-PassOn/feat/get-random-quiz-api
Browse files Browse the repository at this point in the history
feat : 랜덤 퀴즈 요청 API 구현
  • Loading branch information
1000kkannoo authored Jun 1, 2024
2 parents c031df2 + 8a80f18 commit 0c7dc21
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -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<Quiz, Long> {
}
Original file line number Diff line number Diff line change
@@ -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<QuizResponse.Random> getRandomQuiz() {
return CustomResponseEntity.success(quizService.getRandomQuiz());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
1 change: 0 additions & 1 deletion src/main/resources/application.yml

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ protected Object initController() {
return new MenuController(menuService);
}

@DisplayName("모임 장소 추천 조회 리스트 API")
@DisplayName("위치기반 메뉴 추천 조회 API")
@Test
void keywordCentralizedMeetingSpot() throws Exception {
// given
Expand Down Expand Up @@ -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("상태 코드"),
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit 0c7dc21

Please sign in to comment.