Skip to content

Commit 46dd613

Browse files
authored
Merge pull request #114 from JA-yeong-eop-JA-moeu-JA/feat/#111-unread-notification-count
✨ Feat: 안 읽은 알림 개수 조회 API 구현
2 parents 10650a3 + 4f444b3 commit 46dd613

File tree

7 files changed

+58
-17
lines changed

7 files changed

+58
-17
lines changed

src/main/java/com/jajaja/domain/notification/controller/NotificationController.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.jajaja.domain.notification.controller;
22

3-
import java.util.List;
4-
3+
import com.jajaja.domain.notification.dto.NotificationResponseDto;
4+
import com.jajaja.domain.notification.dto.UnreadCountResponseDto;
55
import com.jajaja.domain.notification.repository.NotificationSseEmitterRepository;
6+
import com.jajaja.domain.notification.service.NotificationService;
7+
import com.jajaja.global.apiPayload.ApiResponse;
68
import com.jajaja.global.security.annotation.Auth;
79
import io.swagger.v3.oas.annotations.Operation;
810
import lombok.RequiredArgsConstructor;
911
import org.springframework.http.MediaType;
1012
import org.springframework.web.bind.annotation.*;
1113
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
12-
import com.jajaja.global.apiPayload.ApiResponse;
13-
import com.jajaja.domain.notification.dto.NotificationResponseDto;
14-
import com.jajaja.domain.notification.service.NotificationService;
14+
15+
import java.util.List;
1516

1617
@RestController
1718
@RequestMapping("/api/notifications")
@@ -58,4 +59,14 @@ public ApiResponse<Void> markAllAsRead(@Auth Long memberId) {
5859
notificationService.markAllAsRead(memberId);
5960
return ApiResponse.onSuccess(null);
6061
}
62+
63+
@Operation(
64+
summary = "읽지 않은 알림 개수 조회 API | by 구름/윤윤지",
65+
description = "사용자의 읽지 않은 알림 개수를 반환합니다."
66+
)
67+
@GetMapping("/unread")
68+
public ApiResponse<UnreadCountResponseDto> getUnreadCount(@Auth Long memberId) {
69+
return ApiResponse.onSuccess(notificationService.getUnreadCount(memberId));
70+
}
71+
6172
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.jajaja.domain.notification.dto;
2+
3+
public record UnreadCountResponseDto(int unreadCount) {
4+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.jajaja.domain.notification.repository;
22

33
import com.jajaja.domain.notification.entity.Notification;
4+
45
import java.util.List;
56

67
public interface NotificationRepositoryCustom {
78
List<Notification> findNotificationsByMemberId(Long memberId);
89
int markAllAsReadByMemberId(Long memberId);
10+
int countUnreadByMemberId(Long memberId);
911
}

src/main/java/com/jajaja/domain/notification/repository/NotificationRepositoryImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.querydsl.jpa.impl.JPAQueryFactory;
66
import lombok.RequiredArgsConstructor;
77
import org.springframework.stereotype.Repository;
8+
89
import java.util.List;
910

1011
@Repository
@@ -30,4 +31,14 @@ public int markAllAsReadByMemberId(Long memberId) {
3031
.where(n.member.id.eq(memberId).and(n.isRead.isFalse()))
3132
.execute();
3233
}
34+
35+
@Override
36+
public int countUnreadByMemberId(Long memberId) {
37+
QNotification n = QNotification.notification;
38+
return (int) queryFactory
39+
.selectFrom(n)
40+
.where(n.member.id.eq(memberId).and(n.isRead.isFalse()))
41+
.fetchCount();
42+
}
43+
3344
}

src/main/java/com/jajaja/domain/notification/repository/NotificationSseEmitterRepository.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.jajaja.domain.notification.repository;
22

3+
import org.springframework.stereotype.Component;
4+
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
5+
36
import java.io.IOException;
47
import java.util.ArrayList;
58
import java.util.List;
69
import java.util.Map;
710
import java.util.concurrent.ConcurrentHashMap;
8-
import org.springframework.stereotype.Component;
9-
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
1011

1112
@Component
1213
public class NotificationSseEmitterRepository {
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.jajaja.domain.notification.service;
22

3-
import java.util.List;
43
import com.jajaja.domain.notification.dto.NotificationCreateRequestDto;
54
import com.jajaja.domain.notification.dto.NotificationResponseDto;
5+
import com.jajaja.domain.notification.dto.UnreadCountResponseDto;
6+
7+
import java.util.List;
68

79
public interface NotificationService {
810
Long createNotification(NotificationCreateRequestDto requestDto);
911
List<NotificationResponseDto> getNotifications(Long memberId);
1012
void markAsRead(Long notificationId, Long memberId);
1113
void markAllAsRead(Long memberId);
14+
UnreadCountResponseDto getUnreadCount(Long memberId);
1215
}

src/main/java/com/jajaja/domain/notification/service/NotificationServiceImpl.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
package com.jajaja.domain.notification.service;
22

3-
import java.util.List;
4-
import java.util.stream.Collectors;
5-
3+
import com.jajaja.domain.member.entity.Member;
4+
import com.jajaja.domain.member.repository.MemberRepository;
5+
import com.jajaja.domain.notification.dto.NotificationCreateRequestDto;
6+
import com.jajaja.domain.notification.dto.NotificationResponseDto;
7+
import com.jajaja.domain.notification.dto.UnreadCountResponseDto;
8+
import com.jajaja.domain.notification.entity.Notification;
9+
import com.jajaja.domain.notification.repository.NotificationRepository;
610
import com.jajaja.domain.notification.repository.NotificationSseEmitterRepository;
711
import com.jajaja.global.apiPayload.code.status.ErrorStatus;
812
import com.jajaja.global.apiPayload.exception.custom.BadRequestException;
913
import lombok.RequiredArgsConstructor;
1014
import org.springframework.security.access.AccessDeniedException;
1115
import org.springframework.stereotype.Service;
1216
import org.springframework.transaction.annotation.Transactional;
13-
import com.jajaja.domain.member.entity.Member;
14-
import com.jajaja.domain.member.repository.MemberRepository;
15-
import com.jajaja.domain.notification.dto.NotificationCreateRequestDto;
16-
import com.jajaja.domain.notification.dto.NotificationResponseDto;
17-
import com.jajaja.domain.notification.entity.Notification;
18-
import com.jajaja.domain.notification.repository.NotificationRepository;
17+
18+
import java.util.List;
19+
import java.util.stream.Collectors;
1920

2021
@Service
2122
@RequiredArgsConstructor
@@ -72,4 +73,12 @@ private void validateOwnership(Notification notification, Long memberId) {
7273
throw new AccessDeniedException(ErrorStatus.NOTIFICATION_ACCESS_DENIED.getMessage());
7374
}
7475
}
76+
77+
@Override
78+
@Transactional
79+
public UnreadCountResponseDto getUnreadCount(Long memberId) {
80+
int count = notificationRepository.countUnreadByMemberId(memberId);
81+
return new UnreadCountResponseDto(count);
82+
}
83+
7584
}

0 commit comments

Comments
 (0)