공hannah부
E-day 프로젝트 - 퀴즈 정답 확인 API(2) 본문
구현해야 할 것!
- 앞서 문제 옵션 번호로 Request를 보내면 해당 옵션이 true인지 false인지 응답해주는 API를 작성했다.
- 이제 해당 옵션이 true인 경우 사용자의 칭호를 업데이트 해주고 level을 올려주는 기능을 구현해야 한다
MemberTitle 객체 만들어주기
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;
}
'프로젝트 > EFUB Eday' 카테고리의 다른 글
E-day 프로젝트 - 퀴즈 정답 확인 API(4) (0) | 2023.07.24 |
---|---|
E-day 프로젝트 - 퀴즈 정답 확인 API(3) (0) | 2023.07.23 |
E-day 프로젝트 - 퀴즈 정답 확인 API(1) (0) | 2023.07.20 |
E-day 프로젝트 - 퀴즈 내용 보기 API (0) | 2023.07.20 |
E-day 프로젝트 - 기획안 (0) | 2023.07.20 |