
--- src/main/java/com/example/educatback/Application/MemberAppService.java
+++ src/main/java/com/example/educatback/Application/MemberAppService.java
... | ... | @@ -3,6 +3,7 @@ |
3 | 3 |
import com.example.educatback.DuplicateIdException; |
4 | 4 |
import com.example.educatback.controller.request.MemberRequest; |
5 | 5 |
import com.example.educatback.controller.response.MemberResponse; |
6 |
+import com.example.educatback.controller.response.StudentTotalScoreDTO; |
|
6 | 7 |
import com.example.educatback.model.entity.Member; |
7 | 8 |
import com.example.educatback.model.entity.Solved; |
8 | 9 |
import com.example.educatback.model.repository.MemberRepository; |
... | ... | @@ -12,8 +13,10 @@ |
12 | 13 |
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; |
13 | 14 |
import org.springframework.stereotype.Service; |
14 | 15 |
|
16 |
+import java.util.Comparator; |
|
15 | 17 |
import java.util.List; |
16 | 18 |
import java.util.Optional; |
19 |
+import java.util.stream.Collectors; |
|
17 | 20 |
|
18 | 21 |
@Service |
19 | 22 |
@RequiredArgsConstructor |
... | ... | @@ -86,4 +89,31 @@ |
86 | 89 |
System.out.println("solved 하고나서"); |
87 | 90 |
return member.get().getSolveds(); |
88 | 91 |
} |
92 |
+ |
|
93 |
+ public List<MemberResponse.Detail> getMembersWithNullRole() { |
|
94 |
+ List<Member> membersWithNullRole = memberRepository.findByRoleIsNull(); |
|
95 |
+ return membersWithNullRole.stream() |
|
96 |
+ .map(MemberResponse.Detail::of) |
|
97 |
+ .sorted(Comparator.comparing(MemberResponse.Detail::getName)) // name으로 정렬 |
|
98 |
+ .collect(Collectors.toList()); |
|
99 |
+ } |
|
100 |
+ |
|
101 |
+ public StudentTotalScoreDTO calculateAverageTotalScore() { |
|
102 |
+ List<Member> students = memberRepository.findAll(); |
|
103 |
+ int count = students.size(); |
|
104 |
+ double totalTotalScore = 0; |
|
105 |
+ |
|
106 |
+ for (Member student : students) { |
|
107 |
+ int totalScore = student.getFocus() + student.getExpression() + student.getUnderstand() + |
|
108 |
+ student.getWord() + student.getSentence() + student.getGrammar(); |
|
109 |
+ totalTotalScore += totalScore; |
|
110 |
+ } |
|
111 |
+ |
|
112 |
+ double averageTotalScore = totalTotalScore / count; |
|
113 |
+ |
|
114 |
+ StudentTotalScoreDTO totalScoreDTO = new StudentTotalScoreDTO(); |
|
115 |
+ totalScoreDTO.setAverageTotalScore(averageTotalScore); |
|
116 |
+ |
|
117 |
+ return totalScoreDTO; |
|
118 |
+ } |
|
89 | 119 |
} |
--- src/main/java/com/example/educatback/Application/ScoreLogService.java
+++ src/main/java/com/example/educatback/Application/ScoreLogService.java
... | ... | @@ -38,4 +38,10 @@ |
38 | 38 |
.map(ScoreLogResponseDTO.DailyAverageScore::fromObjectArray) |
39 | 39 |
.collect(Collectors.toList()); |
40 | 40 |
} |
41 |
+ public List<ScoreLogResponseDTO.DailyAverageScore> getDailyAverageScores() { |
|
42 |
+ List<Object[]> averages = scoreLogRepository.findDailyAverageScores(); |
|
43 |
+ return averages.stream() |
|
44 |
+ .map(ScoreLogResponseDTO.DailyAverageScore::fromObjectArray) |
|
45 |
+ .collect(Collectors.toList()); |
|
46 |
+ } |
|
41 | 47 |
} |
--- src/main/java/com/example/educatback/controller/MemberController.java
+++ src/main/java/com/example/educatback/controller/MemberController.java
... | ... | @@ -3,14 +3,15 @@ |
3 | 3 |
import com.example.educatback.Application.MemberAppService; |
4 | 4 |
import com.example.educatback.DuplicateIdException; |
5 | 5 |
import com.example.educatback.controller.request.MemberRequest; |
6 |
-import com.example.educatback.controller.response.ApiResponse; |
|
7 |
-import com.example.educatback.controller.response.MemberResponse; |
|
8 |
-import com.example.educatback.controller.response.ResponseCode; |
|
9 |
-import com.example.educatback.controller.response.SolvedResponse; |
|
6 |
+import com.example.educatback.controller.response.*; |
|
7 |
+import com.example.educatback.model.entity.Member; |
|
10 | 8 |
import com.example.educatback.model.entity.Solved; |
9 |
+import com.example.educatback.model.repository.MemberRepository; |
|
11 | 10 |
import jakarta.persistence.EntityNotFoundException; |
12 | 11 |
import jakarta.validation.Valid; |
13 | 12 |
import lombok.RequiredArgsConstructor; |
13 |
+import org.springframework.data.repository.query.Param; |
|
14 |
+import org.springframework.http.ResponseEntity; |
|
14 | 15 |
import org.springframework.security.core.annotation.AuthenticationPrincipal; |
15 | 16 |
import org.springframework.security.core.userdetails.UserDetails; |
16 | 17 |
import org.springframework.web.bind.MethodArgumentNotValidException; |
... | ... | @@ -24,7 +25,7 @@ |
24 | 25 |
@RequiredArgsConstructor |
25 | 26 |
public class MemberController { |
26 | 27 |
private final MemberAppService memberAppService; |
27 |
- |
|
28 |
+ private final MemberRepository memberRepository; |
|
28 | 29 |
@PostMapping("/register") |
29 | 30 |
public ApiResponse<MemberResponse.Detail> create(@Valid @RequestBody MemberRequest.Create memberRequest) { |
30 | 31 |
try { |
... | ... | @@ -58,6 +59,15 @@ |
58 | 59 |
return handleException(e); |
59 | 60 |
} |
60 | 61 |
} |
62 |
+ @GetMapping("/member/student") |
|
63 |
+ public ApiResponse<Object> show1(@RequestParam String userId) { |
|
64 |
+ try { |
|
65 |
+ MemberResponse.Detail member = memberAppService.getMember(userId); |
|
66 |
+ return ApiResponse.response(true, ResponseCode.OK, member); |
|
67 |
+ } catch (Exception e) { |
|
68 |
+ return handleException(e); |
|
69 |
+ } |
|
70 |
+ } |
|
61 | 71 |
@GetMapping("/member/solved") |
62 | 72 |
public ApiResponse<List<SolvedResponse>> listSolvedByMember(@AuthenticationPrincipal UserDetails user) { |
63 | 73 |
try { |
... | ... | @@ -68,6 +78,40 @@ |
68 | 78 |
return handleException(e); |
69 | 79 |
} |
70 | 80 |
} |
81 |
+ @GetMapping("/parents/solved") |
|
82 |
+ public ApiResponse<List<SolvedResponse>> listSolvedByParents(@RequestParam String userId) { |
|
83 |
+ try { |
|
84 |
+ List<Solved> solveds = memberAppService.getSolvedByMember(userId); |
|
85 |
+ List<SolvedResponse> solvedResponses = solveds.stream().map(SolvedResponse::from).collect(Collectors.toList()); |
|
86 |
+ return ApiResponse.response(true, ResponseCode.OK, solvedResponses); |
|
87 |
+ } catch (Exception e) { |
|
88 |
+ return handleException(e); |
|
89 |
+ } |
|
90 |
+ } |
|
91 |
+ @GetMapping("/studentAll") |
|
92 |
+ public List<MemberResponse.Detail> getMembersWithNullRole() { |
|
93 |
+ return memberAppService.getMembersWithNullRole(); |
|
94 |
+ } |
|
95 |
+ |
|
96 |
+ @GetMapping("/average-total-score") |
|
97 |
+ public ResponseEntity<StudentTotalScoreDTO> getAverageTotalScore() { |
|
98 |
+ StudentTotalScoreDTO totalScoreDTO = memberAppService.calculateAverageTotalScore(); |
|
99 |
+ return ResponseEntity.ok(totalScoreDTO); |
|
100 |
+ } |
|
101 |
+ @PutMapping("/updateComment") |
|
102 |
+ public ApiResponse<String> updateComment(@RequestBody MemberRequest.UpdateCommment comment) { |
|
103 |
+ String memberId = comment.getId(); |
|
104 |
+ String newComment = comment.getComment(); |
|
105 |
+ |
|
106 |
+ Member member = memberRepository.findById(memberId) |
|
107 |
+ .orElseThrow(() -> new RuntimeException("해당 ID를 가진 회원을 찾을 수 없습니다: " + memberId)); |
|
108 |
+ |
|
109 |
+ member.setComment(newComment); |
|
110 |
+ memberRepository.save(member); |
|
111 |
+ return ApiResponse.response(true, ResponseCode.OK, "Comment가 업데이트 되었습니다."); |
|
112 |
+ } |
|
113 |
+ |
|
114 |
+ |
|
71 | 115 |
|
72 | 116 |
private <T> ApiResponse<T> handleException(Exception e) { |
73 | 117 |
if (e instanceof MethodArgumentNotValidException) { |
--- src/main/java/com/example/educatback/controller/ScoreLogController.java
+++ src/main/java/com/example/educatback/controller/ScoreLogController.java
... | ... | @@ -3,6 +3,7 @@ |
3 | 3 |
import com.example.educatback.Application.ScoreLogService; |
4 | 4 |
import com.example.educatback.controller.response.ScoreLogResponseDTO; |
5 | 5 |
import com.example.educatback.model.entity.Member; |
6 |
+import com.example.educatback.model.entity.ScoreLog; |
|
6 | 7 |
import com.example.educatback.model.repository.MemberRepository; |
7 | 8 |
import lombok.RequiredArgsConstructor; |
8 | 9 |
import org.springframework.beans.factory.annotation.Autowired; |
... | ... | @@ -10,9 +11,11 @@ |
10 | 11 |
import org.springframework.security.core.userdetails.UserDetails; |
11 | 12 |
import org.springframework.web.bind.annotation.GetMapping; |
12 | 13 |
import org.springframework.web.bind.annotation.RequestMapping; |
14 |
+import org.springframework.web.bind.annotation.RequestParam; |
|
13 | 15 |
import org.springframework.web.bind.annotation.RestController; |
14 | 16 |
|
15 | 17 |
import java.util.List; |
18 |
+import java.util.stream.Collectors; |
|
16 | 19 |
|
17 | 20 |
@RestController |
18 | 21 |
@RequestMapping("/scorelog") |
... | ... | @@ -25,9 +28,23 @@ |
25 | 28 |
public List<ScoreLogResponseDTO> getLatestScoreLogs(@AuthenticationPrincipal UserDetails user) { |
26 | 29 |
return scoreLogService.getScoreLogsForMember(user.getUsername()); |
27 | 30 |
} |
28 |
- |
|
31 |
+ @GetMapping("/parents/latest") |
|
32 |
+ public List<ScoreLogResponseDTO> getLatestScoreLogs1(@RequestParam String userId) { |
|
33 |
+ return scoreLogService.getScoreLogsForMember(userId); |
|
34 |
+ } |
|
35 |
+ @GetMapping("/parents/sum") |
|
36 |
+ public List<ScoreLogResponseDTO.sumScore> getLatestScoreLogs2(@RequestParam String userId) { |
|
37 |
+ List<ScoreLogResponseDTO> scoreLogs = scoreLogService.getScoreLogsForMember(userId); |
|
38 |
+ return scoreLogs.stream() |
|
39 |
+ .map(ScoreLogResponseDTO.sumScore::fromScoreLogResponseDTO) |
|
40 |
+ .collect(Collectors.toList()); |
|
41 |
+ } |
|
29 | 42 |
@GetMapping("/averages") |
30 | 43 |
public List<ScoreLogResponseDTO.DailyAverageScore> getDailyAverageScores(@AuthenticationPrincipal UserDetails user) { |
31 | 44 |
return scoreLogService.getDailyAverageScoresForMember(user.getUsername()); |
32 | 45 |
} |
46 |
+ @GetMapping("/averages/all") |
|
47 |
+ public List<ScoreLogResponseDTO.DailyAverageScore> getDailyAverageScoresForAll() { |
|
48 |
+ return scoreLogService.getDailyAverageScores(); |
|
49 |
+ } |
|
33 | 50 |
} |
--- src/main/java/com/example/educatback/controller/request/MemberRequest.java
+++ src/main/java/com/example/educatback/controller/request/MemberRequest.java
... | ... | @@ -28,5 +28,11 @@ |
28 | 28 |
private String password; |
29 | 29 |
} |
30 | 30 |
|
31 |
- |
|
31 |
+ @Data |
|
32 |
+ public static class UpdateCommment{ |
|
33 |
+ @NotBlank |
|
34 |
+ private String id; |
|
35 |
+ @NotBlank |
|
36 |
+ private String comment; |
|
37 |
+ } |
|
32 | 38 |
} |
--- src/main/java/com/example/educatback/controller/response/MemberResponse.java
+++ src/main/java/com/example/educatback/controller/response/MemberResponse.java
... | ... | @@ -13,12 +13,20 @@ |
13 | 13 |
private String password; |
14 | 14 |
private String name; |
15 | 15 |
private int grade; |
16 |
+ private String role; |
|
17 |
+ private int sum; |
|
18 |
+ private String gender; |
|
19 |
+ private String comment; |
|
16 | 20 |
public static Detail of(Member member) { |
17 | 21 |
return Detail.builder() |
18 | 22 |
.id(member.getUsername()) |
19 | 23 |
.password(member.getPassword()) |
20 | 24 |
.name(member.getName()) |
21 | 25 |
.grade(member.getGrade()) |
26 |
+ .role(member.getRole()) |
|
27 |
+ .gender(member.getGender()) |
|
28 |
+ .comment(member.getComment()) |
|
29 |
+ .sum(member.getFocus()+member.getExpression()+member.getUnderstand()+member.getSentence()+member.getWord()+member.getGrammar()) |
|
22 | 30 |
.build(); |
23 | 31 |
} |
24 | 32 |
} |
... | ... | @@ -43,6 +51,7 @@ |
43 | 51 |
private int word; |
44 | 52 |
private int sentence; |
45 | 53 |
private int grammar; |
54 |
+ private String role; |
|
46 | 55 |
|
47 | 56 |
public static Rating of(Member member) { |
48 | 57 |
return Rating.builder() |
... | ... | @@ -52,8 +61,8 @@ |
52 | 61 |
.word(member.getWord()) |
53 | 62 |
.sentence(member.getSentence()) |
54 | 63 |
.grammar(member.getGrammar()) |
64 |
+ .role(member.getRole()) |
|
55 | 65 |
.build(); |
56 | 66 |
} |
57 | 67 |
} |
58 |
- |
|
59 | 68 |
} |
--- src/main/java/com/example/educatback/controller/response/ScoreLogResponseDTO.java
+++ src/main/java/com/example/educatback/controller/response/ScoreLogResponseDTO.java
... | ... | @@ -4,7 +4,7 @@ |
4 | 4 |
import lombok.Builder; |
5 | 5 |
import lombok.Data; |
6 | 6 |
|
7 |
-import java.sql.Date; |
|
7 |
+ |
|
8 | 8 |
import java.time.LocalDate; |
9 | 9 |
import java.time.LocalDateTime; |
10 | 10 |
|
... | ... | @@ -37,7 +37,7 @@ |
37 | 37 |
@Data |
38 | 38 |
@Builder |
39 | 39 |
public static class DailyAverageScore { |
40 |
- private LocalDateTime dateTime; |
|
40 |
+ private LocalDate date; |
|
41 | 41 |
private double avgFocus; |
42 | 42 |
private double avgExpression; |
43 | 43 |
private double avgUnderstand; |
... | ... | @@ -46,12 +46,18 @@ |
46 | 46 |
private double avgGrammar; |
47 | 47 |
|
48 | 48 |
public static DailyAverageScore fromObjectArray(Object[] objects) { |
49 |
- // Convert java.sql.Date to LocalDateTime |
|
50 |
- LocalDate date = ((Date) objects[0]).toLocalDate(); |
|
51 |
- LocalDateTime dateTime = date.atStartOfDay(); // If you want to convert date to start of the day |
|
49 |
+ // Check if the date string is valid |
|
50 |
+ String dateString = (String) objects[0]; |
|
51 |
+ if (dateString == null || dateString.isEmpty() || dateString.equals("0000-00-00")) { |
|
52 |
+ // Handle invalid date string |
|
53 |
+ return null; |
|
54 |
+ } |
|
55 |
+ |
|
56 |
+ // Convert java.sql.Date to LocalDate |
|
57 |
+ LocalDate date = LocalDate.parse(dateString); |
|
52 | 58 |
|
53 | 59 |
return DailyAverageScore.builder() |
54 |
- .dateTime(dateTime) |
|
60 |
+ .date(date) |
|
55 | 61 |
.avgFocus((double) objects[1]) |
56 | 62 |
.avgExpression((double) objects[2]) |
57 | 63 |
.avgUnderstand((double) objects[3]) |
... | ... | @@ -61,4 +67,17 @@ |
61 | 67 |
.build(); |
62 | 68 |
} |
63 | 69 |
} |
64 |
-}(파일 끝에 줄바꿈 문자 없음) |
|
70 |
+ @Data |
|
71 |
+ @Builder |
|
72 |
+ public static class sumScore { |
|
73 |
+ private double sum; |
|
74 |
+ private LocalDateTime createdAt; |
|
75 |
+ public static sumScore fromScoreLogResponseDTO(ScoreLogResponseDTO dto) { |
|
76 |
+ return sumScore.builder() |
|
77 |
+ .sum(dto.getExpression() + dto.getWord() + dto.getSentence() + dto.getGrammar() + dto.getFocus() + dto.getUnderstand()) |
|
78 |
+ .createdAt(dto.getCreatedAt()) |
|
79 |
+ .build(); |
|
80 |
+ } |
|
81 |
+ } |
|
82 |
+ |
|
83 |
+} |
+++ src/main/java/com/example/educatback/controller/response/StudentTotalScoreDTO.java
... | ... | @@ -0,0 +1,8 @@ |
1 | +package com.example.educatback.controller.response; | |
2 | + | |
3 | +import lombok.Data; | |
4 | + | |
5 | +@Data | |
6 | +public class StudentTotalScoreDTO { | |
7 | + private double averageTotalScore; | |
8 | +} |
--- src/main/java/com/example/educatback/model/entity/Member.java
+++ src/main/java/com/example/educatback/model/entity/Member.java
... | ... | @@ -32,7 +32,7 @@ |
32 | 32 |
@Column(name = "grade") |
33 | 33 |
private int grade; |
34 | 34 |
@Column |
35 |
- private String role; |
|
35 |
+ private String role = "student"; |
|
36 | 36 |
|
37 | 37 |
@Column(name = "focus") |
38 | 38 |
private int focus; |
... | ... | @@ -58,6 +58,10 @@ |
58 | 58 |
|
59 | 59 |
@OneToMany(mappedBy = "member") |
60 | 60 |
private List<ScoreLog> scoreLogs; |
61 |
+ |
|
62 |
+ @Column(name = "comment") |
|
63 |
+ private String Comment; |
|
64 |
+ |
|
61 | 65 |
@Override |
62 | 66 |
public Collection<? extends GrantedAuthority> getAuthorities() { |
63 | 67 |
|
--- src/main/java/com/example/educatback/model/repository/MemberRepository.java
+++ src/main/java/com/example/educatback/model/repository/MemberRepository.java
... | ... | @@ -3,5 +3,8 @@ |
3 | 3 |
import com.example.educatback.model.entity.Member; |
4 | 4 |
import org.springframework.data.jpa.repository.JpaRepository; |
5 | 5 |
|
6 |
+import java.util.List; |
|
7 |
+ |
|
6 | 8 |
public interface MemberRepository extends JpaRepository<Member, String> { |
9 |
+ List<Member> findByRoleIsNull(); |
|
7 | 10 |
} |
--- src/main/java/com/example/educatback/model/repository/ScoreLogRepository.java
+++ src/main/java/com/example/educatback/model/repository/ScoreLogRepository.java
... | ... | @@ -18,4 +18,10 @@ |
18 | 18 |
"AVG(s.word) as avgWord, AVG(s.sentence) as avgSentence, AVG(s.grammar) as avgGrammar " + |
19 | 19 |
"FROM ScoreLog s WHERE s.member = :member GROUP BY FUNCTION('date', s.createdAt)") |
20 | 20 |
List<Object[]> findDailyAverageScoresByMember(Member member); |
21 |
+ |
|
22 |
+ @Query("SELECT DATE_FORMAT(s.createdAt, '%Y-%m-%d') as date, " + |
|
23 |
+ "AVG(s.focus) as avgFocus, AVG(s.expression) as avgExpression, AVG(s.understand) as avgUnderstand, " + |
|
24 |
+ "AVG(s.word) as avgWord, AVG(s.sentence) as avgSentence, AVG(s.grammar) as avgGrammar " + |
|
25 |
+ "FROM ScoreLog s GROUP BY DATE_FORMAT(s.createdAt, '%Y-%m-%d')") |
|
26 |
+ List<Object[]> findDailyAverageScores(); |
|
21 | 27 |
} |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?