Skip to content

Commit b81a396

Browse files
devxbddingminchoidongkuen
authored
release: 0.5.6 (#232)
* fix: 충돌 해결 (#210) * fix: 소셜 로그인 에러 긴급 수정 (#214) (#215) * feat: 기존 회원 리뷰 조회 API 로직 변경 (#218) * feat: userId 에 해당하는 유저 리뷰 조회 API 로직 변경 (#217) * test: 통합테스트 수정 (#217) * test: 단위테스트 수정 (#217) * docs: readme 작성 (#222) * docs: readme 작성 * docs: readme 수정 * test: QA용 EndMeetingAlerted를 발행한다 * feat: 유저가 삭제되었을때, 알람토큰도 삭제하도록 수정 (#226) * feat: 유저가 삭제되었을때, 알람토큰도 삭제하도록 수정한다 * test: ApplicationEventPublisher 바인딩 안되는 테스트 삭제 * refactor: UserDeletedEvent 핸들러 이름 변경 * test: 친구조회 테스트 수정 * refactor: code smell을 제거한다 * fix: 모임 시작, 종료 알림이 모임 참여자가 3명 이상이 아니라면, 발행되지않도록 수정 (#231) * feat: 리뷰 등록시 모임 참여 유저 조회 API 수정 (#229) * refactor: MeetingController getCurrentUserId() 메소드로 통일 (#228) * feat: 리뷰에 자신 포함 확인 로직 추가 (#195) * feat: 모임 참여자 자신 포함 여부 확인 로직 추가(#228) * test: 단위 테스트 추가 (#228) * test: 통합 테스트 수정 및 실패 케이스 추가 (#228) * refactor: title, body alert data에 추가 --------- Co-authored-by: ddingmin <[email protected]> Co-authored-by: ChoiDongKuen <[email protected]>
1 parent e6222bc commit b81a396

File tree

11 files changed

+349
-80
lines changed

11 files changed

+349
-80
lines changed

src/main/java/net/teumteum/alert/infra/FcmAlertPublisher.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ private Message buildMessage(String token, Alert alert, Map<String, String> data
4444
.setToken(token)
4545
.setNotification(buildNotification(alert))
4646
.setAndroidConfig(buildAndroidConfig(alert))
47+
.putData("title", alert.getTitle())
48+
.putData("body", alert.getBody())
4749
.putData("publishedAt", alert.getCreatedAt().toString())
4850
.putData("userId", alert.getUserId().toString())
4951
.putData("type", alert.getType().toString())

src/main/java/net/teumteum/meeting/controller/MeetingController.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import net.teumteum.meeting.domain.Topic;
1010
import net.teumteum.meeting.domain.request.CreateMeetingRequest;
1111
import net.teumteum.meeting.domain.request.UpdateMeetingRequest;
12-
import net.teumteum.meeting.domain.response.MeetingParticipantsResponse;
12+
import net.teumteum.meeting.domain.response.MeetingParticipantResponse;
1313
import net.teumteum.meeting.domain.response.MeetingResponse;
1414
import net.teumteum.meeting.domain.response.MeetingsResponse;
1515
import net.teumteum.meeting.model.PageDto;
@@ -43,14 +43,14 @@ public class MeetingController {
4343
public MeetingResponse createMeeting(
4444
@RequestPart @Valid CreateMeetingRequest meetingRequest,
4545
@RequestPart List<MultipartFile> images) {
46-
Long userId = securityService.getCurrentUserId();
46+
Long userId = getCurrentUserId();
4747
return meetingService.createMeeting(images, meetingRequest, userId);
4848
}
4949

5050
@GetMapping("/{meetingId}")
5151
@ResponseStatus(HttpStatus.OK)
5252
public MeetingResponse getMeetingById(@PathVariable("meetingId") Long meetingId) {
53-
Long userId = securityService.getCurrentUserId();
53+
Long userId = getCurrentUserId();
5454
return meetingService.getMeetingById(meetingId, userId);
5555
}
5656

@@ -64,7 +64,7 @@ public PageDto<MeetingsResponse> getMeetingsByCondition(
6464
@RequestParam(value = "participantUserId", required = false) Long participantUserId,
6565
@RequestParam(value = "isBookmarked", required = false) Boolean isBookmarked,
6666
@RequestParam(value = "searchWord", required = false) String searchWord) {
67-
Long userId = securityService.getCurrentUserId();
67+
Long userId = getCurrentUserId();
6868
return meetingService.getMeetingsBySpecification(pageable, topic, meetingAreaStreet, participantUserId,
6969
searchWord, isBookmarked, isOpen, userId);
7070
}
@@ -74,55 +74,56 @@ public PageDto<MeetingsResponse> getMeetingsByCondition(
7474
public MeetingResponse updateMeeting(@PathVariable Long meetingId,
7575
@RequestPart @Valid UpdateMeetingRequest request,
7676
@RequestPart List<MultipartFile> images) {
77-
Long userId = securityService.getCurrentUserId();
77+
Long userId = getCurrentUserId();
7878
return meetingService.updateMeeting(meetingId, images, request, userId);
7979
}
8080

8181
@DeleteMapping("/{meetingId}")
8282
@ResponseStatus(HttpStatus.OK)
8383
public void deleteMeeting(@PathVariable("meetingId") Long meetingId) {
84-
Long userId = securityService.getCurrentUserId();
84+
Long userId = getCurrentUserId();
8585
meetingService.deleteMeeting(meetingId, userId);
8686
}
8787

8888
@PostMapping("/{meetingId}/participants")
8989
@ResponseStatus(HttpStatus.CREATED)
9090
public MeetingResponse addParticipant(@PathVariable("meetingId") Long meetingId) {
91-
Long userId = securityService.getCurrentUserId();
91+
Long userId = getCurrentUserId();
9292
return meetingService.addParticipant(meetingId, userId);
9393
}
9494

9595
@DeleteMapping("/{meetingId}/participants")
9696
@ResponseStatus(HttpStatus.OK)
9797
public void deleteParticipant(@PathVariable("meetingId") Long meetingId) {
98-
Long userId = securityService.getCurrentUserId();
98+
Long userId = getCurrentUserId();
9999
meetingService.cancelParticipant(meetingId, userId);
100100
}
101101

102102
@GetMapping("/{meetingId}/participants")
103103
@ResponseStatus(HttpStatus.OK)
104-
public List<MeetingParticipantsResponse> getParticipants(@PathVariable("meetingId") Long meetingId) {
105-
return meetingService.getParticipants(meetingId);
104+
public List<MeetingParticipantResponse> getParticipants(@PathVariable("meetingId") Long meetingId) {
105+
Long userId = getCurrentUserId();
106+
return meetingService.getParticipants(meetingId, userId);
106107
}
107108

108109
@PostMapping("/{meetingId}/reports")
109110
@ResponseStatus(HttpStatus.CREATED)
110111
public void reportMeeting(@PathVariable("meetingId") Long meetingId) {
111-
Long userId = securityService.getCurrentUserId();
112+
Long userId = getCurrentUserId();
112113
meetingService.reportMeeting(meetingId, userId);
113114
}
114115

115116
@PostMapping("/{meetingId}/bookmarks")
116117
@ResponseStatus(HttpStatus.CREATED)
117118
public void addBookmark(@PathVariable("meetingId") Long meetingId) {
118-
Long userId = securityService.getCurrentUserId();
119+
Long userId = getCurrentUserId();
119120
meetingService.addBookmark(meetingId, userId);
120121
}
121122

122123
@DeleteMapping("/{meetingId}/bookmarks")
123124
@ResponseStatus(HttpStatus.OK)
124125
public void deleteBookmark(@PathVariable("meetingId") Long meetingId) {
125-
Long userId = securityService.getCurrentUserId();
126+
Long userId = getCurrentUserId();
126127
meetingService.cancelBookmark(meetingId, userId);
127128
}
128129

@@ -132,4 +133,8 @@ public ErrorResponse handleIllegalArgumentException(IllegalArgumentException ill
132133
Sentry.captureException(illegalArgumentException);
133134
return ErrorResponse.of(illegalArgumentException);
134135
}
136+
137+
private Long getCurrentUserId() {
138+
return securityService.getCurrentUserId();
139+
}
135140
}

src/main/java/net/teumteum/meeting/domain/response/MeetingParticipantsResponse.java renamed to src/main/java/net/teumteum/meeting/domain/response/MeetingParticipantResponse.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
import net.teumteum.user.domain.User;
44

5-
public record MeetingParticipantsResponse(
5+
public record MeetingParticipantResponse(
66
Long id,
77
Long characterId,
88
String name,
99
String job
1010
) {
1111

12-
public static MeetingParticipantsResponse of(
12+
public static MeetingParticipantResponse of(
1313
User user
1414
) {
15-
return new MeetingParticipantsResponse(
15+
return new MeetingParticipantResponse(
1616
user.getId(),
1717
user.getCharacterId(),
1818
user.getName(),

src/main/java/net/teumteum/meeting/service/MeetingAlertPublisher.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
@Transactional(readOnly = true)
1717
public class MeetingAlertPublisher {
1818

19+
private static final String KR_TIME_ZONE = "Asia/Seoul";
1920
private static final String EVERY_ONE_MINUTES = "0 * * * * *";
2021
private static final String EVERY_12PM = "0 0 12 * * *";
2122

@@ -24,18 +25,20 @@ public class MeetingAlertPublisher {
2425

2526
@Scheduled(cron = EVERY_ONE_MINUTES)
2627
public void alertBeforeMeeting() {
27-
var alertStart = LocalDateTime.now(ZoneId.of("Asia/Seoul")).plusMinutes(5).withNano(0).withSecond(0);
28+
var alertStart = LocalDateTime.now(ZoneId.of(KR_TIME_ZONE)).plusMinutes(5).withNano(0).withSecond(0);
2829
var alertEnd = alertStart.plusMinutes(1).withNano(0).withSecond(0);
2930
var alertTargets = meetingRepository.findAlertMeetings(alertStart, alertEnd);
30-
alertTargets.forEach(meeting -> eventPublisher.publishEvent(
31-
new BeforeMeetingAlerted(meeting.getParticipantUserIds())
32-
)
33-
);
31+
alertTargets.stream()
32+
.filter(alertTarget -> alertTarget.getParticipantUserIds().size() > 2)
33+
.forEach(meeting -> eventPublisher.publishEvent(
34+
new BeforeMeetingAlerted(meeting.getParticipantUserIds())
35+
)
36+
);
3437
}
3538

3639
@Scheduled(cron = EVERY_12PM)
3740
public void alertEndMeeting() {
38-
var today = LocalDateTime.now(ZoneId.of("Asia/Seoul"))
41+
var today = LocalDateTime.now(ZoneId.of(KR_TIME_ZONE))
3942
.withNano(0)
4043
.withSecond(0)
4144
.withMinute(0)
@@ -44,14 +47,16 @@ public void alertEndMeeting() {
4447
var yesterday = today.minusDays(1);
4548

4649
var alertTargets = meetingRepository.findAlertMeetings(yesterday, today);
47-
alertTargets.forEach(meeting -> eventPublisher.publishEvent(
48-
new EndMeetingAlerted(meeting.getId(), meeting.getTitle(), meeting.getParticipantUserIds())
49-
));
50+
alertTargets.stream()
51+
.filter(alertTarget -> alertTarget.getParticipantUserIds().size() > 2)
52+
.forEach(meeting -> eventPublisher.publishEvent(
53+
new EndMeetingAlerted(meeting.getId(), meeting.getTitle(), meeting.getParticipantUserIds())
54+
));
5055
}
5156

5257
@Scheduled(cron = EVERY_ONE_MINUTES)
5358
public void alertEndMeetingForQa() {
54-
var today = LocalDateTime.now(ZoneId.of("Asia/Seoul"))
59+
var today = LocalDateTime.now(ZoneId.of(KR_TIME_ZONE))
5560
.withNano(0)
5661
.withSecond(0)
5762
.withMinute(0)
@@ -61,8 +66,10 @@ public void alertEndMeetingForQa() {
6166
var yesterday = today.minusDays(365);
6267

6368
var alertTargets = meetingRepository.findAlertMeetings(yesterday, future);
64-
alertTargets.forEach(meeting -> eventPublisher.publishEvent(
65-
new EndMeetingAlerted(meeting.getId(), meeting.getTitle(), meeting.getParticipantUserIds())
66-
));
69+
alertTargets.stream()
70+
.filter(alertTarget -> alertTarget.getParticipantUserIds().size() > 2)
71+
.forEach(meeting -> eventPublisher.publishEvent(
72+
new EndMeetingAlerted(meeting.getId(), meeting.getTitle(), meeting.getParticipantUserIds())
73+
));
6774
}
6875
}

src/main/java/net/teumteum/meeting/service/MeetingService.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import net.teumteum.meeting.domain.Topic;
1313
import net.teumteum.meeting.domain.request.CreateMeetingRequest;
1414
import net.teumteum.meeting.domain.request.UpdateMeetingRequest;
15-
import net.teumteum.meeting.domain.response.MeetingParticipantsResponse;
15+
import net.teumteum.meeting.domain.response.MeetingParticipantResponse;
1616
import net.teumteum.meeting.domain.response.MeetingResponse;
1717
import net.teumteum.meeting.domain.response.MeetingsResponse;
1818
import net.teumteum.meeting.model.PageDto;
@@ -94,7 +94,8 @@ public void deleteMeeting(Long meetingId, Long userId) {
9494
}
9595

9696
@Transactional(readOnly = true)
97-
public PageDto<MeetingsResponse> getMeetingsBySpecification(Pageable pageable, Topic topic, String meetingAreaStreet,
97+
public PageDto<MeetingsResponse> getMeetingsBySpecification(Pageable pageable, Topic topic,
98+
String meetingAreaStreet,
9899
Long participantUserId, String searchWord, Boolean isBookmarked, Boolean isOpen, Long userId) {
99100

100101
Specification<Meeting> spec = MeetingSpecification.withIsOpen(isOpen);
@@ -153,13 +154,16 @@ public void cancelParticipant(Long meetingId, Long userId) {
153154
}
154155

155156
@Transactional(readOnly = true)
156-
public List<MeetingParticipantsResponse> getParticipants(Long meetingId) {
157+
public List<MeetingParticipantResponse> getParticipants(Long meetingId, Long userId) {
157158
var existMeeting = getMeeting(meetingId);
158159

160+
checkMeetingContainUser(existMeeting, userId);
161+
159162
return existMeeting.getParticipantUserIds().stream()
163+
.filter(id -> !id.equals(userId))
160164
.map(userConnector::findUserById)
161165
.flatMap(Optional::stream)
162-
.map(MeetingParticipantsResponse::of)
166+
.map(MeetingParticipantResponse::of)
163167
.toList();
164168
}
165169

@@ -207,4 +211,10 @@ public void reportMeeting(Long meetingId, Long userId) {
207211
throw new IllegalArgumentException("모임 개설자는 모임을 신고할 수 없습니다.");
208212
}
209213
}
214+
215+
private void checkMeetingContainUser(Meeting meeting, Long userId) {
216+
if (!meeting.getParticipantUserIds().contains(userId)) {
217+
throw new IllegalArgumentException("모임에 참여하지 않은 회원입니다.");
218+
}
219+
}
210220
}

0 commit comments

Comments
 (0)