From 9eccdb1fa063c558b51329dd58312e93816cddab Mon Sep 17 00:00:00 2001 From: Kim So Yeon Date: Sat, 1 Feb 2025 01:52:25 +0900 Subject: [PATCH] =?UTF-8?q?:sparkles:=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=95=8C=EB=9E=8C=EC=9D=84=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=ED=95=9C=20=EC=83=81=ED=92=88=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/alarm/api/AlarmController.java | 12 ++++++ .../alarm/converter/AlarmConverter.java | 41 +++++++++++++++++++ .../alarm/repository/AlarmRepository.java | 2 + .../service/AlarmService/AlarmService.java | 4 ++ .../AlarmService/AlarmServiceImpl.java | 14 +++++++ src/main/resources/application-dev.yml | 6 +-- 6 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/pricewagon/pricewagon/domain/alarm/converter/AlarmConverter.java diff --git a/src/main/java/com/pricewagon/pricewagon/domain/alarm/api/AlarmController.java b/src/main/java/com/pricewagon/pricewagon/domain/alarm/api/AlarmController.java index 5e521de..cd54482 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/alarm/api/AlarmController.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/alarm/api/AlarmController.java @@ -1,7 +1,10 @@ package com.pricewagon.pricewagon.domain.alarm.api; +import java.util.List; + import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,6 +13,7 @@ import com.pricewagon.pricewagon.domain.alarm.dto.AlarmRequestDTO; import com.pricewagon.pricewagon.domain.alarm.dto.AlarmResponseDTO; import com.pricewagon.pricewagon.domain.alarm.service.AlarmService.AlarmService; +import com.pricewagon.pricewagon.domain.product.dto.response.BasicProductInfo; import com.pricewagon.pricewagon.global.config.security.CustomUserDetails; import io.swagger.v3.oas.annotations.Operation; @@ -32,4 +36,12 @@ public ResponseEntity registerAlarm( return ResponseEntity.ok(result); } + @Operation(summary = "알람 목록 조회", description = "알람 목록 조회하는 기능(토큰 필요)") + @GetMapping("/list") + public List getAlarmList( + @AuthenticationPrincipal CustomUserDetails userDetails) { + return alarmService.getAlarmList(userDetails.getUsername()); + + } + } diff --git a/src/main/java/com/pricewagon/pricewagon/domain/alarm/converter/AlarmConverter.java b/src/main/java/com/pricewagon/pricewagon/domain/alarm/converter/AlarmConverter.java new file mode 100644 index 0000000..0ee6823 --- /dev/null +++ b/src/main/java/com/pricewagon/pricewagon/domain/alarm/converter/AlarmConverter.java @@ -0,0 +1,41 @@ +package com.pricewagon.pricewagon.domain.alarm.converter; + +import java.util.List; + +import org.springframework.stereotype.Component; + +import com.pricewagon.pricewagon.domain.alarm.entity.Alarm; +import com.pricewagon.pricewagon.domain.history.service.ProductHistoryService; +import com.pricewagon.pricewagon.domain.product.dto.response.BasicProductInfo; +import com.pricewagon.pricewagon.domain.product.entity.Product; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class AlarmConverter { + private final ProductHistoryService productHistoryService; + + public List convertToBasicProductInfo(List alarms) { + return alarms.stream() + .map(like -> { + Product product = like.getProduct(); + Integer previousPrice = productHistoryService.getDifferentLatestPriceByProductId(product); + + return new BasicProductInfo( + product.getProductNumber(), + product.getName(), + product.getBrand(), + product.getStarScore(), + product.getReviewCount(), + product.getUserLikeCount(), + product.getImgUrl(), + product.getShopType(), + product.getCurrentPrice(), + previousPrice, + true + ); + }) + .toList(); + } +} diff --git a/src/main/java/com/pricewagon/pricewagon/domain/alarm/repository/AlarmRepository.java b/src/main/java/com/pricewagon/pricewagon/domain/alarm/repository/AlarmRepository.java index fa993c3..1438456 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/alarm/repository/AlarmRepository.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/alarm/repository/AlarmRepository.java @@ -31,6 +31,8 @@ public interface AlarmRepository extends JpaRepository { int updateAlarmStatus(@Param("id") Long id, @Param("status") AlarmStatus status, @Param("currentStatus") AlarmStatus currentStatus); + List findByUserId(Long userId); + } diff --git a/src/main/java/com/pricewagon/pricewagon/domain/alarm/service/AlarmService/AlarmService.java b/src/main/java/com/pricewagon/pricewagon/domain/alarm/service/AlarmService/AlarmService.java index f4d6ca3..41149f6 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/alarm/service/AlarmService/AlarmService.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/alarm/service/AlarmService/AlarmService.java @@ -1,7 +1,10 @@ package com.pricewagon.pricewagon.domain.alarm.service.AlarmService; +import java.util.List; + import com.pricewagon.pricewagon.domain.alarm.dto.AlarmRequestDTO; import com.pricewagon.pricewagon.domain.alarm.dto.AlarmResponseDTO; +import com.pricewagon.pricewagon.domain.product.dto.response.BasicProductInfo; public interface AlarmService { @@ -9,4 +12,5 @@ public interface AlarmService { AlarmResponseDTO.registerAlarmDTO registerAlarm(AlarmRequestDTO.registerAlarm request, String email); + List getAlarmList(String username); } diff --git a/src/main/java/com/pricewagon/pricewagon/domain/alarm/service/AlarmService/AlarmServiceImpl.java b/src/main/java/com/pricewagon/pricewagon/domain/alarm/service/AlarmService/AlarmServiceImpl.java index d6a4bc7..c5e4b3f 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/alarm/service/AlarmService/AlarmServiceImpl.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/alarm/service/AlarmService/AlarmServiceImpl.java @@ -10,12 +10,14 @@ import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.FirebaseMessagingException; import com.google.firebase.messaging.Message; +import com.pricewagon.pricewagon.domain.alarm.converter.AlarmConverter; import com.pricewagon.pricewagon.domain.alarm.dto.AlarmRequestDTO; import com.pricewagon.pricewagon.domain.alarm.dto.AlarmResponseDTO; import com.pricewagon.pricewagon.domain.alarm.entity.Alarm; import com.pricewagon.pricewagon.domain.alarm.entity.AlarmStatus; import com.pricewagon.pricewagon.domain.alarm.repository.AlarmRepository; import com.pricewagon.pricewagon.domain.fcm.entity.FcmToken; +import com.pricewagon.pricewagon.domain.product.dto.response.BasicProductInfo; import com.pricewagon.pricewagon.domain.product.entity.Product; import com.pricewagon.pricewagon.domain.product.repository.ProductRepository; import com.pricewagon.pricewagon.domain.product.service.ProductService; @@ -37,6 +39,7 @@ public class AlarmServiceImpl implements AlarmService { private final AlarmRepository alarmRepository; private final ProductRepository productRepository; private final FirebaseMessaging firebaseMessaging; + private final AlarmConverter alarmConverter; @Override @Transactional @@ -168,4 +171,15 @@ protected void registerFcmToken(User user, String tokenString) { log.info("새로운 FCM 토큰 등록: user={}, token={}", user.getAccount(), tokenString); } } + + @Transactional(readOnly = true) + @Override + public List getAlarmList(String username) { + User user = userRepository.findByAccount(username) + .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); + + List alarms = alarmRepository.findByUserId(user.getId()); + + return alarmConverter.convertToBasicProductInfo(alarms); + } } \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index aec7473..9311e21 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -14,15 +14,15 @@ spring: show-sql: true datasource: - url: jdbc:mysql://${LOCAL_MYSQL_HOST}:${LOCAL_MYSQL_PORT}/${LOCAL_DB_NAME}?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 + url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${DB_NAME}?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 driver-class-name: com.mysql.cj.jdbc.Driver hikari: maxLifetime: 580000 maximum-pool-size: 20 idle-timeout: 30000 connection-timeout: 30000 - username: ${LOCAL_MYSQL_USERNAME} - password: ${LOCAL_MYSQL_PASSWORD} + username: ${MYSQL_USERNAME} + password: ${MYSQL_PASSWORD}