From 33d0a89702148b1b0eed7a549437414a6df44ac4 Mon Sep 17 00:00:00 2001 From: NaMinhyeok Date: Thu, 13 Feb 2025 16:27:26 +0900 Subject: [PATCH] =?UTF-8?q?[#59]=20feat:=20=EC=98=A8=EB=B3=B4=EB=94=A9=20?= =?UTF-8?q?=EC=84=A4=EB=AC=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../survey/dto/OnboardingSurveyResponse.java | 5 ++ .../domain/survey/model/OnboardingSurvey.java | 21 +++++ .../domain/survey/model/SurveyType.java | 1 + .../OnboardingSurveyRepository.java | 6 ++ .../domain/survey/service/SurveyService.java | 10 +++ .../survey/service/SurveyServiceTest.java | 60 +++++++++++++ .../survey/controller/SurveyController.java | 5 ++ .../controller/SurveyControllerTest.java | 85 +++++++++++++++++++ 8 files changed, 193 insertions(+) create mode 100644 jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/dto/OnboardingSurveyResponse.java create mode 100644 jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/OnboardingSurvey.java create mode 100644 jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/repository/OnboardingSurveyRepository.java diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/dto/OnboardingSurveyResponse.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/dto/OnboardingSurveyResponse.java new file mode 100644 index 00000000..1d7d961d --- /dev/null +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/dto/OnboardingSurveyResponse.java @@ -0,0 +1,5 @@ +package org.nexters.jaknaesocore.domain.survey.dto; + +import java.util.List; + +public record OnboardingSurveyResponse(List surveyResponses) {} diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/OnboardingSurvey.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/OnboardingSurvey.java new file mode 100644 index 00000000..ff6d8e07 --- /dev/null +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/OnboardingSurvey.java @@ -0,0 +1,21 @@ +package org.nexters.jaknaesocore.domain.survey.model; + +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@DiscriminatorValue("ONBOARDING") +public class OnboardingSurvey extends Survey { + + public OnboardingSurvey(final String content, final SurveyBundle surveyBundle) { + super(content, surveyBundle); + } + + @Override + public SurveyType getSurveyType() { + return SurveyType.ONBOARDING; + } +} diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/SurveyType.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/SurveyType.java index 5fd1ddad..a5db4c4a 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/SurveyType.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/SurveyType.java @@ -3,5 +3,6 @@ public enum SurveyType { MULTIPLE_CHOICE, BALANCE, + ONBOARDING, ; } diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/repository/OnboardingSurveyRepository.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/repository/OnboardingSurveyRepository.java new file mode 100644 index 00000000..49df6d10 --- /dev/null +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/repository/OnboardingSurveyRepository.java @@ -0,0 +1,6 @@ +package org.nexters.jaknaesocore.domain.survey.repository; + +import org.nexters.jaknaesocore.domain.survey.model.OnboardingSurvey; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OnboardingSurveyRepository extends JpaRepository {} diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/service/SurveyService.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/service/SurveyService.java index 2b995dee..30bcf684 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/service/SurveyService.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/service/SurveyService.java @@ -13,6 +13,7 @@ import org.nexters.jaknaesocore.domain.member.repository.MemberRepository; import org.nexters.jaknaesocore.domain.survey.dto.*; import org.nexters.jaknaesocore.domain.survey.model.*; +import org.nexters.jaknaesocore.domain.survey.repository.OnboardingSurveyRepository; import org.nexters.jaknaesocore.domain.survey.repository.SurveyBundleRepository; import org.nexters.jaknaesocore.domain.survey.repository.SurveyRepository; import org.nexters.jaknaesocore.domain.survey.repository.SurveySubmissionRepository; @@ -27,6 +28,7 @@ public class SurveyService { private final SurveyBundleRepository surveyBundleRepository; private final SurveySubmissionRepository surveySubmissionRepository; private final SurveyRepository surveyRepository; + private final OnboardingSurveyRepository onboardingSurveyRepository; @Transactional(readOnly = true) public SurveyResponse getNextSurvey(final Long bundleId, final Long memberId) { @@ -134,4 +136,12 @@ public SurveySubmissionHistoryResponse getSurveySubmissionHistory( Collectors.collectingAndThen( Collectors.toList(), SurveySubmissionHistoryResponse::new)); } + + @Transactional(readOnly = true) + public OnboardingSurveyResponse getOnboardingSurveys() { + List onboardingSurveys = onboardingSurveyRepository.findAll(); + return onboardingSurveys.stream() + .map(SurveyResponse::of) + .collect(Collectors.collectingAndThen(Collectors.toList(), OnboardingSurveyResponse::new)); + } } diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java index 391de6be..cd7d3acd 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java @@ -571,4 +571,64 @@ void throwSurveyNotFoundException() { tuple("나의 행복 지수는", "3점", null, "2025.01.03"), tuple("나는 노는게 좋다.", "4점", "당연히 노는게 좋은거 아닌가?", "2025.02.01")); } + + @Test + void 온보딩_설문_목록을_가져온다() { + // given + Member member = Member.create("나민혁", "test@test.com"); + memberRepository.save(member); + SurveyBundle surveyBundle = new SurveyBundle(); + + surveyBundleRepository.save(surveyBundle); + + OnboardingSurvey survey1 = + new OnboardingSurvey( + "새로운 아이디어를 갖고 창의적인 것이 그/그녀에게 중요하다. 그/그녀는 일을 자신만의 독특한 방식으로 하는 것을 좋아한다.", surveyBundle); + OnboardingSurvey survey2 = + new OnboardingSurvey("그/그녀에게 부자가 되는 것은 중요하다. 많은 돈과 비싼 물건들을 가지길 원한다.", surveyBundle); + OnboardingSurvey survey3 = + new OnboardingSurvey( + "세상의 모든 사람들이 평등하게 대우받아야 한다고 생각한다. 그/그녀는 모든 사람이 인생에서 동등한 기회를 가져야 한다고 믿는다.", + surveyBundle); + OnboardingSurvey survey4 = + new OnboardingSurvey( + "그/그녀에게 자신의 능력을 보여주는 것이 매우 중요하다. 사람들이 자신이 하는 일을 인정해주길 바란다.", surveyBundle); + + surveyRepository.saveAll(List.of(survey1, survey2, survey3, survey4)); + + List scores = + List.of( + KeywordScore.builder().keyword(Keyword.ADVENTURE).score(BigDecimal.ONE).build(), + KeywordScore.builder().keyword(Keyword.BENEVOLENCE).score(BigDecimal.TWO).build()); + + SurveyOption option1 = + SurveyOption.builder().survey(survey1).scores(scores).content("전혀 나와 같지않다.").build(); + SurveyOption option2 = + SurveyOption.builder().survey(survey2).scores(scores).content("나와 같지 않다.").build(); + SurveyOption option3 = + SurveyOption.builder().survey(survey3).scores(scores).content("나와 조금 같다.").build(); + SurveyOption option4 = + SurveyOption.builder().survey(survey4).scores(scores).content("나와 같다.").build(); + + surveyOptionRepository.saveAll(List.of(option1, option2, option3, option4)); + // when + OnboardingSurveyResponse response = surveyService.getOnboardingSurveys(); + // then + then(response.surveyResponses()) + .extracting("id", "contents", "surveyType") + .containsExactly( + tuple( + survey1.getId(), + "새로운 아이디어를 갖고 창의적인 것이 그/그녀에게 중요하다. 그/그녀는 일을 자신만의 독특한 방식으로 하는 것을 좋아한다.", + "ONBOARDING"), + tuple(survey2.getId(), "그/그녀에게 부자가 되는 것은 중요하다. 많은 돈과 비싼 물건들을 가지길 원한다.", "ONBOARDING"), + tuple( + survey3.getId(), + "세상의 모든 사람들이 평등하게 대우받아야 한다고 생각한다. 그/그녀는 모든 사람이 인생에서 동등한 기회를 가져야 한다고 믿는다.", + "ONBOARDING"), + tuple( + survey4.getId(), + "그/그녀에게 자신의 능력을 보여주는 것이 매우 중요하다. 사람들이 자신이 하는 일을 인정해주길 바란다.", + "ONBOARDING")); + } } diff --git a/jaknaeso-server/src/main/java/org/nexters/jaknaesoserver/domain/survey/controller/SurveyController.java b/jaknaeso-server/src/main/java/org/nexters/jaknaesoserver/domain/survey/controller/SurveyController.java index 3301b91f..007d1484 100644 --- a/jaknaeso-server/src/main/java/org/nexters/jaknaesoserver/domain/survey/controller/SurveyController.java +++ b/jaknaeso-server/src/main/java/org/nexters/jaknaesoserver/domain/survey/controller/SurveyController.java @@ -62,4 +62,9 @@ public ApiResponse getSurveyHistoryByMemberId( SurveySubmissionHistoryCommand.builder().bundleId(bundleId).memberId(memberId).build(); return ApiResponse.success(surveyService.getSurveySubmissionHistory(command)); } + + @GetMapping("/onboarding") + public ApiResponse getOnboardingSurvey() { + return ApiResponse.success(surveyService.getOnboardingSurveys()); + } } diff --git a/jaknaeso-server/src/test/java/org/nexters/jaknaesoserver/domain/survey/controller/SurveyControllerTest.java b/jaknaeso-server/src/test/java/org/nexters/jaknaesoserver/domain/survey/controller/SurveyControllerTest.java index 7ef76264..0cc881b2 100644 --- a/jaknaeso-server/src/test/java/org/nexters/jaknaesoserver/domain/survey/controller/SurveyControllerTest.java +++ b/jaknaeso-server/src/test/java/org/nexters/jaknaesoserver/domain/survey/controller/SurveyControllerTest.java @@ -265,4 +265,89 @@ void getSurveyHistory() throws Exception { .with(csrf())) .andExpect(status().isForbidden()); } + + @WithMockCustomUser + @Test + void 온보딩_설문을_조회한다() throws Exception { + OnboardingSurveyResponse response = + new OnboardingSurveyResponse( + List.of( + new SurveyResponse( + 1L, + "새로운 아이디어를 갖고 창의적인 것이 그/그녀에게 중요하다. 그/그녀는 일을 자신만의 독특한 방식으로 하는 것을 좋아한다.", + "ONBOARDING", + List.of( + new SurveyOptionsResponse(1L, "전혀 나와 같지 않다."), + new SurveyOptionsResponse(2L, "나와 같지 않다."), + new SurveyOptionsResponse(3L, "나와 조금 같다."), + new SurveyOptionsResponse(4L, "나와 어느정도 같다."), + new SurveyOptionsResponse(5L, "나와 같다."), + new SurveyOptionsResponse(6L, "나와 매우 같다."))), + new SurveyResponse( + 2L, + "그/그녀에게 부자가 되는 것은 중요하다. 많은 돈과 비싼 물건들을 가지길 원한다.", + "ONBOARDING", + List.of( + new SurveyOptionsResponse(7L, "전혀 나와 같지 않다."), + new SurveyOptionsResponse(8L, "나와 같지 않다."), + new SurveyOptionsResponse(9L, "나와 조금 같다."), + new SurveyOptionsResponse(10L, "나와 어느정도 같다."), + new SurveyOptionsResponse(11L, "나와 같다."), + new SurveyOptionsResponse(12L, "나와 매우 같다."))), + new SurveyResponse( + 3L, + "세상의 모든 사람들이 평등하게 대우받아야 한다고 생각한다. 그/그녀는 모든 사람이 인생에서 동등한 기회를 가져야 한다고 믿는다.", + "ONBOARDING", + List.of( + new SurveyOptionsResponse(13L, "전혀 나와 같지 않다."), + new SurveyOptionsResponse(14L, "나와 같지 않다."), + new SurveyOptionsResponse(15L, "나와 조금 같다."), + new SurveyOptionsResponse(16L, "나와 어느정도 같다."), + new SurveyOptionsResponse(17L, "나와 같다."), + new SurveyOptionsResponse(18L, "나와 매우 같다."))), + new SurveyResponse( + 4L, + "그/그녀에게 자신의 능력을 보여주는 것이 매우 중요하다. 사람들이 자신이 하는 일을 인정해주길 바란다.", + "ONBOARDING", + List.of( + new SurveyOptionsResponse(19L, "전혀 나와 같지 않다."), + new SurveyOptionsResponse(20L, "나와 같지 않다."), + new SurveyOptionsResponse(21L, "나와 조금 같다."), + new SurveyOptionsResponse(22L, "나와 어느정도 같다."), + new SurveyOptionsResponse(23L, "나와 같다."), + new SurveyOptionsResponse(24L, "나와 매우 같다."))))); + given(surveyService.getOnboardingSurveys()).willReturn(response); + + mockMvc + .perform(get("/api/v1/surveys/onboarding").with(csrf())) + .andExpect(status().isOk()) + .andDo( + document( + "survey-get-onboarding", + resource( + ResourceSnippetParameters.builder() + .description("온보딩 설문 조회") + .tag("Survey Domain") + .responseFields( + fieldWithPath("result").type(SimpleType.STRING).description("결과"), + fieldWithPath("data.surveyResponses").description("온보딩 설문"), + fieldWithPath("data.surveyResponses[].id") + .type(SimpleType.NUMBER) + .description("설문 ID"), + fieldWithPath("data.surveyResponses[].contents") + .type(SimpleType.STRING) + .description("설문 내용"), + fieldWithPath("data.surveyResponses[].surveyType") + .type(SimpleType.STRING) + .description("설문 타입"), + fieldWithPath("data.surveyResponses[].options[].id") + .type(SimpleType.NUMBER) + .description("설문지 옵션 ID"), + fieldWithPath("data.surveyResponses[].options[].optionContents") + .type(SimpleType.STRING) + .description("설문지 옵션 내용"), + fieldWithPath("error").description("에러").optional()) + .responseSchema(Schema.schema("onboardingSurveyResponse")) + .build()))); + } }