From 4b02cf27911c478418f980af1020543f2b87e8c4 Mon Sep 17 00:00:00 2001 From: psyeon1120 Date: Wed, 30 Aug 2023 21:24:27 +0900 Subject: [PATCH 1/2] =?UTF-8?q?#155=20feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=EC=8B=9C=20=EB=94=94=EB=B0=94=EC=9D=B4=EC=8A=A4=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EC=A0=95=EB=B3=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/psr/psr/PsrApplication.kt | 2 ++ src/main/kotlin/com/psr/psr/user/dto/request/LoginReq.kt | 8 ++------ src/main/kotlin/com/psr/psr/user/service/UserService.kt | 1 + 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/com/psr/psr/PsrApplication.kt b/src/main/kotlin/com/psr/psr/PsrApplication.kt index 8fcf904..c12e07f 100644 --- a/src/main/kotlin/com/psr/psr/PsrApplication.kt +++ b/src/main/kotlin/com/psr/psr/PsrApplication.kt @@ -3,9 +3,11 @@ package com.psr.psr import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.data.jpa.repository.config.EnableJpaAuditing +import org.springframework.scheduling.annotation.EnableScheduling @SpringBootApplication @EnableJpaAuditing +@EnableScheduling class PsrApplication fun main(args: Array) { diff --git a/src/main/kotlin/com/psr/psr/user/dto/request/LoginReq.kt b/src/main/kotlin/com/psr/psr/user/dto/request/LoginReq.kt index d5cc730..0f1f3bb 100644 --- a/src/main/kotlin/com/psr/psr/user/dto/request/LoginReq.kt +++ b/src/main/kotlin/com/psr/psr/user/dto/request/LoginReq.kt @@ -1,13 +1,8 @@ package com.psr.psr.user.dto.request -import com.psr.psr.user.entity.* -import jakarta.annotation.Nullable import jakarta.validation.constraints.Email import jakarta.validation.constraints.NotBlank -import jakarta.validation.constraints.NotEmpty import jakarta.validation.constraints.Pattern -import org.jetbrains.annotations.NotNull -import java.util.stream.Collectors data class LoginReq ( @@ -19,5 +14,6 @@ data class LoginReq ( regexp = "^.*(?=^.{8,15}\$)(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#\$%^&+=]).*\$", message = "비밀번호를 숫자, 문자, 특수문자 포함 8~15자리 이내로 입력해주세요" ) - var password: String + var password: String, + val deviceToken: String? = null ) \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/user/service/UserService.kt b/src/main/kotlin/com/psr/psr/user/service/UserService.kt index eb4e783..1634270 100644 --- a/src/main/kotlin/com/psr/psr/user/service/UserService.kt +++ b/src/main/kotlin/com/psr/psr/user/service/UserService.kt @@ -119,6 +119,7 @@ class UserService( fun login(loginReq: LoginReq) : TokenDto{ val user = userRepository.findByEmail(loginReq.email).orElseThrow{BaseException(NOT_EXIST_EMAIL)} if(!passwordEncoder.matches(loginReq.password, user.password)) throw BaseException(INVALID_PASSWORD) + if (loginReq.deviceToken != null) user.deviceToken = loginReq.deviceToken return createToken(user, loginReq.password) } From e9a652a12f901577ad60f9f4919ad43e2c12c27c Mon Sep 17 00:00:00 2001 From: psyeon1120 Date: Thu, 31 Aug 2023 00:24:17 +0900 Subject: [PATCH 2/2] =?UTF-8?q?#155=20feat:=202=EB=8B=AC=20=EB=92=A4=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=EC=83=81=ED=83=9C=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=9A=94=EB=A7=9D=20=EC=95=8C=EB=A6=BC=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A4=84=EB=9F=AC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/NotificationService.kt | 8 ++-- .../psr/order/repository/OrderRepository.kt | 2 + .../com/psr/psr/order/service/OrderService.kt | 41 ++++++++++++++++++- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/com/psr/psr/notification/service/NotificationService.kt b/src/main/kotlin/com/psr/psr/notification/service/NotificationService.kt index 2c8d291..018f33c 100644 --- a/src/main/kotlin/com/psr/psr/notification/service/NotificationService.kt +++ b/src/main/kotlin/com/psr/psr/notification/service/NotificationService.kt @@ -80,19 +80,19 @@ class NotificationService( } // 2달 뒤 요청상태 입력 요망 알림 - fun send2MonthOrderNoti(productName: String, orderer: User, ordererName: String, orderId: Long) { + fun send2MonthOrderNoti(productName: String, orderReceiver: User, ordererName: String, orderId: Long) { val messageBody = ordererName + TWO_MONTH_ORDER_SENTENCE notificationRepository.save(notiAssembler.toEntity( - orderer, + orderReceiver, productName, messageBody, orderId, NotificationType.TWO_MONTH_ORDER )) - if (isPushNotiAvailable(orderer)) { + if (isPushNotiAvailable(orderReceiver)) { val message: FcmMessage = notiAssembler.makeMessage( - orderer.deviceToken!!, + orderReceiver.deviceToken!!, productName, messageBody, orderId, diff --git a/src/main/kotlin/com/psr/psr/order/repository/OrderRepository.kt b/src/main/kotlin/com/psr/psr/order/repository/OrderRepository.kt index 41eea8d..7950455 100644 --- a/src/main/kotlin/com/psr/psr/order/repository/OrderRepository.kt +++ b/src/main/kotlin/com/psr/psr/order/repository/OrderRepository.kt @@ -7,6 +7,7 @@ import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository +import java.time.LocalDate @Repository interface OrderRepository: JpaRepository { @@ -16,4 +17,5 @@ interface OrderRepository: JpaRepository { fun findByUserAndStatus(orderer: User, status: String, pageable: Pageable): Page fun findByProductUserAndStatus(seller: User, status: String, pageable: Pageable): Page fun deleteByUser(user: User) + fun findByCreatedAt_DateAndOrderStatusAndStatus(date: LocalDate, orderStatus: OrderStatus, status: String): List } \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/order/service/OrderService.kt b/src/main/kotlin/com/psr/psr/order/service/OrderService.kt index 3626775..8bbdf72 100644 --- a/src/main/kotlin/com/psr/psr/order/service/OrderService.kt +++ b/src/main/kotlin/com/psr/psr/order/service/OrderService.kt @@ -5,7 +5,10 @@ import com.psr.psr.global.Constant.UserStatus.UserStatus.ACTIVE_STATUS import com.psr.psr.global.exception.BaseException import com.psr.psr.global.exception.BaseResponseCode import com.psr.psr.notification.service.NotificationService -import com.psr.psr.order.dto.* +import com.psr.psr.order.dto.OrderAssembler +import com.psr.psr.order.dto.OrderListRes +import com.psr.psr.order.dto.OrderReq +import com.psr.psr.order.dto.OrderRes import com.psr.psr.order.entity.Order import com.psr.psr.order.entity.OrderStatus import com.psr.psr.order.repository.OrderRepository @@ -14,7 +17,9 @@ import com.psr.psr.product.repository.ProductRepository import com.psr.psr.user.entity.User import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable +import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Service +import java.time.LocalDate @Service class OrderService( @@ -76,4 +81,38 @@ class OrderService( if (status != null) notificationService.sendChangeOrderStatusNoti(order.product.name, order.product.user, saveOrder.orderStatus, order.id!!) } + + // 2달 뒤 요청상태 입력 요망 알림(오후 1시마다 실행) + @Scheduled(cron = "0 0 13 * * ?", zone = "Asia/Seoul") + fun notify2MonthOrders() { + // 진행 중인 요청 + orderRepository.findByCreatedAt_DateAndOrderStatusAndStatus( + LocalDate.now(), + OrderStatus.PROGRESSING, + ACTIVE_STATUS + ) + .forEach { + notificationService.send2MonthOrderNoti( + it.product.name, + it.product.user, + it.ordererName, + it.id!! + ) + } + + // 대기중인 요청 + orderRepository.findByCreatedAt_DateAndOrderStatusAndStatus( + LocalDate.now(), + OrderStatus.ORDER_WAITING, + ACTIVE_STATUS + ) + .forEach { + notificationService.send2MonthOrderNoti( + it.product.name, + it.product.user, + it.ordererName, + it.id!! + ) + } + } } \ No newline at end of file