1
1
package wooteco .prolog .studylog .application ;
2
2
3
+ import static java .util .stream .Collectors .toList ;
4
+
5
+ import java .time .LocalDateTime ;
6
+ import java .util .ArrayList ;
7
+ import java .util .Comparator ;
8
+ import java .util .List ;
9
+ import java .util .Map ;
10
+ import java .util .stream .Collectors ;
3
11
import lombok .AllArgsConstructor ;
4
12
import org .springframework .data .domain .PageImpl ;
5
13
import org .springframework .data .domain .Pageable ;
20
28
import wooteco .prolog .studylog .domain .repository .PopularStudylogRepository ;
21
29
import wooteco .prolog .studylog .domain .repository .StudylogRepository ;
22
30
23
- import java .time .LocalDateTime ;
24
- import java .util .ArrayList ;
25
- import java .util .Comparator ;
26
- import java .util .List ;
27
- import java .util .Map ;
28
- import java .util .stream .Collectors ;
29
-
30
- import static java .util .stream .Collectors .toList ;
31
-
32
31
@ Service
33
32
@ AllArgsConstructor
34
33
@ Transactional (readOnly = true )
35
34
public class PopularStudylogService {
36
35
37
36
private static final int A_WEEK = 7 ;
38
37
private static final int THREE_WEEK = 21 ;
39
- private static final String BACKEND = "백엔드" ;
40
- private static final String FRONTEND = "프론트엔드" ;
41
- private static final String ANDROID = "안드로이드" ;
42
38
43
39
private final StudylogService studylogService ;
44
40
private final StudylogRepository studylogRepository ;
@@ -51,24 +47,23 @@ public void updatePopularStudylogs(Pageable pageable) {
51
47
deleteAllLegacyPopularStudylogs ();
52
48
53
49
List <GroupMember > groupMembers = groupMemberRepository .findAll ();
54
- Map <MemberGroupType , List <MemberGroup >> memberGroupsBygroupType = memberGroupRepository .findAll (). stream ()
55
- .collect (Collectors .groupingBy (MemberGroup ::getGroupType ));
50
+ Map <MemberGroupType , List <MemberGroup >> memberGroupsBygroupType = memberGroupRepository .findAll ()
51
+ .stream (). collect (Collectors .groupingBy (MemberGroup ::getGroupType ));
56
52
57
- final List <Studylog > recentStudylogs = findRecentStudylogs (LocalDateTime .now (), pageable .getPageSize ());
53
+ final List <Studylog > recentStudylogs = findRecentStudylogs (LocalDateTime .now (),
54
+ pageable .getPageSize ());
58
55
59
56
List <Studylog > popularStudylogs = new ArrayList <>();
60
57
61
58
for (MemberGroupType groupType : MemberGroupType .values ()) {
62
- popularStudylogs .addAll (filterStudylogsByMemberGroups (recentStudylogs , new MemberGroups ( memberGroupsBygroupType . get ( groupType )), groupMembers )
63
- .stream ()
59
+ popularStudylogs .addAll (filterStudylogsByMemberGroups (recentStudylogs ,
60
+ new MemberGroups ( memberGroupsBygroupType . get ( groupType )), groupMembers ) .stream ()
64
61
.sorted (Comparator .comparing (Studylog ::getPopularScore ).reversed ())
65
- .limit (pageable .getPageSize ())
66
- .collect (toList ()));
62
+ .limit (pageable .getPageSize ()).collect (toList ()));
67
63
}
68
64
69
- popularStudylogRepository .saveAll (popularStudylogs .stream ()
70
- .map (it -> new PopularStudylog (it .getId ()))
71
- .collect (toList ()));
65
+ popularStudylogRepository .saveAll (
66
+ popularStudylogs .stream ().map (it -> new PopularStudylog (it .getId ())).collect (toList ()));
72
67
}
73
68
74
69
private void deleteAllLegacyPopularStudylogs () {
@@ -79,7 +74,8 @@ private void deleteAllLegacyPopularStudylogs() {
79
74
}
80
75
}
81
76
82
- private List <Studylog > findRecentStudylogs (final LocalDateTime dateTime , final int minStudylogsSize ) {
77
+ private List <Studylog > findRecentStudylogs (final LocalDateTime dateTime ,
78
+ final int minStudylogsSize ) {
83
79
int decreaseDays = A_WEEK ;
84
80
List <Studylog > recentStudylogs = new ArrayList <>();
85
81
while (decreaseDays <= THREE_WEEK ) {
@@ -92,61 +88,56 @@ private List<Studylog> findRecentStudylogs(final LocalDateTime dateTime, final i
92
88
return recentStudylogs ;
93
89
}
94
90
95
- private List <Studylog > filterStudylogsByMemberGroups (final List <Studylog > studylogs , final MemberGroups memberGroups , final List <GroupMember > groupMembers ) {
96
- return studylogs .stream ()
97
- .filter (studylog -> checkMemberAssignedInMemberGroups (memberGroups , studylog .getMember (),
98
- groupMembers ))
99
- .collect (toList ());
91
+ private List <Studylog > filterStudylogsByMemberGroups (final List <Studylog > studylogs ,
92
+ final MemberGroups memberGroups ,
93
+ final List <GroupMember > groupMembers ) {
94
+ return studylogs .stream ().filter (
95
+ studylog -> checkMemberAssignedInMemberGroups (memberGroups , studylog .getMember (),
96
+ groupMembers )).collect (toList ());
100
97
}
101
98
102
- private boolean checkMemberAssignedInMemberGroups (MemberGroups memberGroups ,
103
- Member member ,
99
+ private boolean checkMemberAssignedInMemberGroups (MemberGroups memberGroups , Member member ,
104
100
List <GroupMember > groupMembers ) {
105
- if (canJudgeMemberGroup (groupMembers , member )) {
106
- return groupMembers .stream ()
107
- .anyMatch (memberGroups ::isContainsMemberGroups );
108
- }
109
-
110
- return false ;
111
- }
112
-
113
- private boolean canJudgeMemberGroup (final List <GroupMember > groupMembers , final Member member ) {
114
- return groupMembers .stream ()
115
- .anyMatch (it -> it .getMember ().equals (member ));
101
+ return groupMembers .stream ().anyMatch (
102
+ it -> it .getMember ().equals (member ) && memberGroups .isContainsMemberGroups (it ));
116
103
}
117
104
118
- public PopularStudylogsResponse findPopularStudylogs (Pageable pageable ,
119
- Long memberId ,
105
+ public PopularStudylogsResponse findPopularStudylogs (Pageable pageable , Long memberId ,
120
106
boolean isAnonymousMember ) {
121
107
122
108
List <Studylog > allPopularStudylogs = getSortedPopularStudyLogs (pageable );
123
109
List <GroupMember > groupedMembers = groupMemberRepository .findAll ();
124
- Map <MemberGroupType , List <MemberGroup >> memberGroupsBygroupType = memberGroupRepository .findAll (). stream ()
125
- .collect (Collectors .groupingBy (MemberGroup ::getGroupType ));
110
+ Map <MemberGroupType , List <MemberGroup >> memberGroupsBygroupType = memberGroupRepository .findAll ()
111
+ .stream (). collect (Collectors .groupingBy (MemberGroup ::getGroupType ));
126
112
127
113
return PopularStudylogsResponse .of (
128
114
studylogsResponse (allPopularStudylogs , pageable , memberId ),
129
- studylogsResponse (filterStudylogsByMemberGroups (allPopularStudylogs , new MemberGroups (memberGroupsBygroupType .get (MemberGroupType .FRONTEND )), groupedMembers ), pageable , memberId ),
130
- studylogsResponse (filterStudylogsByMemberGroups (allPopularStudylogs , new MemberGroups (memberGroupsBygroupType .get (MemberGroupType .BACKEND )), groupedMembers ), pageable , memberId ),
131
- studylogsResponse (filterStudylogsByMemberGroups (allPopularStudylogs , new MemberGroups (memberGroupsBygroupType .get (MemberGroupType .ANDROID )), groupedMembers ), pageable , memberId )
132
- );
115
+ studylogsResponse (
116
+ filterStudylogsByMemberGroups (allPopularStudylogs , new MemberGroups (memberGroupsBygroupType .get (MemberGroupType .FRONTEND )), groupedMembers ),
117
+ pageable ,
118
+ memberId ),
119
+ studylogsResponse (
120
+ filterStudylogsByMemberGroups (allPopularStudylogs , new MemberGroups (memberGroupsBygroupType .get (MemberGroupType .BACKEND )), groupedMembers ),
121
+ pageable ,
122
+ memberId ),
123
+ studylogsResponse (
124
+ filterStudylogsByMemberGroups (allPopularStudylogs , new MemberGroups (memberGroupsBygroupType .get (MemberGroupType .ANDROID )), groupedMembers ),
125
+ pageable ,
126
+ memberId ));
133
127
}
134
128
135
129
private List <Studylog > getSortedPopularStudyLogs (Pageable pageable ) {
136
- return studylogRepository .findAllByIdIn (getPopularStudylogIds (), pageable )
137
- .stream ()
138
- .sorted (Comparator .comparing (Studylog ::getPopularScore ).reversed ())
139
- .collect (toList ());
130
+ return studylogRepository .findAllByIdIn (getPopularStudylogIds (), pageable ).stream ()
131
+ .sorted (Comparator .comparing (Studylog ::getPopularScore ).reversed ()).collect (toList ());
140
132
}
141
133
142
134
private List <Long > getPopularStudylogIds () {
143
- return popularStudylogRepository .findAllByDeletedFalse ()
144
- .stream ()
145
- .map (PopularStudylog ::getStudylogId )
146
- .collect (toList ());
135
+ return popularStudylogRepository .findAllByDeletedFalse ().stream ()
136
+ .map (PopularStudylog ::getStudylogId ).collect (toList ());
147
137
}
148
138
149
- private StudylogsResponse studylogsResponse (final List <Studylog > studylogs , final Pageable pageable , final Long memberId ) {
139
+ private StudylogsResponse studylogsResponse (final List <Studylog > studylogs ,
140
+ final Pageable pageable , final Long memberId ) {
150
141
final PageImpl <Studylog > page = new PageImpl <>(studylogs , pageable , studylogs .size ());
151
142
if (memberId == null ) {
152
143
return StudylogsResponse .of (page );
0 commit comments