diff --git a/src/main/java/com/team/buddyya/notification/controller/NotificationController.java b/src/main/java/com/team/buddyya/notification/controller/NotificationController.java index 65306cb7..2632be52 100644 --- a/src/main/java/com/team/buddyya/notification/controller/NotificationController.java +++ b/src/main/java/com/team/buddyya/notification/controller/NotificationController.java @@ -1,6 +1,7 @@ package com.team.buddyya.notification.controller; import com.team.buddyya.auth.domain.CustomUserDetails; +import com.team.buddyya.notification.dto.request.PushToAllUsersRequest; import com.team.buddyya.notification.dto.request.SaveTokenRequest; import com.team.buddyya.notification.dto.response.SaveTokenResponse; import com.team.buddyya.notification.service.NotificationService; @@ -21,4 +22,10 @@ public ResponseEntity registerPushToken(@AuthenticationPrinci @RequestBody SaveTokenRequest request) { return ResponseEntity.ok(notificationService.savePushToken(userDetails.getStudentInfo().id(), request.token())); } + + @PostMapping("/send-to-all") + public ResponseEntity sendNotificationToAllUser(@RequestBody PushToAllUsersRequest request) { + notificationService.sendNotificationToAllUser(request); + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/com/team/buddyya/notification/dto/request/PushToAllUsersRequest.java b/src/main/java/com/team/buddyya/notification/dto/request/PushToAllUsersRequest.java new file mode 100644 index 00000000..3a1c84d6 --- /dev/null +++ b/src/main/java/com/team/buddyya/notification/dto/request/PushToAllUsersRequest.java @@ -0,0 +1,4 @@ +package com.team.buddyya.notification.dto.request; + +public record PushToAllUsersRequest(long feedId, String title, String body) { +} diff --git a/src/main/java/com/team/buddyya/notification/service/NotificationService.java b/src/main/java/com/team/buddyya/notification/service/NotificationService.java index 0c2b127d..ec0cfdb6 100644 --- a/src/main/java/com/team/buddyya/notification/service/NotificationService.java +++ b/src/main/java/com/team/buddyya/notification/service/NotificationService.java @@ -4,9 +4,13 @@ import com.team.buddyya.chatting.domain.Chatroom; import com.team.buddyya.feed.domain.Comment; import com.team.buddyya.feed.domain.Feed; +import com.team.buddyya.feed.exception.FeedException; +import com.team.buddyya.feed.exception.FeedExceptionType; +import com.team.buddyya.feed.repository.FeedRepository; import com.team.buddyya.match.domain.MatchRequest; import com.team.buddyya.notification.domain.ExpoToken; import com.team.buddyya.notification.domain.RequestNotification; +import com.team.buddyya.notification.dto.request.PushToAllUsersRequest; import com.team.buddyya.notification.dto.response.SaveTokenResponse; import com.team.buddyya.notification.exception.NotificationException; import com.team.buddyya.notification.exception.NotificationExceptionType; @@ -42,6 +46,7 @@ public class NotificationService { private final ExpoTokenRepository expoTokenRepository; private final FindStudentService findStudentService; + private final FeedRepository feedRepository; private final RestTemplate restTemplate; private final ObjectMapper objectMapper; @@ -217,6 +222,35 @@ private String getCommentReplyNotificationTitle(boolean isKorean) { return isKorean ? FEED_REPLY_TITLE_KR : FEED_REPLY_TITLE_EN; } + public void sendNotificationToAllUser(PushToAllUsersRequest request) { + Feed feed = feedRepository.findById(request.feedId()) + .orElseThrow(() -> new FeedException(FeedExceptionType.FEED_NOT_FOUND)); + String title = request.title(); + String body = request.body(); + Map data = Map.of( + "feedId", feed.getId(), + "type", "FEED" + ); + List tokens = expoTokenRepository.findAll(); + for (ExpoToken expoToken : tokens) { + try { + String token = expoToken.getToken(); + if (token == null || token.isBlank()) continue; + RequestNotification notification = RequestNotification.builder() + .to(token) + .title(title) + .body(body) + .data(data) + .build(); + sendToExpo(notification); + } catch (NotificationException e) { + log.warn("전체 유저 알림 전송 실패 - studentId: {}, error: {}", + expoToken.getStudent().getId(), + e.exceptionType().errorMessage()); + } + } + } + public void sendCommentNotification(Long writerId, Feed feed, String commentContent) { boolean isFeedOwner = feed.isFeedOwner(writerId); if (!isFeedOwner) {