6
6
import gdsc .konkuk .platformcore .application .attendance .dtos .MemberAttendanceQueryDto ;
7
7
import gdsc .konkuk .platformcore .application .attendance .exceptions .AttendanceErrorCode ;
8
8
import gdsc .konkuk .platformcore .application .attendance .exceptions .ParticipantNotFoundException ;
9
- import gdsc .konkuk .platformcore .application .member .dtos .MemberAttendances ;
9
+ import gdsc .konkuk .platformcore .application .member .dtos .MemberAttendanceAggregate ;
10
+ import gdsc .konkuk .platformcore .application .member .dtos .MemberCreateCommand ;
11
+ import gdsc .konkuk .platformcore .application .member .dtos .MemberUpdateCommand ;
10
12
import gdsc .konkuk .platformcore .application .member .exceptions .MemberErrorCode ;
11
13
import gdsc .konkuk .platformcore .application .member .exceptions .UserAlreadyExistException ;
12
14
import gdsc .konkuk .platformcore .application .member .exceptions .UserNotFoundException ;
13
- import gdsc .konkuk .platformcore .controller .member .dtos .AttendanceUpdateInfo ;
14
- import gdsc .konkuk .platformcore .controller .member .dtos .MemberRegisterRequest ;
15
- import gdsc .konkuk .platformcore .controller .member .dtos .MemberUpdateInfo ;
15
+ import gdsc .konkuk .platformcore .application .member .dtos .AttendanceUpdateCommand ;
16
16
import gdsc .konkuk .platformcore .domain .attendance .entity .Participant ;
17
17
import gdsc .konkuk .platformcore .domain .attendance .repository .AttendanceRepository ;
18
18
import gdsc .konkuk .platformcore .domain .attendance .repository .ParticipantRepository ;
23
23
import java .time .LocalTime ;
24
24
import java .util .List ;
25
25
import java .util .Map ;
26
- import java .util .Optional ;
27
26
import lombok .RequiredArgsConstructor ;
28
27
import org .springframework .stereotype .Service ;
29
28
import org .springframework .transaction .annotation .Transactional ;
33
32
@ Transactional (readOnly = true )
34
33
public class MemberService {
35
34
35
+ private final MemberFinder memberFinder ;
36
36
private final MemberRepository memberRepository ;
37
37
private final AttendanceRepository attendanceRepository ;
38
38
private final ParticipantRepository participantRepository ;
@@ -42,73 +42,74 @@ public List<Member> getMembersInBatch(String batch) {
42
42
}
43
43
44
44
@ Transactional
45
- public Member register (MemberRegisterRequest registerRequest ) {
46
- if (checkMemberExistWithStudentId (registerRequest .getStudentId ())) {
45
+ public Member register (MemberCreateCommand memberCreateCommand ) {
46
+ if (memberFinder . checkMemberExistWithStudentId (memberCreateCommand .getStudentId ())) {
47
47
throw UserAlreadyExistException .of (MemberErrorCode .USER_ALREADY_EXISTS );
48
48
}
49
- return memberRepository .save (MemberRegisterRequest .toEntity (registerRequest ));
49
+ return memberRepository .save (MemberCreateCommand
50
+ .toEntity (memberCreateCommand ));
50
51
}
51
52
52
53
@ Transactional
53
54
public void withdraw (Long currentId ) {
54
- Member member =
55
- memberRepository
56
- .findById (currentId )
57
- .orElseThrow (
58
- () -> UserNotFoundException .of (MemberErrorCode .USER_NOT_FOUND ));
55
+ Member member = memberFinder .fetchMemberById (currentId );
59
56
member .withdraw ();
60
57
}
61
58
62
59
@ Transactional
63
- public void updateMembers (String batch , @ Valid List <MemberUpdateInfo > updateInfos ) {
64
- List <Long > memberIds = updateInfos .stream ().map (MemberUpdateInfo ::getMemberId ).toList ();
65
- Map <Long , Member > memberMap = fetchMembers (memberIds , batch );
60
+ public void updateMembers (String batch , @ Valid List <MemberUpdateCommand > updateInfos ) {
61
+ List <Long > memberIds = updateInfos .stream ().map (MemberUpdateCommand ::getMemberId ).toList ();
62
+ Map <Long , Member > memberMap = memberFinder . fetchMembersByIdsAndBatch (memberIds , batch );
66
63
updateMembers (memberMap , updateInfos );
67
64
}
68
65
69
- public List <MemberAttendances > getMemberAttendanceWithBatchAndPeriod (String batch ,
70
- LocalDate month ) {
66
+ /**
67
+ * {batch} 기수에 속한 멤버들의 {month}간 출석 정보를 조회하는 메소드
68
+ * @param batch
69
+ * @param month
70
+ * @return List<MemberAttendances> 멤버별 출석 정보, 통계 dto 리스트
71
+ * */
72
+ public List <MemberAttendanceAggregate > getMemberAttendanceWithBatchAndPeriod (String batch ,
73
+ LocalDate month ) {
71
74
List <MemberAttendanceQueryDto > attendanceInfoList =
72
75
attendanceRepository .findAllAttendanceInfoByBatchAndPeriod (
73
76
batch ,
74
77
month .withDayOfMonth (1 ).atStartOfDay (),
75
78
month .withDayOfMonth (month .lengthOfMonth ()).atTime (LocalTime .MAX ));
76
- return MemberAttendances . from (attendanceInfoList );
79
+ return MemberAttendanceAggregator . process (attendanceInfoList );
77
80
}
78
81
82
+ /***
83
+ * {batch} 기수에 속한 멤버들의 {month}간 출석 정보를 업데이트하는 메소드
84
+ * @param batch 소속 기수
85
+ * @param month 출석 정보를 업데이트할 월
86
+ * @param attendanceUpdateCommandList 업데이트할 출석 정보 리스트
87
+ */
79
88
@ Transactional
80
89
public void updateAttendances (
81
- String batch , LocalDate month , List <AttendanceUpdateInfo > attendanceUpdateInfoList ) {
90
+ String batch , LocalDate month , List <AttendanceUpdateCommand > attendanceUpdateCommandList ) {
82
91
Map <Long , Participant > participantMap = fetchParticipants (batch , month );
83
- updateAttendanceStatuses (participantMap , attendanceUpdateInfoList );
92
+ updateAttendanceStatuses (participantMap , attendanceUpdateCommandList );
84
93
}
85
94
86
- private void updateMembers (Map <Long , Member > memberMap , List <MemberUpdateInfo > updateInfos ) {
87
- for (MemberUpdateInfo memberUpdateInfo : updateInfos ) {
88
- if (!memberMap .containsKey (memberUpdateInfo .getMemberId ())) {
95
+ private void updateMembers (Map <Long , Member > memberMap , List <MemberUpdateCommand > updateCommands ) {
96
+ for (MemberUpdateCommand memberUpdateCommand : updateCommands ) {
97
+ if (!memberMap .containsKey (memberUpdateCommand .getMemberId ())) {
89
98
throw UserNotFoundException .of (MemberErrorCode .USER_NOT_FOUND );
90
99
}
91
- Member member = memberMap .get (memberUpdateInfo .getMemberId ());
92
- member .update (memberUpdateInfo . toCommand () );
100
+ Member member = memberMap .get (memberUpdateCommand .getMemberId ());
101
+ member .update (memberUpdateCommand );
93
102
}
94
103
}
95
104
96
- private Map <Long , Member > fetchMembers (List <Long > memberIds , String batch ) {
97
- List <Member > members = memberRepository .findAllByIdsAndBatch (memberIds , batch );
98
- if (members .size () != memberIds .size ()) {
99
- throw UserNotFoundException .of (MemberErrorCode .USER_NOT_FOUND );
100
- }
101
- return members .stream ().collect (toMap (Member ::getId , identity ()));
102
- }
103
-
104
105
private void updateAttendanceStatuses (Map <Long , Participant > participants ,
105
- List <AttendanceUpdateInfo > updateInfos ) {
106
- for (AttendanceUpdateInfo attendanceUpdateInfo : updateInfos ) {
107
- if (!participants .containsKey (attendanceUpdateInfo .getParticipantId ())) {
106
+ List <AttendanceUpdateCommand > updateCommands ) {
107
+ for (AttendanceUpdateCommand attendanceUpdateCommand : updateCommands ) {
108
+ if (!participants .containsKey (attendanceUpdateCommand .getParticipantId ())) {
108
109
throw ParticipantNotFoundException .of (AttendanceErrorCode .PARTICIPANT_NOT_FOUND );
109
110
}
110
- Participant participant = participants .get (attendanceUpdateInfo .getParticipantId ());
111
- participant .updateAttendanceStatus (attendanceUpdateInfo .getAttendanceType ());
111
+ Participant participant = participants .get (attendanceUpdateCommand .getParticipantId ());
112
+ participant .updateAttendanceStatus (attendanceUpdateCommand .getAttendanceType ());
112
113
}
113
114
}
114
115
@@ -121,9 +122,4 @@ private Map<Long, Participant> fetchParticipants(String batch, LocalDate month)
121
122
.stream ()
122
123
.collect (toMap (Participant ::getId , identity ()));
123
124
}
124
-
125
- private boolean checkMemberExistWithStudentId (String studentId ) {
126
- Optional <Member > member = memberRepository .findByStudentId (studentId );
127
- return member .isPresent ();
128
- }
129
125
}
0 commit comments