Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

E-day 프로젝트 - 퀴즈 정답 확인 API(2) 본문

프로젝트/EFUB Eday

E-day 프로젝트 - 퀴즈 정답 확인 API(2)

Hannah0226 2023. 7. 22. 02:37

구현해야 할 것!

  • 앞서 문제 옵션 번호로 Request를 보내면 해당 옵션이 true인지 false인지 응답해주는 API를 작성했다.
  • 이제 해당 옵션이 true인 경우 사용자의 칭호를 업데이트 해주고 level을 올려주는 기능을 구현해야 한다

MemberTitle 객체 만들어주기

MemberTitle, Member, Title 간의 연관관계

 

1. MemberTitle.java

@Entity
@Getter
public class MemberTitle {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "membertitle_id")
    private Long id;

    @Column(name = "get_title", nullable = false)
    private Boolean getTitle;

    @ManyToOne
    @JoinColumn(name = "member_id", nullable = false)
    private Member member;

    @ManyToOne
    @JoinColumn(name = "title_id", nullable = false)
    private Title title;

    @Builder
    public MemberTitle(boolean getTitle, Member member, Title title) {
        this.getTitle = getTitle;
        this.member = member;
        this.title = title;
    }
}

사용자가 퀴즈 정답 맞출 시 칭호 업데이트 해주기

사용자가 퀴즈 정답을 맞출 시 MemberTitle의 getTitle을 true로 바꿔주어야 한다.
 !문제 발생!
→ 해당 퀴즈에 맞는 title_id를 알아야 하는데 Quiz 엔티티는 title 칼럼을 포함하지 않는다.
→ 해당 퀴즈의 subject_id를 조회한 후 그 subject_id를 통해 title을 조회한다.
→ 그 후 member와 title을 통해 memberTitle을 조회한다.
 

1. QuizService

  •  퀴즈 정답 확인 메소드
    • 퀴즈 내용 조회 후, 사용자가 선택한 옵션이 정답인지 확인한다.
    • 정답인 경우, 현재 로그인한 사용자 정보, 해당 subject_id에 해당하는 title(칭호)를 가져와 현재 사용자의 title(칭호)를 조회한다.
    • 만약 해당 타이틀을 아직 획득하지 않았다면, 사용자의 레벨을 1 증가시키고, getTitle을 true로 변경해 칭호 획득 상태로 바꿔준다.
    // 퀴즈 정답 확인
    public boolean checkAnswer(int d_day, int optionNumber){
        Quiz quiz = findQuiz(d_day);

        // 옵션들 중에서 정답인지 확인하는 변수
        boolean isCorrect = false;
        for (Options option : quiz.getOptionsList()) {
            if (option.getOptionNumber() == option_id) {
                isCorrect = option.getIsAnswer();
                break;
            }
        }

        // 정답인 경우
        if (isCorrect) {
            Member member = authService.getCurrentMember();
            Integer subjectId = quiz.getSubject().getId();
            Title title = titleRepository.findBySubjectId(subjectId)
            	.orElseThrow(() -> new IllegalArgumentException("해당 subject_id에 대한 타이틀을 찾을 수 없습니다."));
            MemberTitle memberTitle = memberTitleRepository.findByMemberAndTitle(member, title)
            	.orElseThrow(() -> new IllegalArgumentException("해당 멤버 타이틀을 찾을 수 없습니다."));

            if (!memberTitle.getGetTitle()) {
            	member.setLevel(member.getLevel() + 1);
            }
            memberTitle.setGetTitle(true);
        }

        return isCorrect;
    }

2. TitleRepository

  • 주어진 subjectId에 해당하는 Title 조회
@Repository
public interface TitleRepository extends JpaRepository<Title, Long> {
    Optional<Title> findBySubjectId(Long subjectId);
}

3. MemberTitleRepository

  • 주어진 Member와 Title에 해당하는 MemberTitle 조회
@Repository
public interface MemberTitleRepository extends JpaRepository<MemberTitle, Long> {
    Optional<MemberTitle> findByMemberAndTitle(Member member, Title title);
}

4. QuizController

  •  퀴즈 정답 확인 메소드
    • 퀴즈 서비스를 통해 사용자가 선택한 옵션을 확인하고, 정답 여부를 반환한다.
    • 정답인 경우 해당 D-day의 퀴즈 설명을 가져오고,  정답 여부와 퀴즈 설명을 담아서 응답 DTO 객체를 생성해 반환한다.
//퀴즈 정답 확인
@PostMapping
public QuizAnswerResponseDto checkAnswer(
		@PathVariable int d_day,
		@RequestBody QuizRequestDto quizRequestDto
) {
	boolean isCorrect = quizService.checkAnswer(d_day, quizRequestDto.getOptionId());
	String quizDescription = null;
	if (isCorrect) {
		quizDescription = quizService.getQuizDescription(d_day);
	}
	QuizAnswerResponseDto responseDto = new QuizAnswerResponseDto(isCorrect, quizDescription);
	return responseDto;
}