From 016b2c23817940bfcd86fdb5e528d6a54ab50895 Mon Sep 17 00:00:00 2001 From: JadeKim042386 Date: Mon, 3 Jun 2024 10:53:05 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20#153=20-=201=EA=B0=9C=EC=9B=94=20?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=EB=A1=9C=20=EC=95=8C=EB=9E=8C=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20schedule=EC=9D=84=20=EC=A0=81=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EB=A7=A4=EB=8B=AC=200=EC=8B=9C=EC=97=90=201?= =?UTF-8?q?=EA=B0=9C=EC=9B=94=EC=9D=B4=20=EC=A7=80=EB=82=9C=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=EC=9D=84=20=EB=AA=A8=EB=91=90=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?(soft=20delete)=20-=20=EC=95=8C=EB=9E=8C=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EC=8B=9C=EC=97=90=EB=8A=94=20=EC=9D=BD=EC=9D=80=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=EB=8F=84=20=EA=B0=99=EC=9D=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?-=20=EC=95=8C=EB=9E=8C=20=ED=85=8C=EC=9D=B4=EB=B8=94=EC=97=90?= =?UTF-8?q?=20deleted=5Fat=20=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80=20-?= =?UTF-8?q?=20=EC=95=8C=EB=9E=8C=20=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20batch?= =?UTF-8?q?=20delete=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreshTrashBackendApplication.java | 2 ++ .../freshtrashbackend/entity/Alarm.java | 7 ++++++ .../repository/AlarmRepository.java | 6 ++++- .../service/AlarmService.java | 22 +++++++++++++++---- src/main/resources/application-common.yml | 4 +++- 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main/java/freshtrash/freshtrashbackend/FreshTrashBackendApplication.java b/src/main/java/freshtrash/freshtrashbackend/FreshTrashBackendApplication.java index 66eea409..f8773232 100644 --- a/src/main/java/freshtrash/freshtrashbackend/FreshTrashBackendApplication.java +++ b/src/main/java/freshtrash/freshtrashbackend/FreshTrashBackendApplication.java @@ -3,9 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.scheduling.annotation.EnableScheduling; @ConfigurationPropertiesScan @SpringBootApplication +@EnableScheduling public class FreshTrashBackendApplication { public static void main(String[] args) { diff --git a/src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java b/src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java index 1cfa917c..5860ab90 100644 --- a/src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java +++ b/src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java @@ -5,8 +5,10 @@ import freshtrash.freshtrashbackend.entity.constants.AlarmType; import io.hypersistence.utils.hibernate.type.json.JsonType; import lombok.*; +import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.Where; import javax.persistence.*; import java.time.LocalDateTime; @@ -20,6 +22,8 @@ @EqualsAndHashCode(onlyExplicitlyIncluded = true) @NoArgsConstructor(access = AccessLevel.PROTECTED) @TypeDef(name = "json", typeClass = JsonType.class) +@SQLDelete(sql = "update alarms set deleted_at = now() where id=?") +@Where(clause = "deleted_at is NULL") public class Alarm extends CreatedAt { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -40,6 +44,9 @@ public class Alarm extends CreatedAt { @Setter private LocalDateTime readAt; + @Setter + private LocalDateTime deletedAt; + @ToString.Exclude @ManyToOne(optional = false, fetch = LAZY) @JoinColumn(name = "memberId", insertable = false, updatable = false) diff --git a/src/main/java/freshtrash/freshtrashbackend/repository/AlarmRepository.java b/src/main/java/freshtrash/freshtrashbackend/repository/AlarmRepository.java index 7c7142ef..7234eff4 100644 --- a/src/main/java/freshtrash/freshtrashbackend/repository/AlarmRepository.java +++ b/src/main/java/freshtrash/freshtrashbackend/repository/AlarmRepository.java @@ -8,12 +8,16 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; + @Transactional(propagation = Propagation.SUPPORTS) public interface AlarmRepository extends JpaRepository { - Page findAllByMember_IdAndReadAtIsNull(Long memberId, Pageable pageable); + Page findAllByMember_Id(Long memberId, Pageable pageable); @Query(nativeQuery = true, value = "update alarms a set a.read_at = now() where a.id = ?1") void updateReadAtById(Long alarmId); boolean existsByIdAndMember_Id(Long alarmId, Long memberId); + + void deleteAllInBatchByReadAtNotNullAndCreatedAtBefore(LocalDateTime localDateTime); } diff --git a/src/main/java/freshtrash/freshtrashbackend/service/AlarmService.java b/src/main/java/freshtrash/freshtrashbackend/service/AlarmService.java index 406f14c1..65bd461c 100644 --- a/src/main/java/freshtrash/freshtrashbackend/service/AlarmService.java +++ b/src/main/java/freshtrash/freshtrashbackend/service/AlarmService.java @@ -17,10 +17,13 @@ import org.springframework.data.domain.Pageable; import org.springframework.messaging.handler.annotation.Header; import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.scheduling.annotation.Scheduled; 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.time.LocalDateTime; import java.util.concurrent.TimeUnit; @Slf4j @@ -35,12 +38,10 @@ public class AlarmService { /** * 전체 알람 조회 - * - 읽지 않은 알람(readAt == null)만 조회 + * - 읽지 않은 알람도 같이 조회 */ public Page getAlarms(Long memberId, Pageable pageable) { - return alarmRepository - .findAllByMember_IdAndReadAtIsNull(memberId, pageable) - .map(AlarmResponse::fromEntity); + return alarmRepository.findAllByMember_Id(memberId, pageable).map(AlarmResponse::fromEntity); } /** @@ -112,6 +113,19 @@ public void readAlarm(Long alarmId) { alarmRepository.updateReadAtById(alarmId); } + /** + * 1개월이 지난 알람 모두 삭제 + * - 매달 0시에 수행 + */ + @Transactional + @Scheduled(cron = "0 0 0 * * *") + public void deleteAlarms() { + log.debug("delete alarms!!"); + alarmRepository.deleteAllInBatchByReadAtNotNullAndCreatedAtBefore( + LocalDateTime.now().minusMonths(1)); + log.debug("successfully deleted alarms!!"); + } + public boolean isOwnerOfAlarm(Long alarmId, Long memberId) { return alarmRepository.existsByIdAndMember_Id(alarmId, memberId); } diff --git a/src/main/resources/application-common.yml b/src/main/resources/application-common.yml index 1b833aa0..66d6a4b9 100644 --- a/src/main/resources/application-common.yml +++ b/src/main/resources/application-common.yml @@ -3,7 +3,7 @@ spring: web: locale: ko_KR datasource: - driver-class-name: org.mariadb.jdbc.Driver + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy url: ${DB_URL} username: ${DB_USERNAME} password: ${DB_PASSWORD} @@ -14,6 +14,8 @@ spring: hibernate: format_sql: true metadata_builder_contributor: freshtrash.freshtrashbackend.config.JSONMetadataBuilderContributor + jdbc: + batch_size: 10 redis: port: ${REDIS_PORT} host: ${REDIS_HOST} From 8db52b94f0c2bac093269197bca3c6071430a2de Mon Sep 17 00:00:00 2001 From: JadeKim042386 Date: Mon, 3 Jun 2024 10:55:36 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20#153=20-=20SSE=20=EC=95=8C=EB=9E=8C?= =?UTF-8?q?=20=EC=A0=84=EC=86=A1=20=EC=8B=9C=20name=EC=9C=BC=EB=A1=9C=20al?= =?UTF-8?q?armType=EC=9D=84=20=EC=A7=80=EC=A0=95=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95=20-=20alarmType=EC=97=90=20?= =?UTF-8?q?=EC=98=88=EC=95=BD=20=EC=9A=94=EC=B2=AD=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20type=EC=9D=84=20=EC=B6=94=EA=B0=80=20-=20=ED=8C=90?= =?UTF-8?q?=EB=A7=A4=20=EC=83=81=ED=83=9C=20=EB=B3=80=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=20=EC=8B=9C=20alarmType=EC=9D=84=20=EC=9D=B8=EC=9E=90?= =?UTF-8?q?=EB=A1=9C=20=EB=84=98=EA=B2=A8=EC=A3=BC=EB=8F=84=EB=A1=9D=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 --- .../dto/request/AlarmPayload.java | 22 +++++++++---------- .../entity/constants/AlarmType.java | 15 +++++++------ .../service/AlarmService.java | 3 +-- .../alarm/CancelBookingProductAlarm.java | 3 ++- .../alarm/RequestBookingProductAlarm.java | 3 ++- .../service/producer/ProductDealProducer.java | 16 +++++++++----- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/main/java/freshtrash/freshtrashbackend/dto/request/AlarmPayload.java b/src/main/java/freshtrash/freshtrashbackend/dto/request/AlarmPayload.java index 4b26c2ea..a7b3f5b4 100644 --- a/src/main/java/freshtrash/freshtrashbackend/dto/request/AlarmPayload.java +++ b/src/main/java/freshtrash/freshtrashbackend/dto/request/AlarmPayload.java @@ -6,27 +6,20 @@ @Builder public record AlarmPayload(String message, Long wasteId, Long memberId, Long fromMemberId, AlarmType alarmType) { - public static AlarmPayload ofProductDealByBuyer(String message, ChatRoom chatRoom) { - return ofProductDeal(message, chatRoom) + public static AlarmPayload ofProductDealByBuyer(String message, ChatRoom chatRoom, AlarmType alarmType) { + return ofProductDeal(message, chatRoom, alarmType) .memberId(chatRoom.getSellerId()) .fromMemberId(chatRoom.getBuyerId()) .build(); } - public static AlarmPayload ofProductDealBySeller(String message, ChatRoom chatRoom) { - return ofProductDeal(message, chatRoom) + public static AlarmPayload ofProductDealBySeller(String message, ChatRoom chatRoom, AlarmType alarmType) { + return ofProductDeal(message, chatRoom, alarmType) .memberId(chatRoom.getBuyerId()) .fromMemberId(chatRoom.getSellerId()) .build(); } - private static AlarmPayloadBuilder ofProductDeal(String message, ChatRoom chatRoom) { - return AlarmPayload.builder() - .message(message) - .wasteId(chatRoom.getWasteId()) - .alarmType(AlarmType.TRANSACTION); - } - public static AlarmPayload ofUserFlag(String message, Long wasteId, Long targetMemberId, Long currentMemberId) { return AlarmPayload.builder() .message(message) @@ -36,4 +29,11 @@ public static AlarmPayload ofUserFlag(String message, Long wasteId, Long targetM .alarmType(AlarmType.FLAG) .build(); } + + private static AlarmPayloadBuilder ofProductDeal(String message, ChatRoom chatRoom, AlarmType alarmType) { + return AlarmPayload.builder() + .message(message) + .wasteId(chatRoom.getWasteId()) + .alarmType(alarmType); + } } diff --git a/src/main/java/freshtrash/freshtrashbackend/entity/constants/AlarmType.java b/src/main/java/freshtrash/freshtrashbackend/entity/constants/AlarmType.java index 5e20295d..38680a88 100644 --- a/src/main/java/freshtrash/freshtrashbackend/entity/constants/AlarmType.java +++ b/src/main/java/freshtrash/freshtrashbackend/entity/constants/AlarmType.java @@ -1,11 +1,12 @@ package freshtrash.freshtrashbackend.entity.constants; public enum AlarmType { - CHAT, - TRANSACTION, - BIDDING, - PAY, - RECEIVE, - NOT_PAY, - FLAG + CHAT, // 채팅 알림 + TRANSACTION, // 거래 상태 변경 시 알림 + BOOKING_REQUEST, // 예약 요청 알림 + BIDDING, // 최종 입찰자 알림 + PAY, // 결제 완료 알림 + RECEIVE, // 상품 수령 알림 + NOT_PAY, // 미결제 알림 + FLAG // 사용자 신고 알림 } diff --git a/src/main/java/freshtrash/freshtrashbackend/service/AlarmService.java b/src/main/java/freshtrash/freshtrashbackend/service/AlarmService.java index 65bd461c..845f5e6f 100644 --- a/src/main/java/freshtrash/freshtrashbackend/service/AlarmService.java +++ b/src/main/java/freshtrash/freshtrashbackend/service/AlarmService.java @@ -32,7 +32,6 @@ public class AlarmService { private static final Long SSE_TIMEOUT = TimeUnit.MINUTES.toMillis(30); private static final String CONNECTED_ALARM_NAME = "connected"; - private static final String WASTE_TRANSACTION_ALARM_NAME = "waste-transaction-alarm"; private final EmitterRepository emitterRepository; private final AlarmRepository alarmRepository; @@ -68,7 +67,7 @@ private void receive(Long memberId, AlarmResponse alarmResponse) { try { sseEmitter.send(SseEmitter.event() .id(String.valueOf(alarmResponse.id())) - .name(WASTE_TRANSACTION_ALARM_NAME) + .name(alarmResponse.alarmType().name()) .data(alarmResponse)); } catch (IOException e) { emitterRepository.deleteByMemberId(memberId); diff --git a/src/main/java/freshtrash/freshtrashbackend/service/alarm/CancelBookingProductAlarm.java b/src/main/java/freshtrash/freshtrashbackend/service/alarm/CancelBookingProductAlarm.java index d870ec81..ce1735e9 100644 --- a/src/main/java/freshtrash/freshtrashbackend/service/alarm/CancelBookingProductAlarm.java +++ b/src/main/java/freshtrash/freshtrashbackend/service/alarm/CancelBookingProductAlarm.java @@ -1,6 +1,7 @@ package freshtrash.freshtrashbackend.service.alarm; import freshtrash.freshtrashbackend.entity.ChatRoom; +import freshtrash.freshtrashbackend.entity.constants.AlarmType; import freshtrash.freshtrashbackend.entity.constants.SellStatus; import freshtrash.freshtrashbackend.service.ChatRoomService; import freshtrash.freshtrashbackend.service.TransactionService; @@ -28,7 +29,7 @@ void publishEvent(ChatRoom bookedChatRoom) { this.chatRoomService .getNotClosedChatRoomsByWasteId(bookedChatRoom.getWasteId()) .forEach(chatRoom -> { - this.producer.updateSellStatus(chatRoom, message); + this.producer.updateSellStatus(chatRoom, message, AlarmType.TRANSACTION); }); } diff --git a/src/main/java/freshtrash/freshtrashbackend/service/alarm/RequestBookingProductAlarm.java b/src/main/java/freshtrash/freshtrashbackend/service/alarm/RequestBookingProductAlarm.java index fc2769ed..d602ae8f 100644 --- a/src/main/java/freshtrash/freshtrashbackend/service/alarm/RequestBookingProductAlarm.java +++ b/src/main/java/freshtrash/freshtrashbackend/service/alarm/RequestBookingProductAlarm.java @@ -1,6 +1,7 @@ package freshtrash.freshtrashbackend.service.alarm; import freshtrash.freshtrashbackend.entity.ChatRoom; +import freshtrash.freshtrashbackend.entity.constants.AlarmType; import freshtrash.freshtrashbackend.entity.constants.SellStatus; import freshtrash.freshtrashbackend.service.ChatRoomService; import freshtrash.freshtrashbackend.service.TransactionService; @@ -28,7 +29,7 @@ void publishEvent(ChatRoom ongoingChatRoom) { chatRoomService .getNotClosedChatRoomsByWasteId(ongoingChatRoom.getWasteId()) .forEach(chatRoom -> { - this.producer.updateSellStatus(chatRoom, message); + this.producer.updateSellStatus(chatRoom, message, AlarmType.BOOKING_REQUEST); }); } diff --git a/src/main/java/freshtrash/freshtrashbackend/service/producer/ProductDealProducer.java b/src/main/java/freshtrash/freshtrashbackend/service/producer/ProductDealProducer.java index 636e0cc1..73510e47 100644 --- a/src/main/java/freshtrash/freshtrashbackend/service/producer/ProductDealProducer.java +++ b/src/main/java/freshtrash/freshtrashbackend/service/producer/ProductDealProducer.java @@ -3,6 +3,7 @@ import freshtrash.freshtrashbackend.dto.events.AlarmEvent; import freshtrash.freshtrashbackend.dto.request.AlarmPayload; import freshtrash.freshtrashbackend.entity.ChatRoom; +import freshtrash.freshtrashbackend.entity.constants.AlarmType; import freshtrash.freshtrashbackend.service.producer.publisher.MQPublisher; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -25,24 +26,27 @@ public void requestReview(ChatRoom chatRoom) { mqPublisher.publish(generateRequestReviewEvent(chatRoom)); } - public void updateSellStatus(ChatRoom chatRoom, String message) { - mqPublisher.publish(generateUpdateSellStatusEvent(chatRoom, message)); + public void updateSellStatus(ChatRoom chatRoom, String message, AlarmType alarmType) { + mqPublisher.publish(generateUpdateSellStatusEvent(chatRoom, message, alarmType)); } - private AlarmEvent generateUpdateSellStatusEvent(ChatRoom chatRoom, String message) { + private AlarmEvent generateUpdateSellStatusEvent(ChatRoom chatRoom, String message, AlarmType alarmType) { return AlarmEvent.of( - WASTE_CHANGE_SELL_STATUS.getRoutingKey(), AlarmPayload.ofProductDealBySeller(message, chatRoom)); + WASTE_CHANGE_SELL_STATUS.getRoutingKey(), + AlarmPayload.ofProductDealBySeller(message, chatRoom, alarmType)); } private AlarmEvent generateCompleteDealEvent(ChatRoom chatRoom) { return AlarmEvent.of( WASTE_TRANSACTION_COMPLETE.getRoutingKey(), - AlarmPayload.ofProductDealBySeller(COMPLETED_SELL_MESSAGE.getMessage(), chatRoom)); + AlarmPayload.ofProductDealBySeller( + COMPLETED_SELL_MESSAGE.getMessage(), chatRoom, AlarmType.TRANSACTION)); } private AlarmEvent generateRequestReviewEvent(ChatRoom chatRoom) { return AlarmEvent.of( WASTE_TRANSACTION_COMPLETE.getRoutingKey(), - AlarmPayload.ofProductDealByBuyer(REQUEST_REVIEW_MESSAGE.getMessage(), chatRoom)); + AlarmPayload.ofProductDealByBuyer( + REQUEST_REVIEW_MESSAGE.getMessage(), chatRoom, AlarmType.TRANSACTION)); } } From 97f2ba7365d3325b24fd5fcced4df654de0127b3 Mon Sep 17 00:00:00 2001 From: JadeKim042386 Date: Mon, 3 Jun 2024 10:58:01 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20#153=20-=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EB=B0=98=ED=99=98=EB=90=98?= =?UTF-8?q?=EB=8A=94=20AlarmResponse=EC=97=90=20readAt=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../freshtrashbackend/dto/response/AlarmResponse.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/freshtrash/freshtrashbackend/dto/response/AlarmResponse.java b/src/main/java/freshtrash/freshtrashbackend/dto/response/AlarmResponse.java index f2c9dfdf..307e0d56 100644 --- a/src/main/java/freshtrash/freshtrashbackend/dto/response/AlarmResponse.java +++ b/src/main/java/freshtrash/freshtrashbackend/dto/response/AlarmResponse.java @@ -5,14 +5,17 @@ import freshtrash.freshtrashbackend.entity.constants.AlarmType; import lombok.Builder; +import java.time.LocalDateTime; + @Builder -public record AlarmResponse(Long id, AlarmType alarmType, AlarmArgs alarmArgs, String message) { +public record AlarmResponse(Long id, AlarmType alarmType, AlarmArgs alarmArgs, String message, LocalDateTime readAt) { public static AlarmResponse fromEntity(Alarm alarm) { return AlarmResponse.builder() .id(alarm.getId()) .alarmType(alarm.getAlarmType()) .alarmArgs(alarm.getAlarmArgs()) .message(alarm.getMessage()) + .readAt(alarm.getReadAt()) .build(); } } From 537854e31eccd216f9b23e75626e68a347ae3fb1 Mon Sep 17 00:00:00 2001 From: JadeKim042386 Date: Mon, 3 Jun 2024 10:59:20 +0900 Subject: [PATCH 4/8] =?UTF-8?q?test:=20#153=20-=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../freshtrash/freshtrashbackend/service/AlarmServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/freshtrash/freshtrashbackend/service/AlarmServiceTest.java b/src/test/java/freshtrash/freshtrashbackend/service/AlarmServiceTest.java index 15ef800e..f2e570e5 100644 --- a/src/test/java/freshtrash/freshtrashbackend/service/AlarmServiceTest.java +++ b/src/test/java/freshtrash/freshtrashbackend/service/AlarmServiceTest.java @@ -51,7 +51,7 @@ void given_memberIdAndPageable_when_then_getPagingAlarms() { Long memberId = 1L; int expectedSize = 1; Pageable pageable = PageRequest.of(0, 10); - given(alarmRepository.findAllByMember_IdAndReadAtIsNull(eq(memberId), eq(pageable))) + given(alarmRepository.findAllByMember_Id(eq(memberId), eq(pageable))) .willReturn(new PageImpl<>(List.of(Fixture.createAlarm()))); // when Page alarms = alarmService.getAlarms(memberId, pageable); From 9b234ba1f69b6073f90cb03a56ebaa2c7ac563e7 Mon Sep 17 00:00:00 2001 From: JadeKim042386 Date: Mon, 3 Jun 2024 10:59:47 +0900 Subject: [PATCH 5/8] =?UTF-8?q?chore:=20Alarms=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/mariadb/initdb.d/create_table.sql | 1 + database/mariadb/initdb.d/insert_data.sql | 54 ++++++++++++---------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/database/mariadb/initdb.d/create_table.sql b/database/mariadb/initdb.d/create_table.sql index c319df19..b6cebe19 100644 --- a/database/mariadb/initdb.d/create_table.sql +++ b/database/mariadb/initdb.d/create_table.sql @@ -128,6 +128,7 @@ CREATE TABLE `alarms` `message` varchar(255) NOT NULL, `created_at` datetime NOT NULL, `read_at` datetime, + `deleted_at` datetime, PRIMARY KEY (`id`), foreign key (`member_id`) references members (id) on delete cascade ) ENGINE = InnoDB diff --git a/database/mariadb/initdb.d/insert_data.sql b/database/mariadb/initdb.d/insert_data.sql index 9d9eafe9..a41dddb3 100644 --- a/database/mariadb/initdb.d/insert_data.sql +++ b/database/mariadb/initdb.d/insert_data.sql @@ -143,29 +143,35 @@ values (5, 1, 2, now()), (19, 1, 2, now()), (20, 1, 2, now()); -insert into alarms(member_id, alarm_type, alarm_args, message, created_at, read_at) -values (1, 'CHAT', json_object('fromMemberId', 2, 'targetId', 1), '거래 완료되었습니다.', now(), null), - (1, 'CHAT', json_object('fromMemberId', 1, 'targetId', 2), '알람 테스트', now(), null), - (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), 'user123님이 예약중으로 변경하였습니다.', now(), null), - (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), 'user123님이 판매중으로 변경하였습니다.', now(), null), - (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), 'user123님이 예약중으로 변경하였습니다.', now(), null), - (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), 'user123님이 판매중으로 변경하였습니다.', now(), null), - (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), '거래 완료되었습니다.', now(), null), - (1, 'TRANSACTION', json_object('fromMemberId', 4, 'targetId', 4), '예약중으로 변경하였습니다.', now(), null), - (1, 'TRANSACTION', json_object('fromMemberId', 4, 'targetId', 4), '거래 완료되었습니다.', now(), null), +insert into alarms(member_id, alarm_type, alarm_args, message, created_at, read_at, deleted_at) +values (1, 'CHAT', json_object('fromMemberId', 2, 'targetId', 1), '거래 완료되었습니다.', now(), null, null), + (1, 'CHAT', json_object('fromMemberId', 1, 'targetId', 2), '알람 테스트', now(), null, null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), 'user123님이 예약중으로 변경하였습니다.', now(), null, null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), 'user123님이 판매중으로 변경하였습니다.', now(), null, null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), 'user123님이 예약중으로 변경하였습니다.', now(), null, null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), 'user123님이 판매중으로 변경하였습니다.', now(), null, null), + (1, 'CHAT', json_object('fromMemberId', 2, 'targetId', 5), '거래 완료되었습니다.', now(), now(), null), + (1, 'CHAT', json_object('fromMemberId', 1, 'targetId', 6), '알람 테스트', now(), now(), null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 5), 'user123님이 예약중으로 변경하였습니다.', now(), now(), null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 5), 'user123님이 판매중으로 변경하였습니다.', now(), now(), null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 5), 'user123님이 예약중으로 변경하였습니다.', now(), now(), null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 5), 'user123님이 판매중으로 변경하였습니다.', now(), now(), null), + (1, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), '거래 완료되었습니다.', now(), null, null), + (1, 'TRANSACTION', json_object('fromMemberId', 4, 'targetId', 4), '예약중으로 변경하였습니다.', now(), null, null), + (1, 'TRANSACTION', json_object('fromMemberId', 4, 'targetId', 4), '거래 완료되었습니다.', now(), null, null), (1, 'FLAG', json_object('fromMemberId', 1, 'targetId', 1), - '1번 신고받은 내역이 있습니다. 신고받은 횟수가 10번이상 되면 서비스를 이용하실 수 없습니다.', now(), null), - (2, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null), - (2, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), '판매 완료되었습니다.', now(), null), - (2, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), '판매 완료되었습니다.', now(), null), + '1번 신고받은 내역이 있습니다. 신고받은 횟수가 10번이상 되면 서비스를 이용하실 수 없습니다.', now(), null, null), + (2, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null, null), + (2, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), '판매 완료되었습니다.', now(), null, null), + (2, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), '판매 완료되었습니다.', now(), null, null), (2, 'FLAG', json_object('fromMemberId', 1, 'targetId', 1), - '1번 신고받은 내역이 있습니다. 신고받은 횟수가 10번이상 되면 서비스를 이용하실 수 없습니다.', now(), null), - (2, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 2), 'user123님이 예약중으로 변경했습니다.', now(), null), - (2, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 2), '판매 완료되었습니다.', now(), null), - (2, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), '판매 완료되었습니다.', now(), null), - (3, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null), - (3, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 예약중으로 변경하였습니다.', now(), null), - (3, 'TRANSACTION', json_object('fromMemberId', 2, 'targetId', 1), '판매 완료되었습니다.', now(), null), - (4, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null), - (5, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null); - + '1번 신고받은 내역이 있습니다. 신고받은 횟수가 10번이상 되면 서비스를 이용하실 수 없습니다.', now(), null, null), + (2, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 2), 'user123님이 예약중으로 변경했습니다.', now(), null, null), + (2, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 2), '판매 완료되었습니다.', now(), null, null), + (2, 'TRANSACTION', json_object('fromMemberId', 3, 'targetId', 1), '판매 완료되었습니다.', now(), null, null), + (3, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null, null), + (3, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 예약중으로 변경하였습니다.', now(), null, null), + (3, 'TRANSACTION', json_object('fromMemberId', 2, 'targetId', 1), '판매 완료되었습니다.', now(), null, null), + (4, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null, null), + (5, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null, null), + (1, 'TRANSACTION', json_object('fromMemberId', 1, 'targetId', 1), 'abc님이 판매중으로 변경하였습니다.', now(), null, now()); From d31c16e4210a38fcf76ee8fe3bbff45620d14374 Mon Sep 17 00:00:00 2001 From: JadeKim042386 Date: Mon, 3 Jun 2024 11:11:38 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20#153=20-=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EC=9D=98=20readAt/deletedAt?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20setter=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?-=20readAt/deleteAt=EC=9D=80=20DB=20=EC=BF=BC=EB=A6=AC=EB=A5=BC?= =?UTF-8?q?=20=ED=86=B5=ED=95=B4=20=EA=B0=92=EC=9D=B4=20=ED=95=A0=EB=8B=B9?= =?UTF-8?q?=EB=90=98=EA=B8=B0=20=EB=95=8C=EB=AC=B8=EC=97=90=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20setter=EB=A5=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java b/src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java index 5860ab90..476062b0 100644 --- a/src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java +++ b/src/main/java/freshtrash/freshtrashbackend/entity/Alarm.java @@ -41,10 +41,8 @@ public class Alarm extends CreatedAt { @Column(nullable = false) private String message; - @Setter private LocalDateTime readAt; - @Setter private LocalDateTime deletedAt; @ToString.Exclude From 44b33fc5317ae75cb99b666d6c6f177eac45c06c Mon Sep 17 00:00:00 2001 From: JadeKim042386 Date: Mon, 3 Jun 2024 11:15:10 +0900 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20#153=20-=20producer=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=EC=84=9C=EC=9D=98=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=EB=A5=BC=20=EB=B3=91=ED=95=A9=20-=20AlarmEve?= =?UTF-8?q?nt=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=EB=A5=BC=20=EB=94=B0=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=96=88=EC=9D=84=20=EA=B2=BD=EC=9A=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=A0=20=EB=95=8C=20=EB=B3=80=EA=B2=BD=EB=90=98?= =?UTF-8?q?=EC=96=B4=EC=95=BC=ED=95=98=EB=8A=94=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EA=B0=80=20=EB=A7=8E=EC=95=84=EC=A7=80=EA=B3=A0=20=EC=9C=A0?= =?UTF-8?q?=EC=A7=80=EB=B3=B4=EC=88=98=EA=B0=80=20=ED=9E=98=EB=93=A4?= =?UTF-8?q?=EC=96=B4=EC=A7=88=20=EA=B2=83=EC=9D=B4=EB=9D=BC=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=ED=95=98=EC=97=AC=20=EB=8B=A4=EC=8B=9C=20=EB=B3=91?= =?UTF-8?q?=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/producer/ChatProducer.java | 8 ++--- .../service/producer/ProductDealProducer.java | 32 ++++++------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/main/java/freshtrash/freshtrashbackend/service/producer/ChatProducer.java b/src/main/java/freshtrash/freshtrashbackend/service/producer/ChatProducer.java index fdaefeaf..80faca00 100644 --- a/src/main/java/freshtrash/freshtrashbackend/service/producer/ChatProducer.java +++ b/src/main/java/freshtrash/freshtrashbackend/service/producer/ChatProducer.java @@ -14,12 +14,8 @@ public class ChatProducer { private final MQPublisher mqPublisher; public void occurredUserFlag(Long wasteId, Long targetMemberId, Long currentMemberId, String message) { - mqPublisher.publish(generateUserFlagEvent(wasteId, targetMemberId, currentMemberId, message)); - } - - private AlarmEvent generateUserFlagEvent(Long wasteId, Long targetMemberId, Long currentMemberId, String message) { - return AlarmEvent.of( + mqPublisher.publish(AlarmEvent.of( WASTE_TRANSACTION_FLAG.getRoutingKey(), - AlarmPayload.ofUserFlag(message, wasteId, targetMemberId, currentMemberId)); + AlarmPayload.ofUserFlag(message, wasteId, targetMemberId, currentMemberId))); } } diff --git a/src/main/java/freshtrash/freshtrashbackend/service/producer/ProductDealProducer.java b/src/main/java/freshtrash/freshtrashbackend/service/producer/ProductDealProducer.java index 73510e47..c280da8a 100644 --- a/src/main/java/freshtrash/freshtrashbackend/service/producer/ProductDealProducer.java +++ b/src/main/java/freshtrash/freshtrashbackend/service/producer/ProductDealProducer.java @@ -19,34 +19,22 @@ public class ProductDealProducer { private final MQPublisher mqPublisher; public void completeDeal(ChatRoom chatRoom) { - mqPublisher.publish(generateCompleteDealEvent(chatRoom)); + mqPublisher.publish(AlarmEvent.of( + WASTE_TRANSACTION_COMPLETE.getRoutingKey(), + AlarmPayload.ofProductDealBySeller( + COMPLETED_SELL_MESSAGE.getMessage(), chatRoom, AlarmType.TRANSACTION))); } public void requestReview(ChatRoom chatRoom) { - mqPublisher.publish(generateRequestReviewEvent(chatRoom)); + mqPublisher.publish(AlarmEvent.of( + WASTE_TRANSACTION_COMPLETE.getRoutingKey(), + AlarmPayload.ofProductDealByBuyer( + REQUEST_REVIEW_MESSAGE.getMessage(), chatRoom, AlarmType.TRANSACTION))); } public void updateSellStatus(ChatRoom chatRoom, String message, AlarmType alarmType) { - mqPublisher.publish(generateUpdateSellStatusEvent(chatRoom, message, alarmType)); - } - - private AlarmEvent generateUpdateSellStatusEvent(ChatRoom chatRoom, String message, AlarmType alarmType) { - return AlarmEvent.of( + mqPublisher.publish(AlarmEvent.of( WASTE_CHANGE_SELL_STATUS.getRoutingKey(), - AlarmPayload.ofProductDealBySeller(message, chatRoom, alarmType)); - } - - private AlarmEvent generateCompleteDealEvent(ChatRoom chatRoom) { - return AlarmEvent.of( - WASTE_TRANSACTION_COMPLETE.getRoutingKey(), - AlarmPayload.ofProductDealBySeller( - COMPLETED_SELL_MESSAGE.getMessage(), chatRoom, AlarmType.TRANSACTION)); - } - - private AlarmEvent generateRequestReviewEvent(ChatRoom chatRoom) { - return AlarmEvent.of( - WASTE_TRANSACTION_COMPLETE.getRoutingKey(), - AlarmPayload.ofProductDealByBuyer( - REQUEST_REVIEW_MESSAGE.getMessage(), chatRoom, AlarmType.TRANSACTION)); + AlarmPayload.ofProductDealBySeller(message, chatRoom, alarmType))); } } From ed21c4a617bb3c396f186d23ce62e38ab0488d78 Mon Sep 17 00:00:00 2001 From: JadeKim042386 Date: Mon, 3 Jun 2024 11:22:20 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20#153=20-=20=EC=95=8C=EB=9E=8C=20rea?= =?UTF-8?q?dAt=20update=20=EC=BF=BC=EB=A6=AC=20=EC=88=98=EC=A0=95=20-=20?= =?UTF-8?q?=EA=B0=99=EC=9D=80=20=EC=95=8C=EB=9E=8C=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=B4=20=EC=97=AC=EB=9F=AC=EB=B2=88=20=EC=9D=BD=EC=9D=8C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=9A=94=EC=B2=AD=EC=9D=B4=20=EB=93=A4?= =?UTF-8?q?=EC=96=B4=EC=98=AC=20=EA=B2=BD=EC=9A=B0=20readAt=EC=9D=B4=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=EC=9D=B4=20=EB=93=A4=EC=96=B4=EC=98=AC=20?= =?UTF-8?q?=EB=95=8C=EB=A7=88=EB=8B=A4=20update=EA=B0=80=20=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20readAt=EC=9D=B4=20nul?= =?UTF-8?q?l=EC=9D=B4=EC=96=B4=EC=95=BC=ED=95=9C=EB=8B=A4=EB=8A=94=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=EC=9D=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../freshtrashbackend/repository/AlarmRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/freshtrash/freshtrashbackend/repository/AlarmRepository.java b/src/main/java/freshtrash/freshtrashbackend/repository/AlarmRepository.java index 7234eff4..1cc55301 100644 --- a/src/main/java/freshtrash/freshtrashbackend/repository/AlarmRepository.java +++ b/src/main/java/freshtrash/freshtrashbackend/repository/AlarmRepository.java @@ -14,7 +14,7 @@ public interface AlarmRepository extends JpaRepository { Page findAllByMember_Id(Long memberId, Pageable pageable); - @Query(nativeQuery = true, value = "update alarms a set a.read_at = now() where a.id = ?1") + @Query(nativeQuery = true, value = "update alarms a set a.read_at = now() where a.id = ?1 and a.read_at is null") void updateReadAtById(Long alarmId); boolean existsByIdAndMember_Id(Long alarmId, Long memberId);