Skip to content

Commit

Permalink
Merge pull request #39 from Team-Umbba/feat/#36-make_custom_qna_list
Browse files Browse the repository at this point in the history
[FEAT] 온보딩에서 진행한 선택질문에 따라 사용자에게 맞춘 질문 리스트 생성 기능 구현
  • Loading branch information
ddongseop authored Jul 14, 2023
2 parents ab51aac + 3801d40 commit 819745c
Show file tree
Hide file tree
Showing 12 changed files with 197 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import sopt.org.umbbaServer.domain.parentchild.controller.dto.response.OnboardingReceiveResponseDto;
import sopt.org.umbbaServer.domain.parentchild.controller.dto.response.OnboardingInviteResponseDto;
import sopt.org.umbbaServer.domain.parentchild.service.ParentchildService;
import sopt.org.umbbaServer.domain.qna.service.QnAService;
import sopt.org.umbbaServer.global.common.dto.ApiResponse;
import sopt.org.umbbaServer.global.config.jwt.JwtProvider;
import sopt.org.umbbaServer.global.exception.SuccessType;
Expand All @@ -24,28 +25,34 @@
public class ParentchildController {

private final ParentchildService parentchildService;
private final QnAService qnAService;

@PostMapping("/onboard/invite")
@ResponseStatus(HttpStatus.CREATED)
public ApiResponse<OnboardingInviteResponseDto> onboardInvite(@RequestBody @Valid final OnboardingInviteRequestDto request, Principal principal) {
return ApiResponse.success(SuccessType.CREATE_PARENT_CHILD_SUCCESS, parentchildService.onboardInvite(JwtProvider.getUserFromPrincial(principal), request));

Long userId = JwtProvider.getUserFromPrincial(principal);
OnboardingInviteResponseDto response = parentchildService.onboardInvite(userId, request);
qnAService.filterFirstQuestion(userId, request.getOnboardingAnswerList());

return ApiResponse.success(SuccessType.CREATE_PARENT_CHILD_SUCCESS, response);
}

@PatchMapping("/onboard/match")
@ResponseStatus(HttpStatus.OK)
public ApiResponse<InviteResultResponseDto> inviteRelation(@RequestBody @Valid final InviteCodeRequestDto request, Principal principal) {
log.info("getUserFromPrincipal에는 문제가 없어요 - 요청 초대코드: {}", request.getInviteCode());

// Long userId = JwtProvider.getUserFromPrincial(principal);
log.info("ParentchlidController 실행 - 요청 초대코드: {}", request.getInviteCode());
return ApiResponse.success(SuccessType.MATCH_PARENT_CHILD_SUCCESS, parentchildService.matchRelation(JwtProvider.getUserFromPrincial(principal), request));

}

@PatchMapping("/onboard/receive")
@ResponseStatus(HttpStatus.OK)
public ApiResponse<OnboardingReceiveResponseDto> onboardReceive(@RequestBody @Valid final OnboardingReceiveRequestDto request, Principal principal) {
return ApiResponse.success(SuccessType.CREATE_PARENT_CHILD_SUCCESS, parentchildService.onboardReceive(JwtProvider.getUserFromPrincial(principal), request));

Long userId = JwtProvider.getUserFromPrincial(principal);
OnboardingReceiveResponseDto response = parentchildService.onboardReceive(userId, request);
qnAService.filterAllQuestion(userId, request.getOnboardingAnswerList());

return ApiResponse.success(SuccessType.CREATE_PARENT_CHILD_SUCCESS, response);
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import sopt.org.umbbaServer.domain.qna.model.OnboardingAnswer;
import sopt.org.umbbaServer.domain.user.controller.dto.request.UserInfoDto;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.time.LocalTime;
import java.util.List;

@Slf4j
@Getter
Expand All @@ -32,6 +34,5 @@ public class OnboardingInviteRequestDto {
@JsonFormat(pattern = "kk:mm")
private LocalTime pushTime;

// TODO 선택질문에 대한 답변 필드 추가 필요

private List<OnboardingAnswer> onboardingAnswerList;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,25 @@
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import sopt.org.umbbaServer.domain.qna.model.OnboardingAnswer;
import sopt.org.umbbaServer.domain.user.controller.dto.request.UserInfoDto;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class OnboardingReceiveRequestDto {

@NotBlank(message = "부모자식 관계 아이디는 필수 입력 값입니다.")
@NonNull
private Long parentChildId;

@NotNull
@Valid
private UserInfoDto userInfo;

private List<OnboardingAnswer> onboardingAnswerList;
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package sopt.org.umbbaServer.domain.parentchild.model;

import lombok.*;
import sopt.org.umbbaServer.domain.qna.model.OnboardingAnswer;
import sopt.org.umbbaServer.domain.qna.model.QnA;
import sopt.org.umbbaServer.global.util.AuditingTimeEntity;

import javax.persistence.*;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

@Entity
Expand All @@ -30,14 +32,27 @@ public class Parentchild extends AuditingTimeEntity {
@Column(nullable = false)
private boolean isInvitorChild;

// TODO 기획에 따라 변경사항 있음
private boolean liveTogether;
@Enumerated(EnumType.STRING)
@Column(name = "answer", nullable = false)
@ElementCollection
private List<OnboardingAnswer> childOnboardingAnswerList = new ArrayList<>();

@Enumerated(EnumType.STRING)
@Column(name = "answer", nullable = false)
@ElementCollection
private List<OnboardingAnswer> parentOnboardingAnswerList = new ArrayList<>();

public void changeChildOnboardingAnswerList(List<OnboardingAnswer> onboardingAnswerList) {
this.childOnboardingAnswerList = onboardingAnswerList;
}
public void changeParentOnboardingAnswerList(List<OnboardingAnswer> onboardingAnswerList) {
this.parentOnboardingAnswerList = onboardingAnswerList;
}

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private ParentchildRelation relation;


@Column(nullable = false)
private LocalTime pushTime; // default: 오후 11시(클라이언트)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ public class ParentchildService {
@Transactional
public OnboardingInviteResponseDto onboardInvite(Long userId, OnboardingInviteRequestDto request) {

// TODO userId 토큰 provider에서 정보 꺼내오도록
User user = getUserById(userId);
user.updateOnboardingInfo(
request.getUserInfo().getName(),
Expand All @@ -49,7 +48,6 @@ public OnboardingInviteResponseDto onboardInvite(Long userId, OnboardingInviteRe
user.updateIsMeChild(request.getIsInvitorChild());
log.info("업데이트 된 isMeChild 필드: {}", user.isMeChild());


Parentchild parentchild = Parentchild.builder()
.inviteCode(generateInviteCode())
.isInvitorChild(request.getIsInvitorChild())
Expand All @@ -74,7 +72,6 @@ public OnboardingReceiveResponseDto onboardReceive(Long userId, OnboardingReceiv
request.getUserInfo().getBornYear()
);


// TODO 추가 질문 답변 저장
Parentchild parentchild = getParentchildById(request.getParentChildId());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,6 @@ public ApiResponse<TodayQnAResponseDto> getTodayQna(Principal principal) {
return ApiResponse.success(SuccessType.GET_TODAY_QNA_SUCCESS, qnAService.getTodayQnA(JwtProvider.getUserFromPrincial(principal)));
}

@GetMapping("/qna/dummy")
@ResponseStatus(HttpStatus.OK)
public ApiResponse dummy() {
qnAService.createQnA();

return ApiResponse.success(SuccessType.GET_TODAY_QNA_SUCCESS);
}

@PostMapping("/qna/answer")
@ResponseStatus(HttpStatus.CREATED)
public ApiResponse answerTodayQuestion(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package sopt.org.umbbaServer.domain.qna.model;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum OnboardingAnswer {

YES("응"),
NO("아니"),
SKIP("잘 모르겠어");

private final String value;
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,14 @@ public class Question extends AuditingTimeEntity {
@Column(nullable = false)
private String childQuestion;

@Column(nullable = false)
private String topic;

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private QuestionSection section;

@Column(nullable = false)
private String topic;
@Enumerated(EnumType.STRING)
private QuestionGroup group;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package sopt.org.umbbaServer.domain.qna.model;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum QuestionGroup {

GROUP1(1L, "그룹1"),
GROUP2(2L, "그룹2"),
GROUP3(3L, "그룹3"),
GROUP4(4L, "그룹4"),
GROUP5(5L, "그룹5"),
GROUP6(6L, "그룹6"),
GROUP7(7L, "그룹7");

private final Long groupId;
private final String description;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum QuestionSection {
YOUNG(1L, "어린시절"),
SCHOOL(2L, "학창시절"),
GOLDEN(3L, "청춘시절"),
COUPLE(4L, "연애시절"),
MARRIAGE(5L, "결혼시절");
YOUNG(1L, "어린시절", 1),
SCHOOL(2L, "학창시절", 2),
GOLDEN(3L, "청춘시절", 2),
COUPLE(4L, "연애시절", 1),
MARRIAGE(5L, "결혼시절", 1);

private final Long sectionId;
private final String value;
private final int questionCount;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,37 @@

import org.springframework.data.repository.Repository;
import sopt.org.umbbaServer.domain.qna.model.Question;
import sopt.org.umbbaServer.domain.qna.model.QuestionGroup;
import sopt.org.umbbaServer.domain.qna.model.QuestionSection;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;


public interface QuestionRepository extends Repository<Question, Long> {

Optional<Question> findById(Long id);
}

List<Question> findBySectionAndGroup(QuestionSection section, QuestionGroup group);

default List<Question> findBySectionAndGroupRandom(QuestionSection section, QuestionGroup group, int size) {
List<Question> matchingQuestions = findBySectionAndGroup(section, group);
List<Question> selectedQuestions = new ArrayList<>();

int totalMatchingQuestions = matchingQuestions.size();
int numQuestionsToSelect = Math.min(totalMatchingQuestions, size);
Random random = new Random();

for (int i = 0; i < numQuestionsToSelect; i++) {
int randomIndex = random.nextInt(totalMatchingQuestions);
Question selectedQuestion = matchingQuestions.get(randomIndex);
selectedQuestions.add(selectedQuestion);
matchingQuestions.remove(randomIndex);
totalMatchingQuestions--;
}

return selectedQuestions;
}
}
Loading

0 comments on commit 819745c

Please sign in to comment.