From 650d9ddd1c7228ec71aa605dc29d9b171cc28154 Mon Sep 17 00:00:00 2001 From: isExample Date: Tue, 26 Sep 2023 00:34:27 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=B6=94=EC=B2=9C=20=EB=B0=8F=20=EC=B6=94=EC=B2=9C=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TransactionController.java | 13 ++++++---- .../transaction/domain/Recommend.java | 19 ++++++++++++++- .../transaction/dto/RecommendPostReq.java | 19 +++++++++++++++ .../repository/RecommendRepository.java | 2 ++ .../service/TransactionService.java | 24 +++++++++++++++---- 5 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 src/main/java/HeyPorori/transaction/dto/RecommendPostReq.java diff --git a/src/main/java/HeyPorori/transaction/controller/TransactionController.java b/src/main/java/HeyPorori/transaction/controller/TransactionController.java index e6ff5cc..9104dbe 100644 --- a/src/main/java/HeyPorori/transaction/controller/TransactionController.java +++ b/src/main/java/HeyPorori/transaction/controller/TransactionController.java @@ -3,10 +3,7 @@ import HeyPorori.transaction.config.BaseException; import HeyPorori.transaction.config.BaseResponse; import HeyPorori.transaction.config.BaseResponseStatus; -import HeyPorori.transaction.dto.CreatePostReq; -import HeyPorori.transaction.dto.PostDetailRes; -import HeyPorori.transaction.dto.PostsRes; -import HeyPorori.transaction.dto.PreSignedUrlRes; +import HeyPorori.transaction.dto.*; import HeyPorori.transaction.service.AmazonS3Service; import HeyPorori.transaction.service.TransactionService; import HeyPorori.transaction.service.UserService; @@ -81,4 +78,12 @@ public BaseResponse deletePost(@RequestHeader("Authorization") String to transactionService.deletePost(token, transactionId); return new BaseResponse<>("게시글이 삭제되었습니다."); } + + @Operation(summary = "중고거래 게시글 추천 API", description = "중고거래 서비스의 거래 게시글을 추천하거나 추천 취소하기 위한 API입니다.") + @ApiResponse(responseCode = "200", description = "요청 성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = BaseResponse.class))) + @PostMapping("/recommend") + public BaseResponse recommendPost(@RequestHeader("Authorization") String token, @RequestBody RecommendPostReq req) throws BaseException { + transactionService.recommendPost(token, req); + return new BaseResponse<>("게시글을 추천했습니다."); + } } diff --git a/src/main/java/HeyPorori/transaction/domain/Recommend.java b/src/main/java/HeyPorori/transaction/domain/Recommend.java index a46799e..eb9f302 100644 --- a/src/main/java/HeyPorori/transaction/domain/Recommend.java +++ b/src/main/java/HeyPorori/transaction/domain/Recommend.java @@ -1,8 +1,11 @@ package HeyPorori.transaction.domain; import HeyPorori.transaction.config.BaseTimeEntity; +import HeyPorori.transaction.dto.CreatePostReq; import lombok.*; import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; @@ -11,6 +14,8 @@ @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "recommend") +@DynamicInsert +@DynamicUpdate public class Recommend extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -28,8 +33,20 @@ public class Recommend extends BaseTimeEntity { private String status; @Builder - public Recommend(Transaction transactionId, Long userId){ + public Recommend(Transaction transactionId, Long userId, String status){ this.transactionId = transactionId; this.userId = userId; + this.status = status; + } + + public static Recommend toEntity(Transaction transaction, Long userId){ + return Recommend.builder() + .transactionId(transaction) + .userId(userId) + .build(); + } + + public void changeStatus(String status) { + this.status = status; } } \ No newline at end of file diff --git a/src/main/java/HeyPorori/transaction/dto/RecommendPostReq.java b/src/main/java/HeyPorori/transaction/dto/RecommendPostReq.java new file mode 100644 index 0000000..5411dcb --- /dev/null +++ b/src/main/java/HeyPorori/transaction/dto/RecommendPostReq.java @@ -0,0 +1,19 @@ +package HeyPorori.transaction.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.util.List; +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class RecommendPostReq { + private Long transactionId; + @Pattern(regexp = "^(INACTIVE|ACTIVE)$", message = "유효하지 않은 상태입니다.") + private String toStatus; + @Pattern(regexp = "^(INACTIVE|ACTIVE)$", message = "유효하지 않은 상태입니다.") + private String fromStatus; +} \ No newline at end of file diff --git a/src/main/java/HeyPorori/transaction/repository/RecommendRepository.java b/src/main/java/HeyPorori/transaction/repository/RecommendRepository.java index ab8aa20..b92c657 100644 --- a/src/main/java/HeyPorori/transaction/repository/RecommendRepository.java +++ b/src/main/java/HeyPorori/transaction/repository/RecommendRepository.java @@ -5,9 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import javax.swing.text.html.Option; import java.util.Optional; @Repository public interface RecommendRepository extends JpaRepository { boolean existsByTransactionIdAndUserId(Transaction transaction, Long userId); + Recommend findByTransactionIdAndUserIdAndStatus(Transaction transaction, Long userId, String status); } diff --git a/src/main/java/HeyPorori/transaction/service/TransactionService.java b/src/main/java/HeyPorori/transaction/service/TransactionService.java index 5ac31e9..2a3c7b9 100644 --- a/src/main/java/HeyPorori/transaction/service/TransactionService.java +++ b/src/main/java/HeyPorori/transaction/service/TransactionService.java @@ -3,11 +3,9 @@ import HeyPorori.transaction.config.BaseException; import HeyPorori.transaction.config.BaseResponseStatus; import HeyPorori.transaction.domain.Category; +import HeyPorori.transaction.domain.Recommend; import HeyPorori.transaction.domain.Transaction; -import HeyPorori.transaction.dto.CreatePostReq; -import HeyPorori.transaction.dto.PostDetailRes; -import HeyPorori.transaction.dto.PostsRes; -import HeyPorori.transaction.dto.UserInfoRes; +import HeyPorori.transaction.dto.*; import HeyPorori.transaction.repository.RecommendRepository; import HeyPorori.transaction.repository.TransactionRepository; import lombok.RequiredArgsConstructor; @@ -18,6 +16,7 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service @Transactional @@ -73,6 +72,23 @@ public void deletePost(String token, Long transactionId){ transactionRepository.save(txn); } + public void recommendPost(String token, RecommendPostReq req){ + Long userId = userService.getUserId(token); + Transaction txn = transactionRepository.findByTransactionIdAndStatus(req.getTransactionId(), "ACTIVE") + .orElseThrow(() -> new BaseException(BaseResponseStatus.POST_NOT_FOUND)); + Recommend recommend = recommendRepository.findByTransactionIdAndUserIdAndStatus(txn, userId, req.getFromStatus()); + if(recommend == null && req.getToStatus().equals("ACTIVE")){ + Recommend newRecommend = Recommend.toEntity(txn, userId); + recommendRepository.save(newRecommend); + } else{ + if(recommend != null && recommend.getStatus().equals(req.getFromStatus())){ + recommend.changeStatus(req.getToStatus()); + } else{ + new IllegalArgumentException("추천 상태가 예상된 상태와 같지 않습니다."); + } + } + } + public String toFormattedDate(LocalDateTime baseDateTime){ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); return baseDateTime.format(formatter);