From 75bde48725e60fc7ffee75ad463415b6be2ed712 Mon Sep 17 00:00:00 2001 From: Son Gahyun <77109954+hyun2371@users.noreply.github.com> Date: Sat, 17 Aug 2024 11:41:45 +0900 Subject: [PATCH] =?UTF-8?q?[refactor=20#48]=20=EC=83=81=ED=98=B8=EC=9E=91?= =?UTF-8?q?=EC=9A=A9=20API=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20(#49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [refactor] : requestmapping 어노테이션 삭제 * [refactor] : interaction 상태 변경 메서드 통합 * [feat] : 상호작용 수 감소 로직 예외 처리 추가 * [refactor] : 어노테이션 파라미터 추가 --- .../controller/InteractionController.java | 8 +++----- .../post_interaction/domain/Interaction.java | 15 +++++---------- .../post_interaction/domain/InteractionCount.java | 5 +++++ .../exception/InteractionErrorCode.java | 4 ++-- .../service/InteractionService.java | 6 +++--- .../controller/QuestionPostController.java | 8 +++----- .../dnd/gongmuin/s3/controller/S3Controller.java | 6 ++---- .../service/InteractionServiceTest.java | 2 +- 8 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/dnd/gongmuin/post_interaction/controller/InteractionController.java b/src/main/java/com/dnd/gongmuin/post_interaction/controller/InteractionController.java index 0eed1dad..6100f0e0 100644 --- a/src/main/java/com/dnd/gongmuin/post_interaction/controller/InteractionController.java +++ b/src/main/java/com/dnd/gongmuin/post_interaction/controller/InteractionController.java @@ -4,7 +4,6 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -17,14 +16,13 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/api/question-posts") public class InteractionController { private final InteractionService interactionService; - @PostMapping("/{questionPostId}/activated") + @PostMapping("/api/question-posts/{questionPostId}/activated") public ResponseEntity activateInteraction( - @PathVariable Long questionPostId, + @PathVariable("questionPostId") Long questionPostId, @RequestParam String type, @AuthenticationPrincipal Member member ) { @@ -36,7 +34,7 @@ public ResponseEntity activateInteraction( return ResponseEntity.ok(response); } - @PostMapping("/{questionPostId}/inactivated") + @PostMapping("/api/question-posts/{questionPostId}/inactivated") public ResponseEntity inactivateInteraction( @PathVariable("questionPostId") Long questionPostId, @RequestParam("type") String type, diff --git a/src/main/java/com/dnd/gongmuin/post_interaction/domain/Interaction.java b/src/main/java/com/dnd/gongmuin/post_interaction/domain/Interaction.java index 2a8cda6e..45c70280 100644 --- a/src/main/java/com/dnd/gongmuin/post_interaction/domain/Interaction.java +++ b/src/main/java/com/dnd/gongmuin/post_interaction/domain/Interaction.java @@ -1,5 +1,7 @@ package com.dnd.gongmuin.post_interaction.domain; +import java.util.Objects; + import com.dnd.gongmuin.common.entity.TimeBaseEntity; import com.dnd.gongmuin.common.exception.runtime.ValidationException; import com.dnd.gongmuin.post_interaction.exception.InteractionErrorCode; @@ -49,17 +51,10 @@ public static Interaction of(InteractionType type, Long memberId, Long questionP return new Interaction(type, memberId, questionPostId); } - public void updateIsInteractedTrue() { - if (Boolean.TRUE.equals(isInteracted)) { + public void updateIsInteracted(boolean updateStatus) { + if (Objects.equals(isInteracted, updateStatus)) { throw new ValidationException(InteractionErrorCode.ALREADY_INTERACTED); } - isInteracted = true; - } - - public void updateIsInteractedFalse() { - if (Boolean.FALSE.equals(isInteracted)) { - throw new ValidationException(InteractionErrorCode.ALREADY_UNINTERACTED); - } - isInteracted = false; + isInteracted = updateStatus; } } diff --git a/src/main/java/com/dnd/gongmuin/post_interaction/domain/InteractionCount.java b/src/main/java/com/dnd/gongmuin/post_interaction/domain/InteractionCount.java index 241a979d..721ad863 100644 --- a/src/main/java/com/dnd/gongmuin/post_interaction/domain/InteractionCount.java +++ b/src/main/java/com/dnd/gongmuin/post_interaction/domain/InteractionCount.java @@ -1,6 +1,8 @@ package com.dnd.gongmuin.post_interaction.domain; import com.dnd.gongmuin.common.entity.TimeBaseEntity; +import com.dnd.gongmuin.common.exception.runtime.ValidationException; +import com.dnd.gongmuin.post_interaction.exception.InteractionErrorCode; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -48,6 +50,9 @@ public int increaseCount() { } public int decreaseCount() { + if (count == 0) { + throw new ValidationException(InteractionErrorCode.UNINTERACTION_NOT_ALLOWED); + } return --count; } } diff --git a/src/main/java/com/dnd/gongmuin/post_interaction/exception/InteractionErrorCode.java b/src/main/java/com/dnd/gongmuin/post_interaction/exception/InteractionErrorCode.java index 0248f200..89c04ac8 100644 --- a/src/main/java/com/dnd/gongmuin/post_interaction/exception/InteractionErrorCode.java +++ b/src/main/java/com/dnd/gongmuin/post_interaction/exception/InteractionErrorCode.java @@ -10,8 +10,8 @@ public enum InteractionErrorCode implements ErrorCode { NOT_FOUND_POST_INTERACTION("상호작용 이력이 존재하지 않습니다.", "PI_001"), - ALREADY_INTERACTED("이미 상호작용한 게시글입니다.", "PI_002"), - ALREADY_UNINTERACTED("이미 상호작용 취소한 게시글입니다.", "PI_003"), + ALREADY_INTERACTED("이미 해당 작업을 수행했습니다.", "PI_002"), + UNINTERACTION_NOT_ALLOWED("상호작용 수가 0이하가 될 수 없습니다.", "PI_003"), INTERACTION_NOT_ALLOWED("본인 게시물은 상호작용할 수 없습니다", "PI_004"); private final String message; diff --git a/src/main/java/com/dnd/gongmuin/post_interaction/service/InteractionService.java b/src/main/java/com/dnd/gongmuin/post_interaction/service/InteractionService.java index 70973c03..6b874e2a 100644 --- a/src/main/java/com/dnd/gongmuin/post_interaction/service/InteractionService.java +++ b/src/main/java/com/dnd/gongmuin/post_interaction/service/InteractionService.java @@ -83,7 +83,7 @@ private void validateIfPostExistsAndNotQuestioner( QuestionPost questionPost = questionPostRepository.findById(questionPostId) .orElseThrow(() -> new NotFoundException(QuestionPostErrorCode.NOT_FOUND_QUESTION_POST)); if (questionPost.isQuestioner(memberId)) { - throw new ValidationException(InteractionErrorCode.ALREADY_UNINTERACTED); + throw new ValidationException(InteractionErrorCode.INTERACTION_NOT_ALLOWED); } } @@ -98,10 +98,10 @@ private int updateInteractionAndCount( InteractionCount interactionCount = getPostInteractionCount(questionPostId, type); if (isActivate) { //활성화 - interaction.updateIsInteractedTrue(); + interaction.updateIsInteracted(true); count = interactionCount.increaseCount(); } else { // 비활성화 - interaction.updateIsInteractedFalse(); + interaction.updateIsInteracted(false); count = interactionCount.decreaseCount(); } return count; diff --git a/src/main/java/com/dnd/gongmuin/question_post/controller/QuestionPostController.java b/src/main/java/com/dnd/gongmuin/question_post/controller/QuestionPostController.java index bdcc1ad5..dba661ed 100644 --- a/src/main/java/com/dnd/gongmuin/question_post/controller/QuestionPostController.java +++ b/src/main/java/com/dnd/gongmuin/question_post/controller/QuestionPostController.java @@ -8,7 +8,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.dnd.gongmuin.common.dto.PageResponse; @@ -29,14 +28,13 @@ @Tag(name = "질문글 API") @RestController @RequiredArgsConstructor -@RequestMapping("/api/question-posts") public class QuestionPostController { private final QuestionPostService questionPostService; @Operation(summary = "질문글 등록 API", description = "질문글을 등록한다") @ApiResponse(useReturnTypeSchema = true) - @PostMapping + @PostMapping("/api/question-posts") public ResponseEntity registerQuestionPost( @Valid @RequestBody RegisterQuestionPostRequest request, @AuthenticationPrincipal Member member @@ -47,7 +45,7 @@ public ResponseEntity registerQuestionPost( @Operation(summary = "질문글 상세 조회 API", description = "질문글을 아이디로 상세조회한다.") @ApiResponse(useReturnTypeSchema = true) - @GetMapping("/{questionPostId}") + @GetMapping("/api/question-posts/{questionPostId}") public ResponseEntity getQuestionPostById( @PathVariable("questionPostId") Long questionPostId ) { @@ -57,7 +55,7 @@ public ResponseEntity getQuestionPostById( @Operation(summary = "질문글 검색 API", description = "질문글을 키워드로 검색하고 정렬, 필터링을 한다.") @ApiResponse(useReturnTypeSchema = true) - @GetMapping("/search") + @GetMapping("/api/question-posts/search") public ResponseEntity> searchQuestionPost( @Valid @ModelAttribute QuestionPostSearchCondition condition, Pageable pageable diff --git a/src/main/java/com/dnd/gongmuin/s3/controller/S3Controller.java b/src/main/java/com/dnd/gongmuin/s3/controller/S3Controller.java index cb60c752..a187a99a 100644 --- a/src/main/java/com/dnd/gongmuin/s3/controller/S3Controller.java +++ b/src/main/java/com/dnd/gongmuin/s3/controller/S3Controller.java @@ -5,7 +5,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.dnd.gongmuin.s3.dto.ImagesUploadRequest; @@ -23,14 +22,13 @@ @Tag(name = "S3 API") @RestController @RequiredArgsConstructor -@RequestMapping("/api/files") public class S3Controller { private final S3Service s3Service; @Operation(summary = "이미지 등록 API", description = "1~10장의 이미지를 등록한다.") @ApiResponse(useReturnTypeSchema = true) - @PostMapping("/images") + @PostMapping("/api/files/images") public ResponseEntity uploadImages( @ModelAttribute @Valid ImagesUploadRequest request ) { @@ -40,7 +38,7 @@ public ResponseEntity uploadImages( @Operation(summary = "동영상 등록 API", description = "최대 45MB의 동영상을 등록한다.") @ApiResponse(useReturnTypeSchema = true) - @PostMapping("/videos") + @PostMapping("/api/files/videos") public ResponseEntity uploadVideo( @ModelAttribute @Valid VideoUploadRequest request ) { diff --git a/src/test/java/com/dnd/gongmuin/post_interaction/service/InteractionServiceTest.java b/src/test/java/com/dnd/gongmuin/post_interaction/service/InteractionServiceTest.java index 0fc78f0c..20e47bd1 100644 --- a/src/test/java/com/dnd/gongmuin/post_interaction/service/InteractionServiceTest.java +++ b/src/test/java/com/dnd/gongmuin/post_interaction/service/InteractionServiceTest.java @@ -118,7 +118,7 @@ void activateInteraction_update() { questionPost.getId()); InteractionCount interactionCount = InteractionCountFixture.interactionCount(type, interactor.getId()); - interaction.updateIsInteractedFalse(); + interaction.updateIsInteracted(false); interactionCount.decreaseCount(); given(interactionRepository.existsByQuestionPostIdAndMemberIdAndType(