From 4e3a3565d201641e22f2b829ad2146458d9da0fa Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Thu, 8 Aug 2024 16:45:52 +0900 Subject: [PATCH 1/7] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EC=97=90=20sourceUrl,=20sourceId=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/notification/QNotification.java | 2 ++ .../notification/QNotificationType.java | 2 ++ .../domain/notification/Notification.java | 21 +++++++++++++++---- .../domain/notification/NotificationType.java | 16 +++++++++++--- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/main/generated/com/gamegoo/domain/notification/QNotification.java b/src/main/generated/com/gamegoo/domain/notification/QNotification.java index a0bf4c6c..c9eccaac 100644 --- a/src/main/generated/com/gamegoo/domain/notification/QNotification.java +++ b/src/main/generated/com/gamegoo/domain/notification/QNotification.java @@ -37,6 +37,8 @@ public class QNotification extends EntityPathBase { public final QNotificationType notificationType; + public final NumberPath sourceId = createNumber("sourceId", Long.class); + //inherited public final DateTimePath updatedAt = _super.updatedAt; diff --git a/src/main/generated/com/gamegoo/domain/notification/QNotificationType.java b/src/main/generated/com/gamegoo/domain/notification/QNotificationType.java index d2e2fe1b..4321ade8 100644 --- a/src/main/generated/com/gamegoo/domain/notification/QNotificationType.java +++ b/src/main/generated/com/gamegoo/domain/notification/QNotificationType.java @@ -32,6 +32,8 @@ public class QNotificationType extends EntityPathBase { public final StringPath name = createString("name"); + public final StringPath sourceUrl = createString("sourceUrl"); + //inherited public final DateTimePath updatedAt = _super.updatedAt; diff --git a/src/main/java/com/gamegoo/domain/notification/Notification.java b/src/main/java/com/gamegoo/domain/notification/Notification.java index acaf798d..889ab2d4 100644 --- a/src/main/java/com/gamegoo/domain/notification/Notification.java +++ b/src/main/java/com/gamegoo/domain/notification/Notification.java @@ -2,9 +2,19 @@ import com.gamegoo.domain.Member; import com.gamegoo.domain.common.BaseDateTimeEntity; -import lombok.*; - -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Getter @@ -12,6 +22,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class Notification extends BaseDateTimeEntity { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "notification_id") @@ -21,7 +32,9 @@ public class Notification extends BaseDateTimeEntity { private String content; @Column(nullable = false) - private Boolean isRead; + private boolean isRead; + + private Long sourceId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id", nullable = false) diff --git a/src/main/java/com/gamegoo/domain/notification/NotificationType.java b/src/main/java/com/gamegoo/domain/notification/NotificationType.java index 50d8fb00..1b23ec1a 100644 --- a/src/main/java/com/gamegoo/domain/notification/NotificationType.java +++ b/src/main/java/com/gamegoo/domain/notification/NotificationType.java @@ -1,9 +1,16 @@ package com.gamegoo.domain.notification; import com.gamegoo.domain.common.BaseDateTimeEntity; -import lombok.*; - -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Getter @@ -11,6 +18,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class NotificationType extends BaseDateTimeEntity { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "notification_type_id") @@ -24,6 +32,8 @@ public class NotificationType extends BaseDateTimeEntity { @Column(nullable = false, length = 200) private String imgUrl; + + private String sourceUrl; } From 11e6797999e726b481000a26586b8d78065a396d Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Thu, 8 Aug 2024 16:58:30 +0900 Subject: [PATCH 2/7] =?UTF-8?q?:sparkles:=20[Feat]=20NotificationTypeTitle?= =?UTF-8?q?=20enum=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/notification/NotificationType.java | 10 ++++--- .../notification/NotificationTypeTitle.java | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gamegoo/domain/notification/NotificationTypeTitle.java diff --git a/src/main/java/com/gamegoo/domain/notification/NotificationType.java b/src/main/java/com/gamegoo/domain/notification/NotificationType.java index 1b23ec1a..9382d539 100644 --- a/src/main/java/com/gamegoo/domain/notification/NotificationType.java +++ b/src/main/java/com/gamegoo/domain/notification/NotificationType.java @@ -3,6 +3,8 @@ import com.gamegoo.domain.common.BaseDateTimeEntity; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -24,16 +26,16 @@ public class NotificationType extends BaseDateTimeEntity { @Column(name = "notification_type_id") private Long id; - @Column(nullable = false, length = 30) - private String name; + @Enumerated(EnumType.STRING) + @Column(columnDefinition = "VARCHAR(30)", nullable = false) + private NotificationTypeTitle title; @Column(nullable = false, length = 400) private String content; @Column(nullable = false, length = 200) private String imgUrl; - - private String sourceUrl; + private String sourceUrl; } diff --git a/src/main/java/com/gamegoo/domain/notification/NotificationTypeTitle.java b/src/main/java/com/gamegoo/domain/notification/NotificationTypeTitle.java new file mode 100644 index 00000000..9cb8f95e --- /dev/null +++ b/src/main/java/com/gamegoo/domain/notification/NotificationTypeTitle.java @@ -0,0 +1,27 @@ +package com.gamegoo.domain.notification; + +public enum NotificationTypeTitle { + FRIEND_REQUEST_SEND("님에게 친구 요청을 보냈어요.", null), + FRIEND_REQUEST_RECEIVED("님에게 친구 요청이 왔어요.", "/member/profile/"), + FRIEND_REQUEST_ACCEPTED("님이 친구를 수락했어요.", null), + FRIEND_REQUEST_REJECTED("님이 친구를 거절했어요.", null), + MANNER_LEVEL_UP("매너레벨이 n단계로 올라갔어요!", "/member/manner"), + MANNER_LEVEL_DOWN("매너레벨이 n단계로 떨어졌어요.", "/member/manner"), + MANNER_KEYWORD_RATED("지난 매칭에서 n 키워드를 받았어요.", "/member/manner"); + + private final String content; + private final String sourceUrl; + + NotificationTypeTitle(String content, String sourceUrl) { + this.content = content; + this.sourceUrl = sourceUrl; + } + + public String getMessage() { + return content; + } + + public String getSourceUrl() { + return sourceUrl; + } +} From 76cf13fae6507eb3aae4572793ed6e36be9c6841 Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Thu, 8 Aug 2024 17:29:59 +0900 Subject: [PATCH 3/7] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/code/status/ErrorStatus.java | 3 + .../handler/NotificationHandler.java | 11 ++ .../domain/notification/Notification.java | 9 + .../notification/NotificationRepository.java | 8 + .../NotificationTypeRepository.java | 12 ++ .../notification/NotificationService.java | 169 ++++++++++++++++++ 6 files changed, 212 insertions(+) create mode 100644 src/main/java/com/gamegoo/apiPayload/exception/handler/NotificationHandler.java create mode 100644 src/main/java/com/gamegoo/repository/notification/NotificationRepository.java create mode 100644 src/main/java/com/gamegoo/repository/notification/NotificationTypeRepository.java create mode 100644 src/main/java/com/gamegoo/service/notification/NotificationService.java diff --git a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java index 6cd189a8..e5fd8b0e 100644 --- a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java @@ -116,6 +116,9 @@ public enum ErrorStatus implements BaseErrorCode { BLOCKED_BY_FRIEND_TARGET(HttpStatus.BAD_REQUEST, "FRIEND403", "나를 차단한 회원입니다. 친구 요청을 보낼 수 없습니다."), + // 알림 관련 에러 + NOTIFICATION_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "NOTI401", "잘못된 알림 타입입니다."), + ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/gamegoo/apiPayload/exception/handler/NotificationHandler.java b/src/main/java/com/gamegoo/apiPayload/exception/handler/NotificationHandler.java new file mode 100644 index 00000000..b686b036 --- /dev/null +++ b/src/main/java/com/gamegoo/apiPayload/exception/handler/NotificationHandler.java @@ -0,0 +1,11 @@ +package com.gamegoo.apiPayload.exception.handler; + +import com.gamegoo.apiPayload.code.BaseErrorCode; +import com.gamegoo.apiPayload.exception.GeneralException; + +public class NotificationHandler extends GeneralException { + + public NotificationHandler(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/gamegoo/domain/notification/Notification.java b/src/main/java/com/gamegoo/domain/notification/Notification.java index 889ab2d4..ba250b2f 100644 --- a/src/main/java/com/gamegoo/domain/notification/Notification.java +++ b/src/main/java/com/gamegoo/domain/notification/Notification.java @@ -44,4 +44,13 @@ public class Notification extends BaseDateTimeEntity { @JoinColumn(name = "notification_type_id", nullable = false) private NotificationType notificationType; + // 연관관계 메소드 + public void setMember(Member member) { + if (this.member != null) { + this.member.getNotificationList().remove(this); + } + this.member = member; + this.member.getNotificationList().add(this); + } + } diff --git a/src/main/java/com/gamegoo/repository/notification/NotificationRepository.java b/src/main/java/com/gamegoo/repository/notification/NotificationRepository.java new file mode 100644 index 00000000..40604827 --- /dev/null +++ b/src/main/java/com/gamegoo/repository/notification/NotificationRepository.java @@ -0,0 +1,8 @@ +package com.gamegoo.repository.notification; + +import com.gamegoo.domain.notification.Notification; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface NotificationRepository extends JpaRepository { + +} diff --git a/src/main/java/com/gamegoo/repository/notification/NotificationTypeRepository.java b/src/main/java/com/gamegoo/repository/notification/NotificationTypeRepository.java new file mode 100644 index 00000000..8fe3cc71 --- /dev/null +++ b/src/main/java/com/gamegoo/repository/notification/NotificationTypeRepository.java @@ -0,0 +1,12 @@ +package com.gamegoo.repository.notification; + +import com.gamegoo.domain.notification.NotificationType; +import com.gamegoo.domain.notification.NotificationTypeTitle; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface NotificationTypeRepository extends JpaRepository { + + Optional findNotificationTypeByTitle(NotificationTypeTitle title); + +} diff --git a/src/main/java/com/gamegoo/service/notification/NotificationService.java b/src/main/java/com/gamegoo/service/notification/NotificationService.java new file mode 100644 index 00000000..d06fa255 --- /dev/null +++ b/src/main/java/com/gamegoo/service/notification/NotificationService.java @@ -0,0 +1,169 @@ +package com.gamegoo.service.notification; + + +import com.gamegoo.apiPayload.code.status.ErrorStatus; +import com.gamegoo.apiPayload.exception.handler.NotificationHandler; +import com.gamegoo.domain.Member; +import com.gamegoo.domain.notification.Notification; +import com.gamegoo.domain.notification.NotificationType; +import com.gamegoo.domain.notification.NotificationTypeTitle; +import com.gamegoo.repository.notification.NotificationRepository; +import com.gamegoo.repository.notification.NotificationTypeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class NotificationService { + + private final NotificationTypeRepository notificationTypeRepository; + private final NotificationRepository notificationRepository; + + /** + * 새로운 알림 생성 및 저장 메소드 + * + * @param notificationTypeTitle + * @param content + * @param sourceId + * @param member + * @return + */ + public Notification createNotification(NotificationTypeTitle notificationTypeTitle, + String content, Long sourceId, Member member) { + + NotificationType notificationType = notificationTypeRepository.findNotificationTypeByTitle( + notificationTypeTitle) + .orElseThrow(() -> new NotificationHandler(ErrorStatus.NOTIFICATION_TYPE_NOT_FOUND)); + + switch (notificationTypeTitle) { + case FRIEND_REQUEST_SEND: + return createFriendRequestSendNotification(notificationType, content, member); + case FRIEND_REQUEST_RECEIVED: + return createFriendRequestReceivedNotification(notificationType, content, sourceId, + member); + case FRIEND_REQUEST_ACCEPTED: + case FRIEND_REQUEST_REJECTED: + return createFriendRequestAcceptedAndRejectedNotification(notificationType, content, + member); + case MANNER_LEVEL_UP: + case MANNER_LEVEL_DOWN: + return createMannerLevelUpDownNotification(notificationType, content, member); + case MANNER_KEYWORD_RATED: + return createMannerKeywordRatedNotification(notificationType, content, member); + default: + throw new NotificationHandler(ErrorStatus.NOTIFICATION_TYPE_NOT_FOUND); + } + } + + /** + * 친구 요청 전송됨 알림 생성 + * + * @param notificationType + * @param content + * @param member + * @return + */ + private Notification createFriendRequestSendNotification( + NotificationType notificationType, + String content, Member member) { + Notification notification = Notification.builder() + .notificationType(notificationType) + .content(content + notificationType.getContent()) + .isRead(false) + .build(); + notification.setMember(member); + + return notificationRepository.save(notification); + } + + /** + * 친구 요청 받음 알림 생성 + * + * @param notificationType + * @param content + * @param sourceId + * @param member + * @return + */ + private Notification createFriendRequestReceivedNotification( + NotificationType notificationType, + String content, Long sourceId, Member member + ) { + Notification notification = Notification.builder() + .notificationType(notificationType) + .content(content + notificationType.getContent()) + .sourceId(sourceId) + .isRead(false) + .build(); + notification.setMember(member); + + return notificationRepository.save(notification); + } + + /** + * 친구 요청 수락됨, 거절됨 알림 생성 + * + * @param notificationType + * @param content + * @param member + * @return + */ + private Notification createFriendRequestAcceptedAndRejectedNotification( + NotificationType notificationType, + String content, Member member + ) { + Notification notification = Notification.builder() + .notificationType(notificationType) + .content(content + notificationType.getContent()) + .isRead(false) + .build(); + notification.setMember(member); + + return notificationRepository.save(notification); + } + + /** + * 매너레벨 상승, 하락 알림 생성 + * + * @param notificationType + * @param content + * @param member + * @return + */ + private Notification createMannerLevelUpDownNotification(NotificationType notificationType, + String content, Member member) { + String notificationContent = notificationType.getContent().replace("n", content); + Notification notification = Notification.builder() + .notificationType(notificationType) + .content(notificationContent) + .isRead(false) + .build(); + notification.setMember(member); + + return notificationRepository.save(notification); + } + + /** + * 키워드 평가 알림 생성 + * + * @param notificationType + * @param content + * @param member + * @return + */ + private Notification createMannerKeywordRatedNotification(NotificationType notificationType, + String content, Member member) { + String notificationContent = notificationType.getContent().replace("n", content); + Notification notification = Notification.builder() + .notificationType(notificationType) + .content(notificationContent) + .isRead(false) + .build(); + notification.setMember(member); + + return notificationRepository.save(notification); + } + +} From 484e6b2102cf2465eadcd01461ff7f593a2c6010 Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Thu, 8 Aug 2024 17:42:27 +0900 Subject: [PATCH 4/7] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=B9=9C=EA=B5=AC=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=A0=84=EC=86=A1=20=EC=8B=9C=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EB=93=B1=EB=A1=9D=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/notification/QNotificationType.java | 4 ++-- .../apiPayload/code/status/ErrorStatus.java | 1 + .../gamegoo/service/member/FriendService.java | 17 ++++++++++++++++- .../notification/NotificationService.java | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/generated/com/gamegoo/domain/notification/QNotificationType.java b/src/main/generated/com/gamegoo/domain/notification/QNotificationType.java index 4321ade8..2b57f6ab 100644 --- a/src/main/generated/com/gamegoo/domain/notification/QNotificationType.java +++ b/src/main/generated/com/gamegoo/domain/notification/QNotificationType.java @@ -30,10 +30,10 @@ public class QNotificationType extends EntityPathBase { public final StringPath imgUrl = createString("imgUrl"); - public final StringPath name = createString("name"); - public final StringPath sourceUrl = createString("sourceUrl"); + public final EnumPath title = createEnum("title", NotificationTypeTitle.class); + //inherited public final DateTimePath updatedAt = _super.updatedAt; diff --git a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java index e5fd8b0e..8095bc2e 100644 --- a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java @@ -118,6 +118,7 @@ public enum ErrorStatus implements BaseErrorCode { // 알림 관련 에러 NOTIFICATION_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "NOTI401", "잘못된 알림 타입입니다."), + NOTIFICATION_METHOD_BAD_REQUEST(HttpStatus.BAD_REQUEST, "NOTI402", "알림 생성 메소드 호출이 잘못되었습니다."), ; diff --git a/src/main/java/com/gamegoo/service/member/FriendService.java b/src/main/java/com/gamegoo/service/member/FriendService.java index b40b4048..a75cc2ba 100644 --- a/src/main/java/com/gamegoo/service/member/FriendService.java +++ b/src/main/java/com/gamegoo/service/member/FriendService.java @@ -6,8 +6,10 @@ import com.gamegoo.domain.friend.Friend; import com.gamegoo.domain.friend.FriendRequestStatus; import com.gamegoo.domain.friend.FriendRequests; +import com.gamegoo.domain.notification.NotificationTypeTitle; import com.gamegoo.repository.friend.FriendRepository; import com.gamegoo.repository.friend.FriendRequestsRepository; +import com.gamegoo.service.notification.NotificationService; import com.gamegoo.util.MemberUtils; import java.util.List; import lombok.RequiredArgsConstructor; @@ -22,6 +24,7 @@ public class FriendService { private final FriendRepository friendRepository; private final FriendRequestsRepository friendRequestsRepository; private final ProfileService profileService; + private final NotificationService notificationService; /** * memberId에 해당하는 회원의 친구 목록 조회 @@ -47,6 +50,7 @@ public FriendRequests sendFriendRequest(Long memberId, Long targetMemberId) { Member targetMember = profileService.findMember(targetMemberId); + // targetMember로 나 자신을 요청한 경우 if (member.equals(targetMember)) { throw new FriendHandler(ErrorStatus.FRIEND_BAD_REQUEST); } @@ -67,6 +71,17 @@ public FriendRequests sendFriendRequest(Long memberId, Long targetMemberId) { .toMember(targetMember) .build(); - return friendRequestsRepository.save(friendRequests); + FriendRequests savedFriendRequests = friendRequestsRepository.save(friendRequests); + + // 친구 요청 알림 생성 + // member -> targetMember + notificationService.createNotification(NotificationTypeTitle.FRIEND_REQUEST_SEND, + targetMember.getGameName(), null, member); + + // targetMember -> member + notificationService.createNotification(NotificationTypeTitle.FRIEND_REQUEST_RECEIVED, + member.getGameName(), member.getId(), targetMember); + + return savedFriendRequests; } } diff --git a/src/main/java/com/gamegoo/service/notification/NotificationService.java b/src/main/java/com/gamegoo/service/notification/NotificationService.java index d06fa255..fdc36825 100644 --- a/src/main/java/com/gamegoo/service/notification/NotificationService.java +++ b/src/main/java/com/gamegoo/service/notification/NotificationService.java @@ -41,6 +41,9 @@ public Notification createNotification(NotificationTypeTitle notificationTypeTit case FRIEND_REQUEST_SEND: return createFriendRequestSendNotification(notificationType, content, member); case FRIEND_REQUEST_RECEIVED: + if (sourceId == null) { + throw new NotificationHandler(ErrorStatus.NOTIFICATION_METHOD_BAD_REQUEST); + } return createFriendRequestReceivedNotification(notificationType, content, sourceId, member); case FRIEND_REQUEST_ACCEPTED: From 431c4e2170e1497db5649a51661460740f82e12a Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Thu, 8 Aug 2024 17:52:55 +0900 Subject: [PATCH 5/7] =?UTF-8?q?:sparkles:=20[Feat]=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=95=8C=EB=A6=BC=20=ED=83=80=EC=9E=85=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A0=84=EC=86=A1=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/NotificationTypeTitle.java | 4 +++- .../notification/NotificationService.java | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gamegoo/domain/notification/NotificationTypeTitle.java b/src/main/java/com/gamegoo/domain/notification/NotificationTypeTitle.java index 9cb8f95e..ab73c9bf 100644 --- a/src/main/java/com/gamegoo/domain/notification/NotificationTypeTitle.java +++ b/src/main/java/com/gamegoo/domain/notification/NotificationTypeTitle.java @@ -7,7 +7,9 @@ public enum NotificationTypeTitle { FRIEND_REQUEST_REJECTED("님이 친구를 거절했어요.", null), MANNER_LEVEL_UP("매너레벨이 n단계로 올라갔어요!", "/member/manner"), MANNER_LEVEL_DOWN("매너레벨이 n단계로 떨어졌어요.", "/member/manner"), - MANNER_KEYWORD_RATED("지난 매칭에서 n 키워드를 받았어요.", "/member/manner"); + MANNER_KEYWORD_RATED("지난 매칭에서 n 키워드를 받았어요.", "/member/manner"), + TEST_ALARM("TEST PUSH. NUMBER: ", null), + ; private final String content; private final String sourceUrl; diff --git a/src/main/java/com/gamegoo/service/notification/NotificationService.java b/src/main/java/com/gamegoo/service/notification/NotificationService.java index fdc36825..ed24bd39 100644 --- a/src/main/java/com/gamegoo/service/notification/NotificationService.java +++ b/src/main/java/com/gamegoo/service/notification/NotificationService.java @@ -55,6 +55,8 @@ public Notification createNotification(NotificationTypeTitle notificationTypeTit return createMannerLevelUpDownNotification(notificationType, content, member); case MANNER_KEYWORD_RATED: return createMannerKeywordRatedNotification(notificationType, content, member); + case TEST_ALARM: + return createTestNotification(notificationType, content, member); default: throw new NotificationHandler(ErrorStatus.NOTIFICATION_TYPE_NOT_FOUND); } @@ -169,4 +171,24 @@ private Notification createMannerKeywordRatedNotification(NotificationType notif return notificationRepository.save(notification); } + /** + * 테스트 알림 생성 + * + * @param notificationType + * @param content + * @param member + * @return + */ + private Notification createTestNotification(NotificationType notificationType, String content, + Member member) { + Notification notification = Notification.builder() + .notificationType(notificationType) + .content(notificationType.getContent() + content) + .isRead(false) + .build(); + notification.setMember(member); + + return notificationRepository.save(notification); + } + } From 7a141fce2a1b573f42f3511c59561b059057b9bf Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Thu, 8 Aug 2024 18:02:58 +0900 Subject: [PATCH 6/7] =?UTF-8?q?:sparkles:=20[Feat]=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=95=8C=EB=A6=BC=20=EC=83=9D=EC=84=B1=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamegoo/controller/TestController.java | 27 ++++++++++++++++++- .../notification/NotificationService.java | 8 +++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gamegoo/controller/TestController.java b/src/main/java/com/gamegoo/controller/TestController.java index 3ad1e0a6..c8f2b444 100644 --- a/src/main/java/com/gamegoo/controller/TestController.java +++ b/src/main/java/com/gamegoo/controller/TestController.java @@ -1,11 +1,18 @@ package com.gamegoo.controller; +import com.gamegoo.apiPayload.ApiResponse; import com.gamegoo.apiPayload.code.status.ErrorStatus; import com.gamegoo.apiPayload.exception.handler.TempHandler; +import com.gamegoo.domain.Member; +import com.gamegoo.domain.notification.NotificationTypeTitle; +import com.gamegoo.service.member.ProfileService; +import com.gamegoo.service.notification.NotificationService; +import com.gamegoo.util.JWTUtil; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,6 +22,9 @@ @Slf4j public class TestController { + private final NotificationService notificationService; + private final ProfileService profileService; + @GetMapping("/test/hello") @Operation(summary = "swagger 테스트용 API 입니다.", description = "simple API for swagger test!") public String hello() { @@ -26,5 +36,20 @@ public String hello() { public String apiResponseTest() { throw new TempHandler(ErrorStatus.TEMP_EXCEPTION); } - + + @GetMapping("/test/send/notifications/{times}") + @Operation(summary = "테스트용 알림 생성 API 입니다.", description = "서버 테스트용 입니다!!") + public ApiResponse sendTestNotifications( + @PathVariable(name = "times") int times + ) { + Long memberId = JWTUtil.getCurrentUserId(); + Member member = profileService.findMember(memberId); + + for (int i = 0; i < times; i++) { + notificationService.createNotification(NotificationTypeTitle.TEST_ALARM, null, null, + member); + } + return ApiResponse.onSuccess("테스트 알림 생성 성공"); + } + } diff --git a/src/main/java/com/gamegoo/service/notification/NotificationService.java b/src/main/java/com/gamegoo/service/notification/NotificationService.java index ed24bd39..e794354a 100644 --- a/src/main/java/com/gamegoo/service/notification/NotificationService.java +++ b/src/main/java/com/gamegoo/service/notification/NotificationService.java @@ -9,6 +9,7 @@ import com.gamegoo.domain.notification.NotificationTypeTitle; import com.gamegoo.repository.notification.NotificationRepository; import com.gamegoo.repository.notification.NotificationTypeRepository; +import java.util.Random; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -56,7 +57,12 @@ public Notification createNotification(NotificationTypeTitle notificationTypeTit case MANNER_KEYWORD_RATED: return createMannerKeywordRatedNotification(notificationType, content, member); case TEST_ALARM: - return createTestNotification(notificationType, content, member); + // 랜덤 숫자 생성 + Random random = new Random(); + int i = random.nextInt(1000) + 1; + // 숫자를 String 형으로 변환 + String randomNumberString = Integer.toString(i); + return createTestNotification(notificationType, randomNumberString, member); default: throw new NotificationHandler(ErrorStatus.NOTIFICATION_TYPE_NOT_FOUND); } From b0ea1089c4ff7be8caf6231cca834c69327eb333 Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Thu, 8 Aug 2024 18:08:06 +0900 Subject: [PATCH 7/7] =?UTF-8?q?:memo:=20[Docs]=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamegoo/service/notification/NotificationService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gamegoo/service/notification/NotificationService.java b/src/main/java/com/gamegoo/service/notification/NotificationService.java index e794354a..c51aba10 100644 --- a/src/main/java/com/gamegoo/service/notification/NotificationService.java +++ b/src/main/java/com/gamegoo/service/notification/NotificationService.java @@ -26,9 +26,9 @@ public class NotificationService { * 새로운 알림 생성 및 저장 메소드 * * @param notificationTypeTitle - * @param content - * @param sourceId - * @param member + * @param content 각 알림에 포함되어어야 할 정보 (사용자 닉네임, 매너레벨 단계, 키둬드) + * @param sourceId 이동해야할 url의 고유 id 파라미터, FRIEND_REQUEST_RECEIVED에서만 필요 + * @param member 알림을 받을 대상 회원 * @return */ public Notification createNotification(NotificationTypeTitle notificationTypeTitle,