-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMemberService.java
More file actions
125 lines (102 loc) Β· 5.24 KB
/
MemberService.java
File metadata and controls
125 lines (102 loc) Β· 5.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.example.wini.domain.member.service;
import static com.example.wini.global.common.constant.StatusReserveTimeConstants.INDEFINITE_HOUR;
import static com.example.wini.global.common.constant.StatusReserveTimeConstants.INDEFINITE_MINUTE;
import static com.example.wini.global.common.constant.StatusReserveTimeConstants.INDEFINITE_SECONDS;
import static com.example.wini.global.error.exception.ErrorCode.MATE_NOT_FOUND;
import static com.example.wini.global.error.exception.ErrorCode.STATUS_NOT_FOUND;
import com.example.wini.domain.common.util.MemberUtil;
import com.example.wini.domain.member.domain.Member;
import com.example.wini.domain.member.domain.Status;
import com.example.wini.domain.member.dto.common.ReservedTimeInfo;
import com.example.wini.domain.member.dto.query.MateInfoQuery;
import com.example.wini.domain.member.dto.request.MemberStatusUpdateRequest;
import com.example.wini.domain.member.dto.response.MateResponse;
import com.example.wini.domain.member.dto.response.MemberResponse;
import com.example.wini.domain.member.dto.response.MemberStatusResponse;
import com.example.wini.domain.member.repository.MemberRepository;
import com.example.wini.domain.member.repository.StatusRepository;
import com.example.wini.domain.notification.domain.NotificationType;
import com.example.wini.domain.notification.event.NotificationEvent;
import com.example.wini.domain.room.repository.RoomRepository;
import com.example.wini.global.error.exception.CustomException;
import java.time.Duration;
import java.time.LocalDateTime;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
private final RoomRepository roomRepository;
private final StatusRepository statusRepository;
private final ApplicationEventPublisher eventPublisher;
private final MemberUtil memberUtil;
@Transactional(readOnly = true)
public MemberStatusResponse searchMyStatus() {
Member member = memberUtil.getCurrentMember();
if (!isStatusValid(member)) {
return MemberStatusResponse.empty();
}
ReservedTimeInfo reservedTimeInfo = createReservedTimeInfo(member.getStatusDuration());
return MemberStatusResponse.from(member, reservedTimeInfo);
}
@Transactional(readOnly = true)
public MemberStatusResponse searchMateStatus() {
Long myMemberId = memberUtil.getCurrentMemberId();
Member mate = memberRepository
.findRoommateWithStatusByMemberId(myMemberId)
.orElseThrow(() -> new CustomException(MATE_NOT_FOUND));
if (!isStatusValid(mate)) {
return MemberStatusResponse.empty();
}
ReservedTimeInfo reservedTimeInfo = createReservedTimeInfo(mate.getStatusDuration());
return MemberStatusResponse.from(mate, reservedTimeInfo);
}
private boolean isStatusValid(Member member) {
if (member.getStatus() == null) {
return false;
}
LocalDateTime endTime = member.getStatusStartedAt().plus(Duration.ofSeconds(member.getStatusDuration()));
return endTime.isAfter(LocalDateTime.now());
}
private ReservedTimeInfo createReservedTimeInfo(long durationSeconds) {
if (durationSeconds == INDEFINITE_SECONDS) {
return ReservedTimeInfo.of(INDEFINITE_HOUR, INDEFINITE_MINUTE);
}
Duration duration = Duration.ofSeconds(durationSeconds);
return ReservedTimeInfo.of(duration.toHours(), duration.toMinutes() % 60);
}
@Transactional
public MemberStatusResponse updateStatus(MemberStatusUpdateRequest request) {
Member member = memberUtil.getCurrentMember();
Status status =
statusRepository.findById(request.statusId()).orElseThrow(() -> new CustomException(STATUS_NOT_FOUND));
Long statusDurationSeconds = request.reservedTimeInfo().toSeconds();
member.updateStatus(status, request.startedAt(), statusDurationSeconds);
notifyRoommateOfStatusUpdate(member.getId());
return MemberStatusResponse.from(member, request.reservedTimeInfo());
}
private void notifyRoommateOfStatusUpdate(Long memberId) {
Member mate = memberRepository
.findRoommateByMemberId(memberId)
.orElseThrow(() -> new CustomException(MATE_NOT_FOUND));
NotificationEvent event = NotificationEvent.from(mate.getId(), NotificationType.NEW_STATUS);
eventPublisher.publishEvent(event);
}
@Transactional(readOnly = true)
public MemberResponse getMyInfo() {
Member member = memberUtil.getCurrentMember();
boolean isMatched = memberRepository.existsRoommate(member.getId());
return MemberResponse.from(member, isMatched);
}
@Transactional(readOnly = true)
public MateResponse getMateInfo() {
Long myMemberId = memberUtil.getCurrentMemberId();
MateInfoQuery query = memberRepository
.findRoommateWithJoinedAtByMemberId(myMemberId)
.orElseThrow(() -> new CustomException(MATE_NOT_FOUND));
return MateResponse.from(query);
}
}