From 6e386db94224d70b0d12e2e37013d054694ee347 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sat, 25 Nov 2023 02:22:39 +0900 Subject: [PATCH 01/78] =?UTF-8?q?feat:=20Crew,=20Game=20=EC=95=8C=EB=9E=8C?= =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alaram/domain/AlaramType.java | 42 +++++++++++++ .../back/alaram/domain/CrewAlaram.java | 61 +++++++++++++++++++ .../back/alaram/domain/GameAlaram.java | 60 ++++++++++++++++++ .../back/common/domain/BaseEntity.java | 12 ++-- .../kr/pickple/back/game/domain/Game.java | 33 ++++------ 5 files changed, 180 insertions(+), 28 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alaram/domain/AlaramType.java create mode 100644 src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java create mode 100644 src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java b/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java new file mode 100644 index 00000000..26f42525 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java @@ -0,0 +1,42 @@ +package kr.pickple.back.alaram.domain; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import kr.pickple.back.crew.exception.CrewException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static kr.pickple.back.alaram.exception.AlaramExceptionCode.ALARM_TYPE_NOT_FOUND; + +@Getter +@RequiredArgsConstructor +public enum AlaramType { + + CREW_LEADER_WAITING("가입 수락을 기다리고 있어요"), + CREW_ACCEPT("크루 가입이 수락되었어요"), + CREW_DENIED("크루 가입이 거절되었어요"), + HOST_WAITING("게스트 모집 창여 수락이 기다리고 있어요"), + GUST_ACCEPT("게스트 참여가 수락되었어요"), + GUST_DENIED("게스트 참여가 거절되었어요"), + ; + private static final Map alaramTypeMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(AlaramType::getDescription, Function.identity()))); + + @JsonValue + private final String description; + + @JsonCreator + public static AlaramType from(final String description) { + if (alaramTypeMap.containsKey(description)) { + return alaramTypeMap.get(description); + } + throw new CrewException(ALARM_TYPE_NOT_FOUND, description); + } + +} diff --git a/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java b/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java new file mode 100644 index 00000000..55b28823 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java @@ -0,0 +1,61 @@ +package kr.pickple.back.alaram.domain; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.alaram.util.AlaramTypeConverter; +import kr.pickple.back.common.domain.BaseEntity; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.member.domain.Member; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +import java.time.LocalDateTime; + +import static kr.pickple.back.alaram.domain.AlaramStatus.FALSE; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CrewAlaram extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(length = 10) + @Convert(converter = AlaramStatus.class) + private AlaramStatus isRead = FALSE; + + @NotNull + @Column(length = 20) + @Convert(converter = AlaramTypeConverter.class) + private AlaramType alaramType; + + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdAt; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "crew_id") + private Crew crew; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @Builder + private CrewAlaram( + final AlaramType alaramType, + final Crew crew, + final Member member + ) { + this.alaramType = alaramType; + this.createdAt = super.getCreatedAt(); + this.crew = crew; + this.member = member; + } +} diff --git a/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java b/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java new file mode 100644 index 00000000..a01a145d --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java @@ -0,0 +1,60 @@ +package kr.pickple.back.alaram.domain; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.common.domain.BaseEntity; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.member.domain.Member; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +import java.time.LocalDateTime; + +import static kr.pickple.back.alaram.domain.AlaramStatus.FALSE; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GameAlaram extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(length = 10) + @Convert(converter = AlaramStatus.class) + private AlaramStatus isRead = FALSE; + + @NotNull + @Column(length = 20) + @Convert(converter = AlaramType.class) + private AlaramType alaramType; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "game_id") + private Game game; + + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdAt; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @Builder + private GameAlaram( + final AlaramType alaramType, + final Game game, + final Member member + ) { + this.alaramType = alaramType; + this.createdAt = super.getCreatedAt(); + this.game = game; + this.member = member; + } +} diff --git a/src/main/java/kr/pickple/back/common/domain/BaseEntity.java b/src/main/java/kr/pickple/back/common/domain/BaseEntity.java index ff684549..7c6236ac 100644 --- a/src/main/java/kr/pickple/back/common/domain/BaseEntity.java +++ b/src/main/java/kr/pickple/back/common/domain/BaseEntity.java @@ -1,16 +1,14 @@ package kr.pickple.back.common.domain; -import java.time.LocalDateTime; - -import org.hibernate.annotations.ColumnDefault; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; @Getter @MappedSuperclass diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/domain/Game.java index 5bc334fd..b64cf6cc 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -1,26 +1,6 @@ package kr.pickple.back.game.domain; -import static kr.pickple.back.game.domain.GameStatus.*; -import static kr.pickple.back.game.exception.GameExceptionCode.*; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.List; - -import org.locationtech.jts.geom.Point; -import org.springframework.util.StringUtils; - -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; +import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; @@ -35,6 +15,17 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.locationtech.jts.geom.Point; +import org.springframework.util.StringUtils; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +import static kr.pickple.back.game.domain.GameStatus.CLOSED; +import static kr.pickple.back.game.domain.GameStatus.OPEN; +import static kr.pickple.back.game.exception.GameExceptionCode.GAME_CAPACITY_LIMIT_REACHED; +import static kr.pickple.back.game.exception.GameExceptionCode.GAME_STATUS_IS_CLOSED; @Entity @Getter From 473eb81ec74caf303d1f055862a2e6a79ca4d0b1 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 15:34:51 +0900 Subject: [PATCH 02/78] =?UTF-8?q?feat:=20=ED=86=B5=ED=95=A9=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/alaram/domain/Alaram.java | 61 +++++++++++++++++++ .../back/alaram/domain/AlaramStatus.java | 37 +++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/domain/Alaram.java create mode 100644 src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java diff --git a/src/main/java/kr/pickple/back/alaram/domain/Alaram.java b/src/main/java/kr/pickple/back/alaram/domain/Alaram.java new file mode 100644 index 00000000..dfc3dad0 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/domain/Alaram.java @@ -0,0 +1,61 @@ +package kr.pickple.back.alaram.domain; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.alaram.util.AlaramStatusConverter; +import kr.pickple.back.member.domain.Member; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import static kr.pickple.back.alaram.domain.AlaramStatus.FALSE; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Alaram { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(length = 10) + @Convert(converter = AlaramStatusConverter.class) + private AlaramStatus status = FALSE; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "crew_alaram_id") + private CrewAlaram crewAlaram; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "game_alaram_id") + private GameAlaram gameAlaram; + + @Builder + private Alaram( + final Member member, + final CrewAlaram crewAlaram, + final GameAlaram gameAlaram + ) { + this.member = member; + this.status = findAlaramUnRead(status); + this.crewAlaram = crewAlaram; + this.gameAlaram = gameAlaram; + } + + private AlaramStatus findAlaramUnRead(AlaramStatus status) { + //1. 크루 알람 조회 - 상태가 unread가 있는지 체크 + + //2. 게임 알람 조회 - 상태가 unread가 있는지 체크 + + //3.status 상태 변화 + + return this.status; + } +} diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java b/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java new file mode 100644 index 00000000..538f8863 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java @@ -0,0 +1,37 @@ +package kr.pickple.back.alaram.domain; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import kr.pickple.back.crew.exception.CrewException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static kr.pickple.back.alaram.exception.AlaramExceptionCode.ALARM_STATUS_NOT_FOUND; + +@Getter +@RequiredArgsConstructor +public enum AlaramStatus { + + TRUE("true"), + FALSE("false"); + + private static final Map alaramStatusMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(AlaramStatus::getDescription, Function.identity()))); + + @JsonValue + private final String description; + + @JsonCreator + public static AlaramStatus from(final String description) { + if (alaramStatusMap.containsKey(description)) { + return alaramStatusMap.get(description); + } + throw new CrewException(ALARM_STATUS_NOT_FOUND, description); + } +} From a1660fad53d3e04a2b518179ce0a4d966c88b7df Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 15:35:17 +0900 Subject: [PATCH 03/78] =?UTF-8?q?feat:=EC=95=8C=EB=9E=8C=20=EC=83=81?= =?UTF-8?q?=ED=83=9C,=20=EC=95=8C=EB=9E=8C=20=ED=83=80=EC=9E=85=20Converte?= =?UTF-8?q?r=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alaram/util/AlaramStatusConverter.java | 19 +++++++++++++++++++ .../back/alaram/util/AlaramTypeConverter.java | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java create mode 100644 src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java diff --git a/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java new file mode 100644 index 00000000..5e12bb67 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java @@ -0,0 +1,19 @@ +package kr.pickple.back.alaram.util; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Convert; +import kr.pickple.back.alaram.domain.AlaramStatus; + +@Convert +public class AlaramStatusConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(final AlaramStatus status) { + return status.getDescription(); + } + + @Override + public AlaramStatus convertToEntityAttribute(final String status) { + return AlaramStatus.from(status); + } +} diff --git a/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java new file mode 100644 index 00000000..7ce25650 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java @@ -0,0 +1,17 @@ +package kr.pickple.back.alaram.util; + +import jakarta.persistence.AttributeConverter; +import kr.pickple.back.alaram.domain.AlaramType; + +public class AlaramTypeConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(final AlaramType alaramType) { + return alaramType.getDescription(); + } + + @Override + public AlaramType convertToEntityAttribute(final String alaramType) { + return AlaramType.from(alaramType); + } +} From 6ae6963ec87cc506d03106922a538106b11e29ef Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 15:37:39 +0900 Subject: [PATCH 04/78] =?UTF-8?q?feat:=20Crew=EC=95=8C=EB=9E=8C,=20Game?= =?UTF-8?q?=EC=95=8C=EB=9E=8C,=20=ED=86=B5=ED=95=A9=20=EC=95=8C=EB=9E=8C?= =?UTF-8?q?=20=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=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 --- .../pickple/back/alaram/repository/AlaramRepository.java | 7 +++++++ .../back/alaram/repository/CrewAlaramRepository.java | 7 +++++++ .../back/alaram/repository/GameAlaramRepository.java | 7 +++++++ 3 files changed, 21 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/repository/AlaramRepository.java create mode 100644 src/main/java/kr/pickple/back/alaram/repository/CrewAlaramRepository.java create mode 100644 src/main/java/kr/pickple/back/alaram/repository/GameAlaramRepository.java diff --git a/src/main/java/kr/pickple/back/alaram/repository/AlaramRepository.java b/src/main/java/kr/pickple/back/alaram/repository/AlaramRepository.java new file mode 100644 index 00000000..4b8b94e9 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/repository/AlaramRepository.java @@ -0,0 +1,7 @@ +package kr.pickple.back.alaram.repository; + +import kr.pickple.back.alaram.domain.Alaram; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AlaramRepository extends JpaRepository { +} diff --git a/src/main/java/kr/pickple/back/alaram/repository/CrewAlaramRepository.java b/src/main/java/kr/pickple/back/alaram/repository/CrewAlaramRepository.java new file mode 100644 index 00000000..8e852c9a --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/repository/CrewAlaramRepository.java @@ -0,0 +1,7 @@ +package kr.pickple.back.alaram.repository; + +import kr.pickple.back.alaram.domain.CrewAlaram; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CrewAlaramRepository extends JpaRepository { +} diff --git a/src/main/java/kr/pickple/back/alaram/repository/GameAlaramRepository.java b/src/main/java/kr/pickple/back/alaram/repository/GameAlaramRepository.java new file mode 100644 index 00000000..fa130cf3 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/repository/GameAlaramRepository.java @@ -0,0 +1,7 @@ +package kr.pickple.back.alaram.repository; + +import kr.pickple.back.alaram.domain.GameAlaram; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GameAlaramRepository extends JpaRepository { +} From bc5c2e69dd6ed0f07c85f80eaef005af2ee62ebc Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 15:41:57 +0900 Subject: [PATCH 05/78] =?UTF-8?q?feat:=20=ED=86=B5=ED=95=A9=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=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 --- .../alaram/exception/AlaramException.java | 11 ++++++++++ .../alaram/exception/AlaramExceptionCode.java | 20 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/exception/AlaramException.java create mode 100644 src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java diff --git a/src/main/java/kr/pickple/back/alaram/exception/AlaramException.java b/src/main/java/kr/pickple/back/alaram/exception/AlaramException.java new file mode 100644 index 00000000..ee1b9526 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/exception/AlaramException.java @@ -0,0 +1,11 @@ +package kr.pickple.back.alaram.exception; + +import kr.pickple.back.common.exception.BusinessException; +import kr.pickple.back.common.exception.ExceptionCode; + +public class AlaramException extends BusinessException { + + public AlaramException(final ExceptionCode exceptionCode, final Object... rejectedValues) { + super(exceptionCode, rejectedValues); + } +} diff --git a/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java b/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java new file mode 100644 index 00000000..58ee1fa6 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java @@ -0,0 +1,20 @@ +package kr.pickple.back.alaram.exception; + +import kr.pickple.back.common.exception.ExceptionCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum AlaramExceptionCode implements ExceptionCode { + + ALARM_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-001", "알람 상태 여부를 찾을 수 없음"), + ALARM_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND,"AEC-002","알림 타입을 찾을 수 없음"), + ; + + + private final HttpStatus status; + private final String code; + private final String message; +} From 7de823682118cddb40623c778ae75168014cd622 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 16:56:43 +0900 Subject: [PATCH 06/78] =?UTF-8?q?refactor:=20Crew=20=EC=95=8C=EB=A6=BC,=20?= =?UTF-8?q?Game=20=EC=95=8C=EB=A6=BC=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alaram/domain/AlaramStatus.java | 11 +++++++--- .../back/alaram/domain/AlaramType.java | 20 +++++++++++-------- .../back/alaram/domain/CrewAlaram.java | 3 ++- .../back/alaram/domain/GameAlaram.java | 14 +++++++------ .../alaram/util/AlaramStatusConverter.java | 2 +- .../back/alaram/util/AlaramTypeConverter.java | 10 +++++----- 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java b/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java index 538f8863..463daded 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java +++ b/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java @@ -18,14 +18,14 @@ @RequiredArgsConstructor public enum AlaramStatus { - TRUE("true"), - FALSE("false"); + TRUE("읽음", true), + FALSE("읽지 않음", false); private static final Map alaramStatusMap = Collections.unmodifiableMap(Stream.of(values()) .collect(Collectors.toMap(AlaramStatus::getDescription, Function.identity()))); - @JsonValue private final String description; + private final Boolean booleanValue; @JsonCreator public static AlaramStatus from(final String description) { @@ -34,4 +34,9 @@ public static AlaramStatus from(final String description) { } throw new CrewException(ALARM_STATUS_NOT_FOUND, description); } + + @JsonValue + public Boolean getBooleanValue() { + return booleanValue; + } } diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java b/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java index 26f42525..5ba248f9 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java +++ b/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java @@ -22,21 +22,25 @@ public enum AlaramType { CREW_ACCEPT("크루 가입이 수락되었어요"), CREW_DENIED("크루 가입이 거절되었어요"), HOST_WAITING("게스트 모집 창여 수락이 기다리고 있어요"), - GUST_ACCEPT("게스트 참여가 수락되었어요"), - GUST_DENIED("게스트 참여가 거절되었어요"), + GUEST_ACCEPT("게스트 참여가 수락되었어요"), + GUEST_DENIED("게스트 참여가 거절되었어요"), ; + private static final Map alaramTypeMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(AlaramType::getDescription, Function.identity()))); + .collect(Collectors.toMap(AlaramType::name, Function.identity()))); - @JsonValue private final String description; @JsonCreator - public static AlaramType from(final String description) { - if (alaramTypeMap.containsKey(description)) { - return alaramTypeMap.get(description); + public static AlaramType from(final String name) { + if (alaramTypeMap.containsKey(name)) { + return alaramTypeMap.get(name); } - throw new CrewException(ALARM_TYPE_NOT_FOUND, description); + throw new CrewException(ALARM_TYPE_NOT_FOUND, name); } + @JsonValue + public String getName() { + return name(); + } } diff --git a/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java b/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java index 55b28823..890242cf 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java +++ b/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; +import kr.pickple.back.alaram.util.AlaramStatusConverter; import kr.pickple.back.alaram.util.AlaramTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.domain.Crew; @@ -27,7 +28,7 @@ public class CrewAlaram extends BaseEntity { @NotNull @Column(length = 10) - @Convert(converter = AlaramStatus.class) + @Convert(converter = AlaramStatusConverter.class) private AlaramStatus isRead = FALSE; @NotNull diff --git a/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java b/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java index a01a145d..a30afec1 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java +++ b/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java @@ -2,6 +2,8 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; +import kr.pickple.back.alaram.util.AlaramStatusConverter; +import kr.pickple.back.alaram.util.AlaramTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; @@ -26,22 +28,22 @@ public class GameAlaram extends BaseEntity { @NotNull @Column(length = 10) - @Convert(converter = AlaramStatus.class) + @Convert(converter = AlaramStatusConverter.class) private AlaramStatus isRead = FALSE; @NotNull @Column(length = 20) - @Convert(converter = AlaramType.class) + @Convert(converter = AlaramTypeConverter.class) private AlaramType alaramType; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "game_id") - private Game game; - @CreatedDate @Column(updatable = false) private LocalDateTime createdAt; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "game_id") + private Game game; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; diff --git a/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java index 5e12bb67..75513a56 100644 --- a/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java +++ b/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java @@ -5,7 +5,7 @@ import kr.pickple.back.alaram.domain.AlaramStatus; @Convert -public class AlaramStatusConverter implements AttributeConverter { +public class AlaramStatusConverter implements AttributeConverter { @Override public String convertToDatabaseColumn(final AlaramStatus status) { diff --git a/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java index 7ce25650..b948af5f 100644 --- a/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java +++ b/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java @@ -3,15 +3,15 @@ import jakarta.persistence.AttributeConverter; import kr.pickple.back.alaram.domain.AlaramType; -public class AlaramTypeConverter implements AttributeConverter { +public class AlaramTypeConverter implements AttributeConverter { @Override - public String convertToDatabaseColumn(final AlaramType alaramType) { - return alaramType.getDescription(); + public String convertToDatabaseColumn(final AlaramType Type) { + return Type.getDescription(); } @Override - public AlaramType convertToEntityAttribute(final String alaramType) { - return AlaramType.from(alaramType); + public AlaramType convertToEntityAttribute(final String Type) { + return AlaramType.from(Type); } } From 226b2312610f1a660abdef132dae8076dd692df5 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 16:57:26 +0900 Subject: [PATCH 07/78] =?UTF-8?q?feat:=20=ED=86=B5=ED=95=A9=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC(Crew=EC=95=8C=EB=9E=8C,Game=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9)=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/alaram/domain/Alaram.java | 20 +++------ .../alaram/domain/AlaramExistsStatus.java | 43 +++++++++++++++++++ .../util/AlaramExistsStatusConverter.java | 19 ++++++++ 3 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alaram/domain/AlaramExistsStatus.java create mode 100644 src/main/java/kr/pickple/back/alaram/util/AlaramExistsStatusConverter.java diff --git a/src/main/java/kr/pickple/back/alaram/domain/Alaram.java b/src/main/java/kr/pickple/back/alaram/domain/Alaram.java index dfc3dad0..4958da5a 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/Alaram.java +++ b/src/main/java/kr/pickple/back/alaram/domain/Alaram.java @@ -2,14 +2,15 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.util.AlaramStatusConverter; +import kr.pickple.back.alaram.util.AlaramExistsStatusConverter; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import static kr.pickple.back.alaram.domain.AlaramStatus.FALSE; +import static kr.pickple.back.alaram.domain.AlaramExistsStatus.NOT_EXISTS; + @Entity @Getter @@ -22,8 +23,8 @@ public class Alaram { @NotNull @Column(length = 10) - @Convert(converter = AlaramStatusConverter.class) - private AlaramStatus status = FALSE; + @Convert(converter = AlaramExistsStatusConverter.class) + private AlaramExistsStatus alaramExistsStatus = NOT_EXISTS; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") @@ -44,18 +45,7 @@ private Alaram( final GameAlaram gameAlaram ) { this.member = member; - this.status = findAlaramUnRead(status); this.crewAlaram = crewAlaram; this.gameAlaram = gameAlaram; } - - private AlaramStatus findAlaramUnRead(AlaramStatus status) { - //1. 크루 알람 조회 - 상태가 unread가 있는지 체크 - - //2. 게임 알람 조회 - 상태가 unread가 있는지 체크 - - //3.status 상태 변화 - - return this.status; - } } diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlaramExistsStatus.java b/src/main/java/kr/pickple/back/alaram/domain/AlaramExistsStatus.java new file mode 100644 index 00000000..a2e800bb --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/domain/AlaramExistsStatus.java @@ -0,0 +1,43 @@ +package kr.pickple.back.alaram.domain; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import kr.pickple.back.crew.exception.CrewException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static kr.pickple.back.alaram.exception.AlaramExceptionCode.ALARM_EXISTS_STATUS_NOT_FOUND; + +@Getter +@RequiredArgsConstructor +public enum AlaramExistsStatus { + + EXISTS("읽지 않은 알람이 있음", true), + NOT_EXISTS("읽지 않은 알람이 없음", false); + + private static final Map alaramExistsStatusMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(AlaramExistsStatus::getDescription, Function.identity()))); + + private final String description; + private final Boolean booleanValue; + + @JsonCreator + public static AlaramExistsStatus from(final String description) { + if (alaramExistsStatusMap.containsKey(description)) { + return alaramExistsStatusMap.get(description); + } + throw new CrewException(ALARM_EXISTS_STATUS_NOT_FOUND, description); + } + + @JsonValue + public Boolean getBooleanValue() { + return booleanValue; + } + +} diff --git a/src/main/java/kr/pickple/back/alaram/util/AlaramExistsStatusConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlaramExistsStatusConverter.java new file mode 100644 index 00000000..1766d43a --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/util/AlaramExistsStatusConverter.java @@ -0,0 +1,19 @@ +package kr.pickple.back.alaram.util; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Convert; +import kr.pickple.back.alaram.domain.AlaramExistsStatus; + +@Convert +public class AlaramExistsStatusConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(final AlaramExistsStatus Status) { + return Status.getDescription(); + } + + @Override + public AlaramExistsStatus convertToEntityAttribute(final String Status) { + return AlaramExistsStatus.from(Status); + } +} From dbbdb236970f7582c92f463aa0e804a070342bb0 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 16:58:10 +0900 Subject: [PATCH 08/78] =?UTF-8?q?refactor:=20=EC=95=8C=EB=9E=8C=20Exceptio?= =?UTF-8?q?nCode=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/alaram/exception/AlaramExceptionCode.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java b/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java index 58ee1fa6..4868c62f 100644 --- a/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java +++ b/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java @@ -9,8 +9,9 @@ @RequiredArgsConstructor public enum AlaramExceptionCode implements ExceptionCode { - ALARM_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-001", "알람 상태 여부를 찾을 수 없음"), - ALARM_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND,"AEC-002","알림 타입을 찾을 수 없음"), + ALARM_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-001", "알람 읽음 여부를 찾을 수 없음"), + ALARM_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-002", "알림 타입을 찾을 수 없음"), + ALARM_EXISTS_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-003", "사용자의 알람 상태 여부를 찾을 수 없음"), ; From 95cca67e64337bb401c39c62e331842b89c5080c Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 22:24:56 +0900 Subject: [PATCH 09/78] =?UTF-8?q?feat:=20Crew=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20Event=20=EB=B0=8F=20=ED=95=B8=EB=93=A4?= =?UTF-8?q?=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CrewJoinRequestNotificationEvent.java | 13 +++++++ .../event/crew/CrewMemberJoinedEvent.java | 18 ++++++++++ .../event/crew/CrewMemberRejectedEvent.java | 18 ++++++++++ .../handler/CrewAlaramEventHandler.java | 35 +++++++++++++++++++ .../back/crew/service/CrewMemberService.java | 30 +++++++++++----- 5 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alaram/event/crew/CrewJoinRequestNotificationEvent.java create mode 100644 src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberJoinedEvent.java create mode 100644 src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberRejectedEvent.java create mode 100644 src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java diff --git a/src/main/java/kr/pickple/back/alaram/event/crew/CrewJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alaram/event/crew/CrewJoinRequestNotificationEvent.java new file mode 100644 index 00000000..ea6a4549 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/event/crew/CrewJoinRequestNotificationEvent.java @@ -0,0 +1,13 @@ +package kr.pickple.back.alaram.event.crew; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class CrewJoinRequestNotificationEvent { + + private final Long crewId; + + public Long getCrewId(){ + return crewId; + } +} diff --git a/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberJoinedEvent.java new file mode 100644 index 00000000..a7bee434 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberJoinedEvent.java @@ -0,0 +1,18 @@ +package kr.pickple.back.alaram.event.crew; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class CrewMemberJoinedEvent { + + private final Long crewId; + private final Long memberId; + + public Long getCrewId() { + return crewId; + } + + public Long getMemberId() { + return memberId; + } +} diff --git a/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberRejectedEvent.java new file mode 100644 index 00000000..908a2a72 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberRejectedEvent.java @@ -0,0 +1,18 @@ +package kr.pickple.back.alaram.event.crew; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class CrewMemberRejectedEvent { + + private final Long crewId; + private final Long memberId; + + public Long getCrewId() { + return crewId; + } + + public Long getMemberId() { + return memberId; + } +} diff --git a/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java new file mode 100644 index 00000000..c1034d07 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java @@ -0,0 +1,35 @@ +package kr.pickple.back.alaram.handler; + +import kr.pickple.back.alaram.domain.CrewAlaram; +import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alaram.service.CrewAlaramService; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CrewAlaramEventHandler { + + private final CrewAlaramService crewAlaramService; + + @EventListener + public void sendAlaramToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewJoinRequestNotificationEvent); // 알람 생성 + crewAlaramService.emitMessage(crewAlaram); // SSE로 알람 메시지 전송 + } + + @EventListener + public void sendAlaramToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { + final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewMemberJoinedEvent); // 알람 생성 + crewAlaramService.emitMessage(crewAlaram); // SSE로 알람 메시지 전송 + } + + @EventListener + public void sendAlaramToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { + final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewMemberRejectedEvent); // 알람 생성 + crewAlaramService.emitMessage(crewAlaram); // SSE로 알람 메시지 전송 + } +} diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 66280986..060524c6 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,14 +1,8 @@ package kr.pickple.back.crew.service; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - +import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; @@ -23,6 +17,16 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @Transactional(readOnly = true) @@ -33,6 +37,7 @@ public class CrewMemberService { private final MemberRepository memberRepository; private final CrewMemberRepository crewMemberRepository; private final ChatMessageService chatMessageService; + private final ApplicationEventPublisher eventPublisher; @Transactional public void applyForCrewMemberShip(final Long crewId, final Long loggedInMemberId) { @@ -40,6 +45,8 @@ public void applyForCrewMemberShip(final Long crewId, final Long loggedInMemberI final Member member = findMemberById(loggedInMemberId); crew.addCrewMember(member); + //TODO:크루 알람 - 크루장에게 가입 신청이 왔어요! (크루장에게 전송) + eventPublisher.publishEvent(new CrewJoinRequestNotificationEvent(crewId)); } public CrewProfileResponse findAllCrewMembers( @@ -85,6 +92,9 @@ public void crewMemberStatusUpdate( enterCrewChatRoom(updateStatus, crewMember); crewMember.updateStatus(updateStatus); + crewMember.updateStatus(crewMemberUpdateStatusRequest.getStatus()); + //TODO:크루 알람 - 크루원(대기)상태이자 해당 크루 지원 멤버에게 전송 - 가입 신청이 허락되었어요! + eventPublisher.publishEvent(new CrewMemberJoinedEvent(crewId, memberId)); } private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { @@ -110,6 +120,8 @@ public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, fin validateIsLeaderSelfDeleted(loggedInMemberId, memberId); deleteCrewMember(crewMember); + //TODO:크루 알람 - 크루장이 크루원(대기)상태에서 해당 크루원을 삭제 함(해당 크루 지원 회원에게 전송) - 가입 신청이 거절되었어요! + eventPublisher.publishEvent(new CrewMemberRejectedEvent(crewId, memberId)); return; } From 706653ac1c26dcfd962e29c84d38a02a040450af Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 22:25:34 +0900 Subject: [PATCH 10/78] =?UTF-8?q?feat:=20Game=EA=B4=80=EB=A0=A8=20Event=20?= =?UTF-8?q?=EB=B0=8F=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameJoinRequestNotificationEvent.java | 13 ++++++ .../event/game/GameMemberJoinedEvent.java | 18 ++++++++ .../event/game/GameMemberRejectedEvent.java | 18 ++++++++ .../handler/GameAlaramEventHandler.java | 35 +++++++++++++++ .../back/game/service/GameService.java | 43 ++++++++++++------- 5 files changed, 112 insertions(+), 15 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alaram/event/game/GameJoinRequestNotificationEvent.java create mode 100644 src/main/java/kr/pickple/back/alaram/event/game/GameMemberJoinedEvent.java create mode 100644 src/main/java/kr/pickple/back/alaram/event/game/GameMemberRejectedEvent.java create mode 100644 src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java diff --git a/src/main/java/kr/pickple/back/alaram/event/game/GameJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alaram/event/game/GameJoinRequestNotificationEvent.java new file mode 100644 index 00000000..4407ba1d --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/event/game/GameJoinRequestNotificationEvent.java @@ -0,0 +1,13 @@ +package kr.pickple.back.alaram.event.game; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class GameJoinRequestNotificationEvent { + + private final Long gameId; + + public Long getGameId() { + return gameId; + } +} diff --git a/src/main/java/kr/pickple/back/alaram/event/game/GameMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alaram/event/game/GameMemberJoinedEvent.java new file mode 100644 index 00000000..6f97cb81 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/event/game/GameMemberJoinedEvent.java @@ -0,0 +1,18 @@ +package kr.pickple.back.alaram.event.game; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class GameMemberJoinedEvent { + + private final Long gameId; + private final Long memberId; + + public Long getGameId() { + return gameId; + } + + public Long getMemberId() { + return memberId; + } +} diff --git a/src/main/java/kr/pickple/back/alaram/event/game/GameMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alaram/event/game/GameMemberRejectedEvent.java new file mode 100644 index 00000000..b8a48057 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/event/game/GameMemberRejectedEvent.java @@ -0,0 +1,18 @@ +package kr.pickple.back.alaram.event.game; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class GameMemberRejectedEvent { + + private final Long gameId; + private final Long memberId; + + public Long getGameId() { + return gameId; + } + + public Long getMemberId() { + return memberId; + } +} diff --git a/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java new file mode 100644 index 00000000..cb88aeb8 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java @@ -0,0 +1,35 @@ +package kr.pickple.back.alaram.handler; + +import kr.pickple.back.alaram.domain.GameAlaram; +import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alaram.service.GameAlaramService; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class GameAlaramEventHandler { + + private final GameAlaramService gameAlaramService; + + @EventListener + public void sendAlaramToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { + final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameJoinRequestNotificationEvent); //알람 생성 + gameAlaramService.emitMessage(gameAlaram); //SSE로 알람 메시지 전송 + } + + @EventListener + public void sendAlaramToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { + final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameMemberJoinedEvent); //알람 생성 + gameAlaramService.emitMessage(gameAlaram); //SSE로 알람 메시지 전송 + } + + @EventListener + public void sendAlaramToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { + final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameMemberRejectedEvent); //알람 생성 + gameAlaramService.emitMessage(gameAlaram); //SSE로 알람 메시지 전송 + } +} diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 34057db7..eff71f67 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -1,23 +1,11 @@ package kr.pickple.back.game.service; -import static kr.pickple.back.chat.domain.RoomType.*; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.game.exception.GameExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - -import java.text.MessageFormat; -import java.time.format.DateTimeFormatter; -import java.util.List; - -import org.locationtech.jts.geom.Point; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import kr.pickple.back.address.dto.response.MainAddressResponse; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; +import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.chat.service.ChatRoomService; @@ -34,11 +22,28 @@ import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.map.repository.MapPolygonRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; +import org.locationtech.jts.geom.Point; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.MessageFormat; +import java.time.format.DateTimeFormatter; +import java.util.List; + +import static kr.pickple.back.chat.domain.RoomType.GAME; +import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; +import static kr.pickple.back.game.exception.GameExceptionCode.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @RequiredArgsConstructor @@ -52,6 +57,8 @@ public class GameService { private final AddressService addressService; private final ChatRoomService chatRoomService; private final ChatMessageService chatMessageService; + private final MapPolygonRepository mapPolygonRepository; + private final ApplicationEventPublisher eventPublisher; @Transactional public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { @@ -98,6 +105,8 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { final Member member = findMemberById(loggedInMemberId); game.addGameMember(member); + //TODO:게임 알람 - 호스트에게 가입 신청이 왔어요!(호스트에게 전송) + eventPublisher.publishEvent(new GameJoinRequestNotificationEvent(gameId)); } private Game findGameById(final Long gameId) { @@ -170,6 +179,8 @@ public void updateGameMemberRegistrationStatus( enterGameChatRoom(updateStatus, gameMember); gameMember.updateStatus(updateStatus); + //TODO:게임 알람 - 게스트(대기)상태이자, 해당 게임 지원 멤버에게 전송 - 승락이 되었어요! + eventPublisher.publishEvent(new GameMemberJoinedEvent(gameId, memberId)); } private void validateIsHost(final Long loggedInMemberId, final Game game) { @@ -199,6 +210,8 @@ public void deleteGameMember(final Long loggedInMemberId, final Long gameId, fin validateIsHostSelfDeleted(loggedInMember, member); deleteGameMember(gameMember); + //TODO:게임 알람 - 게스트(대기)상태에서, 해당 지원 게임 멤버를 삭제함(해당 게임 지원 회원)에게 전송 - 거절 되었어요! + eventPublisher.publishEvent(new GameMemberRejectedEvent(gameId, memberId)); return; } From 408db1253ed476716ffd1733586a03c0eea6088f Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 19 Nov 2023 22:38:43 +0900 Subject: [PATCH 11/78] =?UTF-8?q?feat:=20=ED=81=AC=EB=A3=A8=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=95=8C=EB=9E=8C,=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=95=8C=EB=9E=8C=20=EB=B9=84=EB=8F=99?= =?UTF-8?q?=EA=B8=B0=20=EC=B2=98=EB=A6=AC=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 --- .../back/alaram/config/AsynConfig.java | 60 +++++++++++++++++++ .../handler/CrewAlaramEventHandler.java | 4 ++ .../handler/GameAlaramEventHandler.java | 4 ++ 3 files changed, 68 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/config/AsynConfig.java diff --git a/src/main/java/kr/pickple/back/alaram/config/AsynConfig.java b/src/main/java/kr/pickple/back/alaram/config/AsynConfig.java new file mode 100644 index 00000000..bd527cab --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/config/AsynConfig.java @@ -0,0 +1,60 @@ +package kr.pickple.back.alaram.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +@EnableAsync +public class AsynConfig { + + @Bean + public TaskExecutor taskExecutor() { + return CustomThreadPoolTaskExecutor.builder() + .corePoolSize(50) + .maxPoolSize(70) + .queueCapacity(100) + .build(); + } + + static class CustomThreadPoolTaskExecutor extends ThreadPoolTaskExecutor { + private CustomThreadPoolTaskExecutor(int corePoolSize, int maxPoolSize, int queueCapacity) { + super(); + this.setCorePoolSize(corePoolSize); + this.setMaxPoolSize(maxPoolSize); + this.setQueueCapacity(queueCapacity); + this.initialize(); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private int corePoolSize; + private int maxPoolSize; + private int queueCapacity; + + public Builder corePoolSize(int corePoolSize) { + this.corePoolSize = corePoolSize; + return this; + } + + public Builder maxPoolSize(int maxPoolSize) { + this.maxPoolSize = maxPoolSize; + return this; + } + + public Builder queueCapacity(int queueCapacity) { + this.queueCapacity = queueCapacity; + return this; + } + + public CustomThreadPoolTaskExecutor build() { + return new CustomThreadPoolTaskExecutor(corePoolSize, maxPoolSize, queueCapacity); + } + } + } +} diff --git a/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java index c1034d07..6f4aadc7 100644 --- a/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java +++ b/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java @@ -7,6 +7,7 @@ import kr.pickple.back.alaram.service.CrewAlaramService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @Component @@ -15,18 +16,21 @@ public class CrewAlaramEventHandler { private final CrewAlaramService crewAlaramService; + @Async @EventListener public void sendAlaramToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewJoinRequestNotificationEvent); // 알람 생성 crewAlaramService.emitMessage(crewAlaram); // SSE로 알람 메시지 전송 } + @Async @EventListener public void sendAlaramToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewMemberJoinedEvent); // 알람 생성 crewAlaramService.emitMessage(crewAlaram); // SSE로 알람 메시지 전송 } + @Async @EventListener public void sendAlaramToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewMemberRejectedEvent); // 알람 생성 diff --git a/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java index cb88aeb8..06b9bf09 100644 --- a/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java +++ b/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java @@ -7,6 +7,7 @@ import kr.pickple.back.alaram.service.GameAlaramService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @Component @@ -15,18 +16,21 @@ public class GameAlaramEventHandler { private final GameAlaramService gameAlaramService; + @Async @EventListener public void sendAlaramToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameJoinRequestNotificationEvent); //알람 생성 gameAlaramService.emitMessage(gameAlaram); //SSE로 알람 메시지 전송 } + @Async @EventListener public void sendAlaramToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameMemberJoinedEvent); //알람 생성 gameAlaramService.emitMessage(gameAlaram); //SSE로 알람 메시지 전송 } + @Async @EventListener public void sendAlaramToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameMemberRejectedEvent); //알람 생성 From 9fa0f5f03c73999d535ef6bfe107b2c10a41e54d Mon Sep 17 00:00:00 2001 From: jay-so Date: Mon, 20 Nov 2023 16:49:10 +0900 Subject: [PATCH 12/78] =?UTF-8?q?feat:=20Sse=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B0=8F=20SseEmitters=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alaram/controller/AlarmController.java | 73 +++++++++++++++++++ .../pickple/back/alaram/util/SseEmitters.java | 44 +++++++++++ 2 files changed, 117 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/controller/AlarmController.java create mode 100644 src/main/java/kr/pickple/back/alaram/util/SseEmitters.java diff --git a/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java b/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java new file mode 100644 index 00000000..ebe91356 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java @@ -0,0 +1,73 @@ +package kr.pickple.back.alaram.controller; + +import kr.pickple.back.alaram.dto.response.AlaramUnReadCountResponse; +import kr.pickple.back.alaram.service.AlaramService; +import kr.pickple.back.auth.config.resolver.Login; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.awt.*; + +import static org.springframework.http.HttpStatus.NO_CONTENT; +import static org.springframework.http.HttpStatus.OK; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/alarms") +public class AlarmController { + + private final AlaramService alarmService; + + @GetMapping(value = "/subscribe", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public ResponseEntity subscribeToSse( + @Login final Long loggedInMemberId + ) { + final SseEmitter emitter = alarmService.subscribeToSse(loggedInMemberId); + return ResponseEntity.status(OK) + .header("X-Accel-Buffering", "no") + .body(emitter); + } + + @GetMapping("/unread") + public ResponseEntity findUnreadAlarmResponse( + @PathVariable final Login loggedInMemberId + ) { + //알람 서비스 중, 읽지 않은 알람 계산 + + return ResponseEntity.status(OK) + .body(AlaramService.countUnreadAlaram()); + } + +// @GetMapping +// public ResponseEntity> findAllAlarams( +// @Login final Long loggedInMemberId, +// final Cursor cursor +// ){ +// //커시 기반 조회 서비스 구현 후, 채움 +// return ResponseEntity.status(OK) +// .body(AlaramService.findAllAlarms()); +// } + + @PatchMapping("/{alaramId}") + public ResponseEntity updateAlaramStatus( + @Login final Long loggedInMemberId, + @PathVariable final Long alaramId + ) { + //알람 서비스 중, 수정 기반 + return ResponseEntity.status(NO_CONTENT) + .build(); + } + + @DeleteMapping + public ResponseEntity deleteAlarams( + @Login final Long loggedInMemberId, + final Cursor cursor + ) { + //알람 삭제 서비스, 커서 기반 + return ResponseEntity.status(NO_CONTENT) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java b/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java new file mode 100644 index 00000000..cee880e3 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java @@ -0,0 +1,44 @@ +package kr.pickple.back.alaram.util; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +@Component +@Slf4j +@RequiredArgsConstructor +public class SseEmitters { + + private final ConcurrentMap emitters = new ConcurrentHashMap<>(); + + public SseEmitter add(final Long id, final SseEmitter emitter) { + this.emitters.put(id, emitter); + + log.info("new emitter added: {}", emitter); + log.info("emitter list size: {}", emitters.size()); + + emitter.onCompletion(() -> { + log.info("onCompletion callback"); + this.emitters.remove(id); // 만료되면 리스트에서 삭제 + }); + + emitter.onTimeout(() -> { + log.info("onTimeout callback"); + emitter.complete(); + }); + + return emitter; + } + + public SseEmitter get(final Long id) { + return this.emitters.get(id); + } + + public void remove(final Long id) { + this.emitters.remove(id); + } +} From ef138c8ed8a5ad49e01b3a14b0c37060910a1ed6 Mon Sep 17 00:00:00 2001 From: jay-so Date: Mon, 20 Nov 2023 22:36:40 +0900 Subject: [PATCH 13/78] =?UTF-8?q?style:=20Alarm=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alaram/domain/{Alaram.java => Alarm.java} | 24 ++++++------ ...istsStatus.java => AlarmExistsStatus.java} | 14 +++---- .../{AlaramStatus.java => AlarmStatus.java} | 14 +++---- .../{AlaramType.java => AlarmType.java} | 14 +++---- .../{CrewAlaram.java => CrewAlarm.java} | 22 +++++------ .../{GameAlaram.java => GameAlarm.java} | 22 +++++------ ...aramException.java => AlarmException.java} | 4 +- ...ptionCode.java => AlarmExceptionCode.java} | 2 +- .../handler/CrewAlaramEventHandler.java | 39 ------------------- .../alaram/handler/CrewAlarmEventHandler.java | 39 +++++++++++++++++++ .../handler/GameAlaramEventHandler.java | 39 ------------------- .../alaram/handler/GameAlarmEventHandler.java | 39 +++++++++++++++++++ .../alaram/repository/AlaramRepository.java | 7 ---- .../alaram/repository/AlarmRepository.java | 7 ++++ ...pository.java => CrewAlarmRepository.java} | 4 +- ...pository.java => GameAlarmRepository.java} | 4 +- .../util/AlaramExistsStatusConverter.java | 19 --------- .../alaram/util/AlaramStatusConverter.java | 19 --------- .../back/alaram/util/AlaramTypeConverter.java | 17 -------- .../util/AlarmExistsStatusConverter.java | 19 +++++++++ .../alaram/util/AlarmStatusConverter.java | 19 +++++++++ .../back/alaram/util/AlarmTypeConverter.java | 17 ++++++++ 22 files changed, 202 insertions(+), 202 deletions(-) rename src/main/java/kr/pickple/back/alaram/domain/{Alaram.java => Alarm.java} (60%) rename src/main/java/kr/pickple/back/alaram/domain/{AlaramExistsStatus.java => AlarmExistsStatus.java} (60%) rename src/main/java/kr/pickple/back/alaram/domain/{AlaramStatus.java => AlarmStatus.java} (61%) rename src/main/java/kr/pickple/back/alaram/domain/{AlaramType.java => AlarmType.java} (69%) rename src/main/java/kr/pickple/back/alaram/domain/{CrewAlaram.java => CrewAlarm.java} (69%) rename src/main/java/kr/pickple/back/alaram/domain/{GameAlaram.java => GameAlarm.java} (69%) rename src/main/java/kr/pickple/back/alaram/exception/{AlaramException.java => AlarmException.java} (58%) rename src/main/java/kr/pickple/back/alaram/exception/{AlaramExceptionCode.java => AlarmExceptionCode.java} (92%) delete mode 100644 src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java create mode 100644 src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java delete mode 100644 src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java create mode 100644 src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java delete mode 100644 src/main/java/kr/pickple/back/alaram/repository/AlaramRepository.java create mode 100644 src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java rename src/main/java/kr/pickple/back/alaram/repository/{CrewAlaramRepository.java => CrewAlarmRepository.java} (72%) rename src/main/java/kr/pickple/back/alaram/repository/{GameAlaramRepository.java => GameAlarmRepository.java} (72%) delete mode 100644 src/main/java/kr/pickple/back/alaram/util/AlaramExistsStatusConverter.java delete mode 100644 src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java delete mode 100644 src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java create mode 100644 src/main/java/kr/pickple/back/alaram/util/AlarmExistsStatusConverter.java create mode 100644 src/main/java/kr/pickple/back/alaram/util/AlarmStatusConverter.java create mode 100644 src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java diff --git a/src/main/java/kr/pickple/back/alaram/domain/Alaram.java b/src/main/java/kr/pickple/back/alaram/domain/Alarm.java similarity index 60% rename from src/main/java/kr/pickple/back/alaram/domain/Alaram.java rename to src/main/java/kr/pickple/back/alaram/domain/Alarm.java index 4958da5a..19705583 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/Alaram.java +++ b/src/main/java/kr/pickple/back/alaram/domain/Alarm.java @@ -2,20 +2,20 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.util.AlaramExistsStatusConverter; +import kr.pickple.back.alaram.util.AlarmExistsStatusConverter; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import static kr.pickple.back.alaram.domain.AlaramExistsStatus.NOT_EXISTS; +import static kr.pickple.back.alaram.domain.AlarmExistsStatus.NOT_EXISTS; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Alaram { +public class Alarm { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -23,8 +23,8 @@ public class Alaram { @NotNull @Column(length = 10) - @Convert(converter = AlaramExistsStatusConverter.class) - private AlaramExistsStatus alaramExistsStatus = NOT_EXISTS; + @Convert(converter = AlarmExistsStatusConverter.class) + private AlarmExistsStatus alarmExistsStatus = NOT_EXISTS; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") @@ -32,20 +32,20 @@ public class Alaram { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "crew_alaram_id") - private CrewAlaram crewAlaram; + private CrewAlarm crewAlarm; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "game_alaram_id") - private GameAlaram gameAlaram; + private GameAlarm gameAlarm; @Builder - private Alaram( + private Alarm( final Member member, - final CrewAlaram crewAlaram, - final GameAlaram gameAlaram + final CrewAlarm crewAlarm, + final GameAlarm gameAlarm ) { this.member = member; - this.crewAlaram = crewAlaram; - this.gameAlaram = gameAlaram; + this.crewAlarm = crewAlarm; + this.gameAlarm = gameAlarm; } } diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlaramExistsStatus.java b/src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java similarity index 60% rename from src/main/java/kr/pickple/back/alaram/domain/AlaramExistsStatus.java rename to src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java index a2e800bb..08ef2d37 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlaramExistsStatus.java +++ b/src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java @@ -12,25 +12,25 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alaram.exception.AlaramExceptionCode.ALARM_EXISTS_STATUS_NOT_FOUND; +import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_EXISTS_STATUS_NOT_FOUND; @Getter @RequiredArgsConstructor -public enum AlaramExistsStatus { +public enum AlarmExistsStatus { EXISTS("읽지 않은 알람이 있음", true), NOT_EXISTS("읽지 않은 알람이 없음", false); - private static final Map alaramExistsStatusMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(AlaramExistsStatus::getDescription, Function.identity()))); + private static final Map alarmExistsStatusMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(AlarmExistsStatus::getDescription, Function.identity()))); private final String description; private final Boolean booleanValue; @JsonCreator - public static AlaramExistsStatus from(final String description) { - if (alaramExistsStatusMap.containsKey(description)) { - return alaramExistsStatusMap.get(description); + public static AlarmExistsStatus from(final String description) { + if (alarmExistsStatusMap.containsKey(description)) { + return alarmExistsStatusMap.get(description); } throw new CrewException(ALARM_EXISTS_STATUS_NOT_FOUND, description); } diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java b/src/main/java/kr/pickple/back/alaram/domain/AlarmStatus.java similarity index 61% rename from src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java rename to src/main/java/kr/pickple/back/alaram/domain/AlarmStatus.java index 463daded..cfd9b13d 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlaramStatus.java +++ b/src/main/java/kr/pickple/back/alaram/domain/AlarmStatus.java @@ -12,25 +12,25 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alaram.exception.AlaramExceptionCode.ALARM_STATUS_NOT_FOUND; +import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_STATUS_NOT_FOUND; @Getter @RequiredArgsConstructor -public enum AlaramStatus { +public enum AlarmStatus { TRUE("읽음", true), FALSE("읽지 않음", false); - private static final Map alaramStatusMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(AlaramStatus::getDescription, Function.identity()))); + private static final Map alarmStatusMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(AlarmStatus::getDescription, Function.identity()))); private final String description; private final Boolean booleanValue; @JsonCreator - public static AlaramStatus from(final String description) { - if (alaramStatusMap.containsKey(description)) { - return alaramStatusMap.get(description); + public static AlarmStatus from(final String description) { + if (alarmStatusMap.containsKey(description)) { + return alarmStatusMap.get(description); } throw new CrewException(ALARM_STATUS_NOT_FOUND, description); } diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java b/src/main/java/kr/pickple/back/alaram/domain/AlarmType.java similarity index 69% rename from src/main/java/kr/pickple/back/alaram/domain/AlaramType.java rename to src/main/java/kr/pickple/back/alaram/domain/AlarmType.java index 5ba248f9..c6f46504 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlaramType.java +++ b/src/main/java/kr/pickple/back/alaram/domain/AlarmType.java @@ -12,11 +12,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alaram.exception.AlaramExceptionCode.ALARM_TYPE_NOT_FOUND; +import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_TYPE_NOT_FOUND; @Getter @RequiredArgsConstructor -public enum AlaramType { +public enum AlarmType { CREW_LEADER_WAITING("가입 수락을 기다리고 있어요"), CREW_ACCEPT("크루 가입이 수락되었어요"), @@ -26,15 +26,15 @@ public enum AlaramType { GUEST_DENIED("게스트 참여가 거절되었어요"), ; - private static final Map alaramTypeMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(AlaramType::name, Function.identity()))); + private static final Map alarmTypeMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(AlarmType::name, Function.identity()))); private final String description; @JsonCreator - public static AlaramType from(final String name) { - if (alaramTypeMap.containsKey(name)) { - return alaramTypeMap.get(name); + public static AlarmType from(final String name) { + if (alarmTypeMap.containsKey(name)) { + return alarmTypeMap.get(name); } throw new CrewException(ALARM_TYPE_NOT_FOUND, name); } diff --git a/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java b/src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java similarity index 69% rename from src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java rename to src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java index 890242cf..b40ea7bc 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/CrewAlaram.java +++ b/src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java @@ -2,8 +2,8 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.util.AlaramStatusConverter; -import kr.pickple.back.alaram.util.AlaramTypeConverter; +import kr.pickple.back.alaram.util.AlarmStatusConverter; +import kr.pickple.back.alaram.util.AlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.member.domain.Member; @@ -15,12 +15,12 @@ import java.time.LocalDateTime; -import static kr.pickple.back.alaram.domain.AlaramStatus.FALSE; +import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CrewAlaram extends BaseEntity { +public class CrewAlarm extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -28,13 +28,13 @@ public class CrewAlaram extends BaseEntity { @NotNull @Column(length = 10) - @Convert(converter = AlaramStatusConverter.class) - private AlaramStatus isRead = FALSE; + @Convert(converter = AlarmStatusConverter.class) + private AlarmStatus isRead = FALSE; @NotNull @Column(length = 20) - @Convert(converter = AlaramTypeConverter.class) - private AlaramType alaramType; + @Convert(converter = AlarmTypeConverter.class) + private AlarmType alarmType; @CreatedDate @Column(updatable = false) @@ -49,12 +49,12 @@ public class CrewAlaram extends BaseEntity { private Member member; @Builder - private CrewAlaram( - final AlaramType alaramType, + private CrewAlarm( + final AlarmType alarmType, final Crew crew, final Member member ) { - this.alaramType = alaramType; + this.alarmType = alarmType; this.createdAt = super.getCreatedAt(); this.crew = crew; this.member = member; diff --git a/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java b/src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java similarity index 69% rename from src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java rename to src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java index a30afec1..f5161def 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/GameAlaram.java +++ b/src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java @@ -2,8 +2,8 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.util.AlaramStatusConverter; -import kr.pickple.back.alaram.util.AlaramTypeConverter; +import kr.pickple.back.alaram.util.AlarmStatusConverter; +import kr.pickple.back.alaram.util.AlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; @@ -15,12 +15,12 @@ import java.time.LocalDateTime; -import static kr.pickple.back.alaram.domain.AlaramStatus.FALSE; +import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GameAlaram extends BaseEntity { +public class GameAlarm extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -28,13 +28,13 @@ public class GameAlaram extends BaseEntity { @NotNull @Column(length = 10) - @Convert(converter = AlaramStatusConverter.class) - private AlaramStatus isRead = FALSE; + @Convert(converter = AlarmStatusConverter.class) + private AlarmStatus isRead = FALSE; @NotNull @Column(length = 20) - @Convert(converter = AlaramTypeConverter.class) - private AlaramType alaramType; + @Convert(converter = AlarmTypeConverter.class) + private AlarmType alarmType; @CreatedDate @Column(updatable = false) @@ -49,12 +49,12 @@ public class GameAlaram extends BaseEntity { private Member member; @Builder - private GameAlaram( - final AlaramType alaramType, + private GameAlarm( + final AlarmType alarmType, final Game game, final Member member ) { - this.alaramType = alaramType; + this.alarmType = alarmType; this.createdAt = super.getCreatedAt(); this.game = game; this.member = member; diff --git a/src/main/java/kr/pickple/back/alaram/exception/AlaramException.java b/src/main/java/kr/pickple/back/alaram/exception/AlarmException.java similarity index 58% rename from src/main/java/kr/pickple/back/alaram/exception/AlaramException.java rename to src/main/java/kr/pickple/back/alaram/exception/AlarmException.java index ee1b9526..4900ac72 100644 --- a/src/main/java/kr/pickple/back/alaram/exception/AlaramException.java +++ b/src/main/java/kr/pickple/back/alaram/exception/AlarmException.java @@ -3,9 +3,9 @@ import kr.pickple.back.common.exception.BusinessException; import kr.pickple.back.common.exception.ExceptionCode; -public class AlaramException extends BusinessException { +public class AlarmException extends BusinessException { - public AlaramException(final ExceptionCode exceptionCode, final Object... rejectedValues) { + public AlarmException(final ExceptionCode exceptionCode, final Object... rejectedValues) { super(exceptionCode, rejectedValues); } } diff --git a/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java b/src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java similarity index 92% rename from src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java rename to src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java index 4868c62f..15ce2b34 100644 --- a/src/main/java/kr/pickple/back/alaram/exception/AlaramExceptionCode.java +++ b/src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java @@ -7,7 +7,7 @@ @Getter @RequiredArgsConstructor -public enum AlaramExceptionCode implements ExceptionCode { +public enum AlarmExceptionCode implements ExceptionCode { ALARM_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-001", "알람 읽음 여부를 찾을 수 없음"), ALARM_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-002", "알림 타입을 찾을 수 없음"), diff --git a/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java deleted file mode 100644 index 6f4aadc7..00000000 --- a/src/main/java/kr/pickple/back/alaram/handler/CrewAlaramEventHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package kr.pickple.back.alaram.handler; - -import kr.pickple.back.alaram.domain.CrewAlaram; -import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; -import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; -import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; -import kr.pickple.back.alaram.service.CrewAlaramService; -import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class CrewAlaramEventHandler { - - private final CrewAlaramService crewAlaramService; - - @Async - @EventListener - public void sendAlaramToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewJoinRequestNotificationEvent); // 알람 생성 - crewAlaramService.emitMessage(crewAlaram); // SSE로 알람 메시지 전송 - } - - @Async - @EventListener - public void sendAlaramToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { - final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewMemberJoinedEvent); // 알람 생성 - crewAlaramService.emitMessage(crewAlaram); // SSE로 알람 메시지 전송 - } - - @Async - @EventListener - public void sendAlaramToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { - final CrewAlaram crewAlaram = crewAlaramService.createAlaram(crewMemberRejectedEvent); // 알람 생성 - crewAlaramService.emitMessage(crewAlaram); // SSE로 알람 메시지 전송 - } -} diff --git a/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java new file mode 100644 index 00000000..62d0d953 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java @@ -0,0 +1,39 @@ +package kr.pickple.back.alaram.handler; + +import kr.pickple.back.alaram.domain.CrewAlarm; +import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alaram.service.CrewAlarmService; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CrewAlarmEventHandler { + + private final CrewAlarmService crewAlaramService; + + @Async + @EventListener + public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + final CrewAlarm crewAlarm = crewAlaramService.createCrewJoinAlaram(crewJoinRequestNotificationEvent); // 알람 생성 + crewAlaramService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + } + + @Async + @EventListener + public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { + final CrewAlarm crewAlarm = crewAlaramService.createCrewMemberApproveAlaram(crewMemberJoinedEvent); // 알람 생성 + crewAlaramService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + } + + @Async + @EventListener + public void sendAlarmToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { + final CrewAlarm crewAlarm = crewAlaramService.createCrewMemberDeniedAlaram(crewMemberRejectedEvent); // 알람 생성 + crewAlaramService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + } +} diff --git a/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java deleted file mode 100644 index 06b9bf09..00000000 --- a/src/main/java/kr/pickple/back/alaram/handler/GameAlaramEventHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package kr.pickple.back.alaram.handler; - -import kr.pickple.back.alaram.domain.GameAlaram; -import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; -import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; -import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; -import kr.pickple.back.alaram.service.GameAlaramService; -import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class GameAlaramEventHandler { - - private final GameAlaramService gameAlaramService; - - @Async - @EventListener - public void sendAlaramToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { - final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameJoinRequestNotificationEvent); //알람 생성 - gameAlaramService.emitMessage(gameAlaram); //SSE로 알람 메시지 전송 - } - - @Async - @EventListener - public void sendAlaramToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { - final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameMemberJoinedEvent); //알람 생성 - gameAlaramService.emitMessage(gameAlaram); //SSE로 알람 메시지 전송 - } - - @Async - @EventListener - public void sendAlaramToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { - final GameAlaram gameAlaram = gameAlaramService.createAlaram(gameMemberRejectedEvent); //알람 생성 - gameAlaramService.emitMessage(gameAlaram); //SSE로 알람 메시지 전송 - } -} diff --git a/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java new file mode 100644 index 00000000..d0702a24 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java @@ -0,0 +1,39 @@ +package kr.pickple.back.alaram.handler; + +import kr.pickple.back.alaram.domain.GameAlarm; +import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alaram.service.GameAlarmService; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class GameAlarmEventHandler { + + private final GameAlarmService gameAlarmService; + + @Async + @EventListener + public void sendAlarmToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { + final GameAlarm gameAlarm = gameAlarmService.createGameJoinAlaram(gameJoinRequestNotificationEvent); //알람 생성 + gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 - sseServcie로 변경? + } + + @Async + @EventListener + public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { + final GameAlarm gameAlarm = gameAlarmService.createGuestApproveAlaram(gameMemberJoinedEvent); //알람 생성 + gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 + } + + @Async + @EventListener + public void sendAlarmToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { + final GameAlarm gameAlarm = gameAlarmService.createGuestDeniedAlaram(gameMemberRejectedEvent); //알람 생성 + gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 + } +} diff --git a/src/main/java/kr/pickple/back/alaram/repository/AlaramRepository.java b/src/main/java/kr/pickple/back/alaram/repository/AlaramRepository.java deleted file mode 100644 index 4b8b94e9..00000000 --- a/src/main/java/kr/pickple/back/alaram/repository/AlaramRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package kr.pickple.back.alaram.repository; - -import kr.pickple.back.alaram.domain.Alaram; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface AlaramRepository extends JpaRepository { -} diff --git a/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java b/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java new file mode 100644 index 00000000..e4dd1954 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java @@ -0,0 +1,7 @@ +package kr.pickple.back.alaram.repository; + +import kr.pickple.back.alaram.domain.Alarm; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AlaramRepository extends JpaRepository { +} diff --git a/src/main/java/kr/pickple/back/alaram/repository/CrewAlaramRepository.java b/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java similarity index 72% rename from src/main/java/kr/pickple/back/alaram/repository/CrewAlaramRepository.java rename to src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java index 8e852c9a..65e31d55 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/CrewAlaramRepository.java +++ b/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java @@ -1,7 +1,7 @@ package kr.pickple.back.alaram.repository; -import kr.pickple.back.alaram.domain.CrewAlaram; +import kr.pickple.back.alaram.domain.CrewAlarm; import org.springframework.data.jpa.repository.JpaRepository; -public interface CrewAlaramRepository extends JpaRepository { +public interface CrewAlaramRepository extends JpaRepository { } diff --git a/src/main/java/kr/pickple/back/alaram/repository/GameAlaramRepository.java b/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java similarity index 72% rename from src/main/java/kr/pickple/back/alaram/repository/GameAlaramRepository.java rename to src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java index fa130cf3..7cb276cc 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/GameAlaramRepository.java +++ b/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java @@ -1,7 +1,7 @@ package kr.pickple.back.alaram.repository; -import kr.pickple.back.alaram.domain.GameAlaram; +import kr.pickple.back.alaram.domain.GameAlarm; import org.springframework.data.jpa.repository.JpaRepository; -public interface GameAlaramRepository extends JpaRepository { +public interface GameAlaramRepository extends JpaRepository { } diff --git a/src/main/java/kr/pickple/back/alaram/util/AlaramExistsStatusConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlaramExistsStatusConverter.java deleted file mode 100644 index 1766d43a..00000000 --- a/src/main/java/kr/pickple/back/alaram/util/AlaramExistsStatusConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package kr.pickple.back.alaram.util; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Convert; -import kr.pickple.back.alaram.domain.AlaramExistsStatus; - -@Convert -public class AlaramExistsStatusConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(final AlaramExistsStatus Status) { - return Status.getDescription(); - } - - @Override - public AlaramExistsStatus convertToEntityAttribute(final String Status) { - return AlaramExistsStatus.from(Status); - } -} diff --git a/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java deleted file mode 100644 index 75513a56..00000000 --- a/src/main/java/kr/pickple/back/alaram/util/AlaramStatusConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package kr.pickple.back.alaram.util; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Convert; -import kr.pickple.back.alaram.domain.AlaramStatus; - -@Convert -public class AlaramStatusConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(final AlaramStatus status) { - return status.getDescription(); - } - - @Override - public AlaramStatus convertToEntityAttribute(final String status) { - return AlaramStatus.from(status); - } -} diff --git a/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java deleted file mode 100644 index b948af5f..00000000 --- a/src/main/java/kr/pickple/back/alaram/util/AlaramTypeConverter.java +++ /dev/null @@ -1,17 +0,0 @@ -package kr.pickple.back.alaram.util; - -import jakarta.persistence.AttributeConverter; -import kr.pickple.back.alaram.domain.AlaramType; - -public class AlaramTypeConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(final AlaramType Type) { - return Type.getDescription(); - } - - @Override - public AlaramType convertToEntityAttribute(final String Type) { - return AlaramType.from(Type); - } -} diff --git a/src/main/java/kr/pickple/back/alaram/util/AlarmExistsStatusConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlarmExistsStatusConverter.java new file mode 100644 index 00000000..be1078d6 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/util/AlarmExistsStatusConverter.java @@ -0,0 +1,19 @@ +package kr.pickple.back.alaram.util; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Convert; +import kr.pickple.back.alaram.domain.AlarmExistsStatus; + +@Convert +public class AlarmExistsStatusConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(final AlarmExistsStatus Status) { + return Status.getDescription(); + } + + @Override + public AlarmExistsStatus convertToEntityAttribute(final String Status) { + return AlarmExistsStatus.from(Status); + } +} diff --git a/src/main/java/kr/pickple/back/alaram/util/AlarmStatusConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlarmStatusConverter.java new file mode 100644 index 00000000..78f6418e --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/util/AlarmStatusConverter.java @@ -0,0 +1,19 @@ +package kr.pickple.back.alaram.util; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Convert; +import kr.pickple.back.alaram.domain.AlarmStatus; + +@Convert +public class AlarmStatusConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(final AlarmStatus status) { + return status.getDescription(); + } + + @Override + public AlarmStatus convertToEntityAttribute(final String status) { + return AlarmStatus.from(status); + } +} diff --git a/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java new file mode 100644 index 00000000..5d8bec4e --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java @@ -0,0 +1,17 @@ +package kr.pickple.back.alaram.util; + +import jakarta.persistence.AttributeConverter; +import kr.pickple.back.alaram.domain.AlarmType; + +public class AlarmTypeConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(final AlarmType Type) { + return Type.getDescription(); + } + + @Override + public AlarmType convertToEntityAttribute(final String Type) { + return AlarmType.from(Type); + } +} From 34de4d1e284c289e8bcfb4ee8cbccae9caabb89b Mon Sep 17 00:00:00 2001 From: jay-so Date: Mon, 20 Nov 2023 22:45:11 +0900 Subject: [PATCH 14/78] =?UTF-8?q?feat:CrewAlarm,GameAlarm,Alarm=20Reposito?= =?UTF-8?q?ry=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/alaram/repository/AlarmRepository.java | 2 +- .../kr/pickple/back/alaram/repository/CrewAlarmRepository.java | 2 +- .../kr/pickple/back/alaram/repository/GameAlarmRepository.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java b/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java index e4dd1954..a3fc1f10 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java +++ b/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java @@ -3,5 +3,5 @@ import kr.pickple.back.alaram.domain.Alarm; import org.springframework.data.jpa.repository.JpaRepository; -public interface AlaramRepository extends JpaRepository { +public interface AlarmRepository extends JpaRepository { } diff --git a/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java b/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java index 65e31d55..6bf5fb3d 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java @@ -3,5 +3,5 @@ import kr.pickple.back.alaram.domain.CrewAlarm; import org.springframework.data.jpa.repository.JpaRepository; -public interface CrewAlaramRepository extends JpaRepository { +public interface CrewAlarmRepository extends JpaRepository { } diff --git a/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java b/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java index 7cb276cc..6f758ba5 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java @@ -3,5 +3,5 @@ import kr.pickple.back.alaram.domain.GameAlarm; import org.springframework.data.jpa.repository.JpaRepository; -public interface GameAlaramRepository extends JpaRepository { +public interface GameAlarmRepository extends JpaRepository { } From 04af8bd31c2775aa9e95272bf4bd7cd9b049538b Mon Sep 17 00:00:00 2001 From: jay-so Date: Mon, 20 Nov 2023 22:46:10 +0900 Subject: [PATCH 15/78] =?UTF-8?q?feat:=20CrewAlarm,GameAlarm=20Response=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 --- .../dto/response/CrewAlaramResponse.java | 33 +++++++++++++++ .../dto/response/GameAlaramResponse.java | 41 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/dto/response/CrewAlaramResponse.java create mode 100644 src/main/java/kr/pickple/back/alaram/dto/response/GameAlaramResponse.java diff --git a/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlaramResponse.java b/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlaramResponse.java new file mode 100644 index 00000000..d5ae11d9 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlaramResponse.java @@ -0,0 +1,33 @@ +package kr.pickple.back.alaram.dto.response; + +import kr.pickple.back.alaram.domain.AlarmStatus; +import kr.pickple.back.alaram.domain.AlarmType; +import kr.pickple.back.alaram.domain.CrewAlarm; +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@Builder +@RequiredArgsConstructor +public class CrewAlaramResponse { + + private final CrewAlarm crewAlarm; + private final Long id; + private final String crewName; + private final LocalDateTime createdAt; + private final AlarmStatus isRead; + private final AlarmType alarmType; + + public static CrewAlaramResponse of(final CrewAlarm crewAlarm) { + return CrewAlaramResponse.builder() + .id(crewAlarm.getId()) + .crewName(crewAlarm.getCrew().getName()) + .createdAt(crewAlarm.getCreatedAt()) + .isRead(crewAlarm.getIsRead()) + .alarmType(crewAlarm.getAlarmType()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/alaram/dto/response/GameAlaramResponse.java b/src/main/java/kr/pickple/back/alaram/dto/response/GameAlaramResponse.java new file mode 100644 index 00000000..1ed8b8bd --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/dto/response/GameAlaramResponse.java @@ -0,0 +1,41 @@ +package kr.pickple.back.alaram.dto.response; + +import kr.pickple.back.alaram.domain.AlarmStatus; +import kr.pickple.back.alaram.domain.AlarmType; +import kr.pickple.back.alaram.domain.GameAlarm; +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +@Getter +@Builder +@RequiredArgsConstructor +public class GameAlaramResponse { + + private final GameAlarm gameAlarm; + private final Long id; + private final String mainAddress; + private final LocalDateTime createdAt; + private final LocalDate playDate; + private final LocalTime playStartTime; + private final Integer playTimeMinutes; + private final AlarmStatus isRead; + private final AlarmType alarmType; + + public static GameAlaramResponse of(final GameAlarm gameAlarm) { + return GameAlaramResponse.builder() + .id(gameAlarm.getId()) + .mainAddress(gameAlarm.getGame().getMainAddress()) + .createdAt(gameAlarm.getCreatedAt()) + .playDate(gameAlarm.getGame().getPlayDate()) + .playStartTime(gameAlarm.getGame().getPlayStartTime()) + .playTimeMinutes(gameAlarm.getGame().getPlayTimeMinutes()) + .isRead(gameAlarm.getIsRead()) + .alarmType(gameAlarm.getAlarmType()) + .build(); + } +} From 91c366330836b4b3b995f202f8f466c74b6ad90b Mon Sep 17 00:00:00 2001 From: jay-so Date: Mon, 20 Nov 2023 22:47:38 +0900 Subject: [PATCH 16/78] =?UTF-8?q?feat:=20GameAlarmService=20(=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B4=80=EB=A0=A8=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=9C=20=EA=B2=8C=EC=9E=84=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=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 --- .../back/alaram/service/GameAlarmService.java | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java diff --git a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java new file mode 100644 index 00000000..bf017490 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java @@ -0,0 +1,144 @@ +package kr.pickple.back.alaram.service; + +import kr.pickple.back.alaram.domain.GameAlarm; +import kr.pickple.back.alaram.dto.response.GameAlaramResponse; +import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alaram.repository.GameAlarmRepository; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import static kr.pickple.back.alaram.domain.AlarmType.*; +import static kr.pickple.back.game.exception.GameExceptionCode.GAME_IS_NOT_HOST; +import static kr.pickple.back.game.exception.GameExceptionCode.GAME_NOT_FOUND; +import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; + +//SSE 연결 로직에서는 @Transcational금지 +@Service +@RequiredArgsConstructor +public class GameAlarmService { + + private final MemberRepository memberRepository; + private final GameRepository gameRepository; + private final GameAlarmRepository gameAlarmRepository; + + public GameAlarm createGameJoinAlaram(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { + //1.게임 리포지토리에서 해당 게임의 호스트인지 확인 + validateIsHost(gameJoinRequestNotificationEvent); + + //2. 이벤트로부터 게임 정보 가져오기 + final Long gameId = gameJoinRequestNotificationEvent.getGameId(); + final Game game = getGameInfo(gameId); + final Member host = game.getHost(); + + //3. 알람 생성 + final GameAlarm gameAlarm = GameAlarm.builder() + .game(game) + .member(host) + .alarmType(HOST_WAITING) + .build(); + + //4. DB에다가 알림 저장 + gameAlarmRepository.save(gameAlarm); + return GameAlaramResponse.of(gameAlarm).getGameAlarm(); + } + + public GameAlarm createGuestApproveAlaram(final GameMemberJoinedEvent gameMemberJoinedEvent) { + + //1.이벤트로부터 게임 정보, 회원 정보 가져오기 + final Long gameId = gameMemberJoinedEvent.getGameId(); + final Game game = getGameInfo(gameId); + final Long memberId = gameMemberJoinedEvent.getMemberId(); + final Member member = getMemberInfo(memberId); + + //2.알람 생성 + final GameAlarm gameAlarm = GameAlarm.builder() + .game(game) + .member(member) + .alarmType(GUEST_ACCEPT) + .build(); + + //3.알람을 DB에다가 저장 + gameAlarmRepository.save(gameAlarm); + + return GameAlaramResponse.of(gameAlarm).getGameAlarm(); + } + + public GameAlarm createGuestDeniedAlaram(final GameMemberRejectedEvent gameMemberRejectedEvent) { + + //1.이벤트로부터 게임 정보, 회원 정보 가져오기 + final Long gameId = gameMemberRejectedEvent.getGameId(); + final Game game = getGameInfo(gameId); + final Long memberId = gameMemberRejectedEvent.getMemberId(); + final Member member = getMemberInfo(memberId); + + //2.알람 생성 + final GameAlarm gameAlarm = GameAlarm.builder() + .game(game) + .member(member) + .alarmType(GUEST_DENIED) + .build(); + + //3.알람 DB에다가 저장 + gameAlarmRepository.save(gameAlarm); + + return GameAlaramResponse.of(gameAlarm).getGameAlarm(); + } + + + private void validateIsHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { + final Long gameId = gameJoinRequestNotificationEvent.getGameId(); + final Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + + //해당 게임의 id와 호스트 id를 비교하여, 해당 게임의 호스트가 맞는지 체크 + if (!game.isHost(gameJoinRequestNotificationEvent.getGameId())) { + throw new GameException(GAME_IS_NOT_HOST, gameId, game.getHost()); + } + } + + private Game getGameInfo(final Long gameId) { + final Game game = gameRepository.findById(gameId) + .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + return game; + } + + + private Member getMemberInfo(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } + + //3개의 부분에서 SSE알람으로 존재함 - 구분 + public void emitMessage(GameAlarm gameAlarm) { + //1. SSE로 알람 생성 - 각 케이스 별 알람 생성 + + //2. SSE로 발생된 알람 저장 + } + + //게임 알림 찾기 By ID + public void findGameAlaramById() { + //id로 알람 찾기 + } + + //게임 알림 찾기 모두 + public void findGameAlaramAll() { + + } + + //게임 알림 변경 By ID + public void updateGameAlaramStatus() { + + } + + //게임 알림 삭제 + public void deleteGameAlaram() { + + } +} From 77e9a07472775d902db0b181ee179f92f97a5663 Mon Sep 17 00:00:00 2001 From: jay-so Date: Mon, 20 Nov 2023 22:48:28 +0900 Subject: [PATCH 17/78] =?UTF-8?q?feat:CrewAlarmService(=ED=81=AC=EB=A3=A8?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4,=20=ED=81=AC=EB=A3=A8=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EC=95=8C=EB=9E=8C)=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alaram/service/CrewAlarmService.java | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java diff --git a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java new file mode 100644 index 00000000..3e92cd4a --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java @@ -0,0 +1,167 @@ +package kr.pickple.back.alaram.service; + +import kr.pickple.back.alaram.domain.CrewAlarm; +import kr.pickple.back.alaram.dto.response.CrewAlaramResponse; +import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alaram.repository.CrewAlarmRepository; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import static kr.pickple.back.alaram.domain.AlarmType.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; +import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; + +//SSE 연결 로직에서는 @Transcational금지 +@Service +@RequiredArgsConstructor +public class CrewAlarmService { + + private final MemberRepository memberRepository; + private final CrewRepository crewRepository; + private final CrewAlarmRepository crewAlarmRepository; + + //크루 알림 생성 + + public CrewAlarm createCrewJoinAlaram(CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + //1.크루 리포지토리에서 해당 크루의 리더인지 확인 + validateIsLeader(crewJoinRequestNotificationEvent); + + //2.이벤트로 부터 크루 정보 가져오기 + final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); + final Crew crew = getCrewInfo(crewId); + final Member leader = crew.getLeader(); + + //3. 알람 생성 + final CrewAlarm crewAlarm = CrewAlarm.builder() + .crew(crew) + .member(leader) + .alarmType(CREW_LEADER_WAITING) + .build(); + + //4. DB에다가 알람 저장 + crewAlarmRepository.save(crewAlarm); + + //?.SSE로 발생된 알람 발송 - 미완성 + //emitMessage(crewAlaramResponse.getCrewAlarm()); + + //?. 발생된 알림을 해당 크루장에게 발송 - notify()메소드 - 미완성 + + return CrewAlaramResponse.of(crewAlarm).getCrewAlarm(); + } + + public CrewAlarm createCrewMemberApproveAlaram(CrewMemberJoinedEvent crewMemberJoinedEvent) { + + //1.이벤트로부터 크루 정보, 회원 정보 가져오기 + final Long crewId = crewMemberJoinedEvent.getCrewId(); + final Crew crew = getCrewInfo(crewId); + final Long memberId = crewMemberJoinedEvent.getMemberId(); + final Member member = getMemberInfo(memberId); + + //3. 알람 생성 + final CrewAlarm crewAlarm = CrewAlarm.builder() + .crew(crew) + .member(member) + .alarmType(CREW_ACCEPT) + .build(); + + //4. 알람 DB에다가 저장 + crewAlarmRepository.save(crewAlarm); + + //?.SSE로 발생된 알람 저장 - DB 저장 + //emitMessage(crewAlaramResponse.getCrewAlarm()); + + + //?.발생된 알림을 해당 Member에게 발송 - notifiy() 메소드 + + return CrewAlaramResponse.of(crewAlarm).getCrewAlarm(); + } + + public CrewAlarm createCrewMemberDeniedAlaram(CrewMemberRejectedEvent crewMemberRejectedEvent) { + + //1.이벤트로 부터 크루 정보,회원 정보 가져오기 + final Long crewId = crewMemberRejectedEvent.getCrewId(); + final Crew crew = getCrewInfo(crewId); + final Long memberId = crewMemberRejectedEvent.getMemberId(); + final Member member = getMemberInfo(memberId); + + //3. 알람 생성 + final CrewAlarm crewAlarm = CrewAlarm.builder() + .crew(crew) + .member(member) + .alarmType(CREW_DENIED) + .build(); + + + //4. 알람 DB에다가 저장 + crewAlarmRepository.save(crewAlarm); + + + //?. SSE로 발생된 알람 저장 - DB 저장 + //emitMessage(crewAlaramResponse.getCrewAlarm()); + + //?. 발생된 알림을 해당 Member에게 발송 - notify()메소드 + + return CrewAlaramResponse.of(crewAlarm).getCrewAlarm(); + } + + private Crew getCrewInfo(Long crewId) { + final Crew crew = crewRepository.findById(crewId) + .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + return crew; + } + + private Member getMemberInfo(Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } + + private void validateIsLeader(CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); + final Crew crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + + //해당 크루의 id와 크루장의 id를 비교하여 해당 크루장이 맞는지 체크 + if (!crew.isLeader(crewJoinRequestNotificationEvent.getCrewId())) { + throw new CrewException(CREW_IS_NOT_LEADER, crewId, crew.getLeader()); + } + } + + + //SSE알람을 발송하는 부분 + //1. 크루장에게 발송 (멤버(회원)이 크루에 지원 클릭 시) + //2. 회원에게 발송(멤버(회훤) - 대기 상태 WAITING을 CONFIREMED로 변경 시) + //3. 회원에게 발송(멤버(회원) - 해당 크루가 거절되었어요!) + public void emitMessage(CrewAlarm alaram) { + //1. SSE로 알람 생성 - 각 케이스 별 알람 생성 + + //2. SSE로 발생된 알람 저장 + } + + //크루 알림 찾기 By ID + public void findCrewAlramById() { + //id로 알람을 찾기 + } + + //크루 알람 모두 찾기 - 상태 + public void findCrewAlaramAll() { + + } + + //크루 알람 상태 변경 + public void updateCrewAlaramStatus() { + + } + + //크루 알림 삭제 + public void deleteCrewAlaram() { + + } +} From ad72030d432065d796817760ce08f6d982facea1 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 00:12:30 +0900 Subject: [PATCH 18/78] =?UTF-8?q?feat:Crew=20=EC=95=8C=EB=9E=8C,=20Game=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=20Update=20DTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/alaram/domain/CrewAlarm.java | 4 ++++ .../kr/pickple/back/alaram/domain/GameAlarm.java | 4 ++++ .../request/CrewAlarmStatusUpdateRequest.java | 15 +++++++++++++++ .../request/GameAlarmStatusUpdateRequest.java | 16 ++++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/dto/request/CrewAlarmStatusUpdateRequest.java create mode 100644 src/main/java/kr/pickple/back/alaram/dto/request/GameAlarmStatusUpdateRequest.java diff --git a/src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java b/src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java index b40ea7bc..be30aa63 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java +++ b/src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java @@ -59,4 +59,8 @@ private CrewAlarm( this.crew = crew; this.member = member; } + + public void updateStatus(AlarmStatus status) { + this.isRead = status; + } } diff --git a/src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java b/src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java index f5161def..d6ddf8c6 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java +++ b/src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java @@ -59,4 +59,8 @@ private GameAlarm( this.game = game; this.member = member; } + + public void updateStatus(AlarmStatus status) { + this.isRead = status; + } } diff --git a/src/main/java/kr/pickple/back/alaram/dto/request/CrewAlarmStatusUpdateRequest.java b/src/main/java/kr/pickple/back/alaram/dto/request/CrewAlarmStatusUpdateRequest.java new file mode 100644 index 00000000..cac3b47f --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/dto/request/CrewAlarmStatusUpdateRequest.java @@ -0,0 +1,15 @@ +package kr.pickple.back.alaram.dto.request; + +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.alaram.domain.AlarmStatus; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CrewAlarmStatusUpdateRequest { + + @NotNull(message = "크루 알람 읽음 상태 여부는 필수입니다.") + private AlarmStatus isRead; +} diff --git a/src/main/java/kr/pickple/back/alaram/dto/request/GameAlarmStatusUpdateRequest.java b/src/main/java/kr/pickple/back/alaram/dto/request/GameAlarmStatusUpdateRequest.java new file mode 100644 index 00000000..80cee3fd --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/dto/request/GameAlarmStatusUpdateRequest.java @@ -0,0 +1,16 @@ +package kr.pickple.back.alaram.dto.request; + + +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.alaram.domain.AlarmStatus; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GameAlarmStatusUpdateRequest { + + @NotNull(message = "게임 알람 읽음 상태 여부는 필수입니다.") + private AlarmStatus isRead; +} From b431b60d5d00330ded18dedc45326ff75821cfcb Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 00:12:58 +0900 Subject: [PATCH 19/78] =?UTF-8?q?feat:=20Alarm=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/alaram/exception/AlarmExceptionCode.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java b/src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java index 15ce2b34..ae177b8e 100644 --- a/src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java +++ b/src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java @@ -12,6 +12,7 @@ public enum AlarmExceptionCode implements ExceptionCode { ALARM_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-001", "알람 읽음 여부를 찾을 수 없음"), ALARM_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-002", "알림 타입을 찾을 수 없음"), ALARM_EXISTS_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-003", "사용자의 알람 상태 여부를 찾을 수 없음"), + ALARM_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-004", "해당 알람을 찾을 수 없음"), ; From 0c7e29ffd4c333515f153ce8dfc0fd74f228e696 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 00:13:48 +0900 Subject: [PATCH 20/78] =?UTF-8?q?style:=20alarm=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alaram/handler/CrewAlarmEventHandler.java | 14 +++++++------- .../back/alaram/handler/GameAlarmEventHandler.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java index 62d0d953..9721ffb3 100644 --- a/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java @@ -14,26 +14,26 @@ @RequiredArgsConstructor public class CrewAlarmEventHandler { - private final CrewAlarmService crewAlaramService; + private final CrewAlarmService crewAlarmService; @Async @EventListener public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - final CrewAlarm crewAlarm = crewAlaramService.createCrewJoinAlaram(crewJoinRequestNotificationEvent); // 알람 생성 - crewAlaramService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + final CrewAlarm crewAlarm = crewAlarmService.createCrewJoinAlaram(crewJoinRequestNotificationEvent); // 알람 생성 + crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 } @Async @EventListener public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { - final CrewAlarm crewAlarm = crewAlaramService.createCrewMemberApproveAlaram(crewMemberJoinedEvent); // 알람 생성 - crewAlaramService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + final CrewAlarm crewAlarm = crewAlarmService.createCrewMemberApproveAlaram(crewMemberJoinedEvent); // 알람 생성 + crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 } @Async @EventListener public void sendAlarmToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { - final CrewAlarm crewAlarm = crewAlaramService.createCrewMemberDeniedAlaram(crewMemberRejectedEvent); // 알람 생성 - crewAlaramService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + final CrewAlarm crewAlarm = crewAlarmService.createCrewMemberDeniedAlaram(crewMemberRejectedEvent); // 알람 생성 + crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 } } diff --git a/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java index d0702a24..d86ed481 100644 --- a/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java @@ -33,7 +33,7 @@ public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJo @Async @EventListener public void sendAlarmToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { - final GameAlarm gameAlarm = gameAlarmService.createGuestDeniedAlaram(gameMemberRejectedEvent); //알람 생성 + final GameAlarm gameAlarm = gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); //알람 생성 gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 } } From 5216572b864d352700ec62254ac845a9391a8c1b Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 00:15:27 +0900 Subject: [PATCH 21/78] =?UTF-8?q?feat:=20Crew,Game=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?deleteAll=20=EB=A9=94=EC=86=8C=EB=93=9C.=20updateAlarmStatus=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C,=20findAlarm=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C,=20checkUnreadAlarm=20=EB=A9=94=EC=86=8C=EB=93=9C=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 --- .../back/alaram/service/CrewAlarmService.java | 50 ++++++++++++++++--- .../back/alaram/service/GameAlarmService.java | 50 +++++++++++++++---- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java index 3e92cd4a..c19181cd 100644 --- a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java @@ -1,10 +1,12 @@ package kr.pickple.back.alaram.service; import kr.pickple.back.alaram.domain.CrewAlarm; +import kr.pickple.back.alaram.dto.request.CrewAlarmStatusUpdateRequest; import kr.pickple.back.alaram.dto.response.CrewAlaramResponse; import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alaram.exception.AlarmException; import kr.pickple.back.alaram.repository.CrewAlarmRepository; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; @@ -15,7 +17,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; import static kr.pickple.back.alaram.domain.AlarmType.*; +import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_NOT_FOUND; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @@ -145,23 +149,53 @@ public void emitMessage(CrewAlarm alaram) { //2. SSE로 발생된 알람 저장 } - //크루 알림 찾기 By ID - public void findCrewAlramById() { - //id로 알람을 찾기 + //크루 알람 모두 찾기 - 미정 + public void findCrewAlaramAll() { + } - //크루 알람 모두 찾기 - 상태 - public void findCrewAlaramAll() { + //크루 알림에서 isRead가 False가 있는지 체크하는 메소드 + public boolean checkUnreadCrewAlarm(final Long memberId){ + //1.해당 회원의 읽지 않은 알람이 있는지 체크함 + final boolean existsUnreadCrewAlarm = crewAlarmRepository.existsByMemberIdAndIsRead(memberId, FALSE); + + //2.반환 + return existsUnreadCrewAlarm; + } + + + //크루 알림 찾기 By ID + public CrewAlarm findCrewAlramById(final Long crewAlarmId) { + //1. 알람 ID로 해당 알림 찾기 + final CrewAlarm crewAlarm = checkExistCrewAlarm(crewAlarmId); + + //2.찾는 알람 반환 + return crewAlarm; } //크루 알람 상태 변경 - public void updateCrewAlaramStatus() { + public void updateCrewAlaramStatus(final Long crewAlarmId, final CrewAlarmStatusUpdateRequest crewAlarmStatusUpdateRequest) { + //1.알람 ID로 해당 알림 찾기 + final CrewAlarm crewAlarm = checkExistCrewAlarm(crewAlarmId); + + //2.상태 업데이트 + crewAlarm.updateStatus(crewAlarmStatusUpdateRequest.getIsRead()); + + //3.저장 + crewAlarmRepository.save(crewAlarm); + } + private CrewAlarm checkExistCrewAlarm(final Long crewAlarmId) { + final CrewAlarm crewAlarm = crewAlarmRepository.findById(crewAlarmId) + .orElseThrow(() -> new AlarmException(ALARM_NOT_FOUND, crewAlarmId)); + + return crewAlarm; } //크루 알림 삭제 - public void deleteCrewAlaram() { - + public void deleteAllCrewAlaram() { + //1.DB에서 생성된 모든 크루 알람을 삭제함 + crewAlarmRepository.deleteAll(); } } diff --git a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java index bf017490..a8367250 100644 --- a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java @@ -1,10 +1,12 @@ package kr.pickple.back.alaram.service; import kr.pickple.back.alaram.domain.GameAlarm; +import kr.pickple.back.alaram.dto.request.GameAlarmStatusUpdateRequest; import kr.pickple.back.alaram.dto.response.GameAlaramResponse; import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alaram.exception.AlarmException; import kr.pickple.back.alaram.repository.GameAlarmRepository; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.exception.GameException; @@ -15,7 +17,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; import static kr.pickple.back.alaram.domain.AlarmType.*; +import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_NOT_FOUND; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_IS_NOT_HOST; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @@ -71,7 +75,7 @@ public GameAlarm createGuestApproveAlaram(final GameMemberJoinedEvent gameMember return GameAlaramResponse.of(gameAlarm).getGameAlarm(); } - public GameAlarm createGuestDeniedAlaram(final GameMemberRejectedEvent gameMemberRejectedEvent) { + public GameAlarm createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejectedEvent) { //1.이벤트로부터 게임 정보, 회원 정보 가져오기 final Long gameId = gameMemberRejectedEvent.getGameId(); @@ -122,23 +126,51 @@ public void emitMessage(GameAlarm gameAlarm) { //2. SSE로 발생된 알람 저장 } - //게임 알림 찾기 By ID - public void findGameAlaramById() { - //id로 알람 찾기 + //게임 알림 찾기 모두 - 미정 + public void findGameAlarmAll() { + + } + + //게임 알람에서 isRead가 False가 있는지 체크하는 메소드 + public boolean checkUnreadGameAlarm(final Long memberId) { + //1. 해당 회원의 읽지 않은 알람이 있는지 체크함 + final boolean existsUnreadGameAlarm = gameAlarmRepository.existsByMemberIdAndIsRead(memberId, FALSE); + + //2. 반환 + return existsUnreadGameAlarm; } - //게임 알림 찾기 모두 - public void findGameAlaramAll() { + //게임 알림 찾기 By ID + public GameAlarm findGameAlarmById(final Long gameAlarmId) { + //1.알람 ID로 해당 알림 찾기 + final GameAlarm gameAlarm = checkExistGameAlarm(gameAlarmId); + //2.찾은 알람 반환 + return gameAlarm; } //게임 알림 변경 By ID - public void updateGameAlaramStatus() { + public void updateGameAlarmStatus(final Long gameAlarmId, final GameAlarmStatusUpdateRequest gameAlarmStatusUpdateRequest) { + //1. 알람 ID로 해당 알림 찾기 + final GameAlarm gameAlarm = checkExistGameAlarm(gameAlarmId); + + //2. 상태 업데이트 + gameAlarm.updateStatus(gameAlarmStatusUpdateRequest.getIsRead()); + //3. 저장 + gameAlarmRepository.save(gameAlarm); } - //게임 알림 삭제 - public void deleteGameAlaram() { + private GameAlarm checkExistGameAlarm(final Long gameAlarmId) { + final GameAlarm gameAlarm = gameAlarmRepository.findById(gameAlarmId) + .orElseThrow(() -> new AlarmException(ALARM_NOT_FOUND, gameAlarmId)); + + return gameAlarm; + } + //게임의 모든 알림을 삭제 + public void deleteAllGameAlarms() { + //1.DB에서 생성된 모든 게임 알람을 삭제함 + gameAlarmRepository.deleteAll(); } } From f380b0f1886bdeabed49a7140505b6c4a2b9d13c Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 00:16:04 +0900 Subject: [PATCH 22/78] =?UTF-8?q?feat:=20Crew,Game=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?Repository=20=EC=9D=BD=EC=9D=8C=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=B3=80=ED=99=94=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 --- .../kr/pickple/back/alaram/repository/CrewAlarmRepository.java | 2 ++ .../kr/pickple/back/alaram/repository/GameAlarmRepository.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java b/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java index 6bf5fb3d..67ffd192 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java @@ -1,7 +1,9 @@ package kr.pickple.back.alaram.repository; +import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.CrewAlarm; import org.springframework.data.jpa.repository.JpaRepository; public interface CrewAlarmRepository extends JpaRepository { + boolean existsByMemberIdAndIsRead(final Long memberId, final AlarmStatus alarmStatus); } diff --git a/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java b/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java index 6f758ba5..51ee0cde 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java @@ -1,7 +1,9 @@ package kr.pickple.back.alaram.repository; +import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.GameAlarm; import org.springframework.data.jpa.repository.JpaRepository; public interface GameAlarmRepository extends JpaRepository { + boolean existsByMemberIdAndIsRead(final Long memberId, final AlarmStatus alarmStatus); } From 67e96b950d86d07601559f73954a56d8a0fd29a8 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 17:12:46 +0900 Subject: [PATCH 23/78] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=ED=95=B4=EB=8B=B9=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?host=20=EC=B2=B4=ED=81=AC=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 --- src/main/java/kr/pickple/back/game/domain/Game.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/domain/Game.java index b64cf6cc..1e6ccafe 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -198,6 +198,10 @@ public Boolean isHost(final Member member) { return member.equals(host); } + public Boolean isHost(final Long hostId) { + return hostId.equals(host.getId()); + } + public void makeNewCrewChatRoom(final ChatRoom chatRoom) { chatRoom.updateMaxMemberCount(maxMemberCount); this.chatRoom = chatRoom; From 88a8ff8b52141ecce213d60c82bea71879e423d4 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 17:13:23 +0900 Subject: [PATCH 24/78] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=97=90=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/game/exception/GameExceptionCode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/exception/GameExceptionCode.java b/src/main/java/kr/pickple/back/game/exception/GameExceptionCode.java index 96dd2789..2a6c2048 100644 --- a/src/main/java/kr/pickple/back/game/exception/GameExceptionCode.java +++ b/src/main/java/kr/pickple/back/game/exception/GameExceptionCode.java @@ -1,10 +1,9 @@ package kr.pickple.back.game.exception; -import org.springframework.http.HttpStatus; - import kr.pickple.back.common.exception.ExceptionCode; import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; @Getter @RequiredArgsConstructor @@ -24,6 +23,7 @@ public enum GameExceptionCode implements ExceptionCode { GAME_MEMBER_CANNOT_REVIEW_SELF(HttpStatus.BAD_REQUEST, "GAM-012", "자기 자신에게 리뷰를 남길 수 없음"), GAME_CAPACITY_LIMIT_REACHED(HttpStatus.BAD_REQUEST, "GAM-013", "해당 게스트 모집글의 정원을 초과할 수 없음"), GAME_STATUS_IS_CLOSED(HttpStatus.BAD_REQUEST, "GAM-014", "해당 게스트 모집글은 모집중이 아님"), + GAME_IS_NOT_HOST(HttpStatus.BAD_REQUEST, "GAM-013", "해당 게임의 호스트가 아님"), ; private final HttpStatus status; From f26459383fe501d2885e9adadf2b6bea551bcf80 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 00:18:31 +0900 Subject: [PATCH 25/78] =?UTF-8?q?style:=20MemberRepository=20import?= =?UTF-8?q?=EB=AC=B8=20=EC=84=A4=EC=A0=95=20=EC=BD=94=EB=93=9C=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/member/repository/MemberRepository.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index b8658dea..2e332ab6 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -1,10 +1,9 @@ package kr.pickple.back.member.repository; -import java.util.Optional; - +import kr.pickple.back.member.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.member.domain.Member; +import java.util.Optional; public interface MemberRepository extends JpaRepository { From 0bb20747117da3c2d9010ee4bda07c8737408bca Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 00:33:42 +0900 Subject: [PATCH 26/78] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/alaram/service/CrewAlarmService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java index c19181cd..d50310fb 100644 --- a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java @@ -194,7 +194,7 @@ private CrewAlarm checkExistCrewAlarm(final Long crewAlarmId) { } //크루 알림 삭제 - public void deleteAllCrewAlaram() { + public void deleteAllCrewAlarms() { //1.DB에서 생성된 모든 크루 알람을 삭제함 crewAlarmRepository.deleteAll(); } From 8c6c3a92ff1be12c92ac2c560d9716b1770f390a Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 01:47:25 +0900 Subject: [PATCH 27/78] =?UTF-8?q?refactor:=20Crew=20=EC=95=8C=EB=9E=8C,=20?= =?UTF-8?q?Game=EC=95=8C=EB=9E=8C=20updateStatus=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/CrewAlarmStatusUpdateRequest.java | 15 --------------- .../request/GameAlarmStatusUpdateRequest.java | 16 ---------------- .../back/alaram/service/CrewAlarmService.java | 11 +++++------ .../back/alaram/service/GameAlarmService.java | 7 ++++--- 4 files changed, 9 insertions(+), 40 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/alaram/dto/request/CrewAlarmStatusUpdateRequest.java delete mode 100644 src/main/java/kr/pickple/back/alaram/dto/request/GameAlarmStatusUpdateRequest.java diff --git a/src/main/java/kr/pickple/back/alaram/dto/request/CrewAlarmStatusUpdateRequest.java b/src/main/java/kr/pickple/back/alaram/dto/request/CrewAlarmStatusUpdateRequest.java deleted file mode 100644 index cac3b47f..00000000 --- a/src/main/java/kr/pickple/back/alaram/dto/request/CrewAlarmStatusUpdateRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package kr.pickple.back.alaram.dto.request; - -import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.domain.AlarmStatus; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CrewAlarmStatusUpdateRequest { - - @NotNull(message = "크루 알람 읽음 상태 여부는 필수입니다.") - private AlarmStatus isRead; -} diff --git a/src/main/java/kr/pickple/back/alaram/dto/request/GameAlarmStatusUpdateRequest.java b/src/main/java/kr/pickple/back/alaram/dto/request/GameAlarmStatusUpdateRequest.java deleted file mode 100644 index 80cee3fd..00000000 --- a/src/main/java/kr/pickple/back/alaram/dto/request/GameAlarmStatusUpdateRequest.java +++ /dev/null @@ -1,16 +0,0 @@ -package kr.pickple.back.alaram.dto.request; - - -import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.domain.AlarmStatus; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GameAlarmStatusUpdateRequest { - - @NotNull(message = "게임 알람 읽음 상태 여부는 필수입니다.") - private AlarmStatus isRead; -} diff --git a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java index d50310fb..3a6c5603 100644 --- a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java @@ -1,7 +1,7 @@ package kr.pickple.back.alaram.service; +import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.CrewAlarm; -import kr.pickple.back.alaram.dto.request.CrewAlarmStatusUpdateRequest; import kr.pickple.back.alaram.dto.response.CrewAlaramResponse; import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; @@ -155,7 +155,7 @@ public void findCrewAlaramAll() { } //크루 알림에서 isRead가 False가 있는지 체크하는 메소드 - public boolean checkUnreadCrewAlarm(final Long memberId){ + public boolean checkUnreadCrewAlarm(final Long memberId) { //1.해당 회원의 읽지 않은 알람이 있는지 체크함 final boolean existsUnreadCrewAlarm = crewAlarmRepository.existsByMemberIdAndIsRead(memberId, FALSE); @@ -163,8 +163,6 @@ public boolean checkUnreadCrewAlarm(final Long memberId){ return existsUnreadCrewAlarm; } - - //크루 알림 찾기 By ID public CrewAlarm findCrewAlramById(final Long crewAlarmId) { //1. 알람 ID로 해당 알림 찾기 @@ -175,12 +173,13 @@ public CrewAlarm findCrewAlramById(final Long crewAlarmId) { } //크루 알람 상태 변경 - public void updateCrewAlaramStatus(final Long crewAlarmId, final CrewAlarmStatusUpdateRequest crewAlarmStatusUpdateRequest) { + public void updateCrewAlaramStatus(final Long crewAlarmId, final String isRead) { //1.알람 ID로 해당 알림 찾기 final CrewAlarm crewAlarm = checkExistCrewAlarm(crewAlarmId); + final AlarmStatus alarmStatus = AlarmStatus.from(isRead); //2.상태 업데이트 - crewAlarm.updateStatus(crewAlarmStatusUpdateRequest.getIsRead()); + crewAlarm.updateStatus(alarmStatus); //3.저장 crewAlarmRepository.save(crewAlarm); diff --git a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java index a8367250..7e69ccd9 100644 --- a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java @@ -1,7 +1,7 @@ package kr.pickple.back.alaram.service; +import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.GameAlarm; -import kr.pickple.back.alaram.dto.request.GameAlarmStatusUpdateRequest; import kr.pickple.back.alaram.dto.response.GameAlaramResponse; import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; @@ -150,12 +150,13 @@ public GameAlarm findGameAlarmById(final Long gameAlarmId) { } //게임 알림 변경 By ID - public void updateGameAlarmStatus(final Long gameAlarmId, final GameAlarmStatusUpdateRequest gameAlarmStatusUpdateRequest) { + public void updateGameAlarmStatus(final Long gameAlarmId, final String isRead) { //1. 알람 ID로 해당 알림 찾기 final GameAlarm gameAlarm = checkExistGameAlarm(gameAlarmId); + final AlarmStatus alarmStatus = AlarmStatus.from(isRead); //2. 상태 업데이트 - gameAlarm.updateStatus(gameAlarmStatusUpdateRequest.getIsRead()); + gameAlarm.updateStatus(alarmStatus); //3. 저장 gameAlarmRepository.save(gameAlarm); From 11fadde7671a4dad013a641a5a1fb9ae73b6081e Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 01:47:40 +0900 Subject: [PATCH 28/78] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EA=B0=9C=ED=96=89=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java b/src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java index 08ef2d37..1d85a1ad 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java +++ b/src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java @@ -39,5 +39,4 @@ public static AlarmExistsStatus from(final String description) { public Boolean getBooleanValue() { return booleanValue; } - } From 165921c948f16cc698016c8cbd6c1542f2f0f435 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 01:49:25 +0900 Subject: [PATCH 29/78] =?UTF-8?q?feat:=20=ED=86=B5=ED=95=A9=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=84=9C=EB=B9=84=EC=8A=A4=20deleteAllAlarms,updat?= =?UTF-8?q?eAlarmById,checkUnReadAlarms,subsribeToSse(sse=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0)=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alaram/service/AlarmService.java | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/main/java/kr/pickple/back/alaram/service/AlarmService.java diff --git a/src/main/java/kr/pickple/back/alaram/service/AlarmService.java b/src/main/java/kr/pickple/back/alaram/service/AlarmService.java new file mode 100644 index 00000000..43638eb5 --- /dev/null +++ b/src/main/java/kr/pickple/back/alaram/service/AlarmService.java @@ -0,0 +1,123 @@ +package kr.pickple.back.alaram.service; + +import kr.pickple.back.alaram.domain.AlarmExistsStatus; +import kr.pickple.back.alaram.domain.CrewAlarm; +import kr.pickple.back.alaram.domain.GameAlarm; +import kr.pickple.back.alaram.exception.AlarmException; +import kr.pickple.back.alaram.exception.AlarmExceptionCode; +import kr.pickple.back.alaram.util.SseEmitters; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; + +import static kr.pickple.back.alaram.domain.AlarmExistsStatus.EXISTS; +import static kr.pickple.back.alaram.domain.AlarmExistsStatus.NOT_EXISTS; +import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; + +//SSE 연결 로직에서는 @Transcational금지 +@Service +@RequiredArgsConstructor +public class AlarmService { + + private final GameAlarmService gameAlarmService; + private final CrewAlarmService crewAlarmService; + private final MemberRepository memberRepository; + private final SseEmitters sseEmitters; + + //1.SSE 연결 - 이벤트가 발생 된 후, 30초동안 지속 연결 + public SseEmitter subscribeToSse(final Long loggedInMemberId) { + final Member member = findMemberById(loggedInMemberId); + final SseEmitter emitter = new SseEmitter(30 * 1000L); //30초안 sse 연결 지속 + sseEmitters.add(loggedInMemberId, emitter); + + try { + emitter.send(SseEmitter.event() + .name("AlaramSseConnect") // 해당 이벤트의 이름 지정 + .data("사용자에 대한 알람 SSE 연결이 정상적으로 처리되었습니다.")); // 503 에러 방지를 위한 더미 데이터 + } catch (IOException e) { + sseEmitters.remove(loggedInMemberId); + emitter.completeWithError(e); + } + + + return emitter; + } + + //특정 사용자(loggedInMemberId)에게 이벤트(event)를 전송하는 역할을 함 + //SseEmitters에서 해당 사용자의 SseEmitter를 가져오고, 이를 통해 이벤트를 클라이언트에게 전송 + //특정 이벤트가 발생했을 때 해당 이벤트를 클라이언트에게 실시간으로 전달하는데 사용됨 + //새로운 알림이 도착했을 때 이를 클라이언트에게 실시간으로 알려주는 등의 기능을 구현하고자 할 때 notify 메서드를 사용 + public void notify(final Long loggedInMemberId, final Object event) { + final SseEmitter emitter = sseEmitters.get(loggedInMemberId); + if (emitter != null) { + try { + emitter.send(event); + } catch (IOException e) { + sseEmitters.remove(loggedInMemberId); + emitter.completeWithError(e); + } + } + } + + //모든 알람 찾기 모두 - 각 알림에서 생성일 순으로 조회 + +// public static List findAllAlarms() { +// return null; +// } + + //특정 알림 읽음, 읽지 않음 상태 확인 + //1. memberId를 통해, 각 알림의 Repository에서 읽지 않은 알림이 있는지 판별 + //2. 크루 관련 알람 -> 해당 사용자의 크루 관련 알람의 읽지 않은 상태 확인(checkUnreadCrewAlarm)메소드 -> 있다면 True반환 + //2. 게임 관련 알람 -> 해당 사용자의 게임 관련 알람의 읽지 않은 상태 확인( checkUnreadGameAlarm)메소드 -> 있다면 True반환 + //3. 두 알림 중 하나라도 읽지 않은 상태가 있다면 True를 , 두 알림 중 모두 읽은 상태라면 False를 반환 + public AlarmExistsStatus checkUnReadAlarms(final Long loggedInMemberId) { + final boolean existsUnreadCrewAlarm = crewAlarmService.checkUnreadCrewAlarm(loggedInMemberId); + final boolean existsUnreadGameAlarm = gameAlarmService.checkUnreadGameAlarm(loggedInMemberId); + + return existsUnreadCrewAlarm || existsUnreadGameAlarm ? EXISTS : NOT_EXISTS; + } + + //특정 알림 수정 - 해당 id가 각 크루,게임 알림 중, 어떤 것인지 판별하고 읽음 처리 + //1. alarmId를 통해, 들어온 알람이 어떤 알람인지 판별 + //2. 크루 관련 알람 -> 해당 크루 관련 알람을 찾음(findById)메소드 -> 상태 수정(updateById) 메소드 + //3. 게임 관련 알람 -> 해당 게임 관련 알람을 찾음(findById)메소드 -> 상태 수정(updateById) 메소드 + public void updateAlarmById(final Long loggedInMemberId, final Long alarmId, final String isRead) { + //1.해당 회원의 ID가 있는지 체크 + final Member member = findMemberById(loggedInMemberId); + + //2.해당 알람이 어떤 알람인지 판별 + final GameAlarm gameAlarm = gameAlarmService.findGameAlarmById(alarmId); + final CrewAlarm crewAlarm = crewAlarmService.findCrewAlramById(alarmId); + + //3.해당 알람이 어떤 알람인지 확인하고, 상태 수정 + if (gameAlarm != null) { + gameAlarmService.updateGameAlarmStatus(alarmId,isRead); + } + + if (crewAlarm != null) { + crewAlarmService.updateCrewAlaramStatus(alarmId,isRead); + } + //아니면 + throw new AlarmException(AlarmExceptionCode.ALARM_NOT_FOUND, alarmId); + } + + //모든 알림 삭제 - 모든 알림들을 삭제함 + public void deleteAllAlarms(final Long loggedInMemberId) { + //1.해당 회원의 ID가 있는지 체크 + final Member member = findMemberById(loggedInMemberId); + + //2. 모든 알람을 삭제함 - 해당 회원의 크루 알람, 게임 알람 + crewAlarmService.deleteAllCrewAlarms(); + gameAlarmService.deleteAllGameAlarms(); + } + + private Member findMemberById(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } +} From ba28f9292a51b53f3c79b837f7acd5527f523185 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 01:50:57 +0900 Subject: [PATCH 30/78] =?UTF-8?q?feat:=20=ED=86=B5=ED=95=A9=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=20Controller=20sse=EC=97=B0=EA=B2=B0,=20=EB=AF=B8?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EC=95=8C=EB=9E=8C=20=EC=B2=B4=ED=81=AC,?= =?UTF-8?q?=20=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alaram/controller/AlarmController.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java b/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java index ebe91356..de133ac1 100644 --- a/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java +++ b/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java @@ -1,7 +1,8 @@ package kr.pickple.back.alaram.controller; -import kr.pickple.back.alaram.dto.response.AlaramUnReadCountResponse; -import kr.pickple.back.alaram.service.AlaramService; +import jakarta.validation.Valid; +import kr.pickple.back.alaram.domain.AlarmExistsStatus; +import kr.pickple.back.alaram.service.AlarmService; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -9,8 +10,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import java.awt.*; - import static org.springframework.http.HttpStatus.NO_CONTENT; import static org.springframework.http.HttpStatus.OK; @@ -19,8 +18,9 @@ @RequestMapping("/alarms") public class AlarmController { - private final AlaramService alarmService; + private final AlarmService alarmService; + //해당 사용자의 sse연결 @GetMapping(value = "/subscribe", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public ResponseEntity subscribeToSse( @Login final Long loggedInMemberId @@ -31,14 +31,16 @@ public ResponseEntity subscribeToSse( .body(emitter); } + //해당 사용자에게 미 알람이 있는지 체크 @GetMapping("/unread") - public ResponseEntity findUnreadAlarmResponse( - @PathVariable final Login loggedInMemberId + public ResponseEntity findUnreadAlarm( + @Login final Long loggedInMemberId ) { - //알람 서비스 중, 읽지 않은 알람 계산 + AlarmExistsStatus alarmExistsStatus = alarmService.checkUnReadAlarms(loggedInMemberId); + return ResponseEntity + .status(OK) + .body(alarmExistsStatus); - return ResponseEntity.status(OK) - .body(AlaramService.countUnreadAlaram()); } // @GetMapping @@ -48,25 +50,28 @@ public ResponseEntity findUnreadAlarmResponse( // ){ // //커시 기반 조회 서비스 구현 후, 채움 // return ResponseEntity.status(OK) -// .body(AlaramService.findAllAlarms()); +// .body(AlarmService.findAllAlarms()); // } - @PatchMapping("/{alaramId}") - public ResponseEntity updateAlaramStatus( + + //알람 수정 + @PatchMapping("/{alarmId}") + public ResponseEntity updateAlarmStatus( @Login final Long loggedInMemberId, - @PathVariable final Long alaramId + @PathVariable final Long alarmId, + @Valid @RequestBody final String isRead ) { - //알람 서비스 중, 수정 기반 + alarmService.updateAlarmById(loggedInMemberId, alarmId, isRead); return ResponseEntity.status(NO_CONTENT) .build(); } + //모든 알람 삭제 @DeleteMapping - public ResponseEntity deleteAlarams( - @Login final Long loggedInMemberId, - final Cursor cursor + public ResponseEntity deleteAllAlarms( + @Login final Long loggedInMemberId ) { - //알람 삭제 서비스, 커서 기반 + alarmService.deleteAllAlarms(loggedInMemberId); return ResponseEntity.status(NO_CONTENT) .build(); } From 2a542ee4db26191b64a1246ae9ee7be2d333e67f Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 04:46:11 +0900 Subject: [PATCH 31/78] =?UTF-8?q?refactor:=20CrewAlarmResponse,GameAlarmRe?= =?UTF-8?q?sponse=20=EC=A7=81=EB=A0=AC=ED=99=94=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...wAlaramResponse.java => CrewAlarmResponse.java} | 14 ++++++++++---- ...eAlaramResponse.java => GameAlarmResponse.java} | 9 +++++---- 2 files changed, 15 insertions(+), 8 deletions(-) rename src/main/java/kr/pickple/back/alaram/dto/response/{CrewAlaramResponse.java => CrewAlarmResponse.java} (68%) rename src/main/java/kr/pickple/back/alaram/dto/response/{GameAlaramResponse.java => GameAlarmResponse.java} (78%) diff --git a/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlaramResponse.java b/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlarmResponse.java similarity index 68% rename from src/main/java/kr/pickple/back/alaram/dto/response/CrewAlaramResponse.java rename to src/main/java/kr/pickple/back/alaram/dto/response/CrewAlarmResponse.java index d5ae11d9..8174e49a 100644 --- a/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlaramResponse.java +++ b/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlarmResponse.java @@ -1,8 +1,10 @@ package kr.pickple.back.alaram.dto.response; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.AlarmType; import kr.pickple.back.alaram.domain.CrewAlarm; +import kr.pickple.back.crew.domain.Crew; import lombok.Builder; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,19 +13,23 @@ @Getter @Builder +@JsonSerialize @RequiredArgsConstructor -public class CrewAlaramResponse { +public class CrewAlarmResponse { - private final CrewAlarm crewAlarm; private final Long id; + private final Long crewId; private final String crewName; private final LocalDateTime createdAt; private final AlarmStatus isRead; private final AlarmType alarmType; - public static CrewAlaramResponse of(final CrewAlarm crewAlarm) { - return CrewAlaramResponse.builder() + public static CrewAlarmResponse of(final CrewAlarm crewAlarm) { + final Crew crew = crewAlarm.getCrew(); + + return CrewAlarmResponse.builder() .id(crewAlarm.getId()) + .crewId(crew.getId()) .crewName(crewAlarm.getCrew().getName()) .createdAt(crewAlarm.getCreatedAt()) .isRead(crewAlarm.getIsRead()) diff --git a/src/main/java/kr/pickple/back/alaram/dto/response/GameAlaramResponse.java b/src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java similarity index 78% rename from src/main/java/kr/pickple/back/alaram/dto/response/GameAlaramResponse.java rename to src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java index 1ed8b8bd..8f9c9a59 100644 --- a/src/main/java/kr/pickple/back/alaram/dto/response/GameAlaramResponse.java +++ b/src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java @@ -1,5 +1,6 @@ package kr.pickple.back.alaram.dto.response; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.AlarmType; import kr.pickple.back.alaram.domain.GameAlarm; @@ -13,10 +14,10 @@ @Getter @Builder +@JsonSerialize //text/event-stream'의 MIME 타입이기 때문에 JsonSerialize로 Json형식으로 직렬화해야 함 @RequiredArgsConstructor -public class GameAlaramResponse { +public class GameAlarmResponse { - private final GameAlarm gameAlarm; private final Long id; private final String mainAddress; private final LocalDateTime createdAt; @@ -26,8 +27,8 @@ public class GameAlaramResponse { private final AlarmStatus isRead; private final AlarmType alarmType; - public static GameAlaramResponse of(final GameAlarm gameAlarm) { - return GameAlaramResponse.builder() + public static GameAlarmResponse of(final GameAlarm gameAlarm) { + return GameAlarmResponse.builder() .id(gameAlarm.getId()) .mainAddress(gameAlarm.getGame().getMainAddress()) .createdAt(gameAlarm.getCreatedAt()) From fbc094895798a7784efdd5139645a334aeba4869 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 04:46:42 +0900 Subject: [PATCH 32/78] =?UTF-8?q?refactor:=20CrewAlarmEventHander,GameAlar?= =?UTF-8?q?mEventHandler=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alaram/handler/CrewAlarmEventHandler.java | 8 ++++---- .../back/alaram/handler/GameAlarmEventHandler.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java index 9721ffb3..82e35bbe 100644 --- a/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java @@ -1,6 +1,6 @@ package kr.pickple.back.alaram.handler; -import kr.pickple.back.alaram.domain.CrewAlarm; +import kr.pickple.back.alaram.dto.response.CrewAlarmResponse; import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; @@ -19,21 +19,21 @@ public class CrewAlarmEventHandler { @Async @EventListener public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - final CrewAlarm crewAlarm = crewAlarmService.createCrewJoinAlaram(crewJoinRequestNotificationEvent); // 알람 생성 + final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewJoinAlaram(crewJoinRequestNotificationEvent); // 알람 생성 crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 } @Async @EventListener public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { - final CrewAlarm crewAlarm = crewAlarmService.createCrewMemberApproveAlaram(crewMemberJoinedEvent); // 알람 생성 + final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberApproveAlarm(crewMemberJoinedEvent); // 알람 생성 crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 } @Async @EventListener public void sendAlarmToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { - final CrewAlarm crewAlarm = crewAlarmService.createCrewMemberDeniedAlaram(crewMemberRejectedEvent); // 알람 생성 + final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberDeniedAlarm(crewMemberRejectedEvent); // 알람 생성 crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 } } diff --git a/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java index d86ed481..ba0c5a96 100644 --- a/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java @@ -1,6 +1,6 @@ package kr.pickple.back.alaram.handler; -import kr.pickple.back.alaram.domain.GameAlarm; +import kr.pickple.back.alaram.dto.response.GameAlarmResponse; import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; @@ -19,21 +19,21 @@ public class GameAlarmEventHandler { @Async @EventListener public void sendAlarmToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { - final GameAlarm gameAlarm = gameAlarmService.createGameJoinAlaram(gameJoinRequestNotificationEvent); //알람 생성 + final GameAlarmResponse gameAlarm = gameAlarmService.createGameJoinAlarm(gameJoinRequestNotificationEvent); //알람 생성 gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 - sseServcie로 변경? } @Async @EventListener public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { - final GameAlarm gameAlarm = gameAlarmService.createGuestApproveAlaram(gameMemberJoinedEvent); //알람 생성 + final GameAlarmResponse gameAlarm = gameAlarmService.createGuestApproveAlarm(gameMemberJoinedEvent); //알람 생성 gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 } @Async @EventListener public void sendAlarmToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { - final GameAlarm gameAlarm = gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); //알람 생성 + final GameAlarmResponse gameAlarm = gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); //알람 생성 gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 } } From cdbc934fe0afbd61fd26a27cedd996b4315c748f Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 04:47:32 +0900 Subject: [PATCH 33/78] =?UTF-8?q?refactor:=20SseEmitters=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/alaram/service/AlarmService.java | 8 +++----- .../java/kr/pickple/back/alaram/util/SseEmitters.java | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/service/AlarmService.java b/src/main/java/kr/pickple/back/alaram/service/AlarmService.java index 43638eb5..88f6bf9f 100644 --- a/src/main/java/kr/pickple/back/alaram/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alaram/service/AlarmService.java @@ -32,8 +32,7 @@ public class AlarmService { //1.SSE 연결 - 이벤트가 발생 된 후, 30초동안 지속 연결 public SseEmitter subscribeToSse(final Long loggedInMemberId) { final Member member = findMemberById(loggedInMemberId); - final SseEmitter emitter = new SseEmitter(30 * 1000L); //30초안 sse 연결 지속 - sseEmitters.add(loggedInMemberId, emitter); + final SseEmitter emitter = new SseEmitter(); try { emitter.send(SseEmitter.event() @@ -44,7 +43,6 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { emitter.completeWithError(e); } - return emitter; } @@ -96,11 +94,11 @@ public void updateAlarmById(final Long loggedInMemberId, final Long alarmId, fin //3.해당 알람이 어떤 알람인지 확인하고, 상태 수정 if (gameAlarm != null) { - gameAlarmService.updateGameAlarmStatus(alarmId,isRead); + gameAlarmService.updateGameAlarmStatus(alarmId, isRead); } if (crewAlarm != null) { - crewAlarmService.updateCrewAlaramStatus(alarmId,isRead); + crewAlarmService.updateCrewAlaramStatus(alarmId, isRead); } //아니면 throw new AlarmException(AlarmExceptionCode.ALARM_NOT_FOUND, alarmId); diff --git a/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java b/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java index cee880e3..7c8362e7 100644 --- a/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java +++ b/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java @@ -23,7 +23,7 @@ public SseEmitter add(final Long id, final SseEmitter emitter) { emitter.onCompletion(() -> { log.info("onCompletion callback"); - this.emitters.remove(id); // 만료되면 리스트에서 삭제 + this.emitters.remove(id); }); emitter.onTimeout(() -> { From c9238f5917d55331026eb86740f25007d3e7738f Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 04:48:48 +0900 Subject: [PATCH 34/78] =?UTF-8?q?feat:=20=ED=81=AC=EB=A3=A8=EC=9E=A5=20sse?= =?UTF-8?q?=20=EC=8B=A4=EC=8B=9C=EA=B0=84=20=EC=95=8C=EB=9E=8C,=20?= =?UTF-8?q?=ED=81=AC=EB=A3=A8=EC=9B=90=20sse=20=EC=8B=A4=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=20=EC=95=8C=EB=9E=8C=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alaram/service/CrewAlarmService.java | 104 ++++++++++++------ 1 file changed, 72 insertions(+), 32 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java index 3a6c5603..5bdcf7b6 100644 --- a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java @@ -2,12 +2,14 @@ import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.CrewAlarm; -import kr.pickple.back.alaram.dto.response.CrewAlaramResponse; +import kr.pickple.back.alaram.dto.response.CrewAlarmResponse; import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alaram.exception.AlarmException; import kr.pickple.back.alaram.repository.CrewAlarmRepository; +import kr.pickple.back.alaram.util.SseEmitters; +import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewRepository; @@ -15,16 +17,23 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.List; import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; import static kr.pickple.back.alaram.domain.AlarmType.*; import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_NOT_FOUND; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; //SSE 연결 로직에서는 @Transcational금지 +@Slf4j @Service @RequiredArgsConstructor public class CrewAlarmService { @@ -32,10 +41,11 @@ public class CrewAlarmService { private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final CrewAlarmRepository crewAlarmRepository; + private final AlarmService alarmService; + private final SseEmitters sseEmitters; //크루 알림 생성 - - public CrewAlarm createCrewJoinAlaram(CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + public CrewAlarmResponse createCrewJoinAlaram(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { //1.크루 리포지토리에서 해당 크루의 리더인지 확인 validateIsLeader(crewJoinRequestNotificationEvent); @@ -54,15 +64,13 @@ public CrewAlarm createCrewJoinAlaram(CrewJoinRequestNotificationEvent crewJoinR //4. DB에다가 알람 저장 crewAlarmRepository.save(crewAlarm); - //?.SSE로 발생된 알람 발송 - 미완성 - //emitMessage(crewAlaramResponse.getCrewAlarm()); - - //?. 발생된 알림을 해당 크루장에게 발송 - notify()메소드 - 미완성 + final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); + alarmService.notify(leader.getId(), response); - return CrewAlaramResponse.of(crewAlarm).getCrewAlarm(); + return response; } - public CrewAlarm createCrewMemberApproveAlaram(CrewMemberJoinedEvent crewMemberJoinedEvent) { + public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewMemberJoinedEvent crewMemberJoinedEvent) { //1.이벤트로부터 크루 정보, 회원 정보 가져오기 final Long crewId = crewMemberJoinedEvent.getCrewId(); @@ -80,16 +88,13 @@ public CrewAlarm createCrewMemberApproveAlaram(CrewMemberJoinedEvent crewMemberJ //4. 알람 DB에다가 저장 crewAlarmRepository.save(crewAlarm); - //?.SSE로 발생된 알람 저장 - DB 저장 - //emitMessage(crewAlaramResponse.getCrewAlarm()); + final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); + alarmService.notify(member.getId(), response); - - //?.발생된 알림을 해당 Member에게 발송 - notifiy() 메소드 - - return CrewAlaramResponse.of(crewAlarm).getCrewAlarm(); + return response; } - public CrewAlarm createCrewMemberDeniedAlaram(CrewMemberRejectedEvent crewMemberRejectedEvent) { + public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewMemberRejectedEvent crewMemberRejectedEvent) { //1.이벤트로 부터 크루 정보,회원 정보 가져오기 final Long crewId = crewMemberRejectedEvent.getCrewId(); @@ -108,27 +113,35 @@ public CrewAlarm createCrewMemberDeniedAlaram(CrewMemberRejectedEvent crewMember //4. 알람 DB에다가 저장 crewAlarmRepository.save(crewAlarm); + final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); + alarmService.notify(member.getId(), response); - //?. SSE로 발생된 알람 저장 - DB 저장 - //emitMessage(crewAlaramResponse.getCrewAlarm()); - - //?. 발생된 알림을 해당 Member에게 발송 - notify()메소드 - - return CrewAlaramResponse.of(crewAlarm).getCrewAlarm(); + return response; } - private Crew getCrewInfo(Long crewId) { + private Crew getCrewInfo(final Long crewId) { final Crew crew = crewRepository.findById(crewId) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); return crew; } - private Member getMemberInfo(Long memberId) { - return memberRepository.findById(memberId) + private Member getCrewLeaderOfCrew(final Long crewId) { + final Crew crew = getCrewInfo(crewId); + return crew.getLeader(); + } + + private List getCrewMembers(final Long crewId, final RegistrationStatus status) { + final Crew crew = getCrewInfo(crewId); + return crew.getCrewMembers(status); + } + + private Member getMemberInfo(final Long memberId) { + final Member member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + return member; } - private void validateIsLeader(CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + private void validateIsLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); final Crew crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); @@ -140,13 +153,40 @@ private void validateIsLeader(CrewJoinRequestNotificationEvent crewJoinRequestNo //SSE알람을 발송하는 부분 - //1. 크루장에게 발송 (멤버(회원)이 크루에 지원 클릭 시) - //2. 회원에게 발송(멤버(회훤) - 대기 상태 WAITING을 CONFIREMED로 변경 시) - //3. 회원에게 발송(멤버(회원) - 해당 크루가 거절되었어요!) - public void emitMessage(CrewAlarm alaram) { - //1. SSE로 알람 생성 - 각 케이스 별 알람 생성 + public void emitMessage(final CrewAlarmResponse crewAlarm) { + + final Long crewId = crewAlarm.getCrewId(); + final Member crewLeader = getCrewLeaderOfCrew(crewId); + final List crewApplyMembers = getCrewMembers(crewId, WAITING); - //2. SSE로 발생된 알람 저장 + //1. SSE로 알람 생성 - 각 케이스 별 알람 생성(크루장과 지원자에게 메시지 전송) + sendAlarmToCrewLeader(crewLeader, crewAlarm); + sendAlarmToCrewApplyMembers(crewApplyMembers, crewAlarm); + } + + private void sendAlarmToMember(final Member member, final CrewAlarmResponse crewAlarm) { + final SseEmitter crewLeaderEmitter = sseEmitters.get(member.getId()); + if (crewLeaderEmitter != null) { + try { + crewLeaderEmitter.send(crewAlarm); + } catch (IOException e) { + sseEmitters.remove(member.getId()); + log.error("해당 회원에게 알람 전송 중 오류가 발생했습니다. : " + member.getId(), e); + } + } + } + + //크루장에게 가입 신청이 올 시 받는 알람 + private void sendAlarmToCrewLeader(final Member leader, final CrewAlarmResponse crewAlarm) { + sendAlarmToMember(leader, crewAlarm); + } + + //회원(크루원 - 대기)에게 크루장이 승락 시, 상태가 Confired로 변하며 승락되었다는 알람 + //회원(크루원 - 대기)에게 크루장이 거절 시, 크루원 테이블에서 삭제되며, 거절되었다는 알람 + private void sendAlarmToCrewApplyMembers(final List members, final CrewAlarmResponse crewAlarm) { + for (final Member member : members) { + sendAlarmToMember(member, crewAlarm); + } } //크루 알람 모두 찾기 - 미정 From 56a2adf0a391d7b7cf0fca43efe7ecb378c816f7 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 05:12:48 +0900 Subject: [PATCH 35/78] =?UTF-8?q?refactor:=20AlarmTypeConverter=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20@Converter=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/alaram/util/AlarmTypeConverter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java b/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java index 5d8bec4e..1e78628e 100644 --- a/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java +++ b/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java @@ -1,8 +1,10 @@ package kr.pickple.back.alaram.util; import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Convert; import kr.pickple.back.alaram.domain.AlarmType; +@Convert public class AlarmTypeConverter implements AttributeConverter { @Override From a518f80971828414b787725978bc8bfffeca2a3e Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 15:05:08 +0900 Subject: [PATCH 36/78] =?UTF-8?q?feat:=20=ED=98=B8=EC=8A=A4=ED=8A=B8=20sse?= =?UTF-8?q?=20=EC=8B=A4=EC=8B=9C=EA=B0=84=20=EC=95=8C=EB=9E=8C,=20?= =?UTF-8?q?=EA=B2=8C=EC=8A=A4=ED=8A=B8=20sse=20=EC=8B=A4=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=20=EC=95=8C=EB=9E=8C=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/GameAlarmResponse.java | 5 ++ .../back/alaram/service/GameAlarmService.java | 82 ++++++++++++++++--- 2 files changed, 76 insertions(+), 11 deletions(-) diff --git a/src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java index 8f9c9a59..f3fd959f 100644 --- a/src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java @@ -4,6 +4,7 @@ import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.AlarmType; import kr.pickple.back.alaram.domain.GameAlarm; +import kr.pickple.back.game.domain.Game; import lombok.Builder; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -19,6 +20,7 @@ public class GameAlarmResponse { private final Long id; + private final Long gameId; private final String mainAddress; private final LocalDateTime createdAt; private final LocalDate playDate; @@ -28,8 +30,11 @@ public class GameAlarmResponse { private final AlarmType alarmType; public static GameAlarmResponse of(final GameAlarm gameAlarm) { + final Game game = gameAlarm.getGame(); + return GameAlarmResponse.builder() .id(gameAlarm.getId()) + .gameId(game.getId()) .mainAddress(gameAlarm.getGame().getMainAddress()) .createdAt(gameAlarm.getCreatedAt()) .playDate(gameAlarm.getGame().getPlayDate()) diff --git a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java index 7e69ccd9..2adb4a1b 100644 --- a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java @@ -2,12 +2,14 @@ import kr.pickple.back.alaram.domain.AlarmStatus; import kr.pickple.back.alaram.domain.GameAlarm; -import kr.pickple.back.alaram.dto.response.GameAlaramResponse; +import kr.pickple.back.alaram.dto.response.GameAlarmResponse; import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; import kr.pickple.back.alaram.exception.AlarmException; import kr.pickple.back.alaram.repository.GameAlarmRepository; +import kr.pickple.back.alaram.util.SseEmitters; +import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameRepository; @@ -15,16 +17,23 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.List; import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; import static kr.pickple.back.alaram.domain.AlarmType.*; import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_NOT_FOUND; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_IS_NOT_HOST; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; //SSE 연결 로직에서는 @Transcational금지 +@Slf4j @Service @RequiredArgsConstructor public class GameAlarmService { @@ -32,8 +41,10 @@ public class GameAlarmService { private final MemberRepository memberRepository; private final GameRepository gameRepository; private final GameAlarmRepository gameAlarmRepository; + private final AlarmService alarmService; + private final SseEmitters sseEmitters; - public GameAlarm createGameJoinAlaram(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { + public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { //1.게임 리포지토리에서 해당 게임의 호스트인지 확인 validateIsHost(gameJoinRequestNotificationEvent); @@ -51,10 +62,14 @@ public GameAlarm createGameJoinAlaram(final GameJoinRequestNotificationEvent gam //4. DB에다가 알림 저장 gameAlarmRepository.save(gameAlarm); - return GameAlaramResponse.of(gameAlarm).getGameAlarm(); + + final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); + alarmService.notify(host.getId(), response); + + return response; } - public GameAlarm createGuestApproveAlaram(final GameMemberJoinedEvent gameMemberJoinedEvent) { + public GameAlarmResponse createGuestApproveAlarm(final GameMemberJoinedEvent gameMemberJoinedEvent) { //1.이벤트로부터 게임 정보, 회원 정보 가져오기 final Long gameId = gameMemberJoinedEvent.getGameId(); @@ -72,10 +87,13 @@ public GameAlarm createGuestApproveAlaram(final GameMemberJoinedEvent gameMember //3.알람을 DB에다가 저장 gameAlarmRepository.save(gameAlarm); - return GameAlaramResponse.of(gameAlarm).getGameAlarm(); + final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); + alarmService.notify(member.getId(), response); + + return response; } - public GameAlarm createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejectedEvent) { + public GameAlarmResponse createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejectedEvent) { //1.이벤트로부터 게임 정보, 회원 정보 가져오기 final Long gameId = gameMemberRejectedEvent.getGameId(); @@ -93,7 +111,10 @@ public GameAlarm createGuestDeniedAlarm(final GameMemberRejectedEvent gameMember //3.알람 DB에다가 저장 gameAlarmRepository.save(gameAlarm); - return GameAlaramResponse.of(gameAlarm).getGameAlarm(); + final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); + alarmService.notify(member.getId(), response); + + return response; } @@ -119,11 +140,50 @@ private Member getMemberInfo(final Long memberId) { .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } - //3개의 부분에서 SSE알람으로 존재함 - 구분 - public void emitMessage(GameAlarm gameAlarm) { - //1. SSE로 알람 생성 - 각 케이스 별 알람 생성 + private Member getHostOfGame(final Long gameId) { + final Game game = getGameInfo(gameId); + return game.getHost(); + } + + private List getGameMembers(final Long gameId, final RegistrationStatus status) { + final Game game = getGameInfo(gameId); + return game.getMembersByStatus(status); + } - //2. SSE로 발생된 알람 저장 + //SSE 알람을 발송하는 부분 + public void emitMessage(final GameAlarmResponse gameAlarm) { + final Long gameId = gameAlarm.getGameId(); + final Member gameHost = getHostOfGame(gameId); + final List gameApplyMembers = getGameMembers(gameId, WAITING); + + //1. SSE로 알람 생성 - 각 케이스 별 알람 생성(호스트와 게스트에게 메시지 전송) + sendAlarmToGameHost(gameHost, gameAlarm); + sendAlarmToGameApplyMembers(gameApplyMembers, gameAlarm); + } + + private void sendAlarmToMember(final Member member, final GameAlarmResponse gameAlarm) { + final SseEmitter gameHostEmitter = sseEmitters.get(member.getId()); + if (gameHostEmitter != null) { + try { + gameHostEmitter.send(gameAlarm); + } catch (IOException e) { + sseEmitters.remove(member.getId()); + log.info("해당 회원에게 알람 전송 중 오류가 발생되었습니다. : " + member.getId(), e); + } + } + } + + //게임 호스트에게 가입 신청이 올 시 받는 알람 + private void sendAlarmToGameHost(final Member gameHost, final GameAlarmResponse gameAlarm) { + sendAlarmToMember(gameHost, gameAlarm); + } + + //회원(게스트 - 대기)에게 호스트가 승락 시, 상태가 Confirmed로 변하며 승락되었다는 알람 + //회원(게스트 - 대기)에게 호스트가 거절 시, 게임 참여자(Game Memmber) 테이블에서 삭제되며, 거절되었다는 알람 + private void sendAlarmToGameApplyMembers(List members, GameAlarmResponse gameAlarm) { + for (final Member member : members) { + sendAlarmToMember(member, gameAlarm); + } } //게임 알림 찾기 모두 - 미정 From b994014dd7d9fcabf333e15e1eba9a1fcc8ff133 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 17:14:19 +0900 Subject: [PATCH 37/78] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EB=AA=85=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{alaram => alarm}/config/AsynConfig.java | 2 +- .../controller/AlarmController.java | 6 ++-- .../back/{alaram => alarm}/domain/Alarm.java | 10 +++--- .../domain/AlarmExistsStatus.java | 4 +-- .../{alaram => alarm}/domain/AlarmStatus.java | 4 +-- .../{alaram => alarm}/domain/AlarmType.java | 4 +-- .../{alaram => alarm}/domain/CrewAlarm.java | 8 ++--- .../{alaram => alarm}/domain/GameAlarm.java | 8 ++--- .../dto/response/CrewAlarmResponse.java | 8 ++--- .../dto/response/GameAlarmResponse.java | 8 ++--- .../CrewJoinRequestNotificationEvent.java | 2 +- .../event/crew/CrewMemberJoinedEvent.java | 2 +- .../event/crew/CrewMemberRejectedEvent.java | 2 +- .../GameJoinRequestNotificationEvent.java | 2 +- .../event/game/GameMemberJoinedEvent.java | 2 +- .../event/game/GameMemberRejectedEvent.java | 2 +- .../exception/AlarmException.java | 2 +- .../exception/AlarmExceptionCode.java | 2 +- .../handler/CrewAlarmEventHandler.java | 14 ++++---- .../handler/GameAlarmEventHandler.java | 12 +++---- .../repository/AlarmRepository.java | 4 +-- .../repository/CrewAlarmRepository.java | 6 ++-- .../repository/GameAlarmRepository.java | 6 ++-- .../service/AlarmService.java | 26 +++++++------- .../service/CrewAlarmService.java | 36 +++++++++---------- .../service/GameAlarmService.java | 36 +++++++++---------- .../util/AlarmExistsStatusConverter.java | 4 +-- .../util/AlarmStatusConverter.java | 4 +-- .../util/AlarmTypeConverter.java | 4 +-- .../{alaram => alarm}/util/SseEmitters.java | 2 +- .../back/crew/service/CrewMemberService.java | 6 ++-- .../back/game/service/GameService.java | 6 ++-- 32 files changed, 122 insertions(+), 122 deletions(-) rename src/main/java/kr/pickple/back/{alaram => alarm}/config/AsynConfig.java (97%) rename src/main/java/kr/pickple/back/{alaram => alarm}/controller/AlarmController.java (94%) rename src/main/java/kr/pickple/back/{alaram => alarm}/domain/Alarm.java (80%) rename src/main/java/kr/pickple/back/{alaram => alarm}/domain/AlarmExistsStatus.java (90%) rename src/main/java/kr/pickple/back/{alaram => alarm}/domain/AlarmStatus.java (89%) rename src/main/java/kr/pickple/back/{alaram => alarm}/domain/AlarmType.java (91%) rename src/main/java/kr/pickple/back/{alaram => alarm}/domain/CrewAlarm.java (87%) rename src/main/java/kr/pickple/back/{alaram => alarm}/domain/GameAlarm.java (87%) rename src/main/java/kr/pickple/back/{alaram => alarm}/dto/response/CrewAlarmResponse.java (84%) rename src/main/java/kr/pickple/back/{alaram => alarm}/dto/response/GameAlarmResponse.java (88%) rename src/main/java/kr/pickple/back/{alaram => alarm}/event/crew/CrewJoinRequestNotificationEvent.java (82%) rename src/main/java/kr/pickple/back/{alaram => alarm}/event/crew/CrewMemberJoinedEvent.java (87%) rename src/main/java/kr/pickple/back/{alaram => alarm}/event/crew/CrewMemberRejectedEvent.java (87%) rename src/main/java/kr/pickple/back/{alaram => alarm}/event/game/GameJoinRequestNotificationEvent.java (82%) rename src/main/java/kr/pickple/back/{alaram => alarm}/event/game/GameMemberJoinedEvent.java (87%) rename src/main/java/kr/pickple/back/{alaram => alarm}/event/game/GameMemberRejectedEvent.java (87%) rename src/main/java/kr/pickple/back/{alaram => alarm}/exception/AlarmException.java (88%) rename src/main/java/kr/pickple/back/{alaram => alarm}/exception/AlarmExceptionCode.java (94%) rename src/main/java/kr/pickple/back/{alaram => alarm}/handler/CrewAlarmEventHandler.java (75%) rename src/main/java/kr/pickple/back/{alaram => alarm}/handler/GameAlarmEventHandler.java (79%) rename src/main/java/kr/pickple/back/{alaram => alarm}/repository/AlarmRepository.java (60%) rename src/main/java/kr/pickple/back/{alaram => alarm}/repository/CrewAlarmRepository.java (62%) rename src/main/java/kr/pickple/back/{alaram => alarm}/repository/GameAlarmRepository.java (62%) rename src/main/java/kr/pickple/back/{alaram => alarm}/service/AlarmService.java (87%) rename src/main/java/kr/pickple/back/{alaram => alarm}/service/CrewAlarmService.java (88%) rename src/main/java/kr/pickple/back/{alaram => alarm}/service/GameAlarmService.java (90%) rename src/main/java/kr/pickple/back/{alaram => alarm}/util/AlarmExistsStatusConverter.java (83%) rename src/main/java/kr/pickple/back/{alaram => alarm}/util/AlarmStatusConverter.java (83%) rename src/main/java/kr/pickple/back/{alaram => alarm}/util/AlarmTypeConverter.java (83%) rename src/main/java/kr/pickple/back/{alaram => alarm}/util/SseEmitters.java (96%) diff --git a/src/main/java/kr/pickple/back/alaram/config/AsynConfig.java b/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java similarity index 97% rename from src/main/java/kr/pickple/back/alaram/config/AsynConfig.java rename to src/main/java/kr/pickple/back/alarm/config/AsynConfig.java index bd527cab..4b2c2e76 100644 --- a/src/main/java/kr/pickple/back/alaram/config/AsynConfig.java +++ b/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.config; +package kr.pickple.back.alarm.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java similarity index 94% rename from src/main/java/kr/pickple/back/alaram/controller/AlarmController.java rename to src/main/java/kr/pickple/back/alarm/controller/AlarmController.java index de133ac1..9702a247 100644 --- a/src/main/java/kr/pickple/back/alaram/controller/AlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java @@ -1,8 +1,8 @@ -package kr.pickple.back.alaram.controller; +package kr.pickple.back.alarm.controller; import jakarta.validation.Valid; -import kr.pickple.back.alaram.domain.AlarmExistsStatus; -import kr.pickple.back.alaram.service.AlarmService; +import kr.pickple.back.alarm.domain.AlarmExistsStatus; +import kr.pickple.back.alarm.service.AlarmService; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; diff --git a/src/main/java/kr/pickple/back/alaram/domain/Alarm.java b/src/main/java/kr/pickple/back/alarm/domain/Alarm.java similarity index 80% rename from src/main/java/kr/pickple/back/alaram/domain/Alarm.java rename to src/main/java/kr/pickple/back/alarm/domain/Alarm.java index 19705583..e02da182 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/Alarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/Alarm.java @@ -1,15 +1,15 @@ -package kr.pickple.back.alaram.domain; +package kr.pickple.back.alarm.domain; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.util.AlarmExistsStatusConverter; +import kr.pickple.back.alarm.util.AlarmExistsStatusConverter; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import static kr.pickple.back.alaram.domain.AlarmExistsStatus.NOT_EXISTS; +import static kr.pickple.back.alarm.domain.AlarmExistsStatus.NOT_EXISTS; @Entity @@ -31,11 +31,11 @@ public class Alarm { private Member member; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "crew_alaram_id") + @JoinColumn(name = "crew_alarm_id") private CrewAlarm crewAlarm; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "game_alaram_id") + @JoinColumn(name = "game_alarm_id") private GameAlarm gameAlarm; @Builder diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java b/src/main/java/kr/pickple/back/alarm/domain/AlarmExistsStatus.java similarity index 90% rename from src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java rename to src/main/java/kr/pickple/back/alarm/domain/AlarmExistsStatus.java index 1d85a1ad..0d3114c9 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlarmExistsStatus.java +++ b/src/main/java/kr/pickple/back/alarm/domain/AlarmExistsStatus.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.domain; +package kr.pickple.back.alarm.domain; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; @@ -12,7 +12,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_EXISTS_STATUS_NOT_FOUND; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_EXISTS_STATUS_NOT_FOUND; @Getter @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlarmStatus.java b/src/main/java/kr/pickple/back/alarm/domain/AlarmStatus.java similarity index 89% rename from src/main/java/kr/pickple/back/alaram/domain/AlarmStatus.java rename to src/main/java/kr/pickple/back/alarm/domain/AlarmStatus.java index cfd9b13d..b04eb4af 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlarmStatus.java +++ b/src/main/java/kr/pickple/back/alarm/domain/AlarmStatus.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.domain; +package kr.pickple.back.alarm.domain; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; @@ -12,7 +12,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_STATUS_NOT_FOUND; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_STATUS_NOT_FOUND; @Getter @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alaram/domain/AlarmType.java b/src/main/java/kr/pickple/back/alarm/domain/AlarmType.java similarity index 91% rename from src/main/java/kr/pickple/back/alaram/domain/AlarmType.java rename to src/main/java/kr/pickple/back/alarm/domain/AlarmType.java index c6f46504..73978dd3 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/AlarmType.java +++ b/src/main/java/kr/pickple/back/alarm/domain/AlarmType.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.domain; +package kr.pickple.back.alarm.domain; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; @@ -12,7 +12,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_TYPE_NOT_FOUND; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_TYPE_NOT_FOUND; @Getter @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java similarity index 87% rename from src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java rename to src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java index be30aa63..1b20e5a6 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/CrewAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java @@ -1,9 +1,9 @@ -package kr.pickple.back.alaram.domain; +package kr.pickple.back.alarm.domain; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.util.AlarmStatusConverter; -import kr.pickple.back.alaram.util.AlarmTypeConverter; +import kr.pickple.back.alarm.util.AlarmStatusConverter; +import kr.pickple.back.alarm.util.AlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.member.domain.Member; @@ -15,7 +15,7 @@ import java.time.LocalDateTime; -import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; +import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; @Getter @Entity diff --git a/src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java similarity index 87% rename from src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java rename to src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java index d6ddf8c6..36fa9ebb 100644 --- a/src/main/java/kr/pickple/back/alaram/domain/GameAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java @@ -1,9 +1,9 @@ -package kr.pickple.back.alaram.domain; +package kr.pickple.back.alarm.domain; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alaram.util.AlarmStatusConverter; -import kr.pickple.back.alaram.util.AlarmTypeConverter; +import kr.pickple.back.alarm.util.AlarmStatusConverter; +import kr.pickple.back.alarm.util.AlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; @@ -15,7 +15,7 @@ import java.time.LocalDateTime; -import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; +import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; @Entity @Getter diff --git a/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java similarity index 84% rename from src/main/java/kr/pickple/back/alaram/dto/response/CrewAlarmResponse.java rename to src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index 8174e49a..dfded485 100644 --- a/src/main/java/kr/pickple/back/alaram/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -1,9 +1,9 @@ -package kr.pickple.back.alaram.dto.response; +package kr.pickple.back.alarm.dto.response; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import kr.pickple.back.alaram.domain.AlarmStatus; -import kr.pickple.back.alaram.domain.AlarmType; -import kr.pickple.back.alaram.domain.CrewAlarm; +import kr.pickple.back.alarm.domain.AlarmStatus; +import kr.pickple.back.alarm.domain.AlarmType; +import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.crew.domain.Crew; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java similarity index 88% rename from src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java rename to src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index f3fd959f..0aff5fc7 100644 --- a/src/main/java/kr/pickple/back/alaram/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -1,9 +1,9 @@ -package kr.pickple.back.alaram.dto.response; +package kr.pickple.back.alarm.dto.response; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import kr.pickple.back.alaram.domain.AlarmStatus; -import kr.pickple.back.alaram.domain.AlarmType; -import kr.pickple.back.alaram.domain.GameAlarm; +import kr.pickple.back.alarm.domain.AlarmStatus; +import kr.pickple.back.alarm.domain.AlarmType; +import kr.pickple.back.alarm.domain.GameAlarm; import kr.pickple.back.game.domain.Game; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/kr/pickple/back/alaram/event/crew/CrewJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java similarity index 82% rename from src/main/java/kr/pickple/back/alaram/event/crew/CrewJoinRequestNotificationEvent.java rename to src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java index ea6a4549..2ab4f9b8 100644 --- a/src/main/java/kr/pickple/back/alaram/event/crew/CrewJoinRequestNotificationEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.event.crew; +package kr.pickple.back.alarm.event.crew; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java similarity index 87% rename from src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberJoinedEvent.java rename to src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java index a7bee434..f716467e 100644 --- a/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberJoinedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.event.crew; +package kr.pickple.back.alarm.event.crew; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java similarity index 87% rename from src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberRejectedEvent.java rename to src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java index 908a2a72..5a4e86ca 100644 --- a/src/main/java/kr/pickple/back/alaram/event/crew/CrewMemberRejectedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.event.crew; +package kr.pickple.back.alarm.event.crew; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/pickple/back/alaram/event/game/GameJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java similarity index 82% rename from src/main/java/kr/pickple/back/alaram/event/game/GameJoinRequestNotificationEvent.java rename to src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java index 4407ba1d..4828bc2f 100644 --- a/src/main/java/kr/pickple/back/alaram/event/game/GameJoinRequestNotificationEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.event.game; +package kr.pickple.back.alarm.event.game; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/pickple/back/alaram/event/game/GameMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java similarity index 87% rename from src/main/java/kr/pickple/back/alaram/event/game/GameMemberJoinedEvent.java rename to src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java index 6f97cb81..fd36ca74 100644 --- a/src/main/java/kr/pickple/back/alaram/event/game/GameMemberJoinedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.event.game; +package kr.pickple.back.alarm.event.game; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/pickple/back/alaram/event/game/GameMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java similarity index 87% rename from src/main/java/kr/pickple/back/alaram/event/game/GameMemberRejectedEvent.java rename to src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java index b8a48057..6ca79b31 100644 --- a/src/main/java/kr/pickple/back/alaram/event/game/GameMemberRejectedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.event.game; +package kr.pickple.back.alarm.event.game; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/pickple/back/alaram/exception/AlarmException.java b/src/main/java/kr/pickple/back/alarm/exception/AlarmException.java similarity index 88% rename from src/main/java/kr/pickple/back/alaram/exception/AlarmException.java rename to src/main/java/kr/pickple/back/alarm/exception/AlarmException.java index 4900ac72..bfa31b70 100644 --- a/src/main/java/kr/pickple/back/alaram/exception/AlarmException.java +++ b/src/main/java/kr/pickple/back/alarm/exception/AlarmException.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.exception; +package kr.pickple.back.alarm.exception; import kr.pickple.back.common.exception.BusinessException; import kr.pickple.back.common.exception.ExceptionCode; diff --git a/src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java b/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java similarity index 94% rename from src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java rename to src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java index ae177b8e..15dc79f9 100644 --- a/src/main/java/kr/pickple/back/alaram/exception/AlarmExceptionCode.java +++ b/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.exception; +package kr.pickple.back.alarm.exception; import kr.pickple.back.common.exception.ExceptionCode; import lombok.Getter; diff --git a/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java similarity index 75% rename from src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java rename to src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java index 82e35bbe..9f454caa 100644 --- a/src/main/java/kr/pickple/back/alaram/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java @@ -1,10 +1,10 @@ -package kr.pickple.back.alaram.handler; +package kr.pickple.back.alarm.handler; -import kr.pickple.back.alaram.dto.response.CrewAlarmResponse; -import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; -import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; -import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; -import kr.pickple.back.alaram.service.CrewAlarmService; +import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; +import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alarm.service.CrewAlarmService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; @@ -19,7 +19,7 @@ public class CrewAlarmEventHandler { @Async @EventListener public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewJoinAlaram(crewJoinRequestNotificationEvent); // 알람 생성 + final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewJoinAlarm(crewJoinRequestNotificationEvent); // 알람 생성 crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 } diff --git a/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java similarity index 79% rename from src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java rename to src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java index ba0c5a96..6289a1e4 100644 --- a/src/main/java/kr/pickple/back/alaram/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java @@ -1,10 +1,10 @@ -package kr.pickple.back.alaram.handler; +package kr.pickple.back.alarm.handler; -import kr.pickple.back.alaram.dto.response.GameAlarmResponse; -import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; -import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; -import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; -import kr.pickple.back.alaram.service.GameAlarmService; +import kr.pickple.back.alarm.dto.response.GameAlarmResponse; +import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alarm.service.GameAlarmService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; diff --git a/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java similarity index 60% rename from src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java rename to src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java index a3fc1f10..6633998e 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/AlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java @@ -1,6 +1,6 @@ -package kr.pickple.back.alaram.repository; +package kr.pickple.back.alarm.repository; -import kr.pickple.back.alaram.domain.Alarm; +import kr.pickple.back.alarm.domain.Alarm; import org.springframework.data.jpa.repository.JpaRepository; public interface AlarmRepository extends JpaRepository { diff --git a/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java similarity index 62% rename from src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java rename to src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java index 67ffd192..434a38cb 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/CrewAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java @@ -1,7 +1,7 @@ -package kr.pickple.back.alaram.repository; +package kr.pickple.back.alarm.repository; -import kr.pickple.back.alaram.domain.AlarmStatus; -import kr.pickple.back.alaram.domain.CrewAlarm; +import kr.pickple.back.alarm.domain.AlarmStatus; +import kr.pickple.back.alarm.domain.CrewAlarm; import org.springframework.data.jpa.repository.JpaRepository; public interface CrewAlarmRepository extends JpaRepository { diff --git a/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java similarity index 62% rename from src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java rename to src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java index 51ee0cde..a2af6c99 100644 --- a/src/main/java/kr/pickple/back/alaram/repository/GameAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java @@ -1,7 +1,7 @@ -package kr.pickple.back.alaram.repository; +package kr.pickple.back.alarm.repository; -import kr.pickple.back.alaram.domain.AlarmStatus; -import kr.pickple.back.alaram.domain.GameAlarm; +import kr.pickple.back.alarm.domain.AlarmStatus; +import kr.pickple.back.alarm.domain.GameAlarm; import org.springframework.data.jpa.repository.JpaRepository; public interface GameAlarmRepository extends JpaRepository { diff --git a/src/main/java/kr/pickple/back/alaram/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java similarity index 87% rename from src/main/java/kr/pickple/back/alaram/service/AlarmService.java rename to src/main/java/kr/pickple/back/alarm/service/AlarmService.java index 88f6bf9f..4139f963 100644 --- a/src/main/java/kr/pickple/back/alaram/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -1,11 +1,11 @@ -package kr.pickple.back.alaram.service; - -import kr.pickple.back.alaram.domain.AlarmExistsStatus; -import kr.pickple.back.alaram.domain.CrewAlarm; -import kr.pickple.back.alaram.domain.GameAlarm; -import kr.pickple.back.alaram.exception.AlarmException; -import kr.pickple.back.alaram.exception.AlarmExceptionCode; -import kr.pickple.back.alaram.util.SseEmitters; +package kr.pickple.back.alarm.service; + +import kr.pickple.back.alarm.domain.AlarmExistsStatus; +import kr.pickple.back.alarm.domain.CrewAlarm; +import kr.pickple.back.alarm.domain.GameAlarm; +import kr.pickple.back.alarm.exception.AlarmException; +import kr.pickple.back.alarm.exception.AlarmExceptionCode; +import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; @@ -15,8 +15,8 @@ import java.io.IOException; -import static kr.pickple.back.alaram.domain.AlarmExistsStatus.EXISTS; -import static kr.pickple.back.alaram.domain.AlarmExistsStatus.NOT_EXISTS; +import static kr.pickple.back.alarm.domain.AlarmExistsStatus.EXISTS; +import static kr.pickple.back.alarm.domain.AlarmExistsStatus.NOT_EXISTS; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; //SSE 연결 로직에서는 @Transcational금지 @@ -36,7 +36,7 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { try { emitter.send(SseEmitter.event() - .name("AlaramSseConnect") // 해당 이벤트의 이름 지정 + .name("AlarmSseConnect") // 해당 이벤트의 이름 지정 .data("사용자에 대한 알람 SSE 연결이 정상적으로 처리되었습니다.")); // 503 에러 방지를 위한 더미 데이터 } catch (IOException e) { sseEmitters.remove(loggedInMemberId); @@ -90,7 +90,7 @@ public void updateAlarmById(final Long loggedInMemberId, final Long alarmId, fin //2.해당 알람이 어떤 알람인지 판별 final GameAlarm gameAlarm = gameAlarmService.findGameAlarmById(alarmId); - final CrewAlarm crewAlarm = crewAlarmService.findCrewAlramById(alarmId); + final CrewAlarm crewAlarm = crewAlarmService.findCrewAlarmById(alarmId); //3.해당 알람이 어떤 알람인지 확인하고, 상태 수정 if (gameAlarm != null) { @@ -98,7 +98,7 @@ public void updateAlarmById(final Long loggedInMemberId, final Long alarmId, fin } if (crewAlarm != null) { - crewAlarmService.updateCrewAlaramStatus(alarmId, isRead); + crewAlarmService.updateCrewAlarmStatus(alarmId, isRead); } //아니면 throw new AlarmException(AlarmExceptionCode.ALARM_NOT_FOUND, alarmId); diff --git a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java similarity index 88% rename from src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java rename to src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 5bdcf7b6..96a2d598 100644 --- a/src/main/java/kr/pickple/back/alaram/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -1,14 +1,14 @@ -package kr.pickple.back.alaram.service; - -import kr.pickple.back.alaram.domain.AlarmStatus; -import kr.pickple.back.alaram.domain.CrewAlarm; -import kr.pickple.back.alaram.dto.response.CrewAlarmResponse; -import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; -import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; -import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; -import kr.pickple.back.alaram.exception.AlarmException; -import kr.pickple.back.alaram.repository.CrewAlarmRepository; -import kr.pickple.back.alaram.util.SseEmitters; +package kr.pickple.back.alarm.service; + +import kr.pickple.back.alarm.domain.AlarmStatus; +import kr.pickple.back.alarm.domain.CrewAlarm; +import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; +import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alarm.exception.AlarmException; +import kr.pickple.back.alarm.repository.CrewAlarmRepository; +import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; @@ -24,9 +24,9 @@ import java.io.IOException; import java.util.List; -import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; -import static kr.pickple.back.alaram.domain.AlarmType.*; -import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_NOT_FOUND; +import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; +import static kr.pickple.back.alarm.domain.AlarmType.*; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_NOT_FOUND; import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; @@ -45,7 +45,7 @@ public class CrewAlarmService { private final SseEmitters sseEmitters; //크루 알림 생성 - public CrewAlarmResponse createCrewJoinAlaram(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + public CrewAlarmResponse createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { //1.크루 리포지토리에서 해당 크루의 리더인지 확인 validateIsLeader(crewJoinRequestNotificationEvent); @@ -190,7 +190,7 @@ private void sendAlarmToCrewApplyMembers(final List members, final CrewA } //크루 알람 모두 찾기 - 미정 - public void findCrewAlaramAll() { + public void findCrewAlarmAll() { } @@ -204,7 +204,7 @@ public boolean checkUnreadCrewAlarm(final Long memberId) { } //크루 알림 찾기 By ID - public CrewAlarm findCrewAlramById(final Long crewAlarmId) { + public CrewAlarm findCrewAlarmById(final Long crewAlarmId) { //1. 알람 ID로 해당 알림 찾기 final CrewAlarm crewAlarm = checkExistCrewAlarm(crewAlarmId); @@ -213,7 +213,7 @@ public CrewAlarm findCrewAlramById(final Long crewAlarmId) { } //크루 알람 상태 변경 - public void updateCrewAlaramStatus(final Long crewAlarmId, final String isRead) { + public void updateCrewAlarmStatus(final Long crewAlarmId, final String isRead) { //1.알람 ID로 해당 알림 찾기 final CrewAlarm crewAlarm = checkExistCrewAlarm(crewAlarmId); final AlarmStatus alarmStatus = AlarmStatus.from(isRead); diff --git a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java similarity index 90% rename from src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java rename to src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 2adb4a1b..3c767236 100644 --- a/src/main/java/kr/pickple/back/alaram/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -1,14 +1,14 @@ -package kr.pickple.back.alaram.service; - -import kr.pickple.back.alaram.domain.AlarmStatus; -import kr.pickple.back.alaram.domain.GameAlarm; -import kr.pickple.back.alaram.dto.response.GameAlarmResponse; -import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; -import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; -import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; -import kr.pickple.back.alaram.exception.AlarmException; -import kr.pickple.back.alaram.repository.GameAlarmRepository; -import kr.pickple.back.alaram.util.SseEmitters; +package kr.pickple.back.alarm.service; + +import kr.pickple.back.alarm.domain.AlarmStatus; +import kr.pickple.back.alarm.domain.GameAlarm; +import kr.pickple.back.alarm.dto.response.GameAlarmResponse; +import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alarm.exception.AlarmException; +import kr.pickple.back.alarm.repository.GameAlarmRepository; +import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.exception.GameException; @@ -24,9 +24,9 @@ import java.io.IOException; import java.util.List; -import static kr.pickple.back.alaram.domain.AlarmStatus.FALSE; -import static kr.pickple.back.alaram.domain.AlarmType.*; -import static kr.pickple.back.alaram.exception.AlarmExceptionCode.ALARM_NOT_FOUND; +import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; +import static kr.pickple.back.alarm.domain.AlarmType.*; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_NOT_FOUND; import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_IS_NOT_HOST; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_NOT_FOUND; @@ -186,10 +186,10 @@ private void sendAlarmToGameApplyMembers(List members, GameAlarmResponse } } - //게임 알림 찾기 모두 - 미정 - public void findGameAlarmAll() { - - } +// //게임 알림 찾기 모두 - 미정 +// public void findGameAlarmAll() { +// +// } //게임 알람에서 isRead가 False가 있는지 체크하는 메소드 public boolean checkUnreadGameAlarm(final Long memberId) { diff --git a/src/main/java/kr/pickple/back/alaram/util/AlarmExistsStatusConverter.java b/src/main/java/kr/pickple/back/alarm/util/AlarmExistsStatusConverter.java similarity index 83% rename from src/main/java/kr/pickple/back/alaram/util/AlarmExistsStatusConverter.java rename to src/main/java/kr/pickple/back/alarm/util/AlarmExistsStatusConverter.java index be1078d6..e0343edf 100644 --- a/src/main/java/kr/pickple/back/alaram/util/AlarmExistsStatusConverter.java +++ b/src/main/java/kr/pickple/back/alarm/util/AlarmExistsStatusConverter.java @@ -1,8 +1,8 @@ -package kr.pickple.back.alaram.util; +package kr.pickple.back.alarm.util; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Convert; -import kr.pickple.back.alaram.domain.AlarmExistsStatus; +import kr.pickple.back.alarm.domain.AlarmExistsStatus; @Convert public class AlarmExistsStatusConverter implements AttributeConverter { diff --git a/src/main/java/kr/pickple/back/alaram/util/AlarmStatusConverter.java b/src/main/java/kr/pickple/back/alarm/util/AlarmStatusConverter.java similarity index 83% rename from src/main/java/kr/pickple/back/alaram/util/AlarmStatusConverter.java rename to src/main/java/kr/pickple/back/alarm/util/AlarmStatusConverter.java index 78f6418e..1ac07f06 100644 --- a/src/main/java/kr/pickple/back/alaram/util/AlarmStatusConverter.java +++ b/src/main/java/kr/pickple/back/alarm/util/AlarmStatusConverter.java @@ -1,8 +1,8 @@ -package kr.pickple.back.alaram.util; +package kr.pickple.back.alarm.util; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Convert; -import kr.pickple.back.alaram.domain.AlarmStatus; +import kr.pickple.back.alarm.domain.AlarmStatus; @Convert public class AlarmStatusConverter implements AttributeConverter { diff --git a/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java b/src/main/java/kr/pickple/back/alarm/util/AlarmTypeConverter.java similarity index 83% rename from src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java rename to src/main/java/kr/pickple/back/alarm/util/AlarmTypeConverter.java index 1e78628e..77a73ed6 100644 --- a/src/main/java/kr/pickple/back/alaram/util/AlarmTypeConverter.java +++ b/src/main/java/kr/pickple/back/alarm/util/AlarmTypeConverter.java @@ -1,8 +1,8 @@ -package kr.pickple.back.alaram.util; +package kr.pickple.back.alarm.util; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Convert; -import kr.pickple.back.alaram.domain.AlarmType; +import kr.pickple.back.alarm.domain.AlarmType; @Convert public class AlarmTypeConverter implements AttributeConverter { diff --git a/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java similarity index 96% rename from src/main/java/kr/pickple/back/alaram/util/SseEmitters.java rename to src/main/java/kr/pickple/back/alarm/util/SseEmitters.java index 7c8362e7..0a8e1b99 100644 --- a/src/main/java/kr/pickple/back/alaram/util/SseEmitters.java +++ b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java @@ -1,4 +1,4 @@ -package kr.pickple.back.alaram.util; +package kr.pickple.back.alarm.util; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 060524c6..b1fe37d8 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,8 +1,8 @@ package kr.pickple.back.crew.service; -import kr.pickple.back.alaram.event.crew.CrewJoinRequestNotificationEvent; -import kr.pickple.back.alaram.event.crew.CrewMemberJoinedEvent; -import kr.pickple.back.alaram.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index eff71f67..f1778862 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -3,9 +3,9 @@ import kr.pickple.back.address.dto.response.MainAddressResponse; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; -import kr.pickple.back.alaram.event.game.GameJoinRequestNotificationEvent; -import kr.pickple.back.alaram.event.game.GameMemberJoinedEvent; -import kr.pickple.back.alaram.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.chat.service.ChatRoomService; From 16efc0b4bc6b55e930b5692ea3e72f556ca1c0b3 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 15:21:19 +0900 Subject: [PATCH 38/78] =?UTF-8?q?style:=20=ED=8C=80=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kr/pickple/back/alarm/util/SseEmitters.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java index 0a8e1b99..e3f62ecb 100644 --- a/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java +++ b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java @@ -8,8 +8,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -@Component @Slf4j +@Component @RequiredArgsConstructor public class SseEmitters { From c085b41e9e9ad6746d4ad8bd50985579f4d55478 Mon Sep 17 00:00:00 2001 From: jay-so Date: Tue, 21 Nov 2023 15:41:41 +0900 Subject: [PATCH 39/78] =?UTF-8?q?fix:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alarm/service/AlarmService.java | 22 +++++++++---------- .../back/alarm/service/CrewAlarmService.java | 11 ++++++---- .../back/alarm/service/GameAlarmService.java | 13 +++++++---- .../pickple/back/alarm/util/SseEmitters.java | 15 +++++++++++++ 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java index 4139f963..f1d6d227 100644 --- a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -50,17 +50,17 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { //SseEmitters에서 해당 사용자의 SseEmitter를 가져오고, 이를 통해 이벤트를 클라이언트에게 전송 //특정 이벤트가 발생했을 때 해당 이벤트를 클라이언트에게 실시간으로 전달하는데 사용됨 //새로운 알림이 도착했을 때 이를 클라이언트에게 실시간으로 알려주는 등의 기능을 구현하고자 할 때 notify 메서드를 사용 - public void notify(final Long loggedInMemberId, final Object event) { - final SseEmitter emitter = sseEmitters.get(loggedInMemberId); - if (emitter != null) { - try { - emitter.send(event); - } catch (IOException e) { - sseEmitters.remove(loggedInMemberId); - emitter.completeWithError(e); - } - } - } +// public void notify(final Long loggedInMemberId, final Object event) { +// final SseEmitter emitter = sseEmitters.get(loggedInMemberId); +// if (emitter != null) { +// try { +// emitter.send(event); +// } catch (IOException e) { +// sseEmitters.remove(loggedInMemberId); +// emitter.completeWithError(e); +// } +// } +// } //모든 알람 찾기 모두 - 각 알림에서 생성일 순으로 조회 diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 96a2d598..47209b2b 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -41,7 +41,7 @@ public class CrewAlarmService { private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final CrewAlarmRepository crewAlarmRepository; - private final AlarmService alarmService; + //private final AlarmService alarmService; private final SseEmitters sseEmitters; //크루 알림 생성 @@ -65,7 +65,8 @@ public CrewAlarmResponse createCrewJoinAlarm(final CrewJoinRequestNotificationEv crewAlarmRepository.save(crewAlarm); final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); - alarmService.notify(leader.getId(), response); + //alarmService.notify(leader.getId(), response); + sseEmitters.notify(leader.getId(), response); return response; } @@ -89,7 +90,8 @@ public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewMemberJoinedEven crewAlarmRepository.save(crewAlarm); final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); - alarmService.notify(member.getId(), response); + //alarmService.notify(member.getId(), response); + sseEmitters.notify(member.getId(), response); return response; } @@ -114,7 +116,8 @@ public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewMemberRejectedEve crewAlarmRepository.save(crewAlarm); final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); - alarmService.notify(member.getId(), response); + //alarmService.notify(member.getId(), response); + sseEmitters.notify(member.getId(), response); return response; } diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 3c767236..20ab746e 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -41,7 +41,7 @@ public class GameAlarmService { private final MemberRepository memberRepository; private final GameRepository gameRepository; private final GameAlarmRepository gameAlarmRepository; - private final AlarmService alarmService; + //private final AlarmService alarmService; private final SseEmitters sseEmitters; public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { @@ -64,7 +64,9 @@ public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEv gameAlarmRepository.save(gameAlarm); final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); - alarmService.notify(host.getId(), response); + //alarmService.notify(host.getId(), response); + sseEmitters.notify(host.getId(), response); + return response; } @@ -88,7 +90,9 @@ public GameAlarmResponse createGuestApproveAlarm(final GameMemberJoinedEvent gam gameAlarmRepository.save(gameAlarm); final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); - alarmService.notify(member.getId(), response); +// alarmService.notify(member.getId(), response); + sseEmitters.notify(member.getId(), response); + return response; } @@ -112,7 +116,8 @@ public GameAlarmResponse createGuestDeniedAlarm(final GameMemberRejectedEvent ga gameAlarmRepository.save(gameAlarm); final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); - alarmService.notify(member.getId(), response); +// alarmService.notify(member.getId(), response); + sseEmitters.notify(member.getId(), response); return response; } diff --git a/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java index e3f62ecb..93504b57 100644 --- a/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java +++ b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; +import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -13,6 +14,8 @@ @RequiredArgsConstructor public class SseEmitters { + //private final SseEmitters sseEmitters; + private final ConcurrentMap emitters = new ConcurrentHashMap<>(); public SseEmitter add(final Long id, final SseEmitter emitter) { @@ -41,4 +44,16 @@ public SseEmitter get(final Long id) { public void remove(final Long id) { this.emitters.remove(id); } + + public void notify(final Long loggedInMemberId, final Object event) { + final SseEmitter emitter = this.get(loggedInMemberId); + if (emitter != null) { + try { + emitter.send(event); + } catch (IOException e) { + this.remove(loggedInMemberId); + emitter.completeWithError(e); + } + } + } } From 3f4ce5510a3feaf74cc43f267d97a5d17f971d01 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sat, 25 Nov 2023 02:23:38 +0900 Subject: [PATCH 40/78] =?UTF-8?q?feat:=20=ED=86=B5=ED=95=A9=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=20=EC=BB=A4=EC=84=9C=20=EA=B8=B0=EB=B0=98=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=95=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/http/alram/alarm.http | 17 +++++ src/main/http/crew/crew.http | 10 +-- .../alarm/controller/AlarmController.java | 23 ++++--- .../alarm/dto/response/AlarmResponse.java | 10 +++ .../alarm/dto/response/CrewAlarmResponse.java | 12 +++- .../alarm/dto/response/GameAlarmResponse.java | 12 +++- .../alarm/repository/AlarmRepository.java | 1 + .../back/alarm/service/AlarmService.java | 63 ++++++++++++------- .../back/alarm/service/CrewAlarmService.java | 14 ++++- .../back/alarm/service/GameAlarmService.java | 22 +++++-- .../pickple/back/alarm/util/CursorResult.java | 18 ++++++ .../kr/pickple/back/crew/domain/Crew.java | 29 +++------ 12 files changed, 168 insertions(+), 63 deletions(-) create mode 100644 src/main/http/alram/alarm.http create mode 100644 src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java create mode 100644 src/main/java/kr/pickple/back/alarm/util/CursorResult.java diff --git a/src/main/http/alram/alarm.http b/src/main/http/alram/alarm.http new file mode 100644 index 00000000..638e76ae --- /dev/null +++ b/src/main/http/alram/alarm.http @@ -0,0 +1,17 @@ +### 사용자 알람 sse 연결 +GET http://localhost:8080/alarms/subscribe +Content-Type: text/event-stream +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0IiwiaWF0IjoxNzAwNTU2NDYxLCJleHAiOjE3MDA1NzgwNjF9.ci0mYcVzCTmfwdduNH3HE6KmO-7SX5IqZi4TSuupsAtFc4TIPZeai6_Ock8IVJWnw6VzRziu5Tn2QDkaJbxoYQ + + +### 사용자 읽지 않은 알림 확인 +GET http://localhost:8080/alarms/unread +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0IiwiaWF0IjoxNzAwNTU3ODQ0LCJleHAiOjE3MDA1Nzk0NDR9.c-5-IbDQLouwzW44jMJzREVl84REZ8_BDN-znqfNxLUfC2xaCpJRQ0VOw5N1p7nyRcXtNswBZ-ZSLVRWevRO0g + +### 사용자 알림 수정 +PATCH http://localhost:8080/alarms/ +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0IiwiaWF0IjoxNzAwNTU2NDYxLCJleHAiOjE3MDA1NzgwNjF9.ci0mYcVzCTmfwdduNH3HE6KmO-7SX5IqZi4TSuupsAtFc4TIPZeai6_Ock8IVJWnw6VzRziu5Tn2QDkaJbxoYQ + +### 사용자 모든 알람 삭제 +DELETE http://localhost:8080/alarms +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0IiwiaWF0IjoxNzAwNTU2NDYxLCJleHAiOjE3MDA1NzgwNjF9.ci0mYcVzCTmfwdduNH3HE6KmO-7SX5IqZi4TSuupsAtFc4TIPZeai6_Ock8IVJWnw6VzRziu5Tn2QDkaJbxoYQ diff --git a/src/main/http/crew/crew.http b/src/main/http/crew/crew.http index f309f3d5..f353eba3 100644 --- a/src/main/http/crew/crew.http +++ b/src/main/http/crew/crew.http @@ -1,11 +1,11 @@ ### 크루 생성 POST http://localhost:8080/crews -Authorization: Bearer {{token1}} +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyIiwiaWF0IjoxNzAwNTU5NTA3LCJleHAiOjE3MDA1ODExMDd9.ZqRftJH3Nqh4QR8ppoqaYkJscBm1FEcyvJOcBkOXAUgs1SOW_13XKNJ11fFJGOQUUAlAtnbFWib2BCXVv2eEfA Content-Type: application/json { - "name": "땅콩 크루", - "content": "안녕하세요, 땅콩 크루입니다. 백둥체육관 201호에서 진행합니다.", + "name": "쿠쿠 크루", + "content": "안녕하세요, 쿠쿠 크루입니다. 백둥체육관 201호에서 진행합니다.", "maxMemberCount": 15, "addressDepth1": "서울시", "addressDepth2": "강남구" @@ -15,8 +15,8 @@ Content-Type: application/json GET http://localhost:8080/crews/15 ### 크루가입 신청 -POST http://localhost:8080/crews/15/members -Authorization: Bearer {{token2}} +POST http://localhost:8080/crews/3/members +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI2IiwiaWF0IjoxNzAwNTU4NTQyLCJleHAiOjE3MDA1ODAxNDJ9.fOR4siFedVYqaa5JHA0tIxVS22G0ppAlD8lKMDqpBaQgdCK7iUtPd7zzDg-XgXFOWWl_YcWUZSo9kvtqPOAFLA Content-Type: application/json diff --git a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java index 9702a247..400300a3 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java @@ -2,7 +2,9 @@ import jakarta.validation.Valid; import kr.pickple.back.alarm.domain.AlarmExistsStatus; +import kr.pickple.back.alarm.dto.response.AlarmResponse; import kr.pickple.back.alarm.service.AlarmService; +import kr.pickple.back.alarm.util.CursorResult; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -43,16 +45,17 @@ public ResponseEntity findUnreadAlarm( } -// @GetMapping -// public ResponseEntity> findAllAlarams( -// @Login final Long loggedInMemberId, -// final Cursor cursor -// ){ -// //커시 기반 조회 서비스 구현 후, 채움 -// return ResponseEntity.status(OK) -// .body(AlarmService.findAllAlarms()); -// } - + //모든 알람 조회시 + //처음에 cursorId 없으면 0,한번에 불러오는 size = 10 + @GetMapping + public ResponseEntity> findAllAlarms( + @Login final Long loggedInMemberId, + @RequestParam(defaultValue = "0") Long cursorId, + @RequestParam(defaultValue = "10") Integer size + ) { + return ResponseEntity.status(OK) + .body(alarmService.findAllAlarms(loggedInMemberId, cursorId, size)); + } //알람 수정 @PatchMapping("/{alarmId}") diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java new file mode 100644 index 00000000..07d1dd16 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java @@ -0,0 +1,10 @@ +package kr.pickple.back.alarm.dto.response; + +import java.time.LocalDateTime; + +//CrewAlarmResponse나 GameAlarmResponse는 서로 다른 클래스임으로, 하나의 리스트에 넣기 위해 공통 인터페이스 생성 +public interface AlarmResponse { + LocalDateTime getCreatedAt(); + + Long getId(); +} diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index dfded485..92519dd4 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -15,7 +15,7 @@ @Builder @JsonSerialize @RequiredArgsConstructor -public class CrewAlarmResponse { +public class CrewAlarmResponse implements AlarmResponse { private final Long id; private final Long crewId; @@ -36,4 +36,14 @@ public static CrewAlarmResponse of(final CrewAlarm crewAlarm) { .alarmType(crewAlarm.getAlarmType()) .build(); } + + @Override + public LocalDateTime getCreatedAt() { + return this.createdAt; + } + + @Override + public Long getId() { + return this.id; + } } diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index 0aff5fc7..bab14a79 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -17,7 +17,7 @@ @Builder @JsonSerialize //text/event-stream'의 MIME 타입이기 때문에 JsonSerialize로 Json형식으로 직렬화해야 함 @RequiredArgsConstructor -public class GameAlarmResponse { +public class GameAlarmResponse implements AlarmResponse { private final Long id; private final Long gameId; @@ -44,4 +44,14 @@ public static GameAlarmResponse of(final GameAlarm gameAlarm) { .alarmType(gameAlarm.getAlarmType()) .build(); } + + @Override + public LocalDateTime getCreatedAt() { + return this.createdAt; + } + + @Override + public Long getId() { + return this.id; + } } diff --git a/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java index 6633998e..dee02af8 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java @@ -4,4 +4,5 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface AlarmRepository extends JpaRepository { + Boolean existsByIdLessThan(final Long id); } diff --git a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java index f1d6d227..25a9d9f7 100644 --- a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -3,8 +3,13 @@ import kr.pickple.back.alarm.domain.AlarmExistsStatus; import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.domain.GameAlarm; +import kr.pickple.back.alarm.dto.response.AlarmResponse; +import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; +import kr.pickple.back.alarm.dto.response.GameAlarmResponse; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.exception.AlarmExceptionCode; +import kr.pickple.back.alarm.repository.AlarmRepository; +import kr.pickple.back.alarm.util.CursorResult; import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.exception.MemberException; @@ -14,6 +19,9 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import static kr.pickple.back.alarm.domain.AlarmExistsStatus.EXISTS; import static kr.pickple.back.alarm.domain.AlarmExistsStatus.NOT_EXISTS; @@ -27,8 +35,10 @@ public class AlarmService { private final GameAlarmService gameAlarmService; private final CrewAlarmService crewAlarmService; private final MemberRepository memberRepository; + private final AlarmRepository alarmRepository; private final SseEmitters sseEmitters; + //1.SSE 연결 - 이벤트가 발생 된 후, 30초동안 지속 연결 public SseEmitter subscribeToSse(final Long loggedInMemberId) { final Member member = findMemberById(loggedInMemberId); @@ -46,27 +56,38 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { return emitter; } - //특정 사용자(loggedInMemberId)에게 이벤트(event)를 전송하는 역할을 함 - //SseEmitters에서 해당 사용자의 SseEmitter를 가져오고, 이를 통해 이벤트를 클라이언트에게 전송 - //특정 이벤트가 발생했을 때 해당 이벤트를 클라이언트에게 실시간으로 전달하는데 사용됨 - //새로운 알림이 도착했을 때 이를 클라이언트에게 실시간으로 알려주는 등의 기능을 구현하고자 할 때 notify 메서드를 사용 -// public void notify(final Long loggedInMemberId, final Object event) { -// final SseEmitter emitter = sseEmitters.get(loggedInMemberId); -// if (emitter != null) { -// try { -// emitter.send(event); -// } catch (IOException e) { -// sseEmitters.remove(loggedInMemberId); -// emitter.completeWithError(e); -// } -// } -// } - - //모든 알람 찾기 모두 - 각 알림에서 생성일 순으로 조회 - -// public static List findAllAlarms() { -// return null; -// } + //1. 해당 사용자의 모든 알람 목록 조회 시 - 생성일 순 + //2. 두, 알림에 대해서 가장 빠른 생성일 순으로 조회 + public CursorResult findAllAlarms(final Long loggedInMemberId, final Long cursorId, final Integer size) { + final Member member = findMemberById(loggedInMemberId); + + //1.각 알림을 조회하고, Response DTO로 변환 + final List AllCrewAlarmList = crewAlarmService.findCrewAlarmAll(); + final List AllGameAlarmList = gameAlarmService.findGameAlarmAll(); + + //2.서로 다른 알람을 하나의 리스트에 넣음 + final List alarmResponses = new ArrayList<>(); + alarmResponses.addAll(AllCrewAlarmList); + alarmResponses.addAll(AllGameAlarmList); + + //3.서로 다른 알람들을 생성일 순으로 정렬 + alarmResponses.sort(Comparator.comparing(AlarmResponse::getCreatedAt).reversed()); + + final Long lastIdOfList = alarmResponses.isEmpty() ? null : alarmResponses.get(alarmResponses.size() - 1).getId(); + + + return CursorResult.builder() + .alarmResponses(alarmResponses) + .hasNext(hasNext(lastIdOfList)) + .build(); + } + + //3.커서 기반 페이징 - 다음 페이지가 있는지 조회 + private Boolean hasNext(Long id) { + if (id == null) return false; + + return this.alarmRepository.existsByIdLessThan(id); + } //특정 알림 읽음, 읽지 않음 상태 확인 //1. memberId를 통해, 각 알림의 Repository에서 읽지 않은 알림이 있는지 판별 diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 47209b2b..01b1382c 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.util.List; +import java.util.stream.Collectors; import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; import static kr.pickple.back.alarm.domain.AlarmType.*; @@ -192,9 +193,18 @@ private void sendAlarmToCrewApplyMembers(final List members, final CrewA } } - //크루 알람 모두 찾기 - 미정 - public void findCrewAlarmAll() { + //저장된 크루 알람을 모두 찾기 위한 메소드 + public List findCrewAlarmAll() { + //1.DB에서 모든 CrewAlarm을 조회 + List crewAlarms = crewAlarmRepository.findAll(); + //2.조회한 CrewAlarm을 CrewAlarmResponse로 변환 + List crewAlarmResponses = crewAlarms.stream() + .map(CrewAlarmResponse::of) + .collect(Collectors.toList()); + + //3.변환한 CrewAlarmResponse를 반환 + return crewAlarmResponses; } //크루 알림에서 isRead가 False가 있는지 체크하는 메소드 diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 20ab746e..e5b48c0c 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -19,10 +19,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.util.List; +import java.util.stream.Collectors; import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; import static kr.pickple.back.alarm.domain.AlarmType.*; @@ -44,6 +46,7 @@ public class GameAlarmService { //private final AlarmService alarmService; private final SseEmitters sseEmitters; + @Transactional public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { //1.게임 리포지토리에서 해당 게임의 호스트인지 확인 validateIsHost(gameJoinRequestNotificationEvent); @@ -71,6 +74,7 @@ public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEv return response; } + @Transactional public GameAlarmResponse createGuestApproveAlarm(final GameMemberJoinedEvent gameMemberJoinedEvent) { //1.이벤트로부터 게임 정보, 회원 정보 가져오기 @@ -97,6 +101,7 @@ public GameAlarmResponse createGuestApproveAlarm(final GameMemberJoinedEvent gam return response; } + @Transactional public GameAlarmResponse createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejectedEvent) { //1.이벤트로부터 게임 정보, 회원 정보 가져오기 @@ -191,10 +196,19 @@ private void sendAlarmToGameApplyMembers(List members, GameAlarmResponse } } -// //게임 알림 찾기 모두 - 미정 -// public void findGameAlarmAll() { -// -// } + //저장된 게임 알람을 모두 찾기 위한 메소드 + public List findGameAlarmAll() { + //1.DB에서 모든 GameAlarm을 조회 + List gameAlarms = gameAlarmRepository.findAll(); + + //2.조회한 GameAlarm을 GameAlarmResponse로 변환 + List gameAlarmResponses = gameAlarms.stream() + .map(GameAlarmResponse::of) + .collect(Collectors.toList()); + + //3.변환한 GameAlarmResponse를 반환 + return gameAlarmResponses; + } //게임 알람에서 isRead가 False가 있는지 체크하는 메소드 public boolean checkUnreadGameAlarm(final Long memberId) { diff --git a/src/main/java/kr/pickple/back/alarm/util/CursorResult.java b/src/main/java/kr/pickple/back/alarm/util/CursorResult.java new file mode 100644 index 00000000..f033ffc9 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/util/CursorResult.java @@ -0,0 +1,18 @@ +package kr.pickple.back.alarm.util; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CursorResult { + + private List alarmResponses; + private Boolean hasNext; +} diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 3cdf537b..d31bd4e4 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -1,24 +1,6 @@ package kr.pickple.back.crew.domain; -import static kr.pickple.back.crew.domain.CrewStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; - -import java.text.MessageFormat; -import java.util.List; - -import org.springframework.util.StringUtils; - -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; +import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; @@ -32,6 +14,15 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.util.StringUtils; + +import java.text.MessageFormat; +import java.util.List; + +import static kr.pickple.back.crew.domain.CrewStatus.CLOSED; +import static kr.pickple.back.crew.domain.CrewStatus.OPEN; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_CAPACITY_LIMIT_REACHED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_STATUS_IS_CLOSED; @Getter @Entity From fa9d7156180f33b2ae9fd4982bc18ddc3a25a1ef Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 22 Nov 2023 02:33:14 +0900 Subject: [PATCH 41/78] =?UTF-8?q?fix:=20=EC=8B=A4=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=20Handler=20=EB=B9=84=EB=8F=99=EA=B8=B0=20?= =?UTF-8?q?=EC=83=81=ED=99=A9=20=EC=8B=9C=20=EB=B0=9C=EC=83=9D=EB=90=98?= =?UTF-8?q?=EB=8A=94=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java | 8 -------- src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java | 8 -------- .../pickple/back/alarm/handler/CrewAlarmEventHandler.java | 4 ++++ .../pickple/back/alarm/handler/GameAlarmEventHandler.java | 4 ++++ 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java index 1b20e5a6..f5e9d18f 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java @@ -11,9 +11,6 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.springframework.data.annotation.CreatedDate; - -import java.time.LocalDateTime; import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; @@ -36,10 +33,6 @@ public class CrewAlarm extends BaseEntity { @Convert(converter = AlarmTypeConverter.class) private AlarmType alarmType; - @CreatedDate - @Column(updatable = false) - private LocalDateTime createdAt; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "crew_id") private Crew crew; @@ -55,7 +48,6 @@ private CrewAlarm( final Member member ) { this.alarmType = alarmType; - this.createdAt = super.getCreatedAt(); this.crew = crew; this.member = member; } diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java index 36fa9ebb..6afd4001 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java @@ -11,9 +11,6 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.springframework.data.annotation.CreatedDate; - -import java.time.LocalDateTime; import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; @@ -36,10 +33,6 @@ public class GameAlarm extends BaseEntity { @Convert(converter = AlarmTypeConverter.class) private AlarmType alarmType; - @CreatedDate - @Column(updatable = false) - private LocalDateTime createdAt; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "game_id") private Game game; @@ -55,7 +48,6 @@ private GameAlarm( final Member member ) { this.alarmType = alarmType; - this.createdAt = super.getCreatedAt(); this.game = game; this.member = member; } diff --git a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java index 9f454caa..9b285d36 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java @@ -9,6 +9,7 @@ import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; @Component @RequiredArgsConstructor @@ -17,6 +18,7 @@ public class CrewAlarmEventHandler { private final CrewAlarmService crewAlarmService; @Async + @Transactional @EventListener public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewJoinAlarm(crewJoinRequestNotificationEvent); // 알람 생성 @@ -24,6 +26,7 @@ public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoi } @Async + @Transactional @EventListener public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberApproveAlarm(crewMemberJoinedEvent); // 알람 생성 @@ -31,6 +34,7 @@ public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJo } @Async + @Transactional @EventListener public void sendAlarmToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberDeniedAlarm(crewMemberRejectedEvent); // 알람 생성 diff --git a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java index 6289a1e4..850b764f 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java @@ -9,6 +9,7 @@ import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; @Component @RequiredArgsConstructor @@ -17,6 +18,7 @@ public class GameAlarmEventHandler { private final GameAlarmService gameAlarmService; @Async + @Transactional @EventListener public void sendAlarmToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { final GameAlarmResponse gameAlarm = gameAlarmService.createGameJoinAlarm(gameJoinRequestNotificationEvent); //알람 생성 @@ -24,6 +26,7 @@ public void sendAlarmToGameHost(final GameJoinRequestNotificationEvent gameJoinR } @Async + @Transactional @EventListener public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { final GameAlarmResponse gameAlarm = gameAlarmService.createGuestApproveAlarm(gameMemberJoinedEvent); //알람 생성 @@ -31,6 +34,7 @@ public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJo } @Async + @Transactional @EventListener public void sendAlarmToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { final GameAlarmResponse gameAlarm = gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); //알람 생성 From 79473aca98271e11613f0dc9f81313f73bb0e172 Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 22 Nov 2023 02:37:38 +0900 Subject: [PATCH 42/78] =?UTF-8?q?feat:=20=ED=86=B5=ED=95=A9=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=20=EC=BB=A4=EC=84=9C=20=EA=B8=B0=EB=B0=98=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=95=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/repository/CrewAlarmRepository.java | 10 +++++ .../alarm/repository/GameAlarmRepository.java | 10 +++++ .../back/alarm/service/AlarmService.java | 39 +++++++++++++------ .../back/alarm/service/CrewAlarmService.java | 36 ++++++++++++++++- .../back/alarm/service/GameAlarmService.java | 18 +++++++++ 5 files changed, 100 insertions(+), 13 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java index 434a38cb..e7a8342f 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java @@ -2,8 +2,18 @@ import kr.pickple.back.alarm.domain.AlarmStatus; import kr.pickple.back.alarm.domain.CrewAlarm; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface CrewAlarmRepository extends JpaRepository { + + List findByMemberIdAndIdLessThanOrderByIdDesc(final Long memberId, final Long id, final Pageable page); + + boolean existsByMemberIdAndIdLessThan(final Long memberId, final Long id); + boolean existsByMemberIdAndIsRead(final Long memberId, final AlarmStatus alarmStatus); + + List findByMemberIdOrderByIdDesc(final Long memberId, final Pageable page); } diff --git a/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java index a2af6c99..7ca0a45f 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java @@ -2,8 +2,18 @@ import kr.pickple.back.alarm.domain.AlarmStatus; import kr.pickple.back.alarm.domain.GameAlarm; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface GameAlarmRepository extends JpaRepository { + + List findByMemberIdAndIdLessThanOrderByIdDesc(final Long memberId, final Long id, final Pageable page); + + boolean existsByMemberIdAndIdLessThan(final Long memberId, final Long id); + boolean existsByMemberIdAndIsRead(final Long memberId, final AlarmStatus alarmStatus); + + List findByMemberIdOrderByIdDesc(final Long memberId, final Pageable page); } diff --git a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java index 25a9d9f7..fde8cfe4 100644 --- a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -15,6 +15,8 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -61,32 +63,45 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { public CursorResult findAllAlarms(final Long loggedInMemberId, final Long cursorId, final Integer size) { final Member member = findMemberById(loggedInMemberId); + Pageable page = PageRequest.of(0, size); + //1.각 알림을 조회하고, Response DTO로 변환 - final List AllCrewAlarmList = crewAlarmService.findCrewAlarmAll(); - final List AllGameAlarmList = gameAlarmService.findGameAlarmAll(); + List crewAlarmResponses; + List gameAlarmResponses; + + //1-1.초기 페이징 처리 + if (cursorId == 0) { + crewAlarmResponses = crewAlarmService.findCrewAlarmByMemberIdOrderByIdDesc(member.getId(), page); + gameAlarmResponses = gameAlarmService.findGameAlarmByMemberIdOrderByIdDesc(member.getId(), page); + } else { + crewAlarmResponses = crewAlarmService.findCrewAlarmByMemberIdAndIdLessThanOrderByIdDesc(member.getId(), cursorId, page); + gameAlarmResponses = gameAlarmService.findGameAlarmByMemberIdAndIdLessThanOrderByIdDesc(member.getId(), cursorId, page); + } //2.서로 다른 알람을 하나의 리스트에 넣음 - final List alarmResponses = new ArrayList<>(); - alarmResponses.addAll(AllCrewAlarmList); - alarmResponses.addAll(AllGameAlarmList); + List alarmResponses = new ArrayList<>(); + alarmResponses.addAll(crewAlarmResponses); + alarmResponses.addAll(gameAlarmResponses); //3.서로 다른 알람들을 생성일 순으로 정렬 alarmResponses.sort(Comparator.comparing(AlarmResponse::getCreatedAt).reversed()); - final Long lastIdOfList = alarmResponses.isEmpty() ? null : alarmResponses.get(alarmResponses.size() - 1).getId(); + //3-1.초기 알람 사이즈 + if (alarmResponses.size() > size) { + alarmResponses = alarmResponses.subList(0, size); + } + final Long lastIdOfList = alarmResponses.isEmpty() ? null : alarmResponses.get(alarmResponses.size() - 1).getId(); return CursorResult.builder() .alarmResponses(alarmResponses) - .hasNext(hasNext(lastIdOfList)) + .hasNext(hasNext(member.getId(), lastIdOfList)) .build(); } - //3.커서 기반 페이징 - 다음 페이지가 있는지 조회 - private Boolean hasNext(Long id) { - if (id == null) return false; - - return this.alarmRepository.existsByIdLessThan(id); + //크루와 게임에 대한 다음 페이지가 있는지 확인 + private boolean hasNext(final Long memberId, final Long id) { + return crewAlarmService.existsCrewAlarmByMemberIdAndIdLessThan(memberId, id) || gameAlarmService.existsGameAlarmByMemberIdAndIdLessThan(memberId, id); } //특정 알림 읽음, 읽지 않음 상태 확인 diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 01b1382c..6cf6e3f6 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -1,5 +1,6 @@ package kr.pickple.back.alarm.service; +import kr.pickple.back.alarm.domain.Alarm; import kr.pickple.back.alarm.domain.AlarmStatus; import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; @@ -7,6 +8,7 @@ import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alarm.exception.AlarmException; +import kr.pickple.back.alarm.repository.AlarmRepository; import kr.pickple.back.alarm.repository.CrewAlarmRepository; import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.common.domain.RegistrationStatus; @@ -18,6 +20,7 @@ import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -42,8 +45,8 @@ public class CrewAlarmService { private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final CrewAlarmRepository crewAlarmRepository; - //private final AlarmService alarmService; private final SseEmitters sseEmitters; + private final AlarmRepository alarmRepository; //크루 알림 생성 public CrewAlarmResponse createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { @@ -65,6 +68,13 @@ public CrewAlarmResponse createCrewJoinAlarm(final CrewJoinRequestNotificationEv //4. DB에다가 알람 저장 crewAlarmRepository.save(crewAlarm); + //5.통합 알람 엔티티 생성 및 저장 + final Alarm alarm = Alarm.builder() + .member(leader) + .crewAlarm(crewAlarm) + .build(); + alarmRepository.save(alarm); + final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); //alarmService.notify(leader.getId(), response); sseEmitters.notify(leader.getId(), response); @@ -90,6 +100,13 @@ public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewMemberJoinedEven //4. 알람 DB에다가 저장 crewAlarmRepository.save(crewAlarm); + //5.통합 알람 엔티티 생성 및 저장 + final Alarm alarm = Alarm.builder() + .member(member) + .crewAlarm(crewAlarm) + .build(); + alarmRepository.save(alarm); + final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); //alarmService.notify(member.getId(), response); sseEmitters.notify(member.getId(), response); @@ -250,4 +267,21 @@ public void deleteAllCrewAlarms() { //1.DB에서 생성된 모든 크루 알람을 삭제함 crewAlarmRepository.deleteAll(); } + + //1. memberId와 cursorid를 이용하여 CrewAlarm이 있는지 확인하고 반환 + public boolean existsCrewAlarmByMemberIdAndIdLessThan(final Long memberId, final Long id) { + return crewAlarmRepository.existsByMemberIdAndIdLessThan(memberId, id); + } + + //2.memberId와 cursorid를 이용하여 CrewAlarm을 가져오며, 그 결과를 CrewAlarmResponse로 변환하여 반환 + public List findCrewAlarmByMemberIdOrderByIdDesc(final Long memberId, final Pageable page) { + List crewAlarms = crewAlarmRepository.findByMemberIdOrderByIdDesc(memberId, page); + return crewAlarms.stream().map(CrewAlarmResponse::of).collect(Collectors.toList()); + } + + //3.memberId와 id를 이용하여 CrewAlarm을 가져오고, 그 결과를 CrewAlarmResponse로 변환하여 반환 + public List findCrewAlarmByMemberIdAndIdLessThanOrderByIdDesc(final Long memberId, final Long cursorId, final Pageable page) { + List crewAlarms = crewAlarmRepository.findByMemberIdAndIdLessThanOrderByIdDesc(memberId, cursorId, page); + return crewAlarms.stream().map(CrewAlarmResponse::of).collect(Collectors.toList()); + } } diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index e5b48c0c..d95ccbba 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -18,6 +18,7 @@ import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -253,4 +254,21 @@ public void deleteAllGameAlarms() { //1.DB에서 생성된 모든 게임 알람을 삭제함 gameAlarmRepository.deleteAll(); } + + //1. memberId와 cursorid를 이용하여 GameAlarm이 있는지 확인하고 반환 + public boolean existsGameAlarmByMemberIdAndIdLessThan(final Long memberId, final Long id) { + return gameAlarmRepository.existsByMemberIdAndIdLessThan(memberId, id); + } + + //2.memberId와 cursorid를 이용하여 GameAlarm을 가져오며, 그 결과를 GameAlarmResponse로 변환하여 반환 + public List findGameAlarmByMemberIdOrderByIdDesc(final Long memberId, final Pageable page) { + List gameAlarms = gameAlarmRepository.findByMemberIdOrderByIdDesc(memberId, page); + return gameAlarms.stream().map(GameAlarmResponse::of).collect(Collectors.toList()); + } + + //3.memberId와 id를 이용하여 GameAlarm을 가져오고, 그 결과를 GameAlarmResponse로 변환하여 반환 + public List findGameAlarmByMemberIdAndIdLessThanOrderByIdDesc(final Long memberId, final Long cursorId, final Pageable page) { + List gameAlarms = gameAlarmRepository.findByMemberIdAndIdLessThanOrderByIdDesc(memberId, cursorId, page); + return gameAlarms.stream().map(GameAlarmResponse::of).collect(Collectors.toList()); + } } From 6dabcc08a7fb552d73f71a8290d86ea464335e98 Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 22 Nov 2023 21:16:51 +0900 Subject: [PATCH 43/78] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/service/CrewMemberService.java | 5 +--- .../back/crew/service/CrewService.java | 23 +++++++++---------- .../back/game/service/GameService.java | 7 ++---- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index b1fe37d8..51e41522 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -45,8 +45,7 @@ public void applyForCrewMemberShip(final Long crewId, final Long loggedInMemberI final Member member = findMemberById(loggedInMemberId); crew.addCrewMember(member); - //TODO:크루 알람 - 크루장에게 가입 신청이 왔어요! (크루장에게 전송) - eventPublisher.publishEvent(new CrewJoinRequestNotificationEvent(crewId)); + eventPublisher.publishEvent(new CrewJoinRequestNotificationEvent(crewId, crew.getLeader())); } public CrewProfileResponse findAllCrewMembers( @@ -93,7 +92,6 @@ public void crewMemberStatusUpdate( crewMember.updateStatus(updateStatus); crewMember.updateStatus(crewMemberUpdateStatusRequest.getStatus()); - //TODO:크루 알람 - 크루원(대기)상태이자 해당 크루 지원 멤버에게 전송 - 가입 신청이 허락되었어요! eventPublisher.publishEvent(new CrewMemberJoinedEvent(crewId, memberId)); } @@ -120,7 +118,6 @@ public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, fin validateIsLeaderSelfDeleted(loggedInMemberId, memberId); deleteCrewMember(crewMember); - //TODO:크루 알람 - 크루장이 크루원(대기)상태에서 해당 크루원을 삭제 함(해당 크루 지원 회원에게 전송) - 가입 신청이 거절되었어요! eventPublisher.publishEvent(new CrewMemberRejectedEvent(crewId, memberId)); return; } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index a2adfd96..ba2e4005 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -1,17 +1,5 @@ package kr.pickple.back.crew.service; -import static kr.pickple.back.chat.domain.RoomType.*; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - -import java.util.List; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import kr.pickple.back.address.dto.response.MainAddressResponse; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.chat.domain.ChatRoom; @@ -29,6 +17,17 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static kr.pickple.back.chat.domain.RoomType.CREW; +import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_EXISTED; +import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @Transactional(readOnly = true) diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index f1778862..a787fb69 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -105,8 +105,7 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { final Member member = findMemberById(loggedInMemberId); game.addGameMember(member); - //TODO:게임 알람 - 호스트에게 가입 신청이 왔어요!(호스트에게 전송) - eventPublisher.publishEvent(new GameJoinRequestNotificationEvent(gameId)); + eventPublisher.publishEvent(new GameJoinRequestNotificationEvent(gameId, game.getHost())); } private Game findGameById(final Long gameId) { @@ -179,7 +178,6 @@ public void updateGameMemberRegistrationStatus( enterGameChatRoom(updateStatus, gameMember); gameMember.updateStatus(updateStatus); - //TODO:게임 알람 - 게스트(대기)상태이자, 해당 게임 지원 멤버에게 전송 - 승락이 되었어요! eventPublisher.publishEvent(new GameMemberJoinedEvent(gameId, memberId)); } @@ -208,9 +206,8 @@ public void deleteGameMember(final Long loggedInMemberId, final Long gameId, fin if (game.isHost(loggedInMember)) { validateIsHostSelfDeleted(loggedInMember, member); - deleteGameMember(gameMember); - //TODO:게임 알람 - 게스트(대기)상태에서, 해당 지원 게임 멤버를 삭제함(해당 게임 지원 회원)에게 전송 - 거절 되었어요! + deleteGameMember(gameMember); eventPublisher.publishEvent(new GameMemberRejectedEvent(gameId, memberId)); return; } From e95316c1d47ab8ff8a0fba9a79f828d7d510250a Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 22 Nov 2023 21:19:06 +0900 Subject: [PATCH 44/78] =?UTF-8?q?refactor:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=20=EB=B0=9C=EC=83=9D=20=EC=8B=9C=20=ED=95=B4=EB=8B=B9=20?= =?UTF-8?q?=ED=81=AC=EB=A3=A8,=20=ED=95=B4=EB=8B=B9=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EC=9D=84=20=ED=86=B5=ED=95=B4=20=ED=98=B8=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/crew/CrewJoinRequestNotificationEvent.java | 8 +++++++- .../event/game/GameJoinRequestNotificationEvent.java | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java index 2ab4f9b8..a203168a 100644 --- a/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java @@ -1,13 +1,19 @@ package kr.pickple.back.alarm.event.crew; +import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class CrewJoinRequestNotificationEvent { private final Long crewId; + private final Member crewLeader; - public Long getCrewId(){ + public Long getCrewId() { return crewId; } + + public Member getCrewLeader() { + return crewLeader; + } } diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java index 4828bc2f..5d6d8094 100644 --- a/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java @@ -1,13 +1,19 @@ package kr.pickple.back.alarm.event.game; +import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class GameJoinRequestNotificationEvent { private final Long gameId; + private final Member host; public Long getGameId() { return gameId; } + + public Member getHost() { + return host; + } } From 576a5fea735418e0a3945f3faeeaa61fd931c944 Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 22 Nov 2023 21:21:43 +0900 Subject: [PATCH 45/78] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alarm/handler/CrewAlarmEventHandler.java | 12 ++++++------ .../back/alarm/handler/GameAlarmEventHandler.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java index 9b285d36..1cbae514 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java @@ -21,23 +21,23 @@ public class CrewAlarmEventHandler { @Transactional @EventListener public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewJoinAlarm(crewJoinRequestNotificationEvent); // 알람 생성 - crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewJoinAlarm(crewJoinRequestNotificationEvent); + crewAlarmService.emitMessage(crewAlarm); } @Async @Transactional @EventListener public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { - final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberApproveAlarm(crewMemberJoinedEvent); // 알람 생성 - crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberApproveAlarm(crewMemberJoinedEvent); + crewAlarmService.emitMessage(crewAlarm); } @Async @Transactional @EventListener public void sendAlarmToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { - final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberDeniedAlarm(crewMemberRejectedEvent); // 알람 생성 - crewAlarmService.emitMessage(crewAlarm); // SSE로 알람 메시지 전송 + final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberDeniedAlarm(crewMemberRejectedEvent); + crewAlarmService.emitMessage(crewAlarm); } } diff --git a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java index 850b764f..c9e01b94 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java @@ -21,23 +21,23 @@ public class GameAlarmEventHandler { @Transactional @EventListener public void sendAlarmToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { - final GameAlarmResponse gameAlarm = gameAlarmService.createGameJoinAlarm(gameJoinRequestNotificationEvent); //알람 생성 - gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 - sseServcie로 변경? + final GameAlarmResponse gameAlarm = gameAlarmService.createGameJoinAlarm(gameJoinRequestNotificationEvent); + gameAlarmService.emitMessage(gameAlarm); } @Async @Transactional @EventListener public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { - final GameAlarmResponse gameAlarm = gameAlarmService.createGuestApproveAlarm(gameMemberJoinedEvent); //알람 생성 - gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 + final GameAlarmResponse gameAlarm = gameAlarmService.createGuestApproveAlarm(gameMemberJoinedEvent); + gameAlarmService.emitMessage(gameAlarm); } @Async @Transactional @EventListener public void sendAlarmToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { - final GameAlarmResponse gameAlarm = gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); //알람 생성 - gameAlarmService.emitMessage(gameAlarm); //SSE로 알람 메시지 전송 + final GameAlarmResponse gameAlarm = gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); + gameAlarmService.emitMessage(gameAlarm); } } From 543ff018c87f790b0a40b72c662de1b67e41777d Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 22 Nov 2023 21:28:37 +0900 Subject: [PATCH 46/78] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/alarm/config/AsynConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java b/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java index 4b2c2e76..5149e826 100644 --- a/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java +++ b/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java @@ -20,7 +20,7 @@ public TaskExecutor taskExecutor() { } static class CustomThreadPoolTaskExecutor extends ThreadPoolTaskExecutor { - private CustomThreadPoolTaskExecutor(int corePoolSize, int maxPoolSize, int queueCapacity) { + private CustomThreadPoolTaskExecutor(final int corePoolSize, final int maxPoolSize, final int queueCapacity) { super(); this.setCorePoolSize(corePoolSize); this.setMaxPoolSize(maxPoolSize); @@ -37,17 +37,17 @@ public static class Builder { private int maxPoolSize; private int queueCapacity; - public Builder corePoolSize(int corePoolSize) { + public Builder corePoolSize(final int corePoolSize) { this.corePoolSize = corePoolSize; return this; } - public Builder maxPoolSize(int maxPoolSize) { + public Builder maxPoolSize(final int maxPoolSize) { this.maxPoolSize = maxPoolSize; return this; } - public Builder queueCapacity(int queueCapacity) { + public Builder queueCapacity(final int queueCapacity) { this.queueCapacity = queueCapacity; return this; } From f5b2f45a6485e264920915c7776bc840e920e5ca Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 22 Nov 2023 21:37:21 +0900 Subject: [PATCH 47/78] =?UTF-8?q?refactor:=20=ED=86=B5=ED=95=A9=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=ED=83=80=EC=9E=85=EC=9D=84=20=ED=81=AC?= =?UTF-8?q?=EB=A3=A8=20=EC=95=8C=EB=A6=BC,=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=ED=83=80=EC=9E=85=20=EA=B0=81=EA=B0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/alarm/domain/Alarm.java | 51 ------------------- .../pickple/back/alarm/domain/CrewAlarm.java | 14 ++--- .../{AlarmType.java => CrewAlarmType.java} | 19 +++---- .../pickple/back/alarm/domain/GameAlarm.java | 14 ++--- .../back/alarm/domain/GameAlarmType.java | 42 +++++++++++++++ .../util/AlarmExistsStatusConverter.java | 19 ------- .../back/alarm/util/AlarmTypeConverter.java | 19 ------- .../alarm/util/CrewAlarmTypeConverter.java | 19 +++++++ .../alarm/util/GameAlarmTypeConverter.java | 19 +++++++ 9 files changed, 102 insertions(+), 114 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/alarm/domain/Alarm.java rename src/main/java/kr/pickple/back/alarm/domain/{AlarmType.java => CrewAlarmType.java} (55%) create mode 100644 src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java delete mode 100644 src/main/java/kr/pickple/back/alarm/util/AlarmExistsStatusConverter.java delete mode 100644 src/main/java/kr/pickple/back/alarm/util/AlarmTypeConverter.java create mode 100644 src/main/java/kr/pickple/back/alarm/util/CrewAlarmTypeConverter.java create mode 100644 src/main/java/kr/pickple/back/alarm/util/GameAlarmTypeConverter.java diff --git a/src/main/java/kr/pickple/back/alarm/domain/Alarm.java b/src/main/java/kr/pickple/back/alarm/domain/Alarm.java deleted file mode 100644 index e02da182..00000000 --- a/src/main/java/kr/pickple/back/alarm/domain/Alarm.java +++ /dev/null @@ -1,51 +0,0 @@ -package kr.pickple.back.alarm.domain; - -import jakarta.persistence.*; -import jakarta.validation.constraints.NotNull; -import kr.pickple.back.alarm.util.AlarmExistsStatusConverter; -import kr.pickple.back.member.domain.Member; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import static kr.pickple.back.alarm.domain.AlarmExistsStatus.NOT_EXISTS; - - -@Entity -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Alarm { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Column(length = 10) - @Convert(converter = AlarmExistsStatusConverter.class) - private AlarmExistsStatus alarmExistsStatus = NOT_EXISTS; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") - private Member member; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "crew_alarm_id") - private CrewAlarm crewAlarm; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "game_alarm_id") - private GameAlarm gameAlarm; - - @Builder - private Alarm( - final Member member, - final CrewAlarm crewAlarm, - final GameAlarm gameAlarm - ) { - this.member = member; - this.crewAlarm = crewAlarm; - this.gameAlarm = gameAlarm; - } -} diff --git a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java index f5e9d18f..f4d14c9e 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java @@ -3,7 +3,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import kr.pickple.back.alarm.util.AlarmStatusConverter; -import kr.pickple.back.alarm.util.AlarmTypeConverter; +import kr.pickple.back.alarm.util.CrewAlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.member.domain.Member; @@ -29,9 +29,9 @@ public class CrewAlarm extends BaseEntity { private AlarmStatus isRead = FALSE; @NotNull - @Column(length = 20) - @Convert(converter = AlarmTypeConverter.class) - private AlarmType alarmType; + @Column(length = 30) + @Convert(converter = CrewAlarmTypeConverter.class) + private CrewAlarmType crewAlarmType; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "crew_id") @@ -43,16 +43,16 @@ public class CrewAlarm extends BaseEntity { @Builder private CrewAlarm( - final AlarmType alarmType, + final CrewAlarmType crewAlarmType, final Crew crew, final Member member ) { - this.alarmType = alarmType; + this.crewAlarmType = crewAlarmType; this.crew = crew; this.member = member; } - public void updateStatus(AlarmStatus status) { + public void updateStatus(final AlarmStatus status) { this.isRead = status; } } diff --git a/src/main/java/kr/pickple/back/alarm/domain/AlarmType.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java similarity index 55% rename from src/main/java/kr/pickple/back/alarm/domain/AlarmType.java rename to src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java index 73978dd3..4eec04fe 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/AlarmType.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.alarm.exception.AlarmException; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -16,27 +16,24 @@ @Getter @RequiredArgsConstructor -public enum AlarmType { +public enum CrewAlarmType { CREW_LEADER_WAITING("가입 수락을 기다리고 있어요"), CREW_ACCEPT("크루 가입이 수락되었어요"), CREW_DENIED("크루 가입이 거절되었어요"), - HOST_WAITING("게스트 모집 창여 수락이 기다리고 있어요"), - GUEST_ACCEPT("게스트 참여가 수락되었어요"), - GUEST_DENIED("게스트 참여가 거절되었어요"), ; - private static final Map alarmTypeMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(AlarmType::name, Function.identity()))); + private static final Map crewAlarmTypeMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(CrewAlarmType::name, Function.identity()))); private final String description; @JsonCreator - public static AlarmType from(final String name) { - if (alarmTypeMap.containsKey(name)) { - return alarmTypeMap.get(name); + public static CrewAlarmType from(final String name) { + if (crewAlarmTypeMap.containsKey(name)) { + return crewAlarmTypeMap.get(name); } - throw new CrewException(ALARM_TYPE_NOT_FOUND, name); + throw new AlarmException(ALARM_TYPE_NOT_FOUND, name); } @JsonValue diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java index 6afd4001..0bb0fedc 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java @@ -3,7 +3,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import kr.pickple.back.alarm.util.AlarmStatusConverter; -import kr.pickple.back.alarm.util.AlarmTypeConverter; +import kr.pickple.back.alarm.util.GameAlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; @@ -29,9 +29,9 @@ public class GameAlarm extends BaseEntity { private AlarmStatus isRead = FALSE; @NotNull - @Column(length = 20) - @Convert(converter = AlarmTypeConverter.class) - private AlarmType alarmType; + @Column(length = 30) + @Convert(converter = GameAlarmTypeConverter.class) + private GameAlarmType gameAlarmType; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "game_id") @@ -43,16 +43,16 @@ public class GameAlarm extends BaseEntity { @Builder private GameAlarm( - final AlarmType alarmType, + final GameAlarmType gameAlarmType, final Game game, final Member member ) { - this.alarmType = alarmType; + this.gameAlarmType = gameAlarmType; this.game = game; this.member = member; } - public void updateStatus(AlarmStatus status) { + public void updateStatus(final AlarmStatus status) { this.isRead = status; } } diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java new file mode 100644 index 00000000..80d142fc --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java @@ -0,0 +1,42 @@ +package kr.pickple.back.alarm.domain; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import kr.pickple.back.alarm.exception.AlarmException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_TYPE_NOT_FOUND; + +@Getter +@RequiredArgsConstructor +public enum GameAlarmType { + HOST_WAITING("게스트 모집 참여 수락이 기다리고 있어요"), + GUEST_ACCEPT("게스트 참여가 수락되었어요"), + GUEST_DENIED("게스트 참여가 거절되었어요"), + ; + + private static final Map gameAlarmTypeMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(GameAlarmType::name, Function.identity()))); + + private final String description; + + @JsonCreator + public static GameAlarmType from(final String name) { + if (gameAlarmTypeMap.containsKey(name)) { + return gameAlarmTypeMap.get(name); + } + throw new AlarmException(ALARM_TYPE_NOT_FOUND, name); + } + + @JsonValue + public String getName() { + return name(); + } +} diff --git a/src/main/java/kr/pickple/back/alarm/util/AlarmExistsStatusConverter.java b/src/main/java/kr/pickple/back/alarm/util/AlarmExistsStatusConverter.java deleted file mode 100644 index e0343edf..00000000 --- a/src/main/java/kr/pickple/back/alarm/util/AlarmExistsStatusConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package kr.pickple.back.alarm.util; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Convert; -import kr.pickple.back.alarm.domain.AlarmExistsStatus; - -@Convert -public class AlarmExistsStatusConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(final AlarmExistsStatus Status) { - return Status.getDescription(); - } - - @Override - public AlarmExistsStatus convertToEntityAttribute(final String Status) { - return AlarmExistsStatus.from(Status); - } -} diff --git a/src/main/java/kr/pickple/back/alarm/util/AlarmTypeConverter.java b/src/main/java/kr/pickple/back/alarm/util/AlarmTypeConverter.java deleted file mode 100644 index 77a73ed6..00000000 --- a/src/main/java/kr/pickple/back/alarm/util/AlarmTypeConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package kr.pickple.back.alarm.util; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Convert; -import kr.pickple.back.alarm.domain.AlarmType; - -@Convert -public class AlarmTypeConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(final AlarmType Type) { - return Type.getDescription(); - } - - @Override - public AlarmType convertToEntityAttribute(final String Type) { - return AlarmType.from(Type); - } -} diff --git a/src/main/java/kr/pickple/back/alarm/util/CrewAlarmTypeConverter.java b/src/main/java/kr/pickple/back/alarm/util/CrewAlarmTypeConverter.java new file mode 100644 index 00000000..31855960 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/util/CrewAlarmTypeConverter.java @@ -0,0 +1,19 @@ +package kr.pickple.back.alarm.util; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Convert; +import kr.pickple.back.alarm.domain.CrewAlarmType; + +@Convert +public class CrewAlarmTypeConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(final CrewAlarmType Type) { + return Type.getDescription(); + } + + @Override + public CrewAlarmType convertToEntityAttribute(final String status) { + return CrewAlarmType.from(status); + } +} diff --git a/src/main/java/kr/pickple/back/alarm/util/GameAlarmTypeConverter.java b/src/main/java/kr/pickple/back/alarm/util/GameAlarmTypeConverter.java new file mode 100644 index 00000000..3cf1daec --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/util/GameAlarmTypeConverter.java @@ -0,0 +1,19 @@ +package kr.pickple.back.alarm.util; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Convert; +import kr.pickple.back.alarm.domain.GameAlarmType; + +@Convert +public class GameAlarmTypeConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(final GameAlarmType Type) { + return Type.getDescription(); + } + + @Override + public GameAlarmType convertToEntityAttribute(final String status) { + return GameAlarmType.from(status); + } +} From c5609bd8168b6ad68097ea101306a482338b6dc3 Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 22 Nov 2023 21:37:34 +0900 Subject: [PATCH 48/78] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kr/pickple/back/alarm/util/SseEmitters.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java index 93504b57..56cdb1ea 100644 --- a/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java +++ b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java @@ -14,8 +14,6 @@ @RequiredArgsConstructor public class SseEmitters { - //private final SseEmitters sseEmitters; - private final ConcurrentMap emitters = new ConcurrentHashMap<>(); public SseEmitter add(final Long id, final SseEmitter emitter) { From 1473d747e2ca2037320a87fa2e142d847822720c Mon Sep 17 00:00:00 2001 From: jay-so Date: Thu, 23 Nov 2023 00:03:28 +0900 Subject: [PATCH 49/78] =?UTF-8?q?feat:=20Crew=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/controller/CrewAlarmController.java | 31 +++++++++++++++++++ .../back/alarm/domain/AlarmStatus.java | 12 +++---- .../back/alarm/domain/CrewAlarmType.java | 14 ++++----- .../request/CrewAlarmUpdateStatusRequest.java | 15 +++++++++ .../back/alarm/util/AlarmStatusConverter.java | 2 +- 5 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java create mode 100644 src/main/java/kr/pickple/back/alarm/dto/request/CrewAlarmUpdateStatusRequest.java diff --git a/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java new file mode 100644 index 00000000..183da663 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java @@ -0,0 +1,31 @@ +package kr.pickple.back.alarm.controller; + +import jakarta.validation.Valid; +import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; +import kr.pickple.back.alarm.service.CrewAlarmService; +import kr.pickple.back.auth.config.resolver.Login; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import static org.springframework.http.HttpStatus.NO_CONTENT; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/crew-alarm") +public class CrewAlarmController { + + private final CrewAlarmService crewAlarmService; + + @PatchMapping("/{crewAlarmId}") + public ResponseEntity updateCrewAlarmStatus( + @Login final Long loggedInMemberId, + @PathVariable final Long crewAlarmId, + @Valid @RequestBody final CrewAlarmUpdateStatusRequest crewAlarmUpdateStatusRequest + ) { + crewAlarmService.updateCrewAlarmById(loggedInMemberId, crewAlarmId, crewAlarmUpdateStatusRequest); + + return ResponseEntity.status(NO_CONTENT) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/alarm/domain/AlarmStatus.java b/src/main/java/kr/pickple/back/alarm/domain/AlarmStatus.java index b04eb4af..c3eb3fea 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/AlarmStatus.java +++ b/src/main/java/kr/pickple/back/alarm/domain/AlarmStatus.java @@ -21,18 +21,18 @@ public enum AlarmStatus { TRUE("읽음", true), FALSE("읽지 않음", false); - private static final Map alarmStatusMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(AlarmStatus::getDescription, Function.identity()))); + private static final Map alarmStatusMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(AlarmStatus::getBooleanValue, Function.identity()))); private final String description; private final Boolean booleanValue; @JsonCreator - public static AlarmStatus from(final String description) { - if (alarmStatusMap.containsKey(description)) { - return alarmStatusMap.get(description); + public static AlarmStatus from(final Boolean booleanValue) { + if (alarmStatusMap.containsKey(booleanValue)) { + return alarmStatusMap.get(booleanValue); } - throw new CrewException(ALARM_STATUS_NOT_FOUND, description); + throw new CrewException(ALARM_STATUS_NOT_FOUND, booleanValue); } @JsonValue diff --git a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java index 4eec04fe..dd12c78e 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java @@ -24,20 +24,20 @@ public enum CrewAlarmType { ; private static final Map crewAlarmTypeMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(CrewAlarmType::name, Function.identity()))); + .collect(Collectors.toMap(CrewAlarmType::getDescription, Function.identity()))); private final String description; @JsonCreator - public static CrewAlarmType from(final String name) { - if (crewAlarmTypeMap.containsKey(name)) { - return crewAlarmTypeMap.get(name); + public static CrewAlarmType from(final String description) { + if (crewAlarmTypeMap.containsKey(description)) { + return crewAlarmTypeMap.get(description); } - throw new AlarmException(ALARM_TYPE_NOT_FOUND, name); + throw new AlarmException(ALARM_TYPE_NOT_FOUND, description); } @JsonValue - public String getName() { - return name(); + public String getDescription() { + return description; } } diff --git a/src/main/java/kr/pickple/back/alarm/dto/request/CrewAlarmUpdateStatusRequest.java b/src/main/java/kr/pickple/back/alarm/dto/request/CrewAlarmUpdateStatusRequest.java new file mode 100644 index 00000000..cd1879fa --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/dto/request/CrewAlarmUpdateStatusRequest.java @@ -0,0 +1,15 @@ +package kr.pickple.back.alarm.dto.request; + +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.alarm.domain.AlarmStatus; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CrewAlarmUpdateStatusRequest { + + @NotNull(message = "크루 알림 읽음 여부는 필수입니다.") + private AlarmStatus isRead; +} diff --git a/src/main/java/kr/pickple/back/alarm/util/AlarmStatusConverter.java b/src/main/java/kr/pickple/back/alarm/util/AlarmStatusConverter.java index 1ac07f06..ee2b3a97 100644 --- a/src/main/java/kr/pickple/back/alarm/util/AlarmStatusConverter.java +++ b/src/main/java/kr/pickple/back/alarm/util/AlarmStatusConverter.java @@ -14,6 +14,6 @@ public String convertToDatabaseColumn(final AlarmStatus status) { @Override public AlarmStatus convertToEntityAttribute(final String status) { - return AlarmStatus.from(status); + return AlarmStatus.from(Boolean.valueOf(status)); } } From 2c399231a9078bbb4baeb8ed5db68eb2233cb3f9 Mon Sep 17 00:00:00 2001 From: jay-so Date: Thu, 23 Nov 2023 00:04:11 +0900 Subject: [PATCH 50/78] =?UTF-8?q?feat:=EA=B2=8C=EC=9E=84=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=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 --- .../alarm/controller/GameAlarmController.java | 31 +++++++++++++++++++ .../back/alarm/domain/GameAlarmType.java | 14 ++++----- .../request/GameAlarmUpdateStatusRequest.java | 15 +++++++++ 3 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java create mode 100644 src/main/java/kr/pickple/back/alarm/dto/request/GameAlarmUpdateStatusRequest.java diff --git a/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java new file mode 100644 index 00000000..5faed07b --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java @@ -0,0 +1,31 @@ +package kr.pickple.back.alarm.controller; + +import jakarta.validation.Valid; +import kr.pickple.back.alarm.dto.request.GameAlarmUpdateStatusRequest; +import kr.pickple.back.alarm.service.GameAlarmService; +import kr.pickple.back.auth.config.resolver.Login; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import static org.springframework.http.HttpStatus.NO_CONTENT; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/game-alarm") +public class GameAlarmController { + + private final GameAlarmService gameAlarmService; + + @PatchMapping("/{gameAlarmId}") + public ResponseEntity updateGameAlarmStatus( + @Login final Long loggedInMemberId, + @PathVariable final Long gameAlarmId, + @Valid @RequestBody final GameAlarmUpdateStatusRequest gameAlarmUpdateStatusRequest + ) { + gameAlarmService.updateGameAlarmById(loggedInMemberId, gameAlarmId, gameAlarmUpdateStatusRequest); + + return ResponseEntity.status(NO_CONTENT) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java index 80d142fc..b4c3e6c6 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java @@ -23,20 +23,20 @@ public enum GameAlarmType { ; private static final Map gameAlarmTypeMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(GameAlarmType::name, Function.identity()))); + .collect(Collectors.toMap(GameAlarmType::getDescription, Function.identity()))); private final String description; @JsonCreator - public static GameAlarmType from(final String name) { - if (gameAlarmTypeMap.containsKey(name)) { - return gameAlarmTypeMap.get(name); + public static GameAlarmType from(final String description) { + if (gameAlarmTypeMap.containsKey(description)) { + return gameAlarmTypeMap.get(description); } - throw new AlarmException(ALARM_TYPE_NOT_FOUND, name); + throw new AlarmException(ALARM_TYPE_NOT_FOUND, description); } @JsonValue - public String getName() { - return name(); + public String getDescription() { + return description; } } diff --git a/src/main/java/kr/pickple/back/alarm/dto/request/GameAlarmUpdateStatusRequest.java b/src/main/java/kr/pickple/back/alarm/dto/request/GameAlarmUpdateStatusRequest.java new file mode 100644 index 00000000..81b84c4c --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/dto/request/GameAlarmUpdateStatusRequest.java @@ -0,0 +1,15 @@ +package kr.pickple.back.alarm.dto.request; + +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.alarm.domain.AlarmStatus; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GameAlarmUpdateStatusRequest { + + @NotNull(message = "게임 알림 읽음 여부는 필수입니다.") + private AlarmStatus isRead; +} From 704f6d613b80304fa90e76f5c4deaa4080e530f6 Mon Sep 17 00:00:00 2001 From: jay-so Date: Thu, 23 Nov 2023 00:24:25 +0900 Subject: [PATCH 51/78] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=95=8C=EB=9E=8C=20=EC=83=9D=EC=84=B1,?= =?UTF-8?q?=20=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20&=20=EC=8B=A4=EC=8B=9C=EA=B0=84=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B4=80=EB=A0=A8=20=EC=95=8C=EB=9E=8C=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/dto/response/GameAlarmResponse.java | 8 +- .../back/alarm/service/GameAlarmService.java | 123 ++++-------------- 2 files changed, 31 insertions(+), 100 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index bab14a79..7e11a76e 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import kr.pickple.back.alarm.domain.AlarmStatus; -import kr.pickple.back.alarm.domain.AlarmType; import kr.pickple.back.alarm.domain.GameAlarm; +import kr.pickple.back.alarm.domain.GameAlarmType; import kr.pickple.back.game.domain.Game; import lombok.Builder; import lombok.Getter; @@ -15,7 +15,7 @@ @Getter @Builder -@JsonSerialize //text/event-stream'의 MIME 타입이기 때문에 JsonSerialize로 Json형식으로 직렬화해야 함 +@JsonSerialize @RequiredArgsConstructor public class GameAlarmResponse implements AlarmResponse { @@ -27,7 +27,7 @@ public class GameAlarmResponse implements AlarmResponse { private final LocalTime playStartTime; private final Integer playTimeMinutes; private final AlarmStatus isRead; - private final AlarmType alarmType; + private final GameAlarmType gameAlarmType; public static GameAlarmResponse of(final GameAlarm gameAlarm) { final Game game = gameAlarm.getGame(); @@ -41,7 +41,7 @@ public static GameAlarmResponse of(final GameAlarm gameAlarm) { .playStartTime(gameAlarm.getGame().getPlayStartTime()) .playTimeMinutes(gameAlarm.getGame().getPlayTimeMinutes()) .isRead(gameAlarm.getIsRead()) - .alarmType(gameAlarm.getAlarmType()) + .gameAlarmType(gameAlarm.getGameAlarmType()) .build(); } diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index d95ccbba..7308351f 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -1,7 +1,7 @@ package kr.pickple.back.alarm.service; -import kr.pickple.back.alarm.domain.AlarmStatus; import kr.pickple.back.alarm.domain.GameAlarm; +import kr.pickple.back.alarm.dto.request.GameAlarmUpdateStatusRequest; import kr.pickple.back.alarm.dto.response.GameAlarmResponse; import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; @@ -18,24 +18,21 @@ import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.util.List; -import java.util.stream.Collectors; import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; -import static kr.pickple.back.alarm.domain.AlarmType.*; +import static kr.pickple.back.alarm.domain.GameAlarmType.*; import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_NOT_FOUND; import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_IS_NOT_HOST; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; -//SSE 연결 로직에서는 @Transcational금지 @Slf4j @Service @RequiredArgsConstructor @@ -44,87 +41,73 @@ public class GameAlarmService { private final MemberRepository memberRepository; private final GameRepository gameRepository; private final GameAlarmRepository gameAlarmRepository; - //private final AlarmService alarmService; private final SseEmitters sseEmitters; @Transactional public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { - //1.게임 리포지토리에서 해당 게임의 호스트인지 확인 + validateIsHost(gameJoinRequestNotificationEvent); - //2. 이벤트로부터 게임 정보 가져오기 final Long gameId = gameJoinRequestNotificationEvent.getGameId(); final Game game = getGameInfo(gameId); final Member host = game.getHost(); - //3. 알람 생성 final GameAlarm gameAlarm = GameAlarm.builder() .game(game) .member(host) - .alarmType(HOST_WAITING) + .gameAlarmType(HOST_WAITING) .build(); - //4. DB에다가 알림 저장 gameAlarmRepository.save(gameAlarm); - final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); - //alarmService.notify(host.getId(), response); - sseEmitters.notify(host.getId(), response); + final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); + sseEmitters.notify(host.getId(), response); return response; } @Transactional public GameAlarmResponse createGuestApproveAlarm(final GameMemberJoinedEvent gameMemberJoinedEvent) { - //1.이벤트로부터 게임 정보, 회원 정보 가져오기 final Long gameId = gameMemberJoinedEvent.getGameId(); final Game game = getGameInfo(gameId); final Long memberId = gameMemberJoinedEvent.getMemberId(); final Member member = getMemberInfo(memberId); - //2.알람 생성 final GameAlarm gameAlarm = GameAlarm.builder() .game(game) .member(member) - .alarmType(GUEST_ACCEPT) + .gameAlarmType(GUEST_ACCEPT) .build(); - //3.알람을 DB에다가 저장 gameAlarmRepository.save(gameAlarm); final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); -// alarmService.notify(member.getId(), response); - sseEmitters.notify(member.getId(), response); - + sseEmitters.notify(member.getId(), response); return response; } @Transactional public GameAlarmResponse createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejectedEvent) { - //1.이벤트로부터 게임 정보, 회원 정보 가져오기 final Long gameId = gameMemberRejectedEvent.getGameId(); final Game game = getGameInfo(gameId); final Long memberId = gameMemberRejectedEvent.getMemberId(); final Member member = getMemberInfo(memberId); - //2.알람 생성 final GameAlarm gameAlarm = GameAlarm.builder() .game(game) .member(member) - .alarmType(GUEST_DENIED) + .gameAlarmType(GUEST_DENIED) .build(); - //3.알람 DB에다가 저장 gameAlarmRepository.save(gameAlarm); final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); -// alarmService.notify(member.getId(), response); - sseEmitters.notify(member.getId(), response); + sseEmitters.notify(member.getId(), response); return response; } @@ -133,8 +116,7 @@ private void validateIsHost(final GameJoinRequestNotificationEvent gameJoinReque final Long gameId = gameJoinRequestNotificationEvent.getGameId(); final Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - //해당 게임의 id와 호스트 id를 비교하여, 해당 게임의 호스트가 맞는지 체크 - if (!game.isHost(gameJoinRequestNotificationEvent.getGameId())) { + if (!game.isHost(gameJoinRequestNotificationEvent.getHost().getId())) { throw new GameException(GAME_IS_NOT_HOST, gameId, game.getHost()); } } @@ -145,7 +127,6 @@ private Game getGameInfo(final Long gameId) { return game; } - private Member getMemberInfo(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); @@ -161,13 +142,11 @@ private List getGameMembers(final Long gameId, final RegistrationStatus return game.getMembersByStatus(status); } - //SSE 알람을 발송하는 부분 public void emitMessage(final GameAlarmResponse gameAlarm) { final Long gameId = gameAlarm.getGameId(); final Member gameHost = getHostOfGame(gameId); final List gameApplyMembers = getGameMembers(gameId, WAITING); - //1. SSE로 알람 생성 - 각 케이스 별 알람 생성(호스트와 게스트에게 메시지 전송) sendAlarmToGameHost(gameHost, gameAlarm); sendAlarmToGameApplyMembers(gameApplyMembers, gameAlarm); } @@ -184,91 +163,43 @@ private void sendAlarmToMember(final Member member, final GameAlarmResponse game } } - //게임 호스트에게 가입 신청이 올 시 받는 알람 private void sendAlarmToGameHost(final Member gameHost, final GameAlarmResponse gameAlarm) { sendAlarmToMember(gameHost, gameAlarm); } - //회원(게스트 - 대기)에게 호스트가 승락 시, 상태가 Confirmed로 변하며 승락되었다는 알람 - //회원(게스트 - 대기)에게 호스트가 거절 시, 게임 참여자(Game Memmber) 테이블에서 삭제되며, 거절되었다는 알람 private void sendAlarmToGameApplyMembers(List members, GameAlarmResponse gameAlarm) { for (final Member member : members) { sendAlarmToMember(member, gameAlarm); } } - //저장된 게임 알람을 모두 찾기 위한 메소드 - public List findGameAlarmAll() { - //1.DB에서 모든 GameAlarm을 조회 - List gameAlarms = gameAlarmRepository.findAll(); - - //2.조회한 GameAlarm을 GameAlarmResponse로 변환 - List gameAlarmResponses = gameAlarms.stream() - .map(GameAlarmResponse::of) - .collect(Collectors.toList()); - - //3.변환한 GameAlarmResponse를 반환 - return gameAlarmResponses; - } - - //게임 알람에서 isRead가 False가 있는지 체크하는 메소드 public boolean checkUnreadGameAlarm(final Long memberId) { - //1. 해당 회원의 읽지 않은 알람이 있는지 체크함 final boolean existsUnreadGameAlarm = gameAlarmRepository.existsByMemberIdAndIsRead(memberId, FALSE); - - //2. 반환 return existsUnreadGameAlarm; } - //게임 알림 찾기 By ID - public GameAlarm findGameAlarmById(final Long gameAlarmId) { - //1.알람 ID로 해당 알림 찾기 - final GameAlarm gameAlarm = checkExistGameAlarm(gameAlarmId); - - //2.찾은 알람 반환 - return gameAlarm; - } - - //게임 알림 변경 By ID - public void updateGameAlarmStatus(final Long gameAlarmId, final String isRead) { - //1. 알람 ID로 해당 알림 찾기 - final GameAlarm gameAlarm = checkExistGameAlarm(gameAlarmId); - final AlarmStatus alarmStatus = AlarmStatus.from(isRead); - - //2. 상태 업데이트 - gameAlarm.updateStatus(alarmStatus); - - //3. 저장 - gameAlarmRepository.save(gameAlarm); - } - - private GameAlarm checkExistGameAlarm(final Long gameAlarmId) { - final GameAlarm gameAlarm = gameAlarmRepository.findById(gameAlarmId) - .orElseThrow(() -> new AlarmException(ALARM_NOT_FOUND, gameAlarmId)); - - return gameAlarm; + public void deleteAllGameAlarms(final Long memberId) { + gameAlarmRepository.deleteByMemberId(memberId); } - //게임의 모든 알림을 삭제 - public void deleteAllGameAlarms() { - //1.DB에서 생성된 모든 게임 알람을 삭제함 - gameAlarmRepository.deleteAll(); - } + public void updateGameAlarmById( + final Long loggedInMemberId, + final Long gameAlarmId, + final GameAlarmUpdateStatusRequest gameAlarmUpdateStatusRequest + ) { + final Member member = findMemberById(loggedInMemberId); + final GameAlarm gameAlarm = checkExistGameAlarm(loggedInMemberId, gameAlarmId); - //1. memberId와 cursorid를 이용하여 GameAlarm이 있는지 확인하고 반환 - public boolean existsGameAlarmByMemberIdAndIdLessThan(final Long memberId, final Long id) { - return gameAlarmRepository.existsByMemberIdAndIdLessThan(memberId, id); + gameAlarm.updateStatus(gameAlarmUpdateStatusRequest.getIsRead()); } - //2.memberId와 cursorid를 이용하여 GameAlarm을 가져오며, 그 결과를 GameAlarmResponse로 변환하여 반환 - public List findGameAlarmByMemberIdOrderByIdDesc(final Long memberId, final Pageable page) { - List gameAlarms = gameAlarmRepository.findByMemberIdOrderByIdDesc(memberId, page); - return gameAlarms.stream().map(GameAlarmResponse::of).collect(Collectors.toList()); + private Member findMemberById(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } - //3.memberId와 id를 이용하여 GameAlarm을 가져오고, 그 결과를 GameAlarmResponse로 변환하여 반환 - public List findGameAlarmByMemberIdAndIdLessThanOrderByIdDesc(final Long memberId, final Long cursorId, final Pageable page) { - List gameAlarms = gameAlarmRepository.findByMemberIdAndIdLessThanOrderByIdDesc(memberId, cursorId, page); - return gameAlarms.stream().map(GameAlarmResponse::of).collect(Collectors.toList()); + private GameAlarm checkExistGameAlarm(final Long memberId, final Long gameAlarmId) { + return gameAlarmRepository.findByMemberIdAndId(memberId, gameAlarmId) + .orElseThrow(() -> new AlarmException(ALARM_NOT_FOUND, memberId, gameAlarmId)); } } From f0e490a4b30664ca057c7ce1dc8436ee82ddb96b Mon Sep 17 00:00:00 2001 From: jay-so Date: Thu, 23 Nov 2023 00:24:55 +0900 Subject: [PATCH 52/78] =?UTF-8?q?refactor:=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=20=EC=83=9D=EC=84=B1,=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EB=B6=80=EB=B6=84=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20&=20=EC=8B=A4=EC=8B=9C=EA=B0=84=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=95=8C=EB=9E=8C=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/dto/response/CrewAlarmResponse.java | 6 +- .../back/alarm/service/CrewAlarmService.java | 142 ++++-------------- 2 files changed, 33 insertions(+), 115 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index 92519dd4..4f716e38 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import kr.pickple.back.alarm.domain.AlarmStatus; -import kr.pickple.back.alarm.domain.AlarmType; import kr.pickple.back.alarm.domain.CrewAlarm; +import kr.pickple.back.alarm.domain.CrewAlarmType; import kr.pickple.back.crew.domain.Crew; import lombok.Builder; import lombok.Getter; @@ -22,7 +22,7 @@ public class CrewAlarmResponse implements AlarmResponse { private final String crewName; private final LocalDateTime createdAt; private final AlarmStatus isRead; - private final AlarmType alarmType; + private final CrewAlarmType crewAlarmType; public static CrewAlarmResponse of(final CrewAlarm crewAlarm) { final Crew crew = crewAlarm.getCrew(); @@ -33,7 +33,7 @@ public static CrewAlarmResponse of(final CrewAlarm crewAlarm) { .crewName(crewAlarm.getCrew().getName()) .createdAt(crewAlarm.getCreatedAt()) .isRead(crewAlarm.getIsRead()) - .alarmType(crewAlarm.getAlarmType()) + .crewAlarmType(crewAlarm.getCrewAlarmType()) .build(); } diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 6cf6e3f6..9a1490f0 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -1,14 +1,12 @@ package kr.pickple.back.alarm.service; -import kr.pickple.back.alarm.domain.Alarm; -import kr.pickple.back.alarm.domain.AlarmStatus; import kr.pickple.back.alarm.domain.CrewAlarm; +import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alarm.exception.AlarmException; -import kr.pickple.back.alarm.repository.AlarmRepository; import kr.pickple.back.alarm.repository.CrewAlarmRepository; import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.common.domain.RegistrationStatus; @@ -20,23 +18,21 @@ import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.util.List; -import java.util.stream.Collectors; import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; -import static kr.pickple.back.alarm.domain.AlarmType.*; +import static kr.pickple.back.alarm.domain.CrewAlarmType.*; import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_NOT_FOUND; import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; -//SSE 연결 로직에서는 @Transcational금지 @Slf4j @Service @RequiredArgsConstructor @@ -46,103 +42,75 @@ public class CrewAlarmService { private final CrewRepository crewRepository; private final CrewAlarmRepository crewAlarmRepository; private final SseEmitters sseEmitters; - private final AlarmRepository alarmRepository; - //크루 알림 생성 public CrewAlarmResponse createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - //1.크루 리포지토리에서 해당 크루의 리더인지 확인 + validateIsLeader(crewJoinRequestNotificationEvent); - //2.이벤트로 부터 크루 정보 가져오기 final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); final Member leader = crew.getLeader(); - //3. 알람 생성 final CrewAlarm crewAlarm = CrewAlarm.builder() .crew(crew) .member(leader) - .alarmType(CREW_LEADER_WAITING) + .crewAlarmType(CREW_LEADER_WAITING) .build(); - //4. DB에다가 알람 저장 crewAlarmRepository.save(crewAlarm); - //5.통합 알람 엔티티 생성 및 저장 - final Alarm alarm = Alarm.builder() - .member(leader) - .crewAlarm(crewAlarm) - .build(); - alarmRepository.save(alarm); - final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); - //alarmService.notify(leader.getId(), response); - sseEmitters.notify(leader.getId(), response); + sseEmitters.notify(leader.getId(), response); return response; } public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewMemberJoinedEvent crewMemberJoinedEvent) { - //1.이벤트로부터 크루 정보, 회원 정보 가져오기 final Long crewId = crewMemberJoinedEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); final Long memberId = crewMemberJoinedEvent.getMemberId(); final Member member = getMemberInfo(memberId); - //3. 알람 생성 final CrewAlarm crewAlarm = CrewAlarm.builder() .crew(crew) .member(member) - .alarmType(CREW_ACCEPT) + .crewAlarmType(CREW_ACCEPT) .build(); - //4. 알람 DB에다가 저장 crewAlarmRepository.save(crewAlarm); - //5.통합 알람 엔티티 생성 및 저장 - final Alarm alarm = Alarm.builder() - .member(member) - .crewAlarm(crewAlarm) - .build(); - alarmRepository.save(alarm); - final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); - //alarmService.notify(member.getId(), response); - sseEmitters.notify(member.getId(), response); + sseEmitters.notify(member.getId(), response); return response; } public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewMemberRejectedEvent crewMemberRejectedEvent) { - //1.이벤트로 부터 크루 정보,회원 정보 가져오기 final Long crewId = crewMemberRejectedEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); final Long memberId = crewMemberRejectedEvent.getMemberId(); final Member member = getMemberInfo(memberId); - //3. 알람 생성 final CrewAlarm crewAlarm = CrewAlarm.builder() .crew(crew) .member(member) - .alarmType(CREW_DENIED) + .crewAlarmType(CREW_DENIED) .build(); - - //4. 알람 DB에다가 저장 crewAlarmRepository.save(crewAlarm); final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); - //alarmService.notify(member.getId(), response); - sseEmitters.notify(member.getId(), response); + sseEmitters.notify(member.getId(), response); return response; } private Crew getCrewInfo(final Long crewId) { final Crew crew = crewRepository.findById(crewId) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + return crew; } @@ -166,21 +134,17 @@ private void validateIsLeader(final CrewJoinRequestNotificationEvent crewJoinReq final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); final Crew crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - //해당 크루의 id와 크루장의 id를 비교하여 해당 크루장이 맞는지 체크 - if (!crew.isLeader(crewJoinRequestNotificationEvent.getCrewId())) { + if (!crew.isLeader(crewJoinRequestNotificationEvent.getCrewLeader().getId())) { throw new CrewException(CREW_IS_NOT_LEADER, crewId, crew.getLeader()); } } - - //SSE알람을 발송하는 부분 public void emitMessage(final CrewAlarmResponse crewAlarm) { final Long crewId = crewAlarm.getCrewId(); final Member crewLeader = getCrewLeaderOfCrew(crewId); final List crewApplyMembers = getCrewMembers(crewId, WAITING); - //1. SSE로 알람 생성 - 각 케이스 별 알람 생성(크루장과 지원자에게 메시지 전송) sendAlarmToCrewLeader(crewLeader, crewAlarm); sendAlarmToCrewApplyMembers(crewApplyMembers, crewAlarm); } @@ -197,91 +161,45 @@ private void sendAlarmToMember(final Member member, final CrewAlarmResponse crew } } - //크루장에게 가입 신청이 올 시 받는 알람 private void sendAlarmToCrewLeader(final Member leader, final CrewAlarmResponse crewAlarm) { sendAlarmToMember(leader, crewAlarm); } - //회원(크루원 - 대기)에게 크루장이 승락 시, 상태가 Confired로 변하며 승락되었다는 알람 - //회원(크루원 - 대기)에게 크루장이 거절 시, 크루원 테이블에서 삭제되며, 거절되었다는 알람 private void sendAlarmToCrewApplyMembers(final List members, final CrewAlarmResponse crewAlarm) { for (final Member member : members) { sendAlarmToMember(member, crewAlarm); } } - //저장된 크루 알람을 모두 찾기 위한 메소드 - public List findCrewAlarmAll() { - //1.DB에서 모든 CrewAlarm을 조회 - List crewAlarms = crewAlarmRepository.findAll(); - - //2.조회한 CrewAlarm을 CrewAlarmResponse로 변환 - List crewAlarmResponses = crewAlarms.stream() - .map(CrewAlarmResponse::of) - .collect(Collectors.toList()); - - //3.변환한 CrewAlarmResponse를 반환 - return crewAlarmResponses; - } - - //크루 알림에서 isRead가 False가 있는지 체크하는 메소드 public boolean checkUnreadCrewAlarm(final Long memberId) { - //1.해당 회원의 읽지 않은 알람이 있는지 체크함 final boolean existsUnreadCrewAlarm = crewAlarmRepository.existsByMemberIdAndIsRead(memberId, FALSE); - - //2.반환 return existsUnreadCrewAlarm; } - //크루 알림 찾기 By ID - public CrewAlarm findCrewAlarmById(final Long crewAlarmId) { - //1. 알람 ID로 해당 알림 찾기 - final CrewAlarm crewAlarm = checkExistCrewAlarm(crewAlarmId); - - //2.찾는 알람 반환 - return crewAlarm; - } - - //크루 알람 상태 변경 - public void updateCrewAlarmStatus(final Long crewAlarmId, final String isRead) { - //1.알람 ID로 해당 알림 찾기 - final CrewAlarm crewAlarm = checkExistCrewAlarm(crewAlarmId); - final AlarmStatus alarmStatus = AlarmStatus.from(isRead); - - //2.상태 업데이트 - crewAlarm.updateStatus(alarmStatus); - - //3.저장 - crewAlarmRepository.save(crewAlarm); - } - - private CrewAlarm checkExistCrewAlarm(final Long crewAlarmId) { - final CrewAlarm crewAlarm = crewAlarmRepository.findById(crewAlarmId) - .orElseThrow(() -> new AlarmException(ALARM_NOT_FOUND, crewAlarmId)); - - return crewAlarm; + @Transactional + public void deleteAllCrewAlarms(final Long memberId) { + crewAlarmRepository.deleteByMemberId(memberId); } - //크루 알림 삭제 - public void deleteAllCrewAlarms() { - //1.DB에서 생성된 모든 크루 알람을 삭제함 - crewAlarmRepository.deleteAll(); - } + @Transactional + public void updateCrewAlarmById( + final Long loggedInMemberId, + final Long crewAlarmId, + final CrewAlarmUpdateStatusRequest crewAlarmUpdateStatusRequest + ) { + final Member member = findMemberById(loggedInMemberId); + final CrewAlarm crewAlarm = checkExistCrewAlarm(loggedInMemberId, crewAlarmId); - //1. memberId와 cursorid를 이용하여 CrewAlarm이 있는지 확인하고 반환 - public boolean existsCrewAlarmByMemberIdAndIdLessThan(final Long memberId, final Long id) { - return crewAlarmRepository.existsByMemberIdAndIdLessThan(memberId, id); + crewAlarm.updateStatus(crewAlarmUpdateStatusRequest.getIsRead()); } - //2.memberId와 cursorid를 이용하여 CrewAlarm을 가져오며, 그 결과를 CrewAlarmResponse로 변환하여 반환 - public List findCrewAlarmByMemberIdOrderByIdDesc(final Long memberId, final Pageable page) { - List crewAlarms = crewAlarmRepository.findByMemberIdOrderByIdDesc(memberId, page); - return crewAlarms.stream().map(CrewAlarmResponse::of).collect(Collectors.toList()); + private Member findMemberById(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } - //3.memberId와 id를 이용하여 CrewAlarm을 가져오고, 그 결과를 CrewAlarmResponse로 변환하여 반환 - public List findCrewAlarmByMemberIdAndIdLessThanOrderByIdDesc(final Long memberId, final Long cursorId, final Pageable page) { - List crewAlarms = crewAlarmRepository.findByMemberIdAndIdLessThanOrderByIdDesc(memberId, cursorId, page); - return crewAlarms.stream().map(CrewAlarmResponse::of).collect(Collectors.toList()); + public CrewAlarm checkExistCrewAlarm(final Long memberId, final Long crewAlarmId) { + return crewAlarmRepository.findByMemberIdAndId(memberId, crewAlarmId) + .orElseThrow(() -> new AlarmException(ALARM_NOT_FOUND, memberId, crewAlarmId)); } } From 1d26c29c36965dc45501842f29da1cd43b0c0d38 Mon Sep 17 00:00:00 2001 From: jay-so Date: Thu, 23 Nov 2023 00:39:18 +0900 Subject: [PATCH 53/78] =?UTF-8?q?refactor:=20=EC=8B=A4=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=20=EC=95=8C=EB=9E=8C=20=EC=97=B0=EA=B2=B0=20=EB=B0=8F=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EC=82=AC=EC=9A=A9=EC=9E=90=EC=9D=98=20?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EC=95=8C=EB=9E=8C=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8,=20=EC=82=AD=EC=A0=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/dto/response/AlarmResponse.java | 5 +- .../back/alarm/service/AlarmService.java | 107 ++---------------- 2 files changed, 9 insertions(+), 103 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java index 07d1dd16..f6a133ca 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java @@ -2,9 +2,8 @@ import java.time.LocalDateTime; -//CrewAlarmResponse나 GameAlarmResponse는 서로 다른 클래스임으로, 하나의 리스트에 넣기 위해 공통 인터페이스 생성 public interface AlarmResponse { - LocalDateTime getCreatedAt(); + LocalDateTime getCreatedAt(); - Long getId(); + Long getId(); } diff --git a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java index fde8cfe4..039ea4c5 100644 --- a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -1,35 +1,21 @@ package kr.pickple.back.alarm.service; import kr.pickple.back.alarm.domain.AlarmExistsStatus; -import kr.pickple.back.alarm.domain.CrewAlarm; -import kr.pickple.back.alarm.domain.GameAlarm; -import kr.pickple.back.alarm.dto.response.AlarmResponse; -import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; -import kr.pickple.back.alarm.dto.response.GameAlarmResponse; -import kr.pickple.back.alarm.exception.AlarmException; -import kr.pickple.back.alarm.exception.AlarmExceptionCode; -import kr.pickple.back.alarm.repository.AlarmRepository; -import kr.pickple.back.alarm.util.CursorResult; import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; import static kr.pickple.back.alarm.domain.AlarmExistsStatus.EXISTS; import static kr.pickple.back.alarm.domain.AlarmExistsStatus.NOT_EXISTS; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; -//SSE 연결 로직에서는 @Transcational금지 @Service @RequiredArgsConstructor public class AlarmService { @@ -37,19 +23,16 @@ public class AlarmService { private final GameAlarmService gameAlarmService; private final CrewAlarmService crewAlarmService; private final MemberRepository memberRepository; - private final AlarmRepository alarmRepository; private final SseEmitters sseEmitters; - - //1.SSE 연결 - 이벤트가 발생 된 후, 30초동안 지속 연결 public SseEmitter subscribeToSse(final Long loggedInMemberId) { final Member member = findMemberById(loggedInMemberId); final SseEmitter emitter = new SseEmitter(); try { emitter.send(SseEmitter.event() - .name("AlarmSseConnect") // 해당 이벤트의 이름 지정 - .data("사용자에 대한 알람 SSE 연결이 정상적으로 처리되었습니다.")); // 503 에러 방지를 위한 더미 데이터 + .name("AlarmSseConnect") + .data("사용자에 대한 알람 SSE 연결이 정상적으로 처리되었습니다.")); } catch (IOException e) { sseEmitters.remove(loggedInMemberId); emitter.completeWithError(e); @@ -58,57 +41,7 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { return emitter; } - //1. 해당 사용자의 모든 알람 목록 조회 시 - 생성일 순 - //2. 두, 알림에 대해서 가장 빠른 생성일 순으로 조회 - public CursorResult findAllAlarms(final Long loggedInMemberId, final Long cursorId, final Integer size) { - final Member member = findMemberById(loggedInMemberId); - - Pageable page = PageRequest.of(0, size); - - //1.각 알림을 조회하고, Response DTO로 변환 - List crewAlarmResponses; - List gameAlarmResponses; - - //1-1.초기 페이징 처리 - if (cursorId == 0) { - crewAlarmResponses = crewAlarmService.findCrewAlarmByMemberIdOrderByIdDesc(member.getId(), page); - gameAlarmResponses = gameAlarmService.findGameAlarmByMemberIdOrderByIdDesc(member.getId(), page); - } else { - crewAlarmResponses = crewAlarmService.findCrewAlarmByMemberIdAndIdLessThanOrderByIdDesc(member.getId(), cursorId, page); - gameAlarmResponses = gameAlarmService.findGameAlarmByMemberIdAndIdLessThanOrderByIdDesc(member.getId(), cursorId, page); - } - - //2.서로 다른 알람을 하나의 리스트에 넣음 - List alarmResponses = new ArrayList<>(); - alarmResponses.addAll(crewAlarmResponses); - alarmResponses.addAll(gameAlarmResponses); - - //3.서로 다른 알람들을 생성일 순으로 정렬 - alarmResponses.sort(Comparator.comparing(AlarmResponse::getCreatedAt).reversed()); - - //3-1.초기 알람 사이즈 - if (alarmResponses.size() > size) { - alarmResponses = alarmResponses.subList(0, size); - } - - final Long lastIdOfList = alarmResponses.isEmpty() ? null : alarmResponses.get(alarmResponses.size() - 1).getId(); - - return CursorResult.builder() - .alarmResponses(alarmResponses) - .hasNext(hasNext(member.getId(), lastIdOfList)) - .build(); - } - - //크루와 게임에 대한 다음 페이지가 있는지 확인 - private boolean hasNext(final Long memberId, final Long id) { - return crewAlarmService.existsCrewAlarmByMemberIdAndIdLessThan(memberId, id) || gameAlarmService.existsGameAlarmByMemberIdAndIdLessThan(memberId, id); - } - - //특정 알림 읽음, 읽지 않음 상태 확인 - //1. memberId를 통해, 각 알림의 Repository에서 읽지 않은 알림이 있는지 판별 - //2. 크루 관련 알람 -> 해당 사용자의 크루 관련 알람의 읽지 않은 상태 확인(checkUnreadCrewAlarm)메소드 -> 있다면 True반환 - //2. 게임 관련 알람 -> 해당 사용자의 게임 관련 알람의 읽지 않은 상태 확인( checkUnreadGameAlarm)메소드 -> 있다면 True반환 - //3. 두 알림 중 하나라도 읽지 않은 상태가 있다면 True를 , 두 알림 중 모두 읽은 상태라면 False를 반환 + @Transactional public AlarmExistsStatus checkUnReadAlarms(final Long loggedInMemberId) { final boolean existsUnreadCrewAlarm = crewAlarmService.checkUnreadCrewAlarm(loggedInMemberId); final boolean existsUnreadGameAlarm = gameAlarmService.checkUnreadGameAlarm(loggedInMemberId); @@ -116,38 +49,12 @@ public AlarmExistsStatus checkUnReadAlarms(final Long loggedInMemberId) { return existsUnreadCrewAlarm || existsUnreadGameAlarm ? EXISTS : NOT_EXISTS; } - //특정 알림 수정 - 해당 id가 각 크루,게임 알림 중, 어떤 것인지 판별하고 읽음 처리 - //1. alarmId를 통해, 들어온 알람이 어떤 알람인지 판별 - //2. 크루 관련 알람 -> 해당 크루 관련 알람을 찾음(findById)메소드 -> 상태 수정(updateById) 메소드 - //3. 게임 관련 알람 -> 해당 게임 관련 알람을 찾음(findById)메소드 -> 상태 수정(updateById) 메소드 - public void updateAlarmById(final Long loggedInMemberId, final Long alarmId, final String isRead) { - //1.해당 회원의 ID가 있는지 체크 - final Member member = findMemberById(loggedInMemberId); - - //2.해당 알람이 어떤 알람인지 판별 - final GameAlarm gameAlarm = gameAlarmService.findGameAlarmById(alarmId); - final CrewAlarm crewAlarm = crewAlarmService.findCrewAlarmById(alarmId); - - //3.해당 알람이 어떤 알람인지 확인하고, 상태 수정 - if (gameAlarm != null) { - gameAlarmService.updateGameAlarmStatus(alarmId, isRead); - } - - if (crewAlarm != null) { - crewAlarmService.updateCrewAlarmStatus(alarmId, isRead); - } - //아니면 - throw new AlarmException(AlarmExceptionCode.ALARM_NOT_FOUND, alarmId); - } - - //모든 알림 삭제 - 모든 알림들을 삭제함 + @Transactional public void deleteAllAlarms(final Long loggedInMemberId) { - //1.해당 회원의 ID가 있는지 체크 final Member member = findMemberById(loggedInMemberId); - //2. 모든 알람을 삭제함 - 해당 회원의 크루 알람, 게임 알람 - crewAlarmService.deleteAllCrewAlarms(); - gameAlarmService.deleteAllGameAlarms(); + crewAlarmService.deleteAllCrewAlarms(member.getId()); + gameAlarmService.deleteAllGameAlarms(member.getId()); } private Member findMemberById(final Long memberId) { From b97e336e21dab0a6874fec88afd4267e3a56a377 Mon Sep 17 00:00:00 2001 From: jay-so Date: Thu, 23 Nov 2023 00:40:43 +0900 Subject: [PATCH 54/78] =?UTF-8?q?refactor:=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C,=20=EA=B2=8C=EC=9E=84=20=EC=95=8C=EB=9E=8C?= =?UTF-8?q?=20=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alarm/repository/AlarmRepository.java | 8 -------- .../back/alarm/repository/CrewAlarmRepository.java | 11 ++++------- .../back/alarm/repository/GameAlarmRepository.java | 11 ++++------- 3 files changed, 8 insertions(+), 22 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java diff --git a/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java deleted file mode 100644 index dee02af8..00000000 --- a/src/main/java/kr/pickple/back/alarm/repository/AlarmRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package kr.pickple.back.alarm.repository; - -import kr.pickple.back.alarm.domain.Alarm; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface AlarmRepository extends JpaRepository { - Boolean existsByIdLessThan(final Long id); -} diff --git a/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java index e7a8342f..85cf3ce2 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java @@ -2,18 +2,15 @@ import kr.pickple.back.alarm.domain.AlarmStatus; import kr.pickple.back.alarm.domain.CrewAlarm; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; +import java.util.Optional; public interface CrewAlarmRepository extends JpaRepository { - List findByMemberIdAndIdLessThanOrderByIdDesc(final Long memberId, final Long id, final Pageable page); - - boolean existsByMemberIdAndIdLessThan(final Long memberId, final Long id); - boolean existsByMemberIdAndIsRead(final Long memberId, final AlarmStatus alarmStatus); - List findByMemberIdOrderByIdDesc(final Long memberId, final Pageable page); + void deleteByMemberId(final Long memberId); + + Optional findByMemberIdAndId(final Long memberId, final Long crewAlarmId); } diff --git a/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java index 7ca0a45f..e198345f 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java @@ -2,18 +2,15 @@ import kr.pickple.back.alarm.domain.AlarmStatus; import kr.pickple.back.alarm.domain.GameAlarm; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; +import java.util.Optional; public interface GameAlarmRepository extends JpaRepository { - List findByMemberIdAndIdLessThanOrderByIdDesc(final Long memberId, final Long id, final Pageable page); - - boolean existsByMemberIdAndIdLessThan(final Long memberId, final Long id); - boolean existsByMemberIdAndIsRead(final Long memberId, final AlarmStatus alarmStatus); - List findByMemberIdOrderByIdDesc(final Long memberId, final Pageable page); + void deleteByMemberId(final Long memberId); + + Optional findByMemberIdAndId(final Long memberId, final Long gameAlarmId); } From 146eb3075326a878ef153cdcb1539c497ee37164 Mon Sep 17 00:00:00 2001 From: jay-so Date: Thu, 23 Nov 2023 00:47:52 +0900 Subject: [PATCH 55/78] =?UTF-8?q?style:=20AlarmController=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/http/alram/alarm.http | 19 ++++----- src/main/http/alram/crew-alarm.http | 9 +++++ src/main/http/alram/game-alarm.http | 9 +++++ src/main/http/crew/crew.http | 10 ++--- src/main/http/game/game.http | 2 +- .../alarm/controller/AlarmController.java | 39 ++++--------------- 6 files changed, 39 insertions(+), 49 deletions(-) create mode 100644 src/main/http/alram/crew-alarm.http create mode 100644 src/main/http/alram/game-alarm.http diff --git a/src/main/http/alram/alarm.http b/src/main/http/alram/alarm.http index 638e76ae..4ca2167c 100644 --- a/src/main/http/alram/alarm.http +++ b/src/main/http/alram/alarm.http @@ -1,17 +1,14 @@ -### 사용자 알람 sse 연결 +### 해당 사용자 알람 sse 연결 GET http://localhost:8080/alarms/subscribe Content-Type: text/event-stream -Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0IiwiaWF0IjoxNzAwNTU2NDYxLCJleHAiOjE3MDA1NzgwNjF9.ci0mYcVzCTmfwdduNH3HE6KmO-7SX5IqZi4TSuupsAtFc4TIPZeai6_Ock8IVJWnw6VzRziu5Tn2QDkaJbxoYQ +Authorization: - -### 사용자 읽지 않은 알림 확인 +### 해당 사용자 읽지 않은 알림 확인 GET http://localhost:8080/alarms/unread -Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0IiwiaWF0IjoxNzAwNTU3ODQ0LCJleHAiOjE3MDA1Nzk0NDR9.c-5-IbDQLouwzW44jMJzREVl84REZ8_BDN-znqfNxLUfC2xaCpJRQ0VOw5N1p7nyRcXtNswBZ-ZSLVRWevRO0g - -### 사용자 알림 수정 -PATCH http://localhost:8080/alarms/ -Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0IiwiaWF0IjoxNzAwNTU2NDYxLCJleHAiOjE3MDA1NzgwNjF9.ci0mYcVzCTmfwdduNH3HE6KmO-7SX5IqZi4TSuupsAtFc4TIPZeai6_Ock8IVJWnw6VzRziu5Tn2QDkaJbxoYQ +Authorization: +Content-Type: application/json -### 사용자 모든 알람 삭제 +### 해당 사용자의 모든 알람 삭제 DELETE http://localhost:8080/alarms -Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0IiwiaWF0IjoxNzAwNTU2NDYxLCJleHAiOjE3MDA1NzgwNjF9.ci0mYcVzCTmfwdduNH3HE6KmO-7SX5IqZi4TSuupsAtFc4TIPZeai6_Ock8IVJWnw6VzRziu5Tn2QDkaJbxoYQ +Authorization: +Content-Type: application/json diff --git a/src/main/http/alram/crew-alarm.http b/src/main/http/alram/crew-alarm.http new file mode 100644 index 00000000..2d4bee80 --- /dev/null +++ b/src/main/http/alram/crew-alarm.http @@ -0,0 +1,9 @@ + +### 해당 사용자 크루 관련 알람 상태 변경 +GET http://localhost:8080/crew-alarm/{crewAlarmId} +Authorization: +Content-Type: application/json + +{ + "isRead": true +} diff --git a/src/main/http/alram/game-alarm.http b/src/main/http/alram/game-alarm.http new file mode 100644 index 00000000..60f003b1 --- /dev/null +++ b/src/main/http/alram/game-alarm.http @@ -0,0 +1,9 @@ + +### 게임 관련 알람 상태 수정 +GET http://localhost:8080/game-alarm//{gameAlarmId} +Authorization: +Content-Type: application/json + +{ + "isRead": true +} diff --git a/src/main/http/crew/crew.http b/src/main/http/crew/crew.http index f353eba3..f0e20044 100644 --- a/src/main/http/crew/crew.http +++ b/src/main/http/crew/crew.http @@ -1,11 +1,11 @@ ### 크루 생성 POST http://localhost:8080/crews -Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyIiwiaWF0IjoxNzAwNTU5NTA3LCJleHAiOjE3MDA1ODExMDd9.ZqRftJH3Nqh4QR8ppoqaYkJscBm1FEcyvJOcBkOXAUgs1SOW_13XKNJ11fFJGOQUUAlAtnbFWib2BCXVv2eEfA +Authorization: Content-Type: application/json { - "name": "쿠쿠 크루", - "content": "안녕하세요, 쿠쿠 크루입니다. 백둥체육관 201호에서 진행합니다.", + "name": "밥솥 크루", + "content": "안녕하세요, 밭솥 크루입니다. 백둥체육관 201호에서 진행합니다.", "maxMemberCount": 15, "addressDepth1": "서울시", "addressDepth2": "강남구" @@ -15,8 +15,8 @@ Content-Type: application/json GET http://localhost:8080/crews/15 ### 크루가입 신청 -POST http://localhost:8080/crews/3/members -Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI2IiwiaWF0IjoxNzAwNTU4NTQyLCJleHAiOjE3MDA1ODAxNDJ9.fOR4siFedVYqaa5JHA0tIxVS22G0ppAlD8lKMDqpBaQgdCK7iUtPd7zzDg-XgXFOWWl_YcWUZSo9kvtqPOAFLA +POST http://localhost:8080/crews/11/members +Authorization: Content-Type: application/json diff --git a/src/main/http/game/game.http b/src/main/http/game/game.http index 01e9c953..c31c79c2 100644 --- a/src/main/http/game/game.http +++ b/src/main/http/game/game.http @@ -27,7 +27,7 @@ Content-Type: application/json Authorization: ### 게스트 모집 참여 신청 수락 -PATCH http://localhost:8080/games/38/members/2 +PATCH http://localhost:8080/games/2/members/3 Content-Type: application/json Authorization: diff --git a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java index 400300a3..162d80b2 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java @@ -1,15 +1,15 @@ package kr.pickple.back.alarm.controller; -import jakarta.validation.Valid; import kr.pickple.back.alarm.domain.AlarmExistsStatus; -import kr.pickple.back.alarm.dto.response.AlarmResponse; import kr.pickple.back.alarm.service.AlarmService; -import kr.pickple.back.alarm.util.CursorResult; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import static org.springframework.http.HttpStatus.NO_CONTENT; @@ -22,59 +22,34 @@ public class AlarmController { private final AlarmService alarmService; - //해당 사용자의 sse연결 @GetMapping(value = "/subscribe", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public ResponseEntity subscribeToSse( @Login final Long loggedInMemberId ) { final SseEmitter emitter = alarmService.subscribeToSse(loggedInMemberId); + return ResponseEntity.status(OK) .header("X-Accel-Buffering", "no") .body(emitter); } - //해당 사용자에게 미 알람이 있는지 체크 @GetMapping("/unread") public ResponseEntity findUnreadAlarm( @Login final Long loggedInMemberId ) { AlarmExistsStatus alarmExistsStatus = alarmService.checkUnReadAlarms(loggedInMemberId); + return ResponseEntity .status(OK) .body(alarmExistsStatus); - - } - - //모든 알람 조회시 - //처음에 cursorId 없으면 0,한번에 불러오는 size = 10 - @GetMapping - public ResponseEntity> findAllAlarms( - @Login final Long loggedInMemberId, - @RequestParam(defaultValue = "0") Long cursorId, - @RequestParam(defaultValue = "10") Integer size - ) { - return ResponseEntity.status(OK) - .body(alarmService.findAllAlarms(loggedInMemberId, cursorId, size)); } - //알람 수정 - @PatchMapping("/{alarmId}") - public ResponseEntity updateAlarmStatus( - @Login final Long loggedInMemberId, - @PathVariable final Long alarmId, - @Valid @RequestBody final String isRead - ) { - alarmService.updateAlarmById(loggedInMemberId, alarmId, isRead); - return ResponseEntity.status(NO_CONTENT) - .build(); - } - - //모든 알람 삭제 @DeleteMapping public ResponseEntity deleteAllAlarms( @Login final Long loggedInMemberId ) { alarmService.deleteAllAlarms(loggedInMemberId); + return ResponseEntity.status(NO_CONTENT) .build(); } From ddf10893d2b24c3d4d5d09dd703355a8a0e468ee Mon Sep 17 00:00:00 2001 From: jay-so Date: Thu, 23 Nov 2023 15:00:53 +0900 Subject: [PATCH 56/78] =?UTF-8?q?feat:=20AlarmExistStatus=20Response=20DTO?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/http/alram/alarm.http | 2 +- src/main/http/alram/crew-alarm.http | 2 +- src/main/http/alram/game-alarm.http | 2 +- .../back/alarm/controller/AlarmController.java | 8 ++++---- .../dto/response/AlarmExistStatusResponse.java | 18 ++++++++++++++++++ .../alarm/dto/response/CrewAlarmResponse.java | 4 ++-- .../alarm/dto/response/GameAlarmResponse.java | 4 ++-- .../back/alarm/service/AlarmService.java | 11 ++++++----- 8 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alarm/dto/response/AlarmExistStatusResponse.java diff --git a/src/main/http/alram/alarm.http b/src/main/http/alram/alarm.http index 4ca2167c..2c864fee 100644 --- a/src/main/http/alram/alarm.http +++ b/src/main/http/alram/alarm.http @@ -5,7 +5,7 @@ Authorization: ### 해당 사용자 읽지 않은 알림 확인 GET http://localhost:8080/alarms/unread -Authorization: +Authorization:Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzAwNzE3ODAyLCJleHAiOjE3MDA3Mzk0MDJ9.GEkK183UFNCu-qIgoNuhIW3cheA_xZPGfz-Dk1kz0e4QBV_dJIc9yADCB3w5tMupKTKu2PSdunzXXDCrPxUrzQ Content-Type: application/json ### 해당 사용자의 모든 알람 삭제 diff --git a/src/main/http/alram/crew-alarm.http b/src/main/http/alram/crew-alarm.http index 2d4bee80..7ae91040 100644 --- a/src/main/http/alram/crew-alarm.http +++ b/src/main/http/alram/crew-alarm.http @@ -1,6 +1,6 @@ ### 해당 사용자 크루 관련 알람 상태 변경 -GET http://localhost:8080/crew-alarm/{crewAlarmId} +POST http://localhost:8080/crew-alarm/{crewAlarmId} Authorization: Content-Type: application/json diff --git a/src/main/http/alram/game-alarm.http b/src/main/http/alram/game-alarm.http index 60f003b1..e9b95226 100644 --- a/src/main/http/alram/game-alarm.http +++ b/src/main/http/alram/game-alarm.http @@ -1,6 +1,6 @@ ### 게임 관련 알람 상태 수정 -GET http://localhost:8080/game-alarm//{gameAlarmId} +POST http://localhost:8080/game-alarm/{gameAlarmId} Authorization: Content-Type: application/json diff --git a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java index 162d80b2..5cf0031c 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java @@ -1,6 +1,6 @@ package kr.pickple.back.alarm.controller; -import kr.pickple.back.alarm.domain.AlarmExistsStatus; +import kr.pickple.back.alarm.dto.response.AlarmExistStatusResponse; import kr.pickple.back.alarm.service.AlarmService; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; @@ -34,14 +34,14 @@ public ResponseEntity subscribeToSse( } @GetMapping("/unread") - public ResponseEntity findUnreadAlarm( + public ResponseEntity findUnreadAlarm( @Login final Long loggedInMemberId ) { - AlarmExistsStatus alarmExistsStatus = alarmService.checkUnReadAlarms(loggedInMemberId); + AlarmExistStatusResponse response = alarmService.checkUnReadAlarms(loggedInMemberId); return ResponseEntity .status(OK) - .body(alarmExistsStatus); + .body(response); } @DeleteMapping diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/AlarmExistStatusResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/AlarmExistStatusResponse.java new file mode 100644 index 00000000..6422fc41 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/dto/response/AlarmExistStatusResponse.java @@ -0,0 +1,18 @@ +package kr.pickple.back.alarm.dto.response; + +import kr.pickple.back.alarm.domain.AlarmExistsStatus; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class AlarmExistStatusResponse { + + private final boolean unread; + + public static AlarmExistStatusResponse of(final AlarmExistsStatus status) { + return AlarmExistStatusResponse.builder() + .unread(status.getBooleanValue()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index 4f716e38..fa4b37d8 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -22,7 +22,7 @@ public class CrewAlarmResponse implements AlarmResponse { private final String crewName; private final LocalDateTime createdAt; private final AlarmStatus isRead; - private final CrewAlarmType crewAlarmType; + private final CrewAlarmType crewAlarmMessage; public static CrewAlarmResponse of(final CrewAlarm crewAlarm) { final Crew crew = crewAlarm.getCrew(); @@ -33,7 +33,7 @@ public static CrewAlarmResponse of(final CrewAlarm crewAlarm) { .crewName(crewAlarm.getCrew().getName()) .createdAt(crewAlarm.getCreatedAt()) .isRead(crewAlarm.getIsRead()) - .crewAlarmType(crewAlarm.getCrewAlarmType()) + .crewAlarmMessage(crewAlarm.getCrewAlarmType()) .build(); } diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index 7e11a76e..48253728 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -27,7 +27,7 @@ public class GameAlarmResponse implements AlarmResponse { private final LocalTime playStartTime; private final Integer playTimeMinutes; private final AlarmStatus isRead; - private final GameAlarmType gameAlarmType; + private final GameAlarmType gameAlarmMessage; public static GameAlarmResponse of(final GameAlarm gameAlarm) { final Game game = gameAlarm.getGame(); @@ -41,7 +41,7 @@ public static GameAlarmResponse of(final GameAlarm gameAlarm) { .playStartTime(gameAlarm.getGame().getPlayStartTime()) .playTimeMinutes(gameAlarm.getGame().getPlayTimeMinutes()) .isRead(gameAlarm.getIsRead()) - .gameAlarmType(gameAlarm.getGameAlarmType()) + .gameAlarmMessage(gameAlarm.getGameAlarmType()) .build(); } diff --git a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java index 039ea4c5..abd14215 100644 --- a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -1,6 +1,6 @@ package kr.pickple.back.alarm.service; -import kr.pickple.back.alarm.domain.AlarmExistsStatus; +import kr.pickple.back.alarm.dto.response.AlarmExistStatusResponse; import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.exception.MemberException; @@ -12,8 +12,6 @@ import java.io.IOException; -import static kr.pickple.back.alarm.domain.AlarmExistsStatus.EXISTS; -import static kr.pickple.back.alarm.domain.AlarmExistsStatus.NOT_EXISTS; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @@ -42,11 +40,14 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { } @Transactional - public AlarmExistsStatus checkUnReadAlarms(final Long loggedInMemberId) { + public AlarmExistStatusResponse checkUnReadAlarms(final Long loggedInMemberId) { final boolean existsUnreadCrewAlarm = crewAlarmService.checkUnreadCrewAlarm(loggedInMemberId); final boolean existsUnreadGameAlarm = gameAlarmService.checkUnreadGameAlarm(loggedInMemberId); + final boolean unreadAlarmExist = existsUnreadCrewAlarm || existsUnreadGameAlarm; - return existsUnreadCrewAlarm || existsUnreadGameAlarm ? EXISTS : NOT_EXISTS; + return AlarmExistStatusResponse.builder() + .unread(unreadAlarmExist) + .build(); } @Transactional From a5ffa159a1dd55dbe7f6553a2c6bf0624c2ec8c2 Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 01:23:51 +0900 Subject: [PATCH 57/78] =?UTF-8?q?chore:=20http=20=EB=82=B4=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/http/alram/alarm.http | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/http/alram/alarm.http b/src/main/http/alram/alarm.http index 2c864fee..4ca2167c 100644 --- a/src/main/http/alram/alarm.http +++ b/src/main/http/alram/alarm.http @@ -5,7 +5,7 @@ Authorization: ### 해당 사용자 읽지 않은 알림 확인 GET http://localhost:8080/alarms/unread -Authorization:Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzAwNzE3ODAyLCJleHAiOjE3MDA3Mzk0MDJ9.GEkK183UFNCu-qIgoNuhIW3cheA_xZPGfz-Dk1kz0e4QBV_dJIc9yADCB3w5tMupKTKu2PSdunzXXDCrPxUrzQ +Authorization: Content-Type: application/json ### 해당 사용자의 모든 알람 삭제 From f75859a6383d76bb4c3538029e6d18c7a90ac55a Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 02:17:58 +0900 Subject: [PATCH 58/78] =?UTF-8?q?style:=20api=EB=AA=85=20=EB=B3=B5?= =?UTF-8?q?=EC=88=98=ED=98=95=EC=9C=BC=EB=A1=9C=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/alarm/controller/CrewAlarmController.java | 2 +- .../kr/pickple/back/alarm/controller/GameAlarmController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java index 183da663..12c5d502 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java @@ -12,7 +12,7 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/crew-alarm") +@RequestMapping("/crew-alarms") public class CrewAlarmController { private final CrewAlarmService crewAlarmService; diff --git a/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java index 5faed07b..34be13fe 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java @@ -12,7 +12,7 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/game-alarm") +@RequestMapping("/game-alarms") public class GameAlarmController { private final GameAlarmService gameAlarmService; From 2edb980c440bc9a15445797ee10207d1ce8fbfe7 Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 02:34:53 +0900 Subject: [PATCH 59/78] =?UTF-8?q?refactor:=20=EC=BB=A4=EC=84=9C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=95=20=EA=B4=80=EB=A0=A8=20Response=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alarm/dto/response/AlarmResponse.java | 9 --------- .../back/alarm/dto/response/CrewAlarmResponse.java | 12 +----------- .../back/alarm/dto/response/GameAlarmResponse.java | 12 +----------- 3 files changed, 2 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java deleted file mode 100644 index f6a133ca..00000000 --- a/src/main/java/kr/pickple/back/alarm/dto/response/AlarmResponse.java +++ /dev/null @@ -1,9 +0,0 @@ -package kr.pickple.back.alarm.dto.response; - -import java.time.LocalDateTime; - -public interface AlarmResponse { - LocalDateTime getCreatedAt(); - - Long getId(); -} diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index fa4b37d8..76660eb2 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -15,7 +15,7 @@ @Builder @JsonSerialize @RequiredArgsConstructor -public class CrewAlarmResponse implements AlarmResponse { +public class CrewAlarmResponse { private final Long id; private final Long crewId; @@ -36,14 +36,4 @@ public static CrewAlarmResponse of(final CrewAlarm crewAlarm) { .crewAlarmMessage(crewAlarm.getCrewAlarmType()) .build(); } - - @Override - public LocalDateTime getCreatedAt() { - return this.createdAt; - } - - @Override - public Long getId() { - return this.id; - } } diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index 48253728..7937451d 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -17,7 +17,7 @@ @Builder @JsonSerialize @RequiredArgsConstructor -public class GameAlarmResponse implements AlarmResponse { +public class GameAlarmResponse { private final Long id; private final Long gameId; @@ -44,14 +44,4 @@ public static GameAlarmResponse of(final GameAlarm gameAlarm) { .gameAlarmMessage(gameAlarm.getGameAlarmType()) .build(); } - - @Override - public LocalDateTime getCreatedAt() { - return this.createdAt; - } - - @Override - public Long getId() { - return this.id; - } } From ef5fb413f5904d04b5e1bdec22738507d7020fbc Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 02:37:41 +0900 Subject: [PATCH 60/78] =?UTF-8?q?style:=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=ED=8C=80=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/alarm/dto/response/CrewAlarmResponse.java | 2 +- .../pickple/back/alarm/dto/response/GameAlarmResponse.java | 2 +- .../kr/pickple/back/alarm/service/CrewAlarmService.java | 6 +++--- .../kr/pickple/back/alarm/service/GameAlarmService.java | 6 +++--- .../pickple/back/auth/dto/response/AccessTokenResponse.java | 2 +- .../chat/dto/response/PersonalChatRoomExistedResponse.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index 76660eb2..1cf64048 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -24,7 +24,7 @@ public class CrewAlarmResponse { private final AlarmStatus isRead; private final CrewAlarmType crewAlarmMessage; - public static CrewAlarmResponse of(final CrewAlarm crewAlarm) { + public static CrewAlarmResponse from(final CrewAlarm crewAlarm) { final Crew crew = crewAlarm.getCrew(); return CrewAlarmResponse.builder() diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index 7937451d..a03dbce1 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -29,7 +29,7 @@ public class GameAlarmResponse { private final AlarmStatus isRead; private final GameAlarmType gameAlarmMessage; - public static GameAlarmResponse of(final GameAlarm gameAlarm) { + public static GameAlarmResponse from(final GameAlarm gameAlarm) { final Game game = gameAlarm.getGame(); return GameAlarmResponse.builder() diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 9a1490f0..dadb37c1 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -59,7 +59,7 @@ public CrewAlarmResponse createCrewJoinAlarm(final CrewJoinRequestNotificationEv crewAlarmRepository.save(crewAlarm); - final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); + final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); sseEmitters.notify(leader.getId(), response); return response; @@ -80,7 +80,7 @@ public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewMemberJoinedEven crewAlarmRepository.save(crewAlarm); - final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); + final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); sseEmitters.notify(member.getId(), response); return response; @@ -101,7 +101,7 @@ public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewMemberRejectedEve crewAlarmRepository.save(crewAlarm); - final CrewAlarmResponse response = CrewAlarmResponse.of(crewAlarm); + final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); sseEmitters.notify(member.getId(), response); return response; diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 7308351f..74a5b274 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -61,7 +61,7 @@ public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEv gameAlarmRepository.save(gameAlarm); - final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); + final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); sseEmitters.notify(host.getId(), response); return response; @@ -83,7 +83,7 @@ public GameAlarmResponse createGuestApproveAlarm(final GameMemberJoinedEvent gam gameAlarmRepository.save(gameAlarm); - final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); + final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); sseEmitters.notify(member.getId(), response); return response; @@ -105,7 +105,7 @@ public GameAlarmResponse createGuestDeniedAlarm(final GameMemberRejectedEvent ga gameAlarmRepository.save(gameAlarm); - final GameAlarmResponse response = GameAlarmResponse.of(gameAlarm); + final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); sseEmitters.notify(member.getId(), response); return response; diff --git a/src/main/java/kr/pickple/back/auth/dto/response/AccessTokenResponse.java b/src/main/java/kr/pickple/back/auth/dto/response/AccessTokenResponse.java index 90fdeec6..f0e9a3d7 100644 --- a/src/main/java/kr/pickple/back/auth/dto/response/AccessTokenResponse.java +++ b/src/main/java/kr/pickple/back/auth/dto/response/AccessTokenResponse.java @@ -4,7 +4,7 @@ import lombok.Getter; @Getter -@AllArgsConstructor(staticName = "of") +@AllArgsConstructor(staticName = "from") public class AccessTokenResponse { private String accessToken; diff --git a/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java index 6c701354..a14f36fb 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java @@ -4,7 +4,7 @@ import lombok.Getter; @Getter -@AllArgsConstructor(staticName = "of") +@AllArgsConstructor(staticName = "from") public class PersonalChatRoomExistedResponse { private Long roomId; From 9aa923ad1f9c0fddd7dca8ee1e9e726aeba20a63 Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 02:40:00 +0900 Subject: [PATCH 61/78] =?UTF-8?q?style:=20=EC=97=90=EB=9F=AC=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C,=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EA=B0=9C?= =?UTF-8?q?=ED=96=89=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/alarm/exception/AlarmExceptionCode.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java b/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java index 15dc79f9..ff32271c 100644 --- a/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java +++ b/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java @@ -9,13 +9,12 @@ @RequiredArgsConstructor public enum AlarmExceptionCode implements ExceptionCode { - ALARM_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-001", "알람 읽음 여부를 찾을 수 없음"), - ALARM_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-002", "알림 타입을 찾을 수 없음"), - ALARM_EXISTS_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-003", "사용자의 알람 상태 여부를 찾을 수 없음"), - ALARM_NOT_FOUND(HttpStatus.NOT_FOUND, "AEC-004", "해당 알람을 찾을 수 없음"), + ALARM_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "ALA-001", "알람 읽음 여부를 찾을 수 없음"), + ALARM_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "ALA-002", "알림 타입을 찾을 수 없음"), + ALARM_EXISTS_STATUS_NOT_FOUND(HttpStatus.NOT_FOUND, "ALA-003", "사용자의 알람 상태 여부를 찾을 수 없음"), + ALARM_NOT_FOUND(HttpStatus.NOT_FOUND, "ALA-004", "해당 알람을 찾을 수 없음"), ; - private final HttpStatus status; private final String code; private final String message; From d6ad7d59eb0bfd608399470cb4231170905a77d8 Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 13:59:13 +0900 Subject: [PATCH 62/78] =?UTF-8?q?refactor:=20thread=20pool=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kr/pickple/back/alarm/config/AsynConfig.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java b/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java index 5149e826..97796306 100644 --- a/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java +++ b/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java @@ -13,9 +13,9 @@ public class AsynConfig { @Bean public TaskExecutor taskExecutor() { return CustomThreadPoolTaskExecutor.builder() - .corePoolSize(50) - .maxPoolSize(70) - .queueCapacity(100) + .corePoolSize(30) + .maxPoolSize(50) + .queueCapacity(70) .build(); } From a76d0bdb95849f5ce550ce3341463ac00076e85d Mon Sep 17 00:00:00 2001 From: jay-so Date: Sat, 25 Nov 2023 02:24:36 +0900 Subject: [PATCH 63/78] =?UTF-8?q?style:=20=ED=81=AC=EB=A3=A8=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C,=20=EA=B2=8C=EC=9E=84=EC=95=8C=EB=9E=8C=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20=EC=95=8C=EB=9E=8C=20id=EB=AA=85=EC=9D=84=20?= =?UTF-8?q?=EB=AA=85=ED=99=95=ED=95=98=EA=B2=8C=20=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20crewAlarmId,gameAlarmId=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/dto/response/CrewAlarmResponse.java | 4 ++-- .../alarm/dto/response/GameAlarmResponse.java | 4 ++-- .../auth/dto/response/AccessTokenResponse.java | 2 +- .../pickple/back/auth/service/OauthService.java | 16 ++++++++-------- .../PersonalChatRoomExistedResponse.java | 2 +- .../back/chat/service/ChatRoomService.java | 15 +++++++-------- 6 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index 1cf64048..96c7c4be 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -17,7 +17,7 @@ @RequiredArgsConstructor public class CrewAlarmResponse { - private final Long id; + private final Long crewAlarmId; private final Long crewId; private final String crewName; private final LocalDateTime createdAt; @@ -28,7 +28,7 @@ public static CrewAlarmResponse from(final CrewAlarm crewAlarm) { final Crew crew = crewAlarm.getCrew(); return CrewAlarmResponse.builder() - .id(crewAlarm.getId()) + .crewAlarmId(crewAlarm.getId()) .crewId(crew.getId()) .crewName(crewAlarm.getCrew().getName()) .createdAt(crewAlarm.getCreatedAt()) diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index a03dbce1..9ba49af2 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -19,7 +19,7 @@ @RequiredArgsConstructor public class GameAlarmResponse { - private final Long id; + private final Long GameAlarmId; private final Long gameId; private final String mainAddress; private final LocalDateTime createdAt; @@ -33,7 +33,7 @@ public static GameAlarmResponse from(final GameAlarm gameAlarm) { final Game game = gameAlarm.getGame(); return GameAlarmResponse.builder() - .id(gameAlarm.getId()) + .GameAlarmId(gameAlarm.getId()) .gameId(game.getId()) .mainAddress(gameAlarm.getGame().getMainAddress()) .createdAt(gameAlarm.getCreatedAt()) diff --git a/src/main/java/kr/pickple/back/auth/dto/response/AccessTokenResponse.java b/src/main/java/kr/pickple/back/auth/dto/response/AccessTokenResponse.java index f0e9a3d7..90fdeec6 100644 --- a/src/main/java/kr/pickple/back/auth/dto/response/AccessTokenResponse.java +++ b/src/main/java/kr/pickple/back/auth/dto/response/AccessTokenResponse.java @@ -4,7 +4,7 @@ import lombok.Getter; @Getter -@AllArgsConstructor(staticName = "from") +@AllArgsConstructor(staticName = "of") public class AccessTokenResponse { private String accessToken; diff --git a/src/main/java/kr/pickple/back/auth/service/OauthService.java b/src/main/java/kr/pickple/back/auth/service/OauthService.java index fa9fd675..aa368188 100644 --- a/src/main/java/kr/pickple/back/auth/service/OauthService.java +++ b/src/main/java/kr/pickple/back/auth/service/OauthService.java @@ -1,13 +1,5 @@ package kr.pickple.back.auth.service; -import static kr.pickple.back.auth.exception.AuthExceptionCode.*; - -import java.time.LocalDateTime; -import java.util.Optional; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.config.resolver.TokenExtractor; import kr.pickple.back.auth.domain.oauth.OauthMember; @@ -24,6 +16,14 @@ import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Optional; + +import static kr.pickple.back.auth.exception.AuthExceptionCode.AUTH_FAIL_TO_VALIDATE_TOKEN; +import static kr.pickple.back.auth.exception.AuthExceptionCode.AUTH_INVALID_REFRESH_TOKEN; @Service @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java index a14f36fb..6c701354 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java @@ -4,7 +4,7 @@ import lombok.Getter; @Getter -@AllArgsConstructor(staticName = "from") +@AllArgsConstructor(staticName = "of") public class PersonalChatRoomExistedResponse { private Long roomId; diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index c3490367..79051c68 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -1,13 +1,5 @@ package kr.pickple.back.chat.service; -import static java.text.MessageFormat.*; -import static kr.pickple.back.chat.domain.RoomType.*; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.domain.RoomType; @@ -21,6 +13,13 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import static java.text.MessageFormat.format; +import static kr.pickple.back.chat.domain.RoomType.PERSONAL; +import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_ROOM_NOT_FOUND; +import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @RequiredArgsConstructor From 5a25655aaf28e2388678efb1695b71d3ce7d8e17 Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 15:50:49 +0900 Subject: [PATCH 64/78] =?UTF-8?q?refactor:=20Game=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20lombok=EC=9D=84=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=97=AC=20@Getter,@Builder=EC=9D=84=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EA=B2=8C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/GameJoinRequestNotificationEvent.java | 15 +++++---------- .../event/game/GameMemberJoinedEvent.java | 12 ++++-------- .../event/game/GameMemberRejectedEvent.java | 12 ++++-------- .../back/alarm/service/GameAlarmService.java | 2 +- .../pickple/back/game/service/GameService.java | 18 +++++++++++++++--- 5 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java index 5d6d8094..5f581a20 100644 --- a/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java @@ -1,19 +1,14 @@ package kr.pickple.back.alarm.event.game; -import kr.pickple.back.member.domain.Member; +import lombok.Builder; +import lombok.Getter; import lombok.RequiredArgsConstructor; +@Getter +@Builder @RequiredArgsConstructor public class GameJoinRequestNotificationEvent { private final Long gameId; - private final Member host; - - public Long getGameId() { - return gameId; - } - - public Member getHost() { - return host; - } + private final Long memberId; } diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java index fd36ca74..3517eb57 100644 --- a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java @@ -1,18 +1,14 @@ package kr.pickple.back.alarm.event.game; +import lombok.Builder; +import lombok.Getter; import lombok.RequiredArgsConstructor; +@Getter +@Builder @RequiredArgsConstructor public class GameMemberJoinedEvent { private final Long gameId; private final Long memberId; - - public Long getGameId() { - return gameId; - } - - public Long getMemberId() { - return memberId; - } } diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java index 6ca79b31..393c140b 100644 --- a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java @@ -1,18 +1,14 @@ package kr.pickple.back.alarm.event.game; +import lombok.Builder; +import lombok.Getter; import lombok.RequiredArgsConstructor; +@Getter +@Builder @RequiredArgsConstructor public class GameMemberRejectedEvent { private final Long gameId; private final Long memberId; - - public Long getGameId() { - return gameId; - } - - public Long getMemberId() { - return memberId; - } } diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 74a5b274..131d6280 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -116,7 +116,7 @@ private void validateIsHost(final GameJoinRequestNotificationEvent gameJoinReque final Long gameId = gameJoinRequestNotificationEvent.getGameId(); final Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - if (!game.isHost(gameJoinRequestNotificationEvent.getHost().getId())) { + if (!game.isHost(gameJoinRequestNotificationEvent.getMemberId())) { throw new GameException(GAME_IS_NOT_HOST, gameId, game.getHost()); } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index a787fb69..9813313e 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -105,7 +105,11 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { final Member member = findMemberById(loggedInMemberId); game.addGameMember(member); - eventPublisher.publishEvent(new GameJoinRequestNotificationEvent(gameId, game.getHost())); + + eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() + .gameId(gameId) + .memberId(game.getHost().getId()) + .build()); } private Game findGameById(final Long gameId) { @@ -178,7 +182,11 @@ public void updateGameMemberRegistrationStatus( enterGameChatRoom(updateStatus, gameMember); gameMember.updateStatus(updateStatus); - eventPublisher.publishEvent(new GameMemberJoinedEvent(gameId, memberId)); + + eventPublisher.publishEvent(GameMemberJoinedEvent.builder() + .gameId(gameId) + .memberId(memberId) + .build()); } private void validateIsHost(final Long loggedInMemberId, final Game game) { @@ -208,7 +216,11 @@ public void deleteGameMember(final Long loggedInMemberId, final Long gameId, fin validateIsHostSelfDeleted(loggedInMember, member); deleteGameMember(gameMember); - eventPublisher.publishEvent(new GameMemberRejectedEvent(gameId, memberId)); + + eventPublisher.publishEvent(GameMemberRejectedEvent.builder() + .gameId(gameId) + .memberId(memberId) + .build()); return; } From 0f301a3c57a361054e79645f61d872a5c4aba728 Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 15:51:12 +0900 Subject: [PATCH 65/78] =?UTF-8?q?refactor:=20Crew=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20lombok=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=97=AC=20@Getter,@Builder=EC=9D=84=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CrewJoinRequestNotificationEvent.java | 14 +++++--------- .../event/crew/CrewMemberJoinedEvent.java | 12 ++++-------- .../event/crew/CrewMemberRejectedEvent.java | 12 ++++-------- .../back/alarm/service/CrewAlarmService.java | 2 +- .../back/crew/service/CrewMemberService.java | 19 +++++++++++++++---- 5 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java index a203168a..ead9795d 100644 --- a/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java @@ -1,19 +1,15 @@ package kr.pickple.back.alarm.event.crew; import kr.pickple.back.member.domain.Member; +import lombok.Builder; +import lombok.Getter; import lombok.RequiredArgsConstructor; +@Getter +@Builder @RequiredArgsConstructor public class CrewJoinRequestNotificationEvent { private final Long crewId; - private final Member crewLeader; - - public Long getCrewId() { - return crewId; - } - - public Member getCrewLeader() { - return crewLeader; - } + private final Member memberId; } diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java index f716467e..a38a5deb 100644 --- a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java @@ -1,18 +1,14 @@ package kr.pickple.back.alarm.event.crew; +import lombok.Builder; +import lombok.Getter; import lombok.RequiredArgsConstructor; +@Getter +@Builder @RequiredArgsConstructor public class CrewMemberJoinedEvent { private final Long crewId; private final Long memberId; - - public Long getCrewId() { - return crewId; - } - - public Long getMemberId() { - return memberId; - } } diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java index 5a4e86ca..d10bd65b 100644 --- a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java @@ -1,18 +1,14 @@ package kr.pickple.back.alarm.event.crew; +import lombok.Builder; +import lombok.Getter; import lombok.RequiredArgsConstructor; +@Getter +@Builder @RequiredArgsConstructor public class CrewMemberRejectedEvent { private final Long crewId; private final Long memberId; - - public Long getCrewId() { - return crewId; - } - - public Long getMemberId() { - return memberId; - } } diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index dadb37c1..e4e97c60 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -134,7 +134,7 @@ private void validateIsLeader(final CrewJoinRequestNotificationEvent crewJoinReq final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); final Crew crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - if (!crew.isLeader(crewJoinRequestNotificationEvent.getCrewLeader().getId())) { + if (!crew.isLeader(crewJoinRequestNotificationEvent.getMemberId())) { throw new CrewException(CREW_IS_NOT_LEADER, crewId, crew.getLeader()); } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 51e41522..895f2e19 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,6 +1,5 @@ package kr.pickple.back.crew.service; -import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.chat.service.ChatMessageService; @@ -45,7 +44,11 @@ public void applyForCrewMemberShip(final Long crewId, final Long loggedInMemberI final Member member = findMemberById(loggedInMemberId); crew.addCrewMember(member); - eventPublisher.publishEvent(new CrewJoinRequestNotificationEvent(crewId, crew.getLeader())); + + eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() + .crewId(crewId) + .memberId(crew.getLeader().getId()) + .build()); } public CrewProfileResponse findAllCrewMembers( @@ -92,7 +95,11 @@ public void crewMemberStatusUpdate( crewMember.updateStatus(updateStatus); crewMember.updateStatus(crewMemberUpdateStatusRequest.getStatus()); - eventPublisher.publishEvent(new CrewMemberJoinedEvent(crewId, memberId)); + + eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() + .crewId(crewId) + .memberId(memberId) + .build()); } private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { @@ -118,7 +125,11 @@ public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, fin validateIsLeaderSelfDeleted(loggedInMemberId, memberId); deleteCrewMember(crewMember); - eventPublisher.publishEvent(new CrewMemberRejectedEvent(crewId, memberId)); + + eventPublisher.publishEvent(CrewMemberRejectedEvent.builder() + .crewId(crewId) + .memberId(memberId) + .build()); return; } From 167d198ba2fa4a54833f146741ccfed687f013db Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 16:21:14 +0900 Subject: [PATCH 66/78] =?UTF-8?q?refactor:=20CrewEvent=20=ED=95=98?= =?UTF-8?q?=EB=82=98=EB=A1=9C=20=ED=86=B5=EC=9D=BC=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/dto/response/CrewAlarmResponse.java | 2 ++ ...erJoinedEvent.java => CrewAlarmEvent.java} | 2 +- .../CrewJoinRequestNotificationEvent.java | 15 ---------- .../event/crew/CrewMemberRejectedEvent.java | 14 ---------- .../alarm/handler/CrewAlarmEventHandler.java | 24 +++++----------- .../back/alarm/service/CrewAlarmService.java | 28 +++++++++---------- .../back/crew/service/CrewMemberService.java | 9 +++--- 7 files changed, 27 insertions(+), 67 deletions(-) rename src/main/java/kr/pickple/back/alarm/event/crew/{CrewMemberJoinedEvent.java => CrewAlarmEvent.java} (86%) delete mode 100644 src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java delete mode 100644 src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index 96c7c4be..90d46935 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -20,6 +20,7 @@ public class CrewAlarmResponse { private final Long crewAlarmId; private final Long crewId; private final String crewName; + private final String crewProfileImageUrl; private final LocalDateTime createdAt; private final AlarmStatus isRead; private final CrewAlarmType crewAlarmMessage; @@ -31,6 +32,7 @@ public static CrewAlarmResponse from(final CrewAlarm crewAlarm) { .crewAlarmId(crewAlarm.getId()) .crewId(crew.getId()) .crewName(crewAlarm.getCrew().getName()) + .crewProfileImageUrl(crew.getProfileImageUrl()) .createdAt(crewAlarm.getCreatedAt()) .isRead(crewAlarm.getIsRead()) .crewAlarmMessage(crewAlarm.getCrewAlarmType()) diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewAlarmEvent.java similarity index 86% rename from src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java rename to src/main/java/kr/pickple/back/alarm/event/crew/CrewAlarmEvent.java index a38a5deb..30269cb8 100644 --- a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewAlarmEvent.java @@ -7,7 +7,7 @@ @Getter @Builder @RequiredArgsConstructor -public class CrewMemberJoinedEvent { +public class CrewAlarmEvent { private final Long crewId; private final Long memberId; diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java deleted file mode 100644 index ead9795d..00000000 --- a/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java +++ /dev/null @@ -1,15 +0,0 @@ -package kr.pickple.back.alarm.event.crew; - -import kr.pickple.back.member.domain.Member; -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@Builder -@RequiredArgsConstructor -public class CrewJoinRequestNotificationEvent { - - private final Long crewId; - private final Member memberId; -} diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java deleted file mode 100644 index d10bd65b..00000000 --- a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package kr.pickple.back.alarm.event.crew; - -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@Builder -@RequiredArgsConstructor -public class CrewMemberRejectedEvent { - - private final Long crewId; - private final Long memberId; -} diff --git a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java index 1cbae514..1b6a182a 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java @@ -1,15 +1,11 @@ package kr.pickple.back.alarm.handler; -import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; -import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; -import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; -import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alarm.event.crew.CrewAlarmEvent; import kr.pickple.back.alarm.service.CrewAlarmService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; @Component @RequiredArgsConstructor @@ -18,26 +14,20 @@ public class CrewAlarmEventHandler { private final CrewAlarmService crewAlarmService; @Async - @Transactional @EventListener - public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewJoinAlarm(crewJoinRequestNotificationEvent); - crewAlarmService.emitMessage(crewAlarm); + public void sendAlarmToCrewLeader(final CrewAlarmEvent crewAlarmEvent) { + crewAlarmService.createCrewJoinAlarm(crewAlarmEvent); } @Async - @Transactional @EventListener - public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { - final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberApproveAlarm(crewMemberJoinedEvent); - crewAlarmService.emitMessage(crewAlarm); + public void sendAlarmToCrewMemberOnJoin(final CrewAlarmEvent crewAlarmEvent) { + crewAlarmService.createCrewMemberApproveAlarm(crewAlarmEvent); } @Async - @Transactional @EventListener - public void sendAlarmToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { - final CrewAlarmResponse crewAlarm = crewAlarmService.createCrewMemberDeniedAlarm(crewMemberRejectedEvent); - crewAlarmService.emitMessage(crewAlarm); + public void sendAlarmToCrewMemberOnRejection(final CrewAlarmEvent crewAlarmEvent) { + crewAlarmService.createCrewMemberDeniedAlarm(crewAlarmEvent); } } diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index e4e97c60..b1b5433f 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -3,9 +3,7 @@ import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; -import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; -import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; -import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alarm.event.crew.CrewAlarmEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.CrewAlarmRepository; import kr.pickple.back.alarm.util.SseEmitters; @@ -43,11 +41,11 @@ public class CrewAlarmService { private final CrewAlarmRepository crewAlarmRepository; private final SseEmitters sseEmitters; - public CrewAlarmResponse createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + public CrewAlarmResponse createCrewJoinAlarm(final CrewAlarmEvent crewAlarmEvent) { - validateIsLeader(crewJoinRequestNotificationEvent); + validateIsLeader(crewAlarmEvent); - final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); + final Long crewId = crewAlarmEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); final Member leader = crew.getLeader(); @@ -65,11 +63,11 @@ public CrewAlarmResponse createCrewJoinAlarm(final CrewJoinRequestNotificationEv return response; } - public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewMemberJoinedEvent crewMemberJoinedEvent) { + public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewAlarmEvent crewAlarmEvent) { - final Long crewId = crewMemberJoinedEvent.getCrewId(); + final Long crewId = crewAlarmEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); - final Long memberId = crewMemberJoinedEvent.getMemberId(); + final Long memberId = crewAlarmEvent.getMemberId(); final Member member = getMemberInfo(memberId); final CrewAlarm crewAlarm = CrewAlarm.builder() @@ -86,11 +84,11 @@ public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewMemberJoinedEven return response; } - public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewMemberRejectedEvent crewMemberRejectedEvent) { + public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewAlarmEvent crewAlarmEvent) { - final Long crewId = crewMemberRejectedEvent.getCrewId(); + final Long crewId = crewAlarmEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); - final Long memberId = crewMemberRejectedEvent.getMemberId(); + final Long memberId = crewAlarmEvent.getMemberId(); final Member member = getMemberInfo(memberId); final CrewAlarm crewAlarm = CrewAlarm.builder() @@ -130,11 +128,11 @@ private Member getMemberInfo(final Long memberId) { return member; } - private void validateIsLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); + private void validateIsLeader(final CrewAlarmEvent crewAlarmEvent) { + final Long crewId = crewAlarmEvent.getCrewId(); final Crew crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - if (!crew.isLeader(crewJoinRequestNotificationEvent.getMemberId())) { + if (!crew.isLeader(crewAlarmEvent.getMemberId())) { throw new CrewException(CREW_IS_NOT_LEADER, crewId, crew.getLeader()); } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 895f2e19..0cbdc412 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,7 +1,6 @@ package kr.pickple.back.crew.service; -import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; -import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.alarm.event.crew.CrewAlarmEvent; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; @@ -45,7 +44,7 @@ public void applyForCrewMemberShip(final Long crewId, final Long loggedInMemberI crew.addCrewMember(member); - eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() + eventPublisher.publishEvent(CrewAlarmEvent.builder() .crewId(crewId) .memberId(crew.getLeader().getId()) .build()); @@ -96,7 +95,7 @@ public void crewMemberStatusUpdate( crewMember.updateStatus(updateStatus); crewMember.updateStatus(crewMemberUpdateStatusRequest.getStatus()); - eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() + eventPublisher.publishEvent(CrewAlarmEvent.builder() .crewId(crewId) .memberId(memberId) .build()); @@ -126,7 +125,7 @@ public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, fin deleteCrewMember(crewMember); - eventPublisher.publishEvent(CrewMemberRejectedEvent.builder() + eventPublisher.publishEvent(CrewAlarmEvent.builder() .crewId(crewId) .memberId(memberId) .build()); From 22160dd61abc4bc3245d8d92f954fa8e871e1acf Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 16:27:13 +0900 Subject: [PATCH 67/78] =?UTF-8?q?refactor:=20GameEvent=20=ED=95=98?= =?UTF-8?q?=EB=82=98=EB=A1=9C=20=ED=86=B5=EC=9D=BC=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...erJoinedEvent.java => GameAlarmEvent.java} | 2 +- .../GameJoinRequestNotificationEvent.java | 14 ---------- .../event/game/GameMemberRejectedEvent.java | 14 ---------- .../alarm/handler/GameAlarmEventHandler.java | 24 +++++----------- .../back/alarm/service/GameAlarmService.java | 28 +++++++++---------- .../back/game/service/GameService.java | 10 +++---- 6 files changed, 25 insertions(+), 67 deletions(-) rename src/main/java/kr/pickple/back/alarm/event/game/{GameMemberJoinedEvent.java => GameAlarmEvent.java} (86%) delete mode 100644 src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java delete mode 100644 src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameAlarmEvent.java similarity index 86% rename from src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java rename to src/main/java/kr/pickple/back/alarm/event/game/GameAlarmEvent.java index 3517eb57..f7e0759a 100644 --- a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameAlarmEvent.java @@ -7,7 +7,7 @@ @Getter @Builder @RequiredArgsConstructor -public class GameMemberJoinedEvent { +public class GameAlarmEvent { private final Long gameId; private final Long memberId; diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java deleted file mode 100644 index 5f581a20..00000000 --- a/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package kr.pickple.back.alarm.event.game; - -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@Builder -@RequiredArgsConstructor -public class GameJoinRequestNotificationEvent { - - private final Long gameId; - private final Long memberId; -} diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java deleted file mode 100644 index 393c140b..00000000 --- a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package kr.pickple.back.alarm.event.game; - -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@Builder -@RequiredArgsConstructor -public class GameMemberRejectedEvent { - - private final Long gameId; - private final Long memberId; -} diff --git a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java index c9e01b94..53f3848b 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java @@ -1,15 +1,11 @@ package kr.pickple.back.alarm.handler; -import kr.pickple.back.alarm.dto.response.GameAlarmResponse; -import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; -import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; -import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alarm.event.game.GameAlarmEvent; import kr.pickple.back.alarm.service.GameAlarmService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; @Component @RequiredArgsConstructor @@ -18,26 +14,20 @@ public class GameAlarmEventHandler { private final GameAlarmService gameAlarmService; @Async - @Transactional @EventListener - public void sendAlarmToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { - final GameAlarmResponse gameAlarm = gameAlarmService.createGameJoinAlarm(gameJoinRequestNotificationEvent); - gameAlarmService.emitMessage(gameAlarm); + public void sendAlarmToGameHost(final GameAlarmEvent gameAlarmEvent) { + gameAlarmService.createGameJoinAlarm(gameAlarmEvent); } @Async - @Transactional @EventListener - public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { - final GameAlarmResponse gameAlarm = gameAlarmService.createGuestApproveAlarm(gameMemberJoinedEvent); - gameAlarmService.emitMessage(gameAlarm); + public void sendAlarmToGameMemberOnJoin(final GameAlarmEvent gameAlarmEvent) { + gameAlarmService.createGuestApproveAlarm(gameAlarmEvent); } @Async - @Transactional @EventListener - public void sendAlarmToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { - final GameAlarmResponse gameAlarm = gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); - gameAlarmService.emitMessage(gameAlarm); + public void sendAlarmToGameMemberOnRejection(final GameAlarmEvent gameAlarmEvent) { + gameAlarmService.createGuestDeniedAlarm(gameAlarmEvent); } } diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 131d6280..9c45c64d 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -3,9 +3,7 @@ import kr.pickple.back.alarm.domain.GameAlarm; import kr.pickple.back.alarm.dto.request.GameAlarmUpdateStatusRequest; import kr.pickple.back.alarm.dto.response.GameAlarmResponse; -import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; -import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; -import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alarm.event.game.GameAlarmEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.GameAlarmRepository; import kr.pickple.back.alarm.util.SseEmitters; @@ -44,11 +42,11 @@ public class GameAlarmService { private final SseEmitters sseEmitters; @Transactional - public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { + public GameAlarmResponse createGameJoinAlarm(final GameAlarmEvent gameAlarmEvent) { - validateIsHost(gameJoinRequestNotificationEvent); + validateIsHost(gameAlarmEvent); - final Long gameId = gameJoinRequestNotificationEvent.getGameId(); + final Long gameId = gameAlarmEvent.getGameId(); final Game game = getGameInfo(gameId); final Member host = game.getHost(); @@ -68,11 +66,11 @@ public GameAlarmResponse createGameJoinAlarm(final GameJoinRequestNotificationEv } @Transactional - public GameAlarmResponse createGuestApproveAlarm(final GameMemberJoinedEvent gameMemberJoinedEvent) { + public GameAlarmResponse createGuestApproveAlarm(final GameAlarmEvent gameAlarmEvent) { - final Long gameId = gameMemberJoinedEvent.getGameId(); + final Long gameId = gameAlarmEvent.getGameId(); final Game game = getGameInfo(gameId); - final Long memberId = gameMemberJoinedEvent.getMemberId(); + final Long memberId = gameAlarmEvent.getMemberId(); final Member member = getMemberInfo(memberId); final GameAlarm gameAlarm = GameAlarm.builder() @@ -90,11 +88,11 @@ public GameAlarmResponse createGuestApproveAlarm(final GameMemberJoinedEvent gam } @Transactional - public GameAlarmResponse createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejectedEvent) { + public GameAlarmResponse createGuestDeniedAlarm(final GameAlarmEvent gameAlarmEvent) { - final Long gameId = gameMemberRejectedEvent.getGameId(); + final Long gameId = gameAlarmEvent.getGameId(); final Game game = getGameInfo(gameId); - final Long memberId = gameMemberRejectedEvent.getMemberId(); + final Long memberId = gameAlarmEvent.getMemberId(); final Member member = getMemberInfo(memberId); final GameAlarm gameAlarm = GameAlarm.builder() @@ -112,11 +110,11 @@ public GameAlarmResponse createGuestDeniedAlarm(final GameMemberRejectedEvent ga } - private void validateIsHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { - final Long gameId = gameJoinRequestNotificationEvent.getGameId(); + private void validateIsHost(final GameAlarmEvent gameAlarmEvent) { + final Long gameId = gameAlarmEvent.getGameId(); final Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - if (!game.isHost(gameJoinRequestNotificationEvent.getMemberId())) { + if (!game.isHost(gameAlarmEvent.getMemberId())) { throw new GameException(GAME_IS_NOT_HOST, gameId, game.getHost()); } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 9813313e..cce9d710 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -3,9 +3,7 @@ import kr.pickple.back.address.dto.response.MainAddressResponse; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; -import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; -import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; -import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; +import kr.pickple.back.alarm.event.game.GameAlarmEvent; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.chat.service.ChatRoomService; @@ -106,7 +104,7 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { game.addGameMember(member); - eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() + eventPublisher.publishEvent(GameAlarmEvent.builder() .gameId(gameId) .memberId(game.getHost().getId()) .build()); @@ -183,7 +181,7 @@ public void updateGameMemberRegistrationStatus( gameMember.updateStatus(updateStatus); - eventPublisher.publishEvent(GameMemberJoinedEvent.builder() + eventPublisher.publishEvent(GameAlarmEvent.builder() .gameId(gameId) .memberId(memberId) .build()); @@ -217,7 +215,7 @@ public void deleteGameMember(final Long loggedInMemberId, final Long gameId, fin deleteGameMember(gameMember); - eventPublisher.publishEvent(GameMemberRejectedEvent.builder() + eventPublisher.publishEvent(GameAlarmEvent.builder() .gameId(gameId) .memberId(memberId) .build()); From 6970b6dfea4dce1fb68cc10214071cf23ac70afb Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 23:08:21 +0900 Subject: [PATCH 68/78] =?UTF-8?q?refactor:=20SseEmitters=EB=A5=BC=20SseEmi?= =?UTF-8?q?tterRepository,SseEmitterRepositoryImpl=20=EA=B5=AC=ED=98=84,?= =?UTF-8?q?=20AlarmService=EC=9D=98=20SSE=20=EC=97=B0=EA=B2=B0=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=20SseEmitterService=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/SseEmitterRepository.java | 27 +++++ .../repository/SseEmitterRepositoryImpl.java | 107 ++++++++++++++++++ .../back/alarm/service/AlarmService.java | 19 +--- .../back/alarm/service/SseEmitterService.java | 59 ++++++++++ .../pickple/back/alarm/util/SseEmitters.java | 57 ---------- 5 files changed, 195 insertions(+), 74 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java create mode 100644 src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java create mode 100644 src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java delete mode 100644 src/main/java/kr/pickple/back/alarm/util/SseEmitters.java diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java new file mode 100644 index 00000000..4e4764a3 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java @@ -0,0 +1,27 @@ +package kr.pickple.back.alarm.repository; + +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.util.List; +import java.util.Map; + +public interface SseEmitterRepository { + + SseEmitter save(final String emitterId,final SseEmitter sseEmitter); + + void saveEventCache(final String eventCacheId,final Object event); + + Map findAllEmitterStartWithByMemberId(final Long memberId); + + Map findAllEmitterStartWithByMemberIdInList(final List memberId); + + Map findAllEventCacheStartWithByMemberId(final Long memberId); + + void deleteById(final Long emitterId); + + void deleteAllEmitterStartWithId(final Long memberId); + + void deleteAllEventCacheStartWithId(final Long memberId); + + void notify(final Long memberId, final Object event); +} diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java new file mode 100644 index 00000000..6f724e73 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java @@ -0,0 +1,107 @@ +package kr.pickple.back.alarm.repository; + +import lombok.NoArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Repository; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +@Log4j2 +@Repository +@NoArgsConstructor +public class SseEmitterRepositoryImpl implements SseEmitterRepository { + + private final Map emitters = new ConcurrentHashMap<>(); + private final Map eventCache = new ConcurrentHashMap<>(); + + @Override + public SseEmitter save(final String emitterId, final SseEmitter sseEmitter) { + emitters.put(Long.parseLong(emitterId), sseEmitter); + + log.debug("new emitter added: {}", sseEmitter); + log.debug("emitter list size: {}", emitters.size()); + return sseEmitter; + } + + @Override + public void saveEventCache(final String eventCacheId, final Object event) { + eventCache.put(Long.parseLong(eventCacheId), event); + + log.debug("new event cached: {}", event); + log.debug("event cache size: {}", eventCache.size()); + } + + @Override + public Map findAllEmitterStartWithByMemberId(final Long memberId) { + final Map result = emitters.entrySet().stream() + .filter(entry -> entry.getKey().toString().startsWith(memberId.toString())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + log.debug("emitters for memberId {}: {}", memberId, result); + return result; + } + + @Override + public Map findAllEmitterStartWithByMemberIdInList(final List memberId) { + final Map result = emitters.entrySet().stream() + .filter(entry -> memberId.contains(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + log.debug("emitters for memberIds {}: {}", memberId, result); + return result; + } + + @Override + public Map findAllEventCacheStartWithByMemberId(final Long memberId) { + final Map result = eventCache.entrySet().stream() + .filter(entry -> entry.getKey().toString().startsWith(memberId.toString())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + log.debug("event cache for memberId {}: {}", memberId, result); + return result; + } + + @Override + public void deleteById(final Long emitterId) { + emitters.remove(emitterId); + + log.debug("emitter with id {} removed", emitterId); + } + + @Override + public void deleteAllEmitterStartWithId(final Long memberId) { + emitters.entrySet().removeIf(entry -> entry.getKey().toString().startsWith(memberId.toString())); + + log.debug("all emitters starting with memberId {} removed", memberId); + } + + @Override + public void deleteAllEventCacheStartWithId(final Long memberId) { + eventCache.entrySet().removeIf(entry -> entry.getKey().toString().startsWith(memberId.toString())); + + log.debug("all event cache starting with memberId {} removed", memberId); + } + + @Override + public void notify(final Long loggedInMemberId, final Object event) { + final Map emitters = findAllEmitterStartWithByMemberId(loggedInMemberId); + + emitters.values().forEach(emitter -> { + try { + emitter.send(event); + + log.debug("event {} sent to emitter {}", event, emitter); + } catch (IOException e) { + deleteById(loggedInMemberId); + emitter.completeWithError(e); + + log.debug("error sending event to emitter", e); + } + }); + } +} diff --git a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java index abd14215..95d97c12 100644 --- a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -1,7 +1,6 @@ package kr.pickple.back.alarm.service; import kr.pickple.back.alarm.dto.response.AlarmExistStatusResponse; -import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; @@ -10,8 +9,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import java.io.IOException; - import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @@ -21,22 +18,10 @@ public class AlarmService { private final GameAlarmService gameAlarmService; private final CrewAlarmService crewAlarmService; private final MemberRepository memberRepository; - private final SseEmitters sseEmitters; + private final SseEmitterService sseEmitterService; public SseEmitter subscribeToSse(final Long loggedInMemberId) { - final Member member = findMemberById(loggedInMemberId); - final SseEmitter emitter = new SseEmitter(); - - try { - emitter.send(SseEmitter.event() - .name("AlarmSseConnect") - .data("사용자에 대한 알람 SSE 연결이 정상적으로 처리되었습니다.")); - } catch (IOException e) { - sseEmitters.remove(loggedInMemberId); - emitter.completeWithError(e); - } - - return emitter; + return sseEmitterService.subscribeToSse(loggedInMemberId); } @Transactional diff --git a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java new file mode 100644 index 00000000..c5942d8e --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java @@ -0,0 +1,59 @@ +package kr.pickple.back.alarm.service; + +import kr.pickple.back.alarm.repository.SseEmitterRepository; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; + +import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SseEmitterService { + + private final SseEmitterRepository sseEmitterRepository; + private final MemberRepository memberRepository; + + public SseEmitter subscribeToSse(final Long loggedInMemberId) { + final Member member = findMemberById(loggedInMemberId); + final SseEmitter emitter = new SseEmitter(); + + try { + emitter.send(SseEmitter.event() + .name("AlarmSseConnect") + .data("사용자에 대한 알람 SSE 연결이 정상적으로 처리되었습니다.")); + } catch (IOException e) { + sseEmitterRepository.deleteById(loggedInMemberId); + emitter.completeWithError(e); + } + + sseEmitterRepository.save(String.valueOf(loggedInMemberId), emitter); + return emitter; + } + + public void notify(final Long loggedInMemberId, final Object event) { + try { + sseEmitterRepository.notify(loggedInMemberId, event); + } catch (Exception e) { + sseEmitterRepository.deleteById(loggedInMemberId); + log.error("알림 전송 중 오류가 발생했습니다.", e); + } + } + + private Member findMemberById(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } + + public void deleteById(final Long id) { + sseEmitterRepository.deleteById(id); + log.info("아이디 {}에 해당하는 Emitter가 성공적으로 삭제되었습니다.", id); + } +} diff --git a/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java b/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java deleted file mode 100644 index 56cdb1ea..00000000 --- a/src/main/java/kr/pickple/back/alarm/util/SseEmitters.java +++ /dev/null @@ -1,57 +0,0 @@ -package kr.pickple.back.alarm.util; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import java.io.IOException; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -@Slf4j -@Component -@RequiredArgsConstructor -public class SseEmitters { - - private final ConcurrentMap emitters = new ConcurrentHashMap<>(); - - public SseEmitter add(final Long id, final SseEmitter emitter) { - this.emitters.put(id, emitter); - - log.info("new emitter added: {}", emitter); - log.info("emitter list size: {}", emitters.size()); - - emitter.onCompletion(() -> { - log.info("onCompletion callback"); - this.emitters.remove(id); - }); - - emitter.onTimeout(() -> { - log.info("onTimeout callback"); - emitter.complete(); - }); - - return emitter; - } - - public SseEmitter get(final Long id) { - return this.emitters.get(id); - } - - public void remove(final Long id) { - this.emitters.remove(id); - } - - public void notify(final Long loggedInMemberId, final Object event) { - final SseEmitter emitter = this.get(loggedInMemberId); - if (emitter != null) { - try { - emitter.send(event); - } catch (IOException e) { - this.remove(loggedInMemberId); - emitter.completeWithError(e); - } - } - } -} From 2e485114766034430535785a631adf8b11ba8a96 Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 24 Nov 2023 23:09:18 +0900 Subject: [PATCH 69/78] =?UTF-8?q?refactor:=20GameAlarmService,CrewAlarmSer?= =?UTF-8?q?vice=20=EB=88=84=EB=9D=BD=EB=90=9C=20@Transactional=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20sseEmitter=20=EC=97=B0=EA=B2=B0=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alarm/service/CrewAlarmService.java | 34 +++++++++---------- .../back/alarm/service/GameAlarmService.java | 33 ++++++++---------- 2 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index b1b5433f..bb1c6ccc 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -6,7 +6,6 @@ import kr.pickple.back.alarm.event.crew.CrewAlarmEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.CrewAlarmRepository; -import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; @@ -18,9 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import java.io.IOException; import java.util.List; import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; @@ -39,8 +36,9 @@ public class CrewAlarmService { private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final CrewAlarmRepository crewAlarmRepository; - private final SseEmitters sseEmitters; + private final SseEmitterService sseEmitterService; + @Transactional public CrewAlarmResponse createCrewJoinAlarm(final CrewAlarmEvent crewAlarmEvent) { validateIsLeader(crewAlarmEvent); @@ -59,10 +57,11 @@ public CrewAlarmResponse createCrewJoinAlarm(final CrewAlarmEvent crewAlarmEvent final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - sseEmitters.notify(leader.getId(), response); + sseEmitterService.notify(leader.getId(), response); return response; } + @Transactional public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewAlarmEvent crewAlarmEvent) { final Long crewId = crewAlarmEvent.getCrewId(); @@ -80,10 +79,11 @@ public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewAlarmEvent crewA final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - sseEmitters.notify(member.getId(), response); + sseEmitterService.notify(member.getId(), response); return response; } + @Transactional public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewAlarmEvent crewAlarmEvent) { final Long crewId = crewAlarmEvent.getCrewId(); @@ -101,7 +101,7 @@ public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewAlarmEvent crewAl final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - sseEmitters.notify(member.getId(), response); + sseEmitterService.notify(member.getId(), response); return response; } @@ -148,14 +148,11 @@ public void emitMessage(final CrewAlarmResponse crewAlarm) { } private void sendAlarmToMember(final Member member, final CrewAlarmResponse crewAlarm) { - final SseEmitter crewLeaderEmitter = sseEmitters.get(member.getId()); - if (crewLeaderEmitter != null) { - try { - crewLeaderEmitter.send(crewAlarm); - } catch (IOException e) { - sseEmitters.remove(member.getId()); - log.error("해당 회원에게 알람 전송 중 오류가 발생했습니다. : " + member.getId(), e); - } + try { + sseEmitterService.notify(member.getId(), crewAlarm); + } catch (Exception e) { + log.error("해당 회원에게 알람 전송 중 오류가 발생했습니다. : " + member.getId(), e); + sseEmitterService.deleteById(member.getId()); } } @@ -164,9 +161,12 @@ private void sendAlarmToCrewLeader(final Member leader, final CrewAlarmResponse } private void sendAlarmToCrewApplyMembers(final List members, final CrewAlarmResponse crewAlarm) { - for (final Member member : members) { - sendAlarmToMember(member, crewAlarm); + + if (members == null) { + log.debug("해당 크루에 가입 신청을 한 회원을 찾지 못하였습니다."); + return; } + members.forEach(member -> sendAlarmToMember(member, crewAlarm)); } public boolean checkUnreadCrewAlarm(final Long memberId) { diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 9c45c64d..5a51cd7b 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -6,7 +6,6 @@ import kr.pickple.back.alarm.event.game.GameAlarmEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.GameAlarmRepository; -import kr.pickple.back.alarm.util.SseEmitters; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.exception.GameException; @@ -18,9 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import java.io.IOException; import java.util.List; import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; @@ -39,7 +36,7 @@ public class GameAlarmService { private final MemberRepository memberRepository; private final GameRepository gameRepository; private final GameAlarmRepository gameAlarmRepository; - private final SseEmitters sseEmitters; + private final SseEmitterService sseEmitterService; @Transactional public GameAlarmResponse createGameJoinAlarm(final GameAlarmEvent gameAlarmEvent) { @@ -61,7 +58,7 @@ public GameAlarmResponse createGameJoinAlarm(final GameAlarmEvent gameAlarmEvent final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); - sseEmitters.notify(host.getId(), response); + sseEmitterService.notify(host.getId(), response); return response; } @@ -83,7 +80,7 @@ public GameAlarmResponse createGuestApproveAlarm(final GameAlarmEvent gameAlarmE final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); - sseEmitters.notify(member.getId(), response); + sseEmitterService.notify(member.getId(), response); return response; } @@ -105,11 +102,10 @@ public GameAlarmResponse createGuestDeniedAlarm(final GameAlarmEvent gameAlarmEv final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); - sseEmitters.notify(member.getId(), response); + sseEmitterService.notify(member.getId(), response); return response; } - private void validateIsHost(final GameAlarmEvent gameAlarmEvent) { final Long gameId = gameAlarmEvent.getGameId(); final Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); @@ -150,14 +146,10 @@ public void emitMessage(final GameAlarmResponse gameAlarm) { } private void sendAlarmToMember(final Member member, final GameAlarmResponse gameAlarm) { - final SseEmitter gameHostEmitter = sseEmitters.get(member.getId()); - if (gameHostEmitter != null) { - try { - gameHostEmitter.send(gameAlarm); - } catch (IOException e) { - sseEmitters.remove(member.getId()); - log.info("해당 회원에게 알람 전송 중 오류가 발생되었습니다. : " + member.getId(), e); - } + try { + sseEmitterService.notify(member.getId(), gameAlarm); + } catch (Exception e) { + log.info("해당 회원에게 알람 전송 중 오류가 발생되었습니다. : " + member.getId(), e); } } @@ -166,9 +158,12 @@ private void sendAlarmToGameHost(final Member gameHost, final GameAlarmResponse } private void sendAlarmToGameApplyMembers(List members, GameAlarmResponse gameAlarm) { - for (final Member member : members) { - sendAlarmToMember(member, gameAlarm); + + if (members == null) { + log.debug("해당 경기에 참여 신청을 한 회원을 찾지 못하였습니다."); + return; } + members.forEach(member -> sendAlarmToMember(member, gameAlarm)); } public boolean checkUnreadGameAlarm(final Long memberId) { @@ -176,10 +171,12 @@ public boolean checkUnreadGameAlarm(final Long memberId) { return existsUnreadGameAlarm; } + @Transactional public void deleteAllGameAlarms(final Long memberId) { gameAlarmRepository.deleteByMemberId(memberId); } + @Transactional public void updateGameAlarmById( final Long loggedInMemberId, final Long gameAlarmId, From cd53999dbe8f71d65865856a8f002a9c2b835726 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sat, 25 Nov 2023 01:15:55 +0900 Subject: [PATCH 70/78] =?UTF-8?q?refactor:=20CrewAlarmService,GameAlarmSer?= =?UTF-8?q?vice=EC=97=90=EC=84=9C=EC=9D=98=20SseMessage=EB=B0=8F=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B6=80=EB=B6=84=20SseEmitterService=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/controller/AlarmController.java | 3 + .../repository/SseEmitterRepository.java | 9 +- .../repository/SseEmitterRepositoryImpl.java | 18 --- .../back/alarm/service/CrewAlarmService.java | 67 +-------- .../back/alarm/service/GameAlarmService.java | 65 +------- .../back/alarm/service/SseEmitterService.java | 142 +++++++++++++++++- 6 files changed, 160 insertions(+), 144 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java index 5cf0031c..3955a90f 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java @@ -2,6 +2,7 @@ import kr.pickple.back.alarm.dto.response.AlarmExistStatusResponse; import kr.pickple.back.alarm.service.AlarmService; +import kr.pickple.back.alarm.service.SseEmitterService; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -21,12 +22,14 @@ public class AlarmController { private final AlarmService alarmService; + private final SseEmitterService sseEmitterService; @GetMapping(value = "/subscribe", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public ResponseEntity subscribeToSse( @Login final Long loggedInMemberId ) { final SseEmitter emitter = alarmService.subscribeToSse(loggedInMemberId); + sseEmitterService.sendCachedEventToUser(loggedInMemberId); return ResponseEntity.status(OK) .header("X-Accel-Buffering", "no") diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java index 4e4764a3..15684d1a 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java @@ -2,25 +2,20 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import java.util.List; import java.util.Map; public interface SseEmitterRepository { - SseEmitter save(final String emitterId,final SseEmitter sseEmitter); + SseEmitter save(final String emitterId, final SseEmitter sseEmitter); - void saveEventCache(final String eventCacheId,final Object event); + void saveEventCache(final String eventCacheId, final Object event); Map findAllEmitterStartWithByMemberId(final Long memberId); - Map findAllEmitterStartWithByMemberIdInList(final List memberId); - Map findAllEventCacheStartWithByMemberId(final Long memberId); void deleteById(final Long emitterId); - void deleteAllEmitterStartWithId(final Long memberId); - void deleteAllEventCacheStartWithId(final Long memberId); void notify(final Long memberId, final Object event); diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java index 6f724e73..b11eaf80 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java @@ -6,7 +6,6 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -46,16 +45,6 @@ public Map findAllEmitterStartWithByMemberId(final Long member return result; } - @Override - public Map findAllEmitterStartWithByMemberIdInList(final List memberId) { - final Map result = emitters.entrySet().stream() - .filter(entry -> memberId.contains(entry.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - - log.debug("emitters for memberIds {}: {}", memberId, result); - return result; - } - @Override public Map findAllEventCacheStartWithByMemberId(final Long memberId) { final Map result = eventCache.entrySet().stream() @@ -73,13 +62,6 @@ public void deleteById(final Long emitterId) { log.debug("emitter with id {} removed", emitterId); } - @Override - public void deleteAllEmitterStartWithId(final Long memberId) { - emitters.entrySet().removeIf(entry -> entry.getKey().toString().startsWith(memberId.toString())); - - log.debug("all emitters starting with memberId {} removed", memberId); - } - @Override public void deleteAllEventCacheStartWithId(final Long memberId) { eventCache.entrySet().removeIf(entry -> entry.getKey().toString().startsWith(memberId.toString())); diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index bb1c6ccc..282ccfca 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -6,7 +6,6 @@ import kr.pickple.back.alarm.event.crew.CrewAlarmEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.CrewAlarmRepository; -import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewRepository; @@ -18,12 +17,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; import static kr.pickple.back.alarm.domain.CrewAlarmType.*; import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_NOT_FOUND; -import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @@ -39,7 +35,7 @@ public class CrewAlarmService { private final SseEmitterService sseEmitterService; @Transactional - public CrewAlarmResponse createCrewJoinAlarm(final CrewAlarmEvent crewAlarmEvent) { + public void createCrewJoinAlarm(final CrewAlarmEvent crewAlarmEvent) { validateIsLeader(crewAlarmEvent); @@ -56,14 +52,11 @@ public CrewAlarmResponse createCrewJoinAlarm(final CrewAlarmEvent crewAlarmEvent crewAlarmRepository.save(crewAlarm); final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - - sseEmitterService.notify(leader.getId(), response); - return response; + sseEmitterService.sendAlarm(leader.getId(), response); } @Transactional - public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewAlarmEvent crewAlarmEvent) { - + public void createCrewMemberApproveAlarm(final CrewAlarmEvent crewAlarmEvent) { final Long crewId = crewAlarmEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); final Long memberId = crewAlarmEvent.getMemberId(); @@ -78,14 +71,11 @@ public CrewAlarmResponse createCrewMemberApproveAlarm(final CrewAlarmEvent crewA crewAlarmRepository.save(crewAlarm); final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - - sseEmitterService.notify(member.getId(), response); - return response; + sseEmitterService.sendAlarm(member.getId(), response); } @Transactional - public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewAlarmEvent crewAlarmEvent) { - + public void createCrewMemberDeniedAlarm(final CrewAlarmEvent crewAlarmEvent) { final Long crewId = crewAlarmEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); final Long memberId = crewAlarmEvent.getMemberId(); @@ -100,9 +90,7 @@ public CrewAlarmResponse createCrewMemberDeniedAlarm(final CrewAlarmEvent crewAl crewAlarmRepository.save(crewAlarm); final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - - sseEmitterService.notify(member.getId(), response); - return response; + sseEmitterService.sendAlarm(member.getId(), response); } private Crew getCrewInfo(final Long crewId) { @@ -112,16 +100,6 @@ private Crew getCrewInfo(final Long crewId) { return crew; } - private Member getCrewLeaderOfCrew(final Long crewId) { - final Crew crew = getCrewInfo(crewId); - return crew.getLeader(); - } - - private List getCrewMembers(final Long crewId, final RegistrationStatus status) { - final Crew crew = getCrewInfo(crewId); - return crew.getCrewMembers(status); - } - private Member getMemberInfo(final Long memberId) { final Member member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); @@ -137,40 +115,9 @@ private void validateIsLeader(final CrewAlarmEvent crewAlarmEvent) { } } - public void emitMessage(final CrewAlarmResponse crewAlarm) { - - final Long crewId = crewAlarm.getCrewId(); - final Member crewLeader = getCrewLeaderOfCrew(crewId); - final List crewApplyMembers = getCrewMembers(crewId, WAITING); - - sendAlarmToCrewLeader(crewLeader, crewAlarm); - sendAlarmToCrewApplyMembers(crewApplyMembers, crewAlarm); - } - - private void sendAlarmToMember(final Member member, final CrewAlarmResponse crewAlarm) { - try { - sseEmitterService.notify(member.getId(), crewAlarm); - } catch (Exception e) { - log.error("해당 회원에게 알람 전송 중 오류가 발생했습니다. : " + member.getId(), e); - sseEmitterService.deleteById(member.getId()); - } - } - - private void sendAlarmToCrewLeader(final Member leader, final CrewAlarmResponse crewAlarm) { - sendAlarmToMember(leader, crewAlarm); - } - - private void sendAlarmToCrewApplyMembers(final List members, final CrewAlarmResponse crewAlarm) { - - if (members == null) { - log.debug("해당 크루에 가입 신청을 한 회원을 찾지 못하였습니다."); - return; - } - members.forEach(member -> sendAlarmToMember(member, crewAlarm)); - } - public boolean checkUnreadCrewAlarm(final Long memberId) { final boolean existsUnreadCrewAlarm = crewAlarmRepository.existsByMemberIdAndIsRead(memberId, FALSE); + return existsUnreadCrewAlarm; } diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 5a51cd7b..f0f86164 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -6,7 +6,6 @@ import kr.pickple.back.alarm.event.game.GameAlarmEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.GameAlarmRepository; -import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameRepository; @@ -18,12 +17,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - import static kr.pickple.back.alarm.domain.AlarmStatus.FALSE; import static kr.pickple.back.alarm.domain.GameAlarmType.*; import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_NOT_FOUND; -import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_IS_NOT_HOST; import static kr.pickple.back.game.exception.GameExceptionCode.GAME_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @@ -39,7 +35,7 @@ public class GameAlarmService { private final SseEmitterService sseEmitterService; @Transactional - public GameAlarmResponse createGameJoinAlarm(final GameAlarmEvent gameAlarmEvent) { + public void createGameJoinAlarm(final GameAlarmEvent gameAlarmEvent) { validateIsHost(gameAlarmEvent); @@ -55,16 +51,12 @@ public GameAlarmResponse createGameJoinAlarm(final GameAlarmEvent gameAlarmEvent gameAlarmRepository.save(gameAlarm); - final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); - - sseEmitterService.notify(host.getId(), response); - return response; + sseEmitterService.sendAlarm(host.getId(), response); } @Transactional - public GameAlarmResponse createGuestApproveAlarm(final GameAlarmEvent gameAlarmEvent) { - + public void createGuestApproveAlarm(final GameAlarmEvent gameAlarmEvent) { final Long gameId = gameAlarmEvent.getGameId(); final Game game = getGameInfo(gameId); final Long memberId = gameAlarmEvent.getMemberId(); @@ -79,13 +71,11 @@ public GameAlarmResponse createGuestApproveAlarm(final GameAlarmEvent gameAlarmE gameAlarmRepository.save(gameAlarm); final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); - - sseEmitterService.notify(member.getId(), response); - return response; + sseEmitterService.sendAlarm(member.getId(), response); } @Transactional - public GameAlarmResponse createGuestDeniedAlarm(final GameAlarmEvent gameAlarmEvent) { + public void createGuestDeniedAlarm(final GameAlarmEvent gameAlarmEvent) { final Long gameId = gameAlarmEvent.getGameId(); final Game game = getGameInfo(gameId); @@ -101,9 +91,7 @@ public GameAlarmResponse createGuestDeniedAlarm(final GameAlarmEvent gameAlarmEv gameAlarmRepository.save(gameAlarm); final GameAlarmResponse response = GameAlarmResponse.from(gameAlarm); - - sseEmitterService.notify(member.getId(), response); - return response; + sseEmitterService.sendAlarm(member.getId(), response); } private void validateIsHost(final GameAlarmEvent gameAlarmEvent) { @@ -126,48 +114,9 @@ private Member getMemberInfo(final Long memberId) { .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } - private Member getHostOfGame(final Long gameId) { - final Game game = getGameInfo(gameId); - return game.getHost(); - } - - private List getGameMembers(final Long gameId, final RegistrationStatus status) { - final Game game = getGameInfo(gameId); - return game.getMembersByStatus(status); - } - - public void emitMessage(final GameAlarmResponse gameAlarm) { - final Long gameId = gameAlarm.getGameId(); - final Member gameHost = getHostOfGame(gameId); - final List gameApplyMembers = getGameMembers(gameId, WAITING); - - sendAlarmToGameHost(gameHost, gameAlarm); - sendAlarmToGameApplyMembers(gameApplyMembers, gameAlarm); - } - - private void sendAlarmToMember(final Member member, final GameAlarmResponse gameAlarm) { - try { - sseEmitterService.notify(member.getId(), gameAlarm); - } catch (Exception e) { - log.info("해당 회원에게 알람 전송 중 오류가 발생되었습니다. : " + member.getId(), e); - } - } - - private void sendAlarmToGameHost(final Member gameHost, final GameAlarmResponse gameAlarm) { - sendAlarmToMember(gameHost, gameAlarm); - } - - private void sendAlarmToGameApplyMembers(List members, GameAlarmResponse gameAlarm) { - - if (members == null) { - log.debug("해당 경기에 참여 신청을 한 회원을 찾지 못하였습니다."); - return; - } - members.forEach(member -> sendAlarmToMember(member, gameAlarm)); - } - public boolean checkUnreadGameAlarm(final Long memberId) { final boolean existsUnreadGameAlarm = gameAlarmRepository.existsByMemberIdAndIsRead(memberId, FALSE); + return existsUnreadGameAlarm; } diff --git a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java index c5942d8e..a2c39d4a 100644 --- a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java +++ b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java @@ -1,6 +1,15 @@ package kr.pickple.back.alarm.service; +import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; +import kr.pickple.back.alarm.dto.response.GameAlarmResponse; import kr.pickple.back.alarm.repository.SseEmitterRepository; +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; @@ -10,7 +19,14 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; +import static kr.pickple.back.game.exception.GameExceptionCode.GAME_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Slf4j @@ -18,8 +34,10 @@ @RequiredArgsConstructor public class SseEmitterService { - private final SseEmitterRepository sseEmitterRepository; + private final CrewRepository crewRepository; + private final GameRepository gameRepository; private final MemberRepository memberRepository; + private final SseEmitterRepository sseEmitterRepository; public SseEmitter subscribeToSse(final Long loggedInMemberId) { final Member member = findMemberById(loggedInMemberId); @@ -42,11 +60,133 @@ public void notify(final Long loggedInMemberId, final Object event) { try { sseEmitterRepository.notify(loggedInMemberId, event); } catch (Exception e) { + sseEmitterRepository.saveEventCache(String.valueOf(loggedInMemberId), event); sseEmitterRepository.deleteById(loggedInMemberId); log.error("알림 전송 중 오류가 발생했습니다.", e); } } + public void sendCachedEventToUser(final Long memberId) { + Map eventCache = sseEmitterRepository.findAllEventCacheStartWithByMemberId(memberId); + if (eventCache != null && !eventCache.isEmpty()) { + eventCache.values().forEach(event -> notify(memberId, event)); + sseEmitterRepository.deleteAllEventCacheStartWithId(memberId); + } + } + + public void sendAlarm(final Long memberId, final T responseDto) { + final Map, Consumer> alarmResponseDto = new HashMap<>(); + + alarmResponseDto.put(CrewAlarmResponse.class, response -> emitCrewMessage(memberId, (CrewAlarmResponse) response)); + alarmResponseDto.put(GameAlarmResponse.class, response -> emitGameMessage(memberId, (GameAlarmResponse) response)); + + final Consumer processor = alarmResponseDto.get(responseDto.getClass()); + + if (processor != null) { + try { + processor.accept(responseDto); + } catch (Exception e) { + sseEmitterRepository.deleteById(memberId); + log.error("알람 전송 중 오류가 발생했습니다. : " + memberId, e); + } + } else { + log.error("알 수 없는 알람 타입입니다: " + responseDto.getClass().getSimpleName()); + } + } + + public void emitCrewMessage(final Long memberId, final CrewAlarmResponse crewAlarm) { + final Long crewId = crewAlarm.getCrewId(); + final Member crewLeader = getCrewLeaderOfCrew(crewId); + final List crewApplyMembers = getCrewMembers(crewId, WAITING); + + sendAlarmToCrewLeader(crewLeader, crewAlarm); + sendAlarmToCrewApplyMembers(crewApplyMembers, crewAlarm); + } + + private void sendAlarmToMember(final Member member, final CrewAlarmResponse crewAlarm) { + try { + notify(member.getId(), crewAlarm); + } catch (Exception e) { + log.error("해당 회원에게 알람 전송 중 오류가 발생했습니다. : " + member.getId(), e); + deleteById(member.getId()); + } + } + + private void sendAlarmToCrewLeader(final Member leader, final CrewAlarmResponse crewAlarm) { + sendAlarmToMember(leader, crewAlarm); + } + + private void sendAlarmToCrewApplyMembers(final List members, final CrewAlarmResponse crewAlarm) { + + if (members == null) { + log.debug("해당 크루에 가입 신청을 한 회원을 찾지 못하였습니다."); + return; + } + members.forEach(member -> sendAlarmToMember(member, crewAlarm)); + } + + private Member getCrewLeaderOfCrew(final Long crewId) { + final Crew crew = getCrewInfo(crewId); + return crew.getLeader(); + } + + private Crew getCrewInfo(final Long crewId) { + final Crew crew = crewRepository.findById(crewId) + .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + return crew; + } + + private List getCrewMembers(final Long crewId, final RegistrationStatus status) { + final Crew crew = getCrewInfo(crewId); + return crew.getCrewMembers(status); + } + + public void emitGameMessage(final Long memberId, final GameAlarmResponse gameAlarm) { + final Long gameId = gameAlarm.getGameId(); + final Member gameHost = getHostOfGame(gameId); + final List gameApplyMembers = getGameMembers(gameId, WAITING); + + sendAlarmToGameHost(gameHost, gameAlarm); + sendAlarmToGameApplyMembers(gameApplyMembers, gameAlarm); + } + + private void sendAlarmToMember(final Member member, final GameAlarmResponse gameAlarm) { + try { + notify(member.getId(), gameAlarm); + } catch (Exception e) { + log.info("해당 회원에게 알람 전송 중 오류가 발생되었습니다. : " + member.getId(), e); + } + } + + private void sendAlarmToGameHost(final Member gameHost, final GameAlarmResponse gameAlarm) { + sendAlarmToMember(gameHost, gameAlarm); + } + + private void sendAlarmToGameApplyMembers(final List members, final GameAlarmResponse gameAlarm) { + + if (members == null) { + log.debug("해당 경기에 참여 신청을 한 회원을 찾지 못하였습니다."); + return; + } + members.forEach(member -> sendAlarmToMember(member, gameAlarm)); + } + + private Member getHostOfGame(final Long gameId) { + final Game game = getGameInfo(gameId); + return game.getHost(); + } + + private List getGameMembers(final Long gameId, final RegistrationStatus status) { + final Game game = getGameInfo(gameId); + return game.getMembersByStatus(status); + } + + private Game getGameInfo(final Long gameId) { + final Game game = gameRepository.findById(gameId) + .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + return game; + } + private Member findMemberById(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); From 9fb98ab6d5c7ac502b0b307578b55abf7d151c79 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sat, 25 Nov 2023 02:18:02 +0900 Subject: [PATCH 71/78] =?UTF-8?q?fix:=20Game=20Event=20=EB=8F=99=EC=9D=BC?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=EC=8B=9D?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameJoinRequestNotificationEvent.java | 14 ++++++++++ .../event/game/GameMemberJoinedEvent.java | 14 ++++++++++ .../event/game/GameMemberRejectedEvent.java | 14 ++++++++++ .../alarm/handler/GameAlarmEventHandler.java | 15 ++++++---- .../back/alarm/service/GameAlarmService.java | 28 ++++++++++--------- .../back/game/service/GameService.java | 10 ++++--- 6 files changed, 72 insertions(+), 23 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java create mode 100644 src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java create mode 100644 src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java new file mode 100644 index 00000000..5f581a20 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameJoinRequestNotificationEvent.java @@ -0,0 +1,14 @@ +package kr.pickple.back.alarm.event.game; + +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@Builder +@RequiredArgsConstructor +public class GameJoinRequestNotificationEvent { + + private final Long gameId; + private final Long memberId; +} diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java new file mode 100644 index 00000000..3517eb57 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberJoinedEvent.java @@ -0,0 +1,14 @@ +package kr.pickple.back.alarm.event.game; + +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@Builder +@RequiredArgsConstructor +public class GameMemberJoinedEvent { + + private final Long gameId; + private final Long memberId; +} diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java new file mode 100644 index 00000000..393c140b --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/event/game/GameMemberRejectedEvent.java @@ -0,0 +1,14 @@ +package kr.pickple.back.alarm.event.game; + +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@Builder +@RequiredArgsConstructor +public class GameMemberRejectedEvent { + + private final Long gameId; + private final Long memberId; +} diff --git a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java index 53f3848b..a7137491 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java @@ -1,6 +1,9 @@ package kr.pickple.back.alarm.handler; import kr.pickple.back.alarm.event.game.GameAlarmEvent; +import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.alarm.service.GameAlarmService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; @@ -15,19 +18,19 @@ public class GameAlarmEventHandler { @Async @EventListener - public void sendAlarmToGameHost(final GameAlarmEvent gameAlarmEvent) { - gameAlarmService.createGameJoinAlarm(gameAlarmEvent); + public void sendAlarmToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { + gameAlarmService.createGameJoinAlarm(gameJoinRequestNotificationEvent); } @Async @EventListener - public void sendAlarmToGameMemberOnJoin(final GameAlarmEvent gameAlarmEvent) { - gameAlarmService.createGuestApproveAlarm(gameAlarmEvent); + public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { + gameAlarmService.createGuestApproveAlarm(gameMemberJoinedEvent); } @Async @EventListener - public void sendAlarmToGameMemberOnRejection(final GameAlarmEvent gameAlarmEvent) { - gameAlarmService.createGuestDeniedAlarm(gameAlarmEvent); + public void sendAlarmToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { + gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); } } diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index f0f86164..190c1e91 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -3,7 +3,9 @@ import kr.pickple.back.alarm.domain.GameAlarm; import kr.pickple.back.alarm.dto.request.GameAlarmUpdateStatusRequest; import kr.pickple.back.alarm.dto.response.GameAlarmResponse; -import kr.pickple.back.alarm.event.game.GameAlarmEvent; +import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.GameAlarmRepository; import kr.pickple.back.game.domain.Game; @@ -35,11 +37,11 @@ public class GameAlarmService { private final SseEmitterService sseEmitterService; @Transactional - public void createGameJoinAlarm(final GameAlarmEvent gameAlarmEvent) { + public void createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { - validateIsHost(gameAlarmEvent); + validateIsHost(gameJoinRequestNotificationEvent); - final Long gameId = gameAlarmEvent.getGameId(); + final Long gameId = gameJoinRequestNotificationEvent.getGameId(); final Game game = getGameInfo(gameId); final Member host = game.getHost(); @@ -56,10 +58,10 @@ public void createGameJoinAlarm(final GameAlarmEvent gameAlarmEvent) { } @Transactional - public void createGuestApproveAlarm(final GameAlarmEvent gameAlarmEvent) { - final Long gameId = gameAlarmEvent.getGameId(); + public void createGuestApproveAlarm(final GameMemberJoinedEvent gameMemberJoinedEvent) { + final Long gameId = gameMemberJoinedEvent.getGameId(); final Game game = getGameInfo(gameId); - final Long memberId = gameAlarmEvent.getMemberId(); + final Long memberId = gameMemberJoinedEvent.getMemberId(); final Member member = getMemberInfo(memberId); final GameAlarm gameAlarm = GameAlarm.builder() @@ -75,11 +77,11 @@ public void createGuestApproveAlarm(final GameAlarmEvent gameAlarmEvent) { } @Transactional - public void createGuestDeniedAlarm(final GameAlarmEvent gameAlarmEvent) { + public void createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejectedEvent) { - final Long gameId = gameAlarmEvent.getGameId(); + final Long gameId = gameMemberRejectedEvent.getGameId(); final Game game = getGameInfo(gameId); - final Long memberId = gameAlarmEvent.getMemberId(); + final Long memberId = gameMemberRejectedEvent.getMemberId(); final Member member = getMemberInfo(memberId); final GameAlarm gameAlarm = GameAlarm.builder() @@ -94,11 +96,11 @@ public void createGuestDeniedAlarm(final GameAlarmEvent gameAlarmEvent) { sseEmitterService.sendAlarm(member.getId(), response); } - private void validateIsHost(final GameAlarmEvent gameAlarmEvent) { - final Long gameId = gameAlarmEvent.getGameId(); + private void validateIsHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { + final Long gameId = gameJoinRequestNotificationEvent.getGameId(); final Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - if (!game.isHost(gameAlarmEvent.getMemberId())) { + if (!game.isHost(gameJoinRequestNotificationEvent.getMemberId())) { throw new GameException(GAME_IS_NOT_HOST, gameId, game.getHost()); } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index cce9d710..9813313e 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -3,7 +3,9 @@ import kr.pickple.back.address.dto.response.MainAddressResponse; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; -import kr.pickple.back.alarm.event.game.GameAlarmEvent; +import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.chat.service.ChatRoomService; @@ -104,7 +106,7 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { game.addGameMember(member); - eventPublisher.publishEvent(GameAlarmEvent.builder() + eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() .gameId(gameId) .memberId(game.getHost().getId()) .build()); @@ -181,7 +183,7 @@ public void updateGameMemberRegistrationStatus( gameMember.updateStatus(updateStatus); - eventPublisher.publishEvent(GameAlarmEvent.builder() + eventPublisher.publishEvent(GameMemberJoinedEvent.builder() .gameId(gameId) .memberId(memberId) .build()); @@ -215,7 +217,7 @@ public void deleteGameMember(final Long loggedInMemberId, final Long gameId, fin deleteGameMember(gameMember); - eventPublisher.publishEvent(GameAlarmEvent.builder() + eventPublisher.publishEvent(GameMemberRejectedEvent.builder() .gameId(gameId) .memberId(memberId) .build()); From ff6d07e9344a0bfd6223470122399d6550c7ad60 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sat, 25 Nov 2023 02:20:16 +0900 Subject: [PATCH 72/78] =?UTF-8?q?fix:=20Crew=20Event=20=EB=8F=99=EC=9D=BC?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=EC=8B=9D?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CrewJoinRequestNotificationEvent.java | 14 +++++++++++ ...mEvent.java => CrewMemberJoinedEvent.java} | 2 +- .../event/crew/CrewMemberRejectedEvent.java | 14 +++++++++++ .../alarm/handler/CrewAlarmEventHandler.java | 16 +++++++------ .../back/alarm/service/CrewAlarmService.java | 24 ++++++++++--------- .../kr/pickple/back/crew/domain/Crew.java | 3 +++ .../back/crew/service/CrewMemberService.java | 10 ++++---- .../back/crew/service/CrewService.java | 1 + 8 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java rename src/main/java/kr/pickple/back/alarm/event/crew/{CrewAlarmEvent.java => CrewMemberJoinedEvent.java} (86%) create mode 100644 src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java new file mode 100644 index 00000000..f88d0341 --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewJoinRequestNotificationEvent.java @@ -0,0 +1,14 @@ +package kr.pickple.back.alarm.event.crew; + +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@Builder +@RequiredArgsConstructor +public class CrewJoinRequestNotificationEvent { + + private final Long crewId; + private final Long memberId; +} diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewAlarmEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java similarity index 86% rename from src/main/java/kr/pickple/back/alarm/event/crew/CrewAlarmEvent.java rename to src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java index 30269cb8..a38a5deb 100644 --- a/src/main/java/kr/pickple/back/alarm/event/crew/CrewAlarmEvent.java +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberJoinedEvent.java @@ -7,7 +7,7 @@ @Getter @Builder @RequiredArgsConstructor -public class CrewAlarmEvent { +public class CrewMemberJoinedEvent { private final Long crewId; private final Long memberId; diff --git a/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java new file mode 100644 index 00000000..d10bd65b --- /dev/null +++ b/src/main/java/kr/pickple/back/alarm/event/crew/CrewMemberRejectedEvent.java @@ -0,0 +1,14 @@ +package kr.pickple.back.alarm.event.crew; + +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@Builder +@RequiredArgsConstructor +public class CrewMemberRejectedEvent { + + private final Long crewId; + private final Long memberId; +} diff --git a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java index 1b6a182a..17e1f28c 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java @@ -1,6 +1,8 @@ package kr.pickple.back.alarm.handler; -import kr.pickple.back.alarm.event.crew.CrewAlarmEvent; +import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alarm.service.CrewAlarmService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; @@ -15,19 +17,19 @@ public class CrewAlarmEventHandler { @Async @EventListener - public void sendAlarmToCrewLeader(final CrewAlarmEvent crewAlarmEvent) { - crewAlarmService.createCrewJoinAlarm(crewAlarmEvent); + public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { + crewAlarmService.createCrewJoinAlarm(crewJoinRequestNotificationEvent); } @Async @EventListener - public void sendAlarmToCrewMemberOnJoin(final CrewAlarmEvent crewAlarmEvent) { - crewAlarmService.createCrewMemberApproveAlarm(crewAlarmEvent); + public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { + crewAlarmService.createCrewMemberApproveAlarm(crewMemberJoinedEvent); } @Async @EventListener - public void sendAlarmToCrewMemberOnRejection(final CrewAlarmEvent crewAlarmEvent) { - crewAlarmService.createCrewMemberDeniedAlarm(crewAlarmEvent); + public void sendAlarmToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { + crewAlarmService.createCrewMemberDeniedAlarm(crewMemberRejectedEvent); } } diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 282ccfca..a23572d0 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -3,7 +3,9 @@ import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; -import kr.pickple.back.alarm.event.crew.CrewAlarmEvent; +import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.CrewAlarmRepository; import kr.pickple.back.crew.domain.Crew; @@ -35,11 +37,11 @@ public class CrewAlarmService { private final SseEmitterService sseEmitterService; @Transactional - public void createCrewJoinAlarm(final CrewAlarmEvent crewAlarmEvent) { + public void createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - validateIsLeader(crewAlarmEvent); + validateIsLeader(crewJoinRequestNotificationEvent); - final Long crewId = crewAlarmEvent.getCrewId(); + final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); final Member leader = crew.getLeader(); @@ -56,10 +58,10 @@ public void createCrewJoinAlarm(final CrewAlarmEvent crewAlarmEvent) { } @Transactional - public void createCrewMemberApproveAlarm(final CrewAlarmEvent crewAlarmEvent) { - final Long crewId = crewAlarmEvent.getCrewId(); + public void createCrewMemberApproveAlarm(final CrewMemberJoinedEvent crewMemberJoinedEvent) { + final Long crewId = crewMemberJoinedEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); - final Long memberId = crewAlarmEvent.getMemberId(); + final Long memberId = crewMemberJoinedEvent.getMemberId(); final Member member = getMemberInfo(memberId); final CrewAlarm crewAlarm = CrewAlarm.builder() @@ -75,10 +77,10 @@ public void createCrewMemberApproveAlarm(final CrewAlarmEvent crewAlarmEvent) { } @Transactional - public void createCrewMemberDeniedAlarm(final CrewAlarmEvent crewAlarmEvent) { - final Long crewId = crewAlarmEvent.getCrewId(); + public void createCrewMemberDeniedAlarm(final CrewMemberRejectedEvent crewMemberRejectedEvent) { + final Long crewId = crewMemberRejectedEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); - final Long memberId = crewAlarmEvent.getMemberId(); + final Long memberId = crewMemberRejectedEvent.getMemberId(); final Member member = getMemberInfo(memberId); final CrewAlarm crewAlarm = CrewAlarm.builder() @@ -106,7 +108,7 @@ private Member getMemberInfo(final Long memberId) { return member; } - private void validateIsLeader(final CrewAlarmEvent crewAlarmEvent) { + private void validateIsLeader(final CrewJoinRequestNotificationEvent crewAlarmEvent) { final Long crewId = crewAlarmEvent.getCrewId(); final Crew crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index d31bd4e4..16c737b4 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -184,4 +184,7 @@ public void makeNewCrewChatRoom(final ChatRoom chatRoom) { public Boolean isConfirmedCrewMember(final Member member) { return crewMembers.isAlreadyConfirmed(member); } + public List getCrewMembers(RegistrationStatus status) { + return crewMembers.getCrewMembers(status); + } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 0cbdc412..26083aeb 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,6 +1,8 @@ package kr.pickple.back.crew.service; -import kr.pickple.back.alarm.event.crew.CrewAlarmEvent; +import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; +import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; @@ -44,7 +46,7 @@ public void applyForCrewMemberShip(final Long crewId, final Long loggedInMemberI crew.addCrewMember(member); - eventPublisher.publishEvent(CrewAlarmEvent.builder() + eventPublisher.publishEvent(CrewJoinRequestNotificationEvent.builder() .crewId(crewId) .memberId(crew.getLeader().getId()) .build()); @@ -95,7 +97,7 @@ public void crewMemberStatusUpdate( crewMember.updateStatus(updateStatus); crewMember.updateStatus(crewMemberUpdateStatusRequest.getStatus()); - eventPublisher.publishEvent(CrewAlarmEvent.builder() + eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() .crewId(crewId) .memberId(memberId) .build()); @@ -125,7 +127,7 @@ public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, fin deleteCrewMember(crewMember); - eventPublisher.publishEvent(CrewAlarmEvent.builder() + eventPublisher.publishEvent(CrewMemberRejectedEvent.builder() .crewId(crewId) .memberId(memberId) .build()); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index ba2e4005..c2389c0e 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -26,6 +26,7 @@ import static kr.pickple.back.chat.domain.RoomType.CREW; import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_CREATE_MAX_COUNT_EXCEEDED; import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_EXISTED; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; From e9b7a2b2479eacb3daaeacddc571059371b08371 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sat, 25 Nov 2023 03:18:48 +0900 Subject: [PATCH 73/78] =?UTF-8?q?fix:=20=EC=84=9C=EB=B2=84=20=EC=B8=A1=20S?= =?UTF-8?q?seEmitter=20=EC=9D=B8=EC=8A=A4=ED=84=B4=EC=8A=A4=20timout=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EC=B5=9C=EB=8C=80=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/alarm/service/SseEmitterService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java index a2c39d4a..13ded9fd 100644 --- a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java +++ b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java @@ -41,7 +41,7 @@ public class SseEmitterService { public SseEmitter subscribeToSse(final Long loggedInMemberId) { final Member member = findMemberById(loggedInMemberId); - final SseEmitter emitter = new SseEmitter(); + final SseEmitter emitter = new SseEmitter(Long.MAX_VALUE); try { emitter.send(SseEmitter.event() From bf364ef9ae8a4985f7c8d1bfbf8ef6f60febde35 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sat, 25 Nov 2023 23:26:38 +0900 Subject: [PATCH 74/78] =?UTF-8?q?refactor:SseEmitterLocalRepository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=AA=85=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20Repository=20=EB=82=B4=20notify=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pl.java => SseEmitterLocalRepository.java} | 21 +------------------ .../repository/SseEmitterRepository.java | 2 -- .../back/alarm/service/SseEmitterService.java | 2 +- 3 files changed, 2 insertions(+), 23 deletions(-) rename src/main/java/kr/pickple/back/alarm/repository/{SseEmitterRepositoryImpl.java => SseEmitterLocalRepository.java} (78%) diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java similarity index 78% rename from src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java rename to src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java index b11eaf80..4b186462 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepositoryImpl.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Repository; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -13,7 +12,7 @@ @Log4j2 @Repository @NoArgsConstructor -public class SseEmitterRepositoryImpl implements SseEmitterRepository { +public class SseEmitterLocalRepository implements SseEmitterRepository { private final Map emitters = new ConcurrentHashMap<>(); private final Map eventCache = new ConcurrentHashMap<>(); @@ -68,22 +67,4 @@ public void deleteAllEventCacheStartWithId(final Long memberId) { log.debug("all event cache starting with memberId {} removed", memberId); } - - @Override - public void notify(final Long loggedInMemberId, final Object event) { - final Map emitters = findAllEmitterStartWithByMemberId(loggedInMemberId); - - emitters.values().forEach(emitter -> { - try { - emitter.send(event); - - log.debug("event {} sent to emitter {}", event, emitter); - } catch (IOException e) { - deleteById(loggedInMemberId); - emitter.completeWithError(e); - - log.debug("error sending event to emitter", e); - } - }); - } } diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java index 15684d1a..2e9f68d4 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java @@ -17,6 +17,4 @@ public interface SseEmitterRepository { void deleteById(final Long emitterId); void deleteAllEventCacheStartWithId(final Long memberId); - - void notify(final Long memberId, final Object event); } diff --git a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java index 13ded9fd..0b11dfd1 100644 --- a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java +++ b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java @@ -58,7 +58,7 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { public void notify(final Long loggedInMemberId, final Object event) { try { - sseEmitterRepository.notify(loggedInMemberId, event); + notify(loggedInMemberId, event); } catch (Exception e) { sseEmitterRepository.saveEventCache(String.valueOf(loggedInMemberId), event); sseEmitterRepository.deleteById(loggedInMemberId); From 99c3c19760a9ca8669e9b4b55f560ac981ef4d67 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 26 Nov 2023 00:52:54 +0900 Subject: [PATCH 75/78] =?UTF-8?q?refactor:=20SseEmitterService=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=EB=B0=8F=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/SseEmitterLocalRepository.java | 21 --- .../repository/SseEmitterRepository.java | 2 - .../back/alarm/service/SseEmitterService.java | 135 +----------------- 3 files changed, 5 insertions(+), 153 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java index 4b186462..371403b2 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java @@ -20,28 +20,12 @@ public class SseEmitterLocalRepository implements SseEmitterRepository { @Override public SseEmitter save(final String emitterId, final SseEmitter sseEmitter) { emitters.put(Long.parseLong(emitterId), sseEmitter); - - log.debug("new emitter added: {}", sseEmitter); - log.debug("emitter list size: {}", emitters.size()); return sseEmitter; } @Override public void saveEventCache(final String eventCacheId, final Object event) { eventCache.put(Long.parseLong(eventCacheId), event); - - log.debug("new event cached: {}", event); - log.debug("event cache size: {}", eventCache.size()); - } - - @Override - public Map findAllEmitterStartWithByMemberId(final Long memberId) { - final Map result = emitters.entrySet().stream() - .filter(entry -> entry.getKey().toString().startsWith(memberId.toString())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - - log.debug("emitters for memberId {}: {}", memberId, result); - return result; } @Override @@ -50,21 +34,16 @@ public Map findAllEventCacheStartWithByMemberId(final Long memberI .filter(entry -> entry.getKey().toString().startsWith(memberId.toString())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - log.debug("event cache for memberId {}: {}", memberId, result); return result; } @Override public void deleteById(final Long emitterId) { emitters.remove(emitterId); - - log.debug("emitter with id {} removed", emitterId); } @Override public void deleteAllEventCacheStartWithId(final Long memberId) { eventCache.entrySet().removeIf(entry -> entry.getKey().toString().startsWith(memberId.toString())); - - log.debug("all event cache starting with memberId {} removed", memberId); } } diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java index 2e9f68d4..595f7868 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java @@ -10,8 +10,6 @@ public interface SseEmitterRepository { void saveEventCache(final String eventCacheId, final Object event); - Map findAllEmitterStartWithByMemberId(final Long memberId); - Map findAllEventCacheStartWithByMemberId(final Long memberId); void deleteById(final Long emitterId); diff --git a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java index 0b11dfd1..ca76526a 100644 --- a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java +++ b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java @@ -1,15 +1,6 @@ package kr.pickple.back.alarm.service; -import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; -import kr.pickple.back.alarm.dto.response.GameAlarmResponse; import kr.pickple.back.alarm.repository.SseEmitterRepository; -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.exception.CrewException; -import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.exception.GameException; -import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; @@ -19,14 +10,8 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.function.Consumer; -import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; -import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; -import static kr.pickple.back.game.exception.GameExceptionCode.GAME_NOT_FOUND; import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Slf4j @@ -34,8 +19,6 @@ @RequiredArgsConstructor public class SseEmitterService { - private final CrewRepository crewRepository; - private final GameRepository gameRepository; private final MemberRepository memberRepository; private final SseEmitterRepository sseEmitterRepository; @@ -58,7 +41,8 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { public void notify(final Long loggedInMemberId, final Object event) { try { - notify(loggedInMemberId, event); + SseEmitter emitter = subscribeToSse(loggedInMemberId); + emitter.send(SseEmitter.event().name("AlarmEvent").data(event)); } catch (Exception e) { sseEmitterRepository.saveEventCache(String.valueOf(loggedInMemberId), event); sseEmitterRepository.deleteById(loggedInMemberId); @@ -75,125 +59,16 @@ public void sendCachedEventToUser(final Long memberId) { } public void sendAlarm(final Long memberId, final T responseDto) { - final Map, Consumer> alarmResponseDto = new HashMap<>(); - - alarmResponseDto.put(CrewAlarmResponse.class, response -> emitCrewMessage(memberId, (CrewAlarmResponse) response)); - alarmResponseDto.put(GameAlarmResponse.class, response -> emitGameMessage(memberId, (GameAlarmResponse) response)); - - final Consumer processor = alarmResponseDto.get(responseDto.getClass()); - - if (processor != null) { - try { - processor.accept(responseDto); - } catch (Exception e) { - sseEmitterRepository.deleteById(memberId); - log.error("알람 전송 중 오류가 발생했습니다. : " + memberId, e); - } - } else { - log.error("알 수 없는 알람 타입입니다: " + responseDto.getClass().getSimpleName()); - } - } - - public void emitCrewMessage(final Long memberId, final CrewAlarmResponse crewAlarm) { - final Long crewId = crewAlarm.getCrewId(); - final Member crewLeader = getCrewLeaderOfCrew(crewId); - final List crewApplyMembers = getCrewMembers(crewId, WAITING); - - sendAlarmToCrewLeader(crewLeader, crewAlarm); - sendAlarmToCrewApplyMembers(crewApplyMembers, crewAlarm); - } - - private void sendAlarmToMember(final Member member, final CrewAlarmResponse crewAlarm) { try { - notify(member.getId(), crewAlarm); + notify(memberId, responseDto); } catch (Exception e) { - log.error("해당 회원에게 알람 전송 중 오류가 발생했습니다. : " + member.getId(), e); - deleteById(member.getId()); - } - } - - private void sendAlarmToCrewLeader(final Member leader, final CrewAlarmResponse crewAlarm) { - sendAlarmToMember(leader, crewAlarm); - } - - private void sendAlarmToCrewApplyMembers(final List members, final CrewAlarmResponse crewAlarm) { - - if (members == null) { - log.debug("해당 크루에 가입 신청을 한 회원을 찾지 못하였습니다."); - return; + sseEmitterRepository.deleteById(memberId); + log.error("알람 전송 중 오류가 발생했습니다. : " + memberId, e); } - members.forEach(member -> sendAlarmToMember(member, crewAlarm)); - } - - private Member getCrewLeaderOfCrew(final Long crewId) { - final Crew crew = getCrewInfo(crewId); - return crew.getLeader(); - } - - private Crew getCrewInfo(final Long crewId) { - final Crew crew = crewRepository.findById(crewId) - .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - return crew; - } - - private List getCrewMembers(final Long crewId, final RegistrationStatus status) { - final Crew crew = getCrewInfo(crewId); - return crew.getCrewMembers(status); - } - - public void emitGameMessage(final Long memberId, final GameAlarmResponse gameAlarm) { - final Long gameId = gameAlarm.getGameId(); - final Member gameHost = getHostOfGame(gameId); - final List gameApplyMembers = getGameMembers(gameId, WAITING); - - sendAlarmToGameHost(gameHost, gameAlarm); - sendAlarmToGameApplyMembers(gameApplyMembers, gameAlarm); - } - - private void sendAlarmToMember(final Member member, final GameAlarmResponse gameAlarm) { - try { - notify(member.getId(), gameAlarm); - } catch (Exception e) { - log.info("해당 회원에게 알람 전송 중 오류가 발생되었습니다. : " + member.getId(), e); - } - } - - private void sendAlarmToGameHost(final Member gameHost, final GameAlarmResponse gameAlarm) { - sendAlarmToMember(gameHost, gameAlarm); - } - - private void sendAlarmToGameApplyMembers(final List members, final GameAlarmResponse gameAlarm) { - - if (members == null) { - log.debug("해당 경기에 참여 신청을 한 회원을 찾지 못하였습니다."); - return; - } - members.forEach(member -> sendAlarmToMember(member, gameAlarm)); - } - - private Member getHostOfGame(final Long gameId) { - final Game game = getGameInfo(gameId); - return game.getHost(); - } - - private List getGameMembers(final Long gameId, final RegistrationStatus status) { - final Game game = getGameInfo(gameId); - return game.getMembersByStatus(status); - } - - private Game getGameInfo(final Long gameId) { - final Game game = gameRepository.findById(gameId) - .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - return game; } private Member findMemberById(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } - - public void deleteById(final Long id) { - sseEmitterRepository.deleteById(id); - log.info("아이디 {}에 해당하는 Emitter가 성공적으로 삭제되었습니다.", id); - } } From 7b60bf259e5d6ae8cbc9f74d991ab8274ce322a2 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 26 Nov 2023 03:00:05 +0900 Subject: [PATCH 76/78] =?UTF-8?q?refactor:=20SseEmitterLocalRepsoitory=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81(eventCache=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?,findEmiterById,=20deleteEventCache=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/SseEmitterLocalRepository.java | 18 ++++++++++++++---- .../alarm/repository/SseEmitterRepository.java | 4 ++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java index 371403b2..f3b36d2d 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java @@ -15,7 +15,7 @@ public class SseEmitterLocalRepository implements SseEmitterRepository { private final Map emitters = new ConcurrentHashMap<>(); - private final Map eventCache = new ConcurrentHashMap<>(); + private final Map fallbackEmitters = new ConcurrentHashMap<>(); @Override public SseEmitter save(final String emitterId, final SseEmitter sseEmitter) { @@ -23,14 +23,24 @@ public SseEmitter save(final String emitterId, final SseEmitter sseEmitter) { return sseEmitter; } + @Override + public SseEmitter findEmitterById(final Long emitterId) { + return emitters.get(emitterId); + } + @Override public void saveEventCache(final String eventCacheId, final Object event) { - eventCache.put(Long.parseLong(eventCacheId), event); + fallbackEmitters.put(Long.parseLong(eventCacheId), event); + } + + @Override + public void deleteEventCache(final String eventCacheId) { + fallbackEmitters.remove(Long.parseLong(eventCacheId)); } @Override public Map findAllEventCacheStartWithByMemberId(final Long memberId) { - final Map result = eventCache.entrySet().stream() + final Map result = fallbackEmitters.entrySet().stream() .filter(entry -> entry.getKey().toString().startsWith(memberId.toString())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); @@ -44,6 +54,6 @@ public void deleteById(final Long emitterId) { @Override public void deleteAllEventCacheStartWithId(final Long memberId) { - eventCache.entrySet().removeIf(entry -> entry.getKey().toString().startsWith(memberId.toString())); + fallbackEmitters.entrySet().removeIf(entry -> entry.getKey().toString().startsWith(memberId.toString())); } } diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java index 595f7868..858b4b8f 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java @@ -8,8 +8,12 @@ public interface SseEmitterRepository { SseEmitter save(final String emitterId, final SseEmitter sseEmitter); + SseEmitter findEmitterById(final Long emitterId); + void saveEventCache(final String eventCacheId, final Object event); + void deleteEventCache(final String eventCacheId); + Map findAllEventCacheStartWithByMemberId(final Long memberId); void deleteById(final Long emitterId); From 877c80ddb685123931c4fc1b60478f920efecc50 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 26 Nov 2023 03:02:59 +0900 Subject: [PATCH 77/78] =?UTF-8?q?refactor:=20SseEmitterService=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81(=20notify=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C,=20member=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=82=AD=EC=A0=9C,?= =?UTF-8?q?=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=BA=90=EC=8B=9C=EC=97=90=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EB=90=9C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=AC=EC=A0=84=EC=86=A1=20=EB=B0=8F=20=EC=A0=84=EC=86=A1=20?= =?UTF-8?q?=EC=9D=B4=ED=9B=84=20=EC=BA=90=EC=8B=9C=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/controller/AlarmController.java | 2 +- .../back/alarm/service/SseEmitterService.java | 68 ++++++++----------- 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java index 3955a90f..f5b82871 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java @@ -29,7 +29,7 @@ public ResponseEntity subscribeToSse( @Login final Long loggedInMemberId ) { final SseEmitter emitter = alarmService.subscribeToSse(loggedInMemberId); - sseEmitterService.sendCachedEventToUser(loggedInMemberId); + sseEmitterService.sendCachedEventToUser(loggedInMemberId, emitter); return ResponseEntity.status(OK) .header("X-Accel-Buffering", "no") diff --git a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java index ca76526a..2dcf7356 100644 --- a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java +++ b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java @@ -1,9 +1,6 @@ package kr.pickple.back.alarm.service; import kr.pickple.back.alarm.repository.SseEmitterRepository; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -12,63 +9,56 @@ import java.io.IOException; import java.util.Map; -import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; - @Slf4j @Service @RequiredArgsConstructor public class SseEmitterService { - private final MemberRepository memberRepository; private final SseEmitterRepository sseEmitterRepository; public SseEmitter subscribeToSse(final Long loggedInMemberId) { - final Member member = findMemberById(loggedInMemberId); - final SseEmitter emitter = new SseEmitter(Long.MAX_VALUE); + SseEmitter emitter = sseEmitterRepository.findEmitterById(loggedInMemberId); - try { - emitter.send(SseEmitter.event() - .name("AlarmSseConnect") - .data("사용자에 대한 알람 SSE 연결이 정상적으로 처리되었습니다.")); - } catch (IOException e) { - sseEmitterRepository.deleteById(loggedInMemberId); - emitter.completeWithError(e); + if (emitter == null) { + emitter = new SseEmitter(Long.MAX_VALUE); + try { + emitter.send(SseEmitter.event() + .name("AlarmSseConnect") + .data("사용자에 대한 알람 SSE 연결이 정상적으로 처리되었습니다.")); + } catch (IOException e) { + sseEmitterRepository.deleteById(loggedInMemberId); + emitter.completeWithError(e); + } + sseEmitterRepository.save(String.valueOf(loggedInMemberId), emitter); } - - sseEmitterRepository.save(String.valueOf(loggedInMemberId), emitter); return emitter; } - public void notify(final Long loggedInMemberId, final Object event) { - try { - SseEmitter emitter = subscribeToSse(loggedInMemberId); - emitter.send(SseEmitter.event().name("AlarmEvent").data(event)); - } catch (Exception e) { - sseEmitterRepository.saveEventCache(String.valueOf(loggedInMemberId), event); - sseEmitterRepository.deleteById(loggedInMemberId); - log.error("알림 전송 중 오류가 발생했습니다.", e); - } - } + public void sendCachedEventToUser(final Long memberId, final SseEmitter emitter) { + Map fallbackEmitters = sseEmitterRepository.findAllEventCacheStartWithByMemberId(memberId); - public void sendCachedEventToUser(final Long memberId) { - Map eventCache = sseEmitterRepository.findAllEventCacheStartWithByMemberId(memberId); - if (eventCache != null && !eventCache.isEmpty()) { - eventCache.values().forEach(event -> notify(memberId, event)); - sseEmitterRepository.deleteAllEventCacheStartWithId(memberId); + if (fallbackEmitters != null && !fallbackEmitters.isEmpty()) { + fallbackEmitters.values().forEach(event -> { + try { + emitter.send(SseEmitter.event().name("AlarmEvent").data(event)); + } catch (IOException e) { + log.error("알람 전송 중 오류가 발생했습니다.", e); + } + sseEmitterRepository.deleteAllEventCacheStartWithId(memberId); + }); } } public void sendAlarm(final Long memberId, final T responseDto) { + final SseEmitter emitter = subscribeToSse(memberId); + try { - notify(memberId, responseDto); + emitter.send(SseEmitter.event().name("AlarmEvent").data(responseDto)); + sseEmitterRepository.deleteEventCache(String.valueOf(memberId)); } catch (Exception e) { + sseEmitterRepository.saveEventCache(String.valueOf(memberId), responseDto); sseEmitterRepository.deleteById(memberId); - log.error("알람 전송 중 오류가 발생했습니다. : " + memberId, e); + log.error("알람 전송 중 오류가 발생했습니다. memberId: {}", memberId, e); } } - - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } } From b0bdc91ceacb0228956e0f8b6fa28f2c0b7eb961 Mon Sep 17 00:00:00 2001 From: jay-so Date: Sun, 26 Nov 2023 16:54:33 +0900 Subject: [PATCH 78/78] =?UTF-8?q?fix:=20=ED=81=AC=EB=A3=A8=20=EA=B1=B0?= =?UTF-8?q?=EC=A0=88=20=EC=95=8C=EB=9E=8C,=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B1=B0=EC=A0=88=20=EC=95=8C=EB=9E=8C=20=ED=8A=B8=EB=9E=9C?= =?UTF-8?q?=EC=9E=AD=EC=85=98=20=EB=AC=B8=EC=A0=9C=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=ED=81=AC=EB=A3=A8=20=EC=95=8C=EB=9E=8C,=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=95=8C=EB=9E=8C=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/alarm/event/game/GameAlarmEvent.java | 14 -------------- .../back/alarm/handler/CrewAlarmEventHandler.java | 8 ++++---- .../back/alarm/handler/GameAlarmEventHandler.java | 9 ++++----- .../pickple/back/common/config/CommonConfig.java | 5 ++--- 4 files changed, 10 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/alarm/event/game/GameAlarmEvent.java diff --git a/src/main/java/kr/pickple/back/alarm/event/game/GameAlarmEvent.java b/src/main/java/kr/pickple/back/alarm/event/game/GameAlarmEvent.java deleted file mode 100644 index f7e0759a..00000000 --- a/src/main/java/kr/pickple/back/alarm/event/game/GameAlarmEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package kr.pickple.back.alarm.event.game; - -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@Builder -@RequiredArgsConstructor -public class GameAlarmEvent { - - private final Long gameId; - private final Long memberId; -} diff --git a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java index 17e1f28c..474d5f30 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java @@ -5,9 +5,9 @@ import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alarm.service.CrewAlarmService; import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; @Component @RequiredArgsConstructor @@ -16,19 +16,19 @@ public class CrewAlarmEventHandler { private final CrewAlarmService crewAlarmService; @Async - @EventListener + @TransactionalEventListener public void sendAlarmToCrewLeader(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { crewAlarmService.createCrewJoinAlarm(crewJoinRequestNotificationEvent); } @Async - @EventListener + @TransactionalEventListener public void sendAlarmToCrewMemberOnJoin(final CrewMemberJoinedEvent crewMemberJoinedEvent) { crewAlarmService.createCrewMemberApproveAlarm(crewMemberJoinedEvent); } @Async - @EventListener + @TransactionalEventListener public void sendAlarmToCrewMemberOnRejection(final CrewMemberRejectedEvent crewMemberRejectedEvent) { crewAlarmService.createCrewMemberDeniedAlarm(crewMemberRejectedEvent); } diff --git a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java index a7137491..e7a7b674 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java @@ -1,14 +1,13 @@ package kr.pickple.back.alarm.handler; -import kr.pickple.back.alarm.event.game.GameAlarmEvent; import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.alarm.service.GameAlarmService; import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; @Component @RequiredArgsConstructor @@ -17,19 +16,19 @@ public class GameAlarmEventHandler { private final GameAlarmService gameAlarmService; @Async - @EventListener + @TransactionalEventListener public void sendAlarmToGameHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { gameAlarmService.createGameJoinAlarm(gameJoinRequestNotificationEvent); } @Async - @EventListener + @TransactionalEventListener public void sendAlarmToGameMemberOnJoin(final GameMemberJoinedEvent gameMemberJoinedEvent) { gameAlarmService.createGuestApproveAlarm(gameMemberJoinedEvent); } @Async - @EventListener + @TransactionalEventListener public void sendAlarmToGameMemberOnRejection(final GameMemberRejectedEvent gameMemberRejectedEvent) { gameAlarmService.createGuestDeniedAlarm(gameMemberRejectedEvent); } diff --git a/src/main/java/kr/pickple/back/common/config/CommonConfig.java b/src/main/java/kr/pickple/back/common/config/CommonConfig.java index 59d8ad2a..46cb48f5 100644 --- a/src/main/java/kr/pickple/back/common/config/CommonConfig.java +++ b/src/main/java/kr/pickple/back/common/config/CommonConfig.java @@ -1,10 +1,9 @@ package kr.pickple.back.common.config; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - import kr.pickple.back.common.config.property.RedisProperties; import kr.pickple.back.common.config.property.S3Properties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; @Configuration @EnableConfigurationProperties(value = {RedisProperties.class, S3Properties.class})