Skip to content

Commit e762633

Browse files
authored
Merge pull request #99 from Team-Wable/feat/#95
[FEAT] grade quiz api
2 parents 0736f72 + 66736db commit e762633

File tree

8 files changed

+171
-4
lines changed

8 files changed

+171
-4
lines changed

WableServer/src/main/java/com/wable/www/WableServer/api/member/domain/Member.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import lombok.Getter;
1111
import lombok.NoArgsConstructor;
1212

13+
import java.time.LocalDate;
1314
import java.time.LocalDateTime;
1415
import java.util.ArrayList;
1516
import java.util.List;
@@ -104,6 +105,12 @@ public class Member extends BaseTimeEntity {
104105
@Column(name = "member_community")
105106
private String memberCommunity;
106107

108+
@Column(name = "member_quiz_date")
109+
private LocalDate memberQuizDate;
110+
111+
@Column(name = "member_quiz_count", columnDefinition = "INTEGER DEFAULT 0")
112+
private int memberQuizCount;
113+
107114
@Builder
108115
private Member(String nickname, SocialPlatform socialPlatform, String socialId, String profileUrl, String memberEmail, String socialNickname) {
109116
this.nickname = nickname;
@@ -120,6 +127,7 @@ private Member(String nickname, SocialPlatform socialPlatform, String socialId,
120127
this.memberExp = 0;
121128
this.memberBanCount = 0;
122129
this.memberCommunity = null;
130+
this.memberQuizCount = 0;
123131
}
124132

125133
public void decreaseGhost() {
@@ -180,4 +188,14 @@ public void softDelete() {
180188
public void updateMemberCommunity(String memberCommunity) {
181189
this.memberCommunity = memberCommunity;
182190
}
191+
192+
public void increaseExpQuizRight() { this.memberExp += 15.0;}
193+
194+
public void increaseExpQuizWrong() { this.memberExp += 8.0;}
195+
196+
public void increaseQuizCount() { this.memberQuizCount += 1;}
197+
198+
public void updateQuizCount() { this.memberQuizCount = 1;}
199+
200+
public void updateMemberQuizDate(LocalDate localDate) { this.memberQuizDate = localDate;}
183201
}

WableServer/src/main/java/com/wable/www/WableServer/api/quiz/controller/QuizController.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package com.wable.www.WableServer.api.quiz.controller;
22

3+
import com.wable.www.WableServer.api.quiz.dto.request.QuizGradeRequestDto;
34
import com.wable.www.WableServer.api.quiz.dto.response.QuizGetResponseDto;
5+
import com.wable.www.WableServer.api.quiz.dto.response.QuizGradeResponseDto;
6+
import com.wable.www.WableServer.api.quiz.service.QuizCommandService;
47
import com.wable.www.WableServer.api.quiz.service.QuizQueryService;
58
import com.wable.www.WableServer.common.response.ApiResponse;
9+
import com.wable.www.WableServer.common.util.MemberUtil;
610
import io.swagger.v3.oas.annotations.Operation;
711
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
812
import io.swagger.v3.oas.annotations.tags.Tag;
913
import lombok.RequiredArgsConstructor;
1014
import org.springframework.http.ResponseEntity;
11-
import org.springframework.web.bind.annotation.GetMapping;
12-
import org.springframework.web.bind.annotation.RequestMapping;
13-
import org.springframework.web.bind.annotation.RestController;
15+
import org.springframework.web.bind.annotation.*;
1416

1517
import java.security.Principal;
1618

@@ -23,10 +25,17 @@
2325
@Tag(name="퀴즈 관련",description = "Quiz Api Document")
2426
public class QuizController {
2527
private final QuizQueryService quizQueryService;
28+
private final QuizCommandService quizCommandService;
2629

2730
@GetMapping("v1/quiz")
2831
@Operation(summary = "퀴즈 조회 API 입니다.",description = "Quiz Get")
2932
public ResponseEntity<ApiResponse<QuizGetResponseDto>> getQuiz(Principal principal) {
3033
return ApiResponse.success(GET_QUIZ_SUCCESS, quizQueryService.getQuiz());
3134
}
35+
36+
@PatchMapping("v1/quiz/grade")
37+
@Operation(summary = "퀴즈 채점 API 입니다.",description = "Quiz Grade")
38+
public ResponseEntity<ApiResponse<QuizGradeResponseDto>> gradeQuiz(Principal principal, @RequestBody QuizGradeRequestDto quizGradeRequestDto) {
39+
return ApiResponse.success(GRADE_QUIZ_SUCCESS, quizCommandService.gradeQuiz(MemberUtil.getMemberId(principal), quizGradeRequestDto));
40+
}
3241
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.wable.www.WableServer.api.quiz.domain;
2+
3+
import jakarta.persistence.*;
4+
import lombok.AccessLevel;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import static lombok.AccessLevel.PROTECTED;
10+
11+
@Entity
12+
@Getter
13+
@NoArgsConstructor(access = PROTECTED)
14+
public class QuizTime {
15+
@Id
16+
@GeneratedValue(strategy = GenerationType.IDENTITY)
17+
private Long id;
18+
19+
@Column(name = "quiz_id")
20+
private Long quizId;
21+
22+
@Column(name = "quiz_time")
23+
private int quizTime;
24+
25+
@Builder
26+
public QuizTime(Long quizId, int quizTime) {
27+
this.quizId = quizId;
28+
this.quizTime = quizTime;
29+
}
30+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.wable.www.WableServer.api.quiz.dto.request;
2+
3+
public record QuizGradeRequestDto(
4+
Long quizId,
5+
Boolean userAnswer,
6+
int quizTime
7+
) {
8+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.wable.www.WableServer.api.quiz.dto.response;
2+
3+
public record QuizGradeResponseDto(
4+
Boolean quizResult,
5+
int userPercent,
6+
int continueNumber
7+
) {
8+
public static QuizGradeResponseDto of(Boolean quizResult, int userPercent, int continueNumber) {
9+
return new QuizGradeResponseDto(
10+
quizResult,
11+
userPercent,
12+
continueNumber
13+
);
14+
}
15+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.wable.www.WableServer.api.quiz.repository;
2+
3+
import com.wable.www.WableServer.api.quiz.domain.QuizTime;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
import java.util.List;
7+
8+
public interface QuizTimeRepository extends JpaRepository<QuizTime,Long> {
9+
List<QuizTime> findAllByQuizIdOrderByQuizTimeAsc(Long quizId);
10+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.wable.www.WableServer.api.quiz.service;
2+
3+
import com.wable.www.WableServer.api.member.domain.Member;
4+
import com.wable.www.WableServer.api.member.repository.MemberRepository;
5+
import com.wable.www.WableServer.api.quiz.domain.Quiz;
6+
import com.wable.www.WableServer.api.quiz.domain.QuizTime;
7+
import com.wable.www.WableServer.api.quiz.dto.request.QuizGradeRequestDto;
8+
import com.wable.www.WableServer.api.quiz.dto.response.QuizGradeResponseDto;
9+
import com.wable.www.WableServer.api.quiz.repository.QuizRepository;
10+
import com.wable.www.WableServer.api.quiz.repository.QuizTimeRepository;
11+
import lombok.RequiredArgsConstructor;
12+
import org.springframework.stereotype.Service;
13+
import org.springframework.transaction.annotation.Transactional;
14+
15+
import java.time.LocalDate;
16+
import java.time.Period;
17+
import java.util.List;
18+
19+
@Service
20+
@RequiredArgsConstructor
21+
@Transactional
22+
public class QuizCommandService {
23+
private final QuizRepository quizRepository;
24+
private final QuizTimeRepository quizTimeRepository;
25+
private final MemberRepository memberRepository;
26+
27+
public QuizGradeResponseDto gradeQuiz(Long memberId, QuizGradeRequestDto quizGradeRequestDto) {
28+
Member member = memberRepository.findMemberByIdOrThrow(memberId);
29+
LocalDate today = LocalDate.now();
30+
LocalDate memberQuizDate = member.getMemberQuizDate();
31+
int memberQuizCount = member.getMemberQuizCount();
32+
Quiz quiz = quizRepository.findQuizById(quizGradeRequestDto.quizId());
33+
Boolean quizResult = quiz.getQuizAnswer()==quizGradeRequestDto.userAnswer();
34+
35+
QuizTime newQuizTime = quizTimeRepository.save(QuizTime.builder()
36+
.quizId(quizGradeRequestDto.quizId())
37+
.quizTime(quizGradeRequestDto.quizTime())
38+
.build());
39+
40+
List<QuizTime> quizTimes = quizTimeRepository.findAllByQuizIdOrderByQuizTimeAsc(quizGradeRequestDto.quizId());
41+
int rank = 1;
42+
for(int i = 0; i < quizTimes.size(); i++) {
43+
if(quizTimes.get(i).getId().equals(newQuizTime.getId())){
44+
rank = i + 1;
45+
break;
46+
}
47+
}
48+
double percent = ((double) rank / quizTimes.size()) * 100;
49+
int memberPercent = (int) Math.floor(percent);
50+
51+
if(quizResult){
52+
member.increaseExpQuizRight();
53+
}else {
54+
member.increaseExpQuizWrong();
55+
}
56+
57+
if(compareDate(memberQuizDate,today)){
58+
member.updateMemberQuizDate(today);
59+
member.increaseQuizCount();
60+
return QuizGradeResponseDto.of(quizResult,memberPercent,memberQuizCount + 1);
61+
}else{
62+
member.updateMemberQuizDate(today);
63+
member.updateQuizCount();
64+
return QuizGradeResponseDto.of(quizResult,memberPercent,1);
65+
}
66+
67+
68+
}
69+
public boolean compareDate(LocalDate date1, LocalDate date2) {
70+
if(date1==null||date2==null) {
71+
return false;
72+
}
73+
int diff = Math.abs(Period.between(date1,date2).getDays());
74+
return diff == 1;
75+
}
76+
}

WableServer/src/main/java/com/wable/www/WableServer/common/response/SuccessStatus.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ public enum SuccessStatus {
9393
/**
9494
* Quiz
9595
*/
96-
GET_QUIZ_SUCCESS(HttpStatus.OK, "퀴즈 조회 성공")
96+
GET_QUIZ_SUCCESS(HttpStatus.OK, "퀴즈 조회 성공"),
97+
GRADE_QUIZ_SUCCESS(HttpStatus.OK, "퀴즈 채점 성공")
9798
;
9899

99100
private final HttpStatus httpStatus;

0 commit comments

Comments
 (0)