From bdc9cbcff139996f1b59a05df9416cfefb674af0 Mon Sep 17 00:00:00 2001 From: dduneon Date: Mon, 11 Mar 2024 22:06:53 +0900 Subject: [PATCH 001/161] =?UTF-8?q?[ADD]=20Rest=20Docs=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/pom.xml b/pom.xml index 2ef12e5a..ea2e1e67 100644 --- a/pom.xml +++ b/pom.xml @@ -87,6 +87,13 @@ org.springframework.boot spring-boot-starter-actuator + + + + org.springframework.restdocs + spring-restdocs-mockmvc + test + @@ -193,6 +200,56 @@ maven-compiler-plugin 3.10.1 + + org.asciidoctor + asciidoctor-maven-plugin + 2.2.1 + + + generate-docs + prepare-package + + process-asciidoc + + + html + book + + + + + + org.springframework.restdocs + spring-restdocs-asciidoctor + ${spring-restdocs.version} + + + + + maven-resources-plugin + 2.7 + + + copy-resources + prepare-package + + copy-resources + + + + ${project.build.outputDirectory}/static/docs + + + + + ${project.build.directory}/generated-docs + + + + + + + From 091bd20d8631cefcc54a892ef001d5591ae88bf7 Mon Sep 17 00:00:00 2001 From: dduneon Date: Mon, 11 Mar 2024 22:07:04 +0900 Subject: [PATCH 002/161] =?UTF-8?q?[ADD]=20Rest=20Docs=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=A9=94=EC=84=9C=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 --- .../api/tag/controller/TagControllerTest.java | 83 +++++++++++++++++-- 1 file changed, 74 insertions(+), 9 deletions(-) diff --git a/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java b/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java index 246ab57d..c57c6476 100644 --- a/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java +++ b/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java @@ -4,6 +4,15 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.willThrow; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.requestParameters; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -16,12 +25,16 @@ import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.http.MediaType; +import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import store.ckin.api.common.domain.PageInfo; @@ -40,6 +53,7 @@ * @author 김준현 * @version 2024. 02. 17 */ +@AutoConfigureRestDocs @WebMvcTest(TagController.class) class TagControllerTest { @Autowired @@ -76,7 +90,24 @@ void getAllTagListTest() throws Exception{ status().isOk(), content().contentType(MediaType.APPLICATION_JSON), content().json(objectMapper.writeValueAsString(expected)) - ); + ) + .andDo(document("tag/getTagList/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestParameters( + parameterWithName("page").description("지정할 페이지"), + parameterWithName("size").description("한 페이지 당 표시할 개수") + ), + responseFields( + fieldWithPath("data.[].tagId").description("저장된 태그 아이디"), + fieldWithPath("data.[].tagName").description("저장된 태그 이름"), + fieldWithPath("pageInfo.page").description("현재 페이지 정보"), + fieldWithPath("pageInfo.size").description("지정한 페이지 크기"), + fieldWithPath("pageInfo.totalElements").description("총 데이터 수"), + fieldWithPath("pageInfo.totalPages").description("총 페이지 수") + ) + + )); } @Test @@ -90,7 +121,10 @@ void saveTagTest_Failed_Validation() throws Exception{ mockMvc.perform(post("/api/tags") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagCreateRequestDto))) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()) + .andDo(document("tag/saveTag/validation-failed", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()))); } @Test @@ -110,9 +144,12 @@ void saveTagTest_Failed_AlreadyExist() throws Exception { jsonPath("code", equalTo("TagName Already Exist")), jsonPath("message", equalTo(expectedException.getMessage())), status().isBadRequest() - ); + ).andDo(document("tag/saveTag/already-exist", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()))); } + @Test @DisplayName("태그 저장 - 성공") void saveTagTest_Success() throws Exception { @@ -124,7 +161,13 @@ void saveTagTest_Success() throws Exception { mockMvc.perform(post("/api/tags") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagCreateRequestDto))) - .andExpect(status().isCreated()); + .andExpect(status().isCreated()) + .andDo(document("tag/saveTag/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("tagName").description("저장할 태그 이름") + ))); } @Test @@ -139,7 +182,10 @@ void updateTagTest_Failed() throws Exception{ mockMvc.perform(put("/api/tags") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagUpdateRequestDto))) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()) + .andDo(document("tag/updateTag/validation-failed", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()))); } @Test @@ -154,7 +200,14 @@ void updateTagTest_Success() throws Exception { mockMvc.perform(put("/api/tags") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagUpdateRequestDto))) - .andExpect(status().isOk()); + .andExpect(status().isOk()) + .andDo(document("tag/updateTag/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("tagId").description("태그 수정을 위한 태그 아이디"), + fieldWithPath("tagName").description("태그 수정을 위한 태그 이름") + ))); } @Test @DisplayName("태그 삭제 - 실패(Validation Error)") @@ -167,7 +220,10 @@ void deleteTagTest_Failed_Validation() throws Exception{ mockMvc.perform(delete("/api/tags") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagDeleteRequestDto))) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()) + .andDo(document("tag/deleteTag/validation-failed", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()))); } @Test @@ -186,7 +242,10 @@ void deleteTagTest_Failed_TagNotFoundException() throws Exception{ .andExpectAll( jsonPath("code", equalTo("Tag Not Found")), jsonPath("message", equalTo(expectedException.getMessage())), - status().isNotFound()); + status().isNotFound()) + .andDo(document("tag/deleteTag/not-found", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()))); } @Test @@ -200,6 +259,12 @@ void deleteTagTest_Success() throws Exception { mockMvc.perform(delete("/api/tags") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagDeleteRequestDto))) - .andExpect(status().isOk()); + .andExpect(status().isOk()) + .andDo(document("tag/deleteTag/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("tagId").description("삭제를 위한 태그 아이디") + ))); } } \ No newline at end of file From 7d428c185b1df0a139ef0ac945a81660543f6691 Mon Sep 17 00:00:00 2001 From: dduneon Date: Mon, 11 Mar 2024 22:07:20 +0900 Subject: [PATCH 003/161] =?UTF-8?q?[ADD]=20Rest=20docs=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=8F=20=ED=83=9C=EA=B7=B8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 53 +++++++++++++++++ src/docs/asciidoc/tag.adoc | 108 +++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 src/docs/asciidoc/index.adoc create mode 100644 src/docs/asciidoc/tag.adoc diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc new file mode 100644 index 00000000..ee25b8c4 --- /dev/null +++ b/src/docs/asciidoc/index.adoc @@ -0,0 +1,53 @@ += CKIN REST-API docs +:doctype: book +:icons: font +:source-highlighter: highlightjs +:toc-title: 목차 +:toc: left +:toclevels: 5 + += 1. 개요 +이 API 문서는 CKIN(체크인) 팀의 API 문서를 유용하게 볼수 있게 도와줍니다. + +NOTE: 기본적인 구성은 다음과 같습니다 + +### 1.1 API 구성 + +``` +/api/** +``` + +### 1.2 Domain Name 구성 + +``` +ckin.store +``` + +### 1.3 참여 인원 + +[cols=2*] +|=== +| *이름* +| *GitHub 주소* + +| 김준현 +| https://github.com/dduneon + +| 정승조 +| https://github.com/f1v3-dev + +| 이진우 +| https://github.com/devhomh + +| 나국로 +| https://github.com/nayoseb + +| 이가은 +| https://github.com/nueag +|=== + +''' + += 2. API + +include::tag.adoc[] \ No newline at end of file diff --git a/src/docs/asciidoc/tag.adoc b/src/docs/asciidoc/tag.adoc new file mode 100644 index 00000000..344a7d92 --- /dev/null +++ b/src/docs/asciidoc/tag.adoc @@ -0,0 +1,108 @@ +== 태그 + +=== 태그 생성 + +==== Request + +include::{snippets}/tag/saveTag/success/http-request.adoc[] + +==== Response + +include::{snippets}/tag/saveTag/success/http-response.adoc[] + +==== Request Parameters + +include::{snippets}/tag/saveTag/success/request-fields.adoc[] + +===== 태그 생성 실패 - 검증 실패 + +==== Request + +include::{snippets}/tag/saveTag/validation-failed/http-request.adoc[] + +==== Response + +include::{snippets}/tag/saveTag/validation-failed/http-response.adoc[] + +===== 태그 생성 실패 - 이미 존재하는 태그 + +==== Request + +include::{snippets}/tag/saveTag/already-exist/http-request.adoc[] + +==== Response + +include::{snippets}/tag/saveTag/already-exist/http-response.adoc[] + +=== 전체 태그 조회 + +==== Request + +include::{snippets}/tag/getTagList/success/http-request.adoc[] + +==== Response + +include::{snippets}/tag/getTagList/success/http-response.adoc[] + +==== Request Parameters + +include::{snippets}/tag/getTagList/success/request-parameters.adoc[] + +=== 태그 수정 + +==== Request + +include::{snippets}/tag/updateTag/success/http-request.adoc[] + +==== Response + +include::{snippets}/tag/updateTag/success/http-response.adoc[] + +==== Request Parameters + +include::{snippets}/tag/updateTag/success/request-fields.adoc[] + +===== 태그 수정 실패 - 검증 실패 + +==== Request + +include::{snippets}/tag/updateTag/validation-failed/http-request.adoc[] + +==== Response + +include::{snippets}/tag/updateTag/validation-failed/http-response.adoc[] + +=== 태그 삭제 + +==== Request + +include::{snippets}/tag/deleteTag/success/http-request.adoc[] + +==== Response + +include::{snippets}/tag/deleteTag/success/http-response.adoc[] + +==== Request Field + +include::{snippets}/tag/deleteTag/success/request-fields.adoc[] + +===== 태그 삭제 실패 - 존재하지 않는 태그 + +==== Request + +include::{snippets}/tag/deleteTag/not-found/http-request.adoc[] + +==== Response + +include::{snippets}/tag/deleteTag/not-found/http-response.adoc[] + +===== 태그 삭제 실패 - 검증 실패 + +==== Request + +include::{snippets}/tag/deleteTag/validation-failed/http-request.adoc[] + +==== Response + +include::{snippets}/tag/deleteTag/validation-failed/http-response.adoc[] + From 593e9761c6840fb0620f5b7b6244d7ab8857fb28 Mon Sep 17 00:00:00 2001 From: gaeun Date: Wed, 13 Mar 2024 14:12:50 +0900 Subject: [PATCH 004/161] =?UTF-8?q?[FEAT]=20=EB=A6=AC=EB=B7=B0=20DTO?= =?UTF-8?q?=EC=97=90=20=EC=82=AC=EC=A7=84=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/store/ckin/api/adit/Auditable.java | 11 +++---- .../ckin/api/advice/WebControllerAdvice.java | 5 ++-- .../author/controller/AuthorController.java | 17 ++++------- .../dto/request/AuthorCreateRequestDto.java | 5 ++-- .../dto/request/AuthorModifyRequestDto.java | 5 ++-- .../store/ckin/api/author/entity/Author.java | 11 ++----- .../repository/AuthorRepositoryCustom.java | 2 +- .../repository/impl/AuthorRepositoryImpl.java | 4 ++- .../api/book/controller/BookController.java | 17 ++++------- .../dto/request/BookCreateRequestDto.java | 11 +++---- .../dto/request/BookModifyRequestDto.java | 11 +++---- .../response/BookExtractionResponseDto.java | 5 ++-- .../dto/response/BookListResponseDto.java | 5 ++-- .../book/dto/response/BookResponseDto.java | 5 ++-- .../java/store/ckin/api/book/entity/Book.java | 22 ++++---------- .../bookauthor/entity/BookAuthor.java | 18 +++--------- .../bookcategory/entity/BookCategory.java | 18 +++--------- .../relationship/booktag/entity/BookTag.java | 18 +++--------- .../book/repository/BookRepositoryCustom.java | 5 ++-- .../repository/impl/BookRepositoryImpl.java | 9 +++--- .../ckin/api/book/service/BookService.java | 17 ++++++----- .../book/service/impl/BookServiceImpl.java | 11 +++---- .../dto/request/BookSaleCreateRequestDto.java | 5 ++-- .../ckin/api/booksale/entity/BookSale.java | 23 +++------------ .../repository/BookSaleRepository.java | 3 +- .../repository/BookSaleRepositoryCustom.java | 3 +- .../repository/BookSaleRepositoryImpl.java | 3 +- .../api/booksale/service/BookSaleService.java | 3 +- .../service/impl/BookSaleServiceImpl.java | 3 +- .../controller/CategoryController.java | 16 ++++------ .../dto/request/CategoryCreateRequestDto.java | 3 +- .../dto/request/CategoryUpdateRequestDto.java | 3 +- .../ckin/api/category/entity/Category.java | 13 ++------- .../repository/CategoryRepository.java | 5 ++-- .../api/category/service/CategoryService.java | 3 +- .../service/impl/CategoryServiceImpl.java | 5 ++-- .../ckin/api/config/DataSourceConfig.java | 3 +- .../store/ckin/api/config/QuerydslConfig.java | 3 +- .../controller/DeliveryPolicyController.java | 1 + .../DeliveryPolicyCreateRequestDto.java | 1 + .../DeliveryPolicyUpdateRequestDto.java | 1 + .../deliverypolicy/entity/DeliveryPolicy.java | 1 + .../DeliveryPolicyRepositoryCustom.java | 1 + .../DeliveryPolicyRepositoryImpl.java | 2 ++ .../service/DeliveryPolicyService.java | 5 ++-- .../impl/DeliveryPolicyServiceImpl.java | 1 + .../ApplicationStatusController.java | 2 +- .../java/store/ckin/api/file/entity/File.java | 11 ++----- .../api/file/repository/FileRepository.java | 7 ++--- .../file/repository/FileRepositoryCustom.java | 16 ++++++++++ .../file/repository/FileRepositoryImpl.java | 29 +++++++++++++++++++ .../store/ckin/api/grade/entity/Grade.java | 13 ++------- .../exception/GradeNotFoundException.java | 2 +- .../member/controller/MemberController.java | 13 +++------ .../domain/request/MemberAuthRequestDto.java | 5 ++-- .../request/MemberCreateRequestDto.java | 9 +++--- .../store/ckin/api/member/entity/Member.java | 22 ++++---------- .../repository/MemberRepositoryCustom.java | 4 +-- .../repository/impl/MemberRepositoryImpl.java | 4 +-- .../api/member/service/MemberService.java | 4 +-- .../service/impl/MemberServiceImpl.java | 7 +++-- .../dto/response/TokenResponse.java | 1 + .../service/ObjectStorageService.java | 1 + .../impl/ObjectStorageServiceImpl.java | 1 + .../controller/PackagingController.java | 14 +++------ .../request/PackagingCreateRequestDto.java | 3 +- .../request/PackagingUpdateRequestDto.java | 3 +- .../ckin/api/packaging/entity/Packaging.java | 8 ++--- .../repository/PackagingRepositoryCustom.java | 5 ++-- .../repository/PackagingRepositoryImpl.java | 5 ++-- .../packaging/service/PackagingService.java | 3 +- .../service/impl/PackagingServiceImpl.java | 3 +- .../dto/request/PaymentRequestDto.java | 3 +- .../dto/response/PaymentResponseDto.java | 3 +- .../response/PaymentSuccessResponseDto.java | 3 +- .../ckin/api/payment/entity/Payment.java | 13 ++------- .../PaymentNotCompleteException.java | 2 +- .../api/payment/facade/PaymentFacade.java | 3 +- .../controller/PointPolicyController.java | 1 + .../request/PointPolicyCreateRequestDto.java | 7 ++--- .../request/PointPolicyUpdateRequestDto.java | 5 ++-- .../api/pointpolicy/entity/PointPolicy.java | 9 +++--- .../PointPolicyRepositoryCustom.java | 1 + .../repository/PointPolicyRepositoryImpl.java | 2 ++ .../service/PointPolicyService.java | 1 + .../service/impl/PointPolicyServiceImpl.java | 3 +- .../review/controller/ReviewController.java | 4 +-- .../dto/request/ReviewCreateRequestDto.java | 1 - .../dto/response/ReviewResponseDto.java | 18 ++++++++++++ .../exception/ReviewNotFoundException.java | 2 +- .../review/repository/ReviewRepository.java | 5 ---- .../repository/impl/ReviewRepositoryImpl.java | 13 ++++----- .../service/impl/ReviewServiceImpl.java | 7 +++-- .../api/sale/controller/SaleController.java | 13 +++------ .../request/SaleCreateNoBookRequestDto.java | 9 +++--- .../dto/request/SaleCreateRequestDto.java | 13 ++++----- .../dto/response/SaleDetailResponseDto.java | 3 +- .../sale/dto/response/SaleResponseDto.java | 7 +++-- .../dto/response/SaleWithBookResponseDto.java | 5 ++-- .../java/store/ckin/api/sale/entity/Sale.java | 20 ++++--------- .../ckin/api/sale/facade/SaleFacade.java | 3 +- .../sale/repository/SaleRepositoryImpl.java | 3 +- .../ckin/api/sale/service/SaleService.java | 3 +- .../sale/service/impl/SaleServiceImpl.java | 13 +++++---- .../api/skm/exception/KeyMangerException.java | 2 +- .../store/ckin/api/skm/util/KeyManager.java | 21 ++++++-------- .../api/tag/controller/TagController.java | 18 +++++------- .../tag/dto/request/TagCreateRequestDto.java | 3 +- .../tag/dto/request/TagDeleteRequestDto.java | 3 +- .../tag/dto/request/TagUpdateRequestDto.java | 3 +- .../java/store/ckin/api/tag/entity/Tag.java | 14 ++------- .../TagNameAlreadyExistException.java | 2 +- .../tag/exception/TagNotFoundException.java | 2 +- .../api/tag/repository/TagRepository.java | 5 +--- .../api/tag/repository/TagRepositoryImpl.java | 2 -- .../ckin/api/tag/service/TagService.java | 5 +++- .../api/tag/service/impl/TagServiceImpl.java | 14 ++++----- 117 files changed, 390 insertions(+), 439 deletions(-) create mode 100644 src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java create mode 100644 src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java diff --git a/src/main/java/store/ckin/api/adit/Auditable.java b/src/main/java/store/ckin/api/adit/Auditable.java index ef1c058c..e1c00fe1 100644 --- a/src/main/java/store/ckin/api/adit/Auditable.java +++ b/src/main/java/store/ckin/api/adit/Auditable.java @@ -1,13 +1,14 @@ package store.ckin.api.adit; -import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.EntityListeners; -import javax.persistence.MappedSuperclass; import lombok.Getter; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import java.time.LocalDateTime; + /** * 엔티티의 생성 시간을 추적하기 위한 공통 필드 'createdAt'을 포함한 Auditable 추상 클래스입니다. * @@ -20,7 +21,7 @@ public abstract class Auditable { @CreatedDate - @Column(name = "created_at",nullable = false, updatable = false) + @Column(name = "created_at", nullable = false, updatable = false) private LocalDateTime createdAt = LocalDateTime.now(); } \ No newline at end of file diff --git a/src/main/java/store/ckin/api/advice/WebControllerAdvice.java b/src/main/java/store/ckin/api/advice/WebControllerAdvice.java index 236ea3d7..8ba874a0 100644 --- a/src/main/java/store/ckin/api/advice/WebControllerAdvice.java +++ b/src/main/java/store/ckin/api/advice/WebControllerAdvice.java @@ -1,7 +1,5 @@ package store.ckin.api.advice; -import java.util.List; -import java.util.stream.Collectors; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -10,6 +8,9 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import store.ckin.api.deliverypolicy.exception.DeliveryPolicyNotActiveException; +import java.util.List; +import java.util.stream.Collectors; + /** * Controller Advice 입니다. * diff --git a/src/main/java/store/ckin/api/author/controller/AuthorController.java b/src/main/java/store/ckin/api/author/controller/AuthorController.java index 81f9ffa2..168a2bb4 100644 --- a/src/main/java/store/ckin/api/author/controller/AuthorController.java +++ b/src/main/java/store/ckin/api/author/controller/AuthorController.java @@ -1,26 +1,19 @@ package store.ckin.api.author.controller; -import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.author.dto.request.AuthorCreateRequestDto; import store.ckin.api.author.dto.request.AuthorModifyRequestDto; import store.ckin.api.author.dto.response.AuthorResponseDto; import store.ckin.api.author.service.AuthorService; +import javax.validation.Valid; + /** * AuthorController. * @@ -50,7 +43,7 @@ public ResponseEntity> getAllAuthors(Pageable pageable) /** * 이름으로 작가를 검색하고 페이징된 결과를 반환합니다. * - * @param name 작가의 이름 + * @param name 작가의 이름 * @param pageable 페이징 정보 * @return 이름으로 검색된 작가 목록에 대한 ResponseEntity 객체 */ @@ -90,7 +83,7 @@ public ResponseEntity getAuthorById(@PathVariable Long author /** * 주어진 ID를 가진 작가의 정보를 수정하고 결과를 반환합니다. * - * @param authorId 작가 ID + * @param authorId 작가 ID * @param authorModifyRequestDto 작가 수정 요청 DTO * @return 수정된 작가에 대한 ResponseEntity 객체 */ diff --git a/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java b/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java index b1848f30..338a091d 100644 --- a/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java +++ b/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.author.dto.request; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + /** * AuthorCreateRequestDto. * diff --git a/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java b/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java index e491d1eb..770f40cc 100644 --- a/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java +++ b/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.author.dto.request; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + /** * AuthorModifyRequestDto. * diff --git a/src/main/java/store/ckin/api/author/entity/Author.java b/src/main/java/store/ckin/api/author/entity/Author.java index 0b884d75..452ca9e5 100644 --- a/src/main/java/store/ckin/api/author/entity/Author.java +++ b/src/main/java/store/ckin/api/author/entity/Author.java @@ -1,19 +1,14 @@ package store.ckin.api.author.entity; -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.book.relationship.bookauthor.entity.BookAuthor; +import javax.persistence.*; +import java.util.Set; + /** * Author 테이블. * diff --git a/src/main/java/store/ckin/api/author/repository/AuthorRepositoryCustom.java b/src/main/java/store/ckin/api/author/repository/AuthorRepositoryCustom.java index d128d994..e3ca1451 100644 --- a/src/main/java/store/ckin/api/author/repository/AuthorRepositoryCustom.java +++ b/src/main/java/store/ckin/api/author/repository/AuthorRepositoryCustom.java @@ -16,7 +16,7 @@ public interface AuthorRepositoryCustom { /** * 이름으로 작가를 검색하고 페이징된 결과를 반환합니다. * - * @param name 작가의 이름 + * @param name 작가의 이름 * @param pageable 페이징 정보 * @return 이름으로 검색된 작가 목록에 대한 페이지 객체 */ diff --git a/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java b/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java index dd144c6e..cc643534 100644 --- a/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java +++ b/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java @@ -1,7 +1,6 @@ package store.ckin.api.author.repository.impl; import com.querydsl.core.types.Projections; -import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -11,6 +10,8 @@ import store.ckin.api.author.entity.QAuthor; import store.ckin.api.author.repository.AuthorRepositoryCustom; +import java.util.List; + /** * AuthorRepositoryImpl. * @@ -25,6 +26,7 @@ public class AuthorRepositoryImpl extends QuerydslRepositorySupport implements A public AuthorRepositoryImpl() { super(Author.class); } + /** * {@inheritDoc} */ diff --git a/src/main/java/store/ckin/api/book/controller/BookController.java b/src/main/java/store/ckin/api/book/controller/BookController.java index 19a000f6..9d2c0d21 100644 --- a/src/main/java/store/ckin/api/book/controller/BookController.java +++ b/src/main/java/store/ckin/api/book/controller/BookController.java @@ -1,8 +1,5 @@ package store.ckin.api.book.controller; -import java.io.IOException; -import java.util.List; -import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -10,15 +7,7 @@ import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.book.dto.request.BookCreateRequestDto; import store.ckin.api.book.dto.request.BookModifyRequestDto; @@ -28,6 +17,10 @@ import store.ckin.api.book.service.BookService; import store.ckin.api.objectstorage.service.ObjectStorageService; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + /** * BookController 클래스입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java b/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java index 9a3875d7..517a0d7a 100644 --- a/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java +++ b/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java @@ -1,16 +1,13 @@ package store.ckin.api.book.dto.request; -import java.time.LocalDate; -import java.util.Set; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.*; +import java.time.LocalDate; +import java.util.Set; + /** * BookCreateRequestDto 클래스. * diff --git a/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java b/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java index 2440eca1..ec49f94c 100644 --- a/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java +++ b/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java @@ -1,16 +1,13 @@ package store.ckin.api.book.dto.request; -import java.time.LocalDate; -import java.util.Set; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.*; +import java.time.LocalDate; +import java.util.Set; + /** * BookModifyRequestDto. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java index 37a8f84f..107ff695 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java @@ -1,12 +1,13 @@ package store.ckin.api.book.dto.response; -import java.util.ArrayList; -import java.util.List; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.ArrayList; +import java.util.List; + /** * 도서 추출 정보 응답 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java index 95adc321..2287cc31 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java @@ -1,11 +1,12 @@ package store.ckin.api.book.dto.response; -import java.time.LocalDate; -import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDate; +import java.util.List; + /** * BookListResponseDto 리스트로 받아올 떄 Dto입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java index bfa4a8f4..949a039d 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java @@ -1,11 +1,12 @@ package store.ckin.api.book.dto.response; -import java.time.LocalDate; -import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDate; +import java.util.List; + /** * BookResponseDto 단일 조회 dto클래스. * diff --git a/src/main/java/store/ckin/api/book/entity/Book.java b/src/main/java/store/ckin/api/book/entity/Book.java index 7c6c9bfa..927f7a95 100644 --- a/src/main/java/store/ckin/api/book/entity/Book.java +++ b/src/main/java/store/ckin/api/book/entity/Book.java @@ -1,28 +1,16 @@ package store.ckin.api.book.entity; -import java.time.LocalDate; -import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import store.ckin.api.book.relationship.bookauthor.entity.BookAuthor; import store.ckin.api.book.relationship.bookcategory.entity.BookCategory; import store.ckin.api.book.relationship.booktag.entity.BookTag; import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.file.entity.File; +import javax.persistence.*; +import java.time.LocalDate; +import java.util.Set; + /** * Book Entity. * diff --git a/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java b/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java index 028f4a9d..e24dee11 100644 --- a/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java +++ b/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java @@ -1,22 +1,12 @@ package store.ckin.api.book.relationship.bookauthor.entity; -import java.io.Serializable; -import javax.persistence.Embeddable; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import store.ckin.api.author.entity.Author; import store.ckin.api.book.entity.Book; +import javax.persistence.*; +import java.io.Serializable; + /** * BookAuthor 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java b/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java index 5b015ce3..57342ede 100644 --- a/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java +++ b/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java @@ -1,22 +1,12 @@ package store.ckin.api.book.relationship.bookcategory.entity; -import java.io.Serializable; -import javax.persistence.Embeddable; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import store.ckin.api.book.entity.Book; import store.ckin.api.category.entity.Category; +import javax.persistence.*; +import java.io.Serializable; + /** * BookCategory 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java b/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java index 13b0e64d..cb65bd6f 100644 --- a/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java +++ b/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java @@ -1,22 +1,12 @@ package store.ckin.api.book.relationship.booktag.entity; -import java.io.Serializable; -import javax.persistence.Embeddable; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import store.ckin.api.book.entity.Book; import store.ckin.api.tag.entity.Tag; +import javax.persistence.*; +import java.io.Serializable; + /** * BookTag 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java index 3d0b20e4..a7a58f70 100644 --- a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java +++ b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java @@ -1,7 +1,5 @@ package store.ckin.api.book.repository; -import java.util.List; -import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.NoRepositoryBean; @@ -9,6 +7,9 @@ import store.ckin.api.book.dto.response.BookListResponseDto; import store.ckin.api.book.entity.Book; +import java.util.List; +import java.util.Optional; + /** * BookRepositoryCustom 인터페이스. * diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index a8c3e797..b8a8328f 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -2,10 +2,6 @@ import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import javax.persistence.EntityManager; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -24,6 +20,11 @@ import store.ckin.api.file.entity.QFile; import store.ckin.api.tag.entity.QTag; +import javax.persistence.EntityManager; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + /** * BookRepository의 구현클래스. * diff --git a/src/main/java/store/ckin/api/book/service/BookService.java b/src/main/java/store/ckin/api/book/service/BookService.java index 0e2383ce..877f9f9d 100644 --- a/src/main/java/store/ckin/api/book/service/BookService.java +++ b/src/main/java/store/ckin/api/book/service/BookService.java @@ -1,7 +1,5 @@ package store.ckin.api.book.service; -import java.io.IOException; -import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; @@ -11,6 +9,9 @@ import store.ckin.api.book.dto.response.BookListResponseDto; import store.ckin.api.book.dto.response.BookResponseDto; +import java.io.IOException; +import java.util.List; + /** * BookService 인터페이스. * @@ -23,7 +24,7 @@ public interface BookService { * 작가 이름으로 도서를 검색하고 페이징된 결과를 반환합니다. * * @param authorName 작가 이름 - * @param pageable 페이징 정보 + * @param pageable 페이징 정보 * @return 작가 이름으로 검색된 도서 목록에 대한 페이지 객체 */ Page findByAuthorName(String authorName, Pageable pageable); @@ -32,7 +33,7 @@ public interface BookService { * 도서 제목으로 도서를 검색하고 페이징된 결과를 반환합니다. * * @param bookTitle 도서 제목 - * @param pageable 페이징 정보 + * @param pageable 페이징 정보 * @return 도서 제목으로 검색된 도서 목록에 대한 페이지 객체 */ Page findByBookTitle(String bookTitle, Pageable pageable); @@ -41,7 +42,7 @@ public interface BookService { * 카테고리 ID로 도서를 검색하고 페이징된 결과를 반환합니다. * * @param categoryId 카테고리 ID - * @param pageable 페이징 정보 + * @param pageable 페이징 정보 * @return 카테고리 ID로 검색된 도서 목록에 대한 페이지 객체 */ Page findByCategoryId(Long categoryId, Pageable pageable); @@ -58,7 +59,7 @@ public interface BookService { * 새로운 도서를 생성합니다. * * @param requestDto 도서 생성 요청 DTO - * @param file 도서 썸네일 이미지 파일 + * @param file 도서 썸네일 이미지 파일 * @throws IOException 파일 처리 중 발생하는 예외 */ void createBook(BookCreateRequestDto requestDto, MultipartFile file) throws IOException; @@ -66,7 +67,7 @@ public interface BookService { /** * 주어진 ID의 도서 정보를 수정합니다. * - * @param bookId 도서 ID + * @param bookId 도서 ID * @param requestDto 도서 수정 요청 DTO */ void updateBook(Long bookId, BookModifyRequestDto requestDto); @@ -98,7 +99,7 @@ public interface BookService { /** * 주어진 ID의 도서 썸네일을 업데이트합니다. * - * @param bookId 도서 ID + * @param bookId 도서 ID * @param newThumbnail 새 도서 썸네일 이미지 파일 * @throws IOException 파일 처리 중 발생하는 예외 */ diff --git a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java index 9a4ab7c7..d27c1099 100644 --- a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java +++ b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java @@ -1,10 +1,5 @@ package store.ckin.api.book.service.impl; -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -36,6 +31,12 @@ import store.ckin.api.tag.exception.TagNotFoundException; import store.ckin.api.tag.repository.TagRepository; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + /** * BookService 구현클래스. * diff --git a/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java b/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java index 03c3b53f..5ffd097f 100644 --- a/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java +++ b/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.booksale.dto.request; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Positive; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; + /** * 주문 도서 생성 요청 DTO. * diff --git a/src/main/java/store/ckin/api/booksale/entity/BookSale.java b/src/main/java/store/ckin/api/booksale/entity/BookSale.java index 5823154d..6f42e76e 100644 --- a/src/main/java/store/ckin/api/booksale/entity/BookSale.java +++ b/src/main/java/store/ckin/api/booksale/entity/BookSale.java @@ -1,27 +1,12 @@ package store.ckin.api.booksale.entity; -import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import store.ckin.api.book.entity.Book; import store.ckin.api.sale.entity.Sale; +import javax.persistence.*; +import java.io.Serializable; + /** * 주문 도서 (리스트) Entity. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java index b499a217..c5c1c11e 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java @@ -1,9 +1,10 @@ package store.ckin.api.booksale.repository; -import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.booksale.entity.BookSale; +import java.util.List; + /** * 주문 도서 (리스트) JPA 레포지토리입니다. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java index f251520a..6f5afa7d 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java @@ -1,9 +1,10 @@ package store.ckin.api.booksale.repository; -import java.util.List; import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; +import java.util.List; + /** * 도서 주문 리스트 레포지토리 커스텀 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java index ebbd0823..11eed7c1 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java @@ -1,13 +1,14 @@ package store.ckin.api.booksale.repository; import com.querydsl.core.types.Projections; -import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.entity.QBookSale; import store.ckin.api.file.entity.QFile; +import java.util.List; + /** * 도서 주문 리스트 Querydsl 레포지토리 클래스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/service/BookSaleService.java b/src/main/java/store/ckin/api/booksale/service/BookSaleService.java index ad127f6a..afc61edb 100644 --- a/src/main/java/store/ckin/api/booksale/service/BookSaleService.java +++ b/src/main/java/store/ckin/api/booksale/service/BookSaleService.java @@ -1,10 +1,11 @@ package store.ckin.api.booksale.service; -import java.util.List; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.booksale.entity.BookSale; +import java.util.List; + /** * 주문 도서 (리스트) 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java b/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java index a59de4d3..c5e5ec79 100644 --- a/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java +++ b/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java @@ -1,6 +1,5 @@ package store.ckin.api.booksale.service.impl; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,6 +11,8 @@ import store.ckin.api.packaging.dto.response.PackagingResponseDto; import store.ckin.api.packaging.service.PackagingService; +import java.util.List; + /** * 주문 도서 (리스트) 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/category/controller/CategoryController.java b/src/main/java/store/ckin/api/category/controller/CategoryController.java index 12519ed2..e5f6ed8f 100644 --- a/src/main/java/store/ckin/api/category/controller/CategoryController.java +++ b/src/main/java/store/ckin/api/category/controller/CategoryController.java @@ -1,23 +1,17 @@ package store.ckin.api.category.controller; -import java.util.List; -import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; import store.ckin.api.category.dto.response.CategoryResponseDto; import store.ckin.api.category.service.CategoryService; +import javax.validation.Valid; +import java.util.List; + /** * CategoryController 클래스. * @@ -73,7 +67,7 @@ public ResponseEntity> getSubcategories(@PathVariable /** * 지정된 ID의 카테고리를 업데이트합니다. * - * @param categoryId 카테고리 ID + * @param categoryId 카테고리 ID * @param categoryUpdateRequestDto 카테고리 업데이트 요청 DTO * @return 업데이트 성공시 상태 코드 200과 함께 ResponseEntity 반환 */ diff --git a/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java b/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java index 68c4d435..aabed998 100644 --- a/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java +++ b/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.category.dto.request; -import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.NotBlank; + /** * CategoryCreateRequestDto. * diff --git a/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java b/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java index 5a73eaee..18255756 100644 --- a/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.category.dto.request; -import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.NotBlank; + /** * CategoryUpdateRequestDto. * diff --git a/src/main/java/store/ckin/api/category/entity/Category.java b/src/main/java/store/ckin/api/category/entity/Category.java index a67b9273..b58b3ff1 100644 --- a/src/main/java/store/ckin/api/category/entity/Category.java +++ b/src/main/java/store/ckin/api/category/entity/Category.java @@ -1,21 +1,14 @@ package store.ckin.api.category.entity; -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.book.relationship.bookcategory.entity.BookCategory; +import javax.persistence.*; +import java.util.Set; + /** * Category 엔티티 클래스. * diff --git a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java index 87f29d5a..35804909 100644 --- a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java +++ b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java @@ -1,10 +1,11 @@ package store.ckin.api.category.repository; -import java.util.List; -import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.category.entity.Category; +import java.util.List; +import java.util.Optional; + /** * CategoryRepository. * diff --git a/src/main/java/store/ckin/api/category/service/CategoryService.java b/src/main/java/store/ckin/api/category/service/CategoryService.java index ab9347b2..75f9a944 100644 --- a/src/main/java/store/ckin/api/category/service/CategoryService.java +++ b/src/main/java/store/ckin/api/category/service/CategoryService.java @@ -1,10 +1,11 @@ package store.ckin.api.category.service; -import java.util.List; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; import store.ckin.api.category.dto.response.CategoryResponseDto; +import java.util.List; + /** * CategoryService. * diff --git a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java index a49fb688..35731da8 100644 --- a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java +++ b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java @@ -1,7 +1,5 @@ package store.ckin.api.category.service.impl; -import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,6 +11,9 @@ import store.ckin.api.category.repository.CategoryRepository; import store.ckin.api.category.service.CategoryService; +import java.util.List; +import java.util.stream.Collectors; + /** * CategoryServiceImpl. * diff --git a/src/main/java/store/ckin/api/config/DataSourceConfig.java b/src/main/java/store/ckin/api/config/DataSourceConfig.java index b0a74b80..f9436154 100644 --- a/src/main/java/store/ckin/api/config/DataSourceConfig.java +++ b/src/main/java/store/ckin/api/config/DataSourceConfig.java @@ -1,6 +1,5 @@ package store.ckin.api.config; -import javax.sql.DataSource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.dbcp2.BasicDataSource; @@ -8,6 +7,8 @@ import org.springframework.context.annotation.Configuration; import store.ckin.api.skm.util.KeyManager; +import javax.sql.DataSource; + /** * DBCP2 설정을 위한 클래스입니다. * diff --git a/src/main/java/store/ckin/api/config/QuerydslConfig.java b/src/main/java/store/ckin/api/config/QuerydslConfig.java index eafb0941..cb4abf66 100644 --- a/src/main/java/store/ckin/api/config/QuerydslConfig.java +++ b/src/main/java/store/ckin/api/config/QuerydslConfig.java @@ -1,10 +1,11 @@ package store.ckin.api.config; import com.querydsl.jpa.impl.JPAQueryFactory; -import javax.persistence.EntityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import javax.persistence.EntityManager; + /** * JPAQueryFactory Bean 등록을 위한 클래스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java b/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java index 1fe14899..f5bb4f5d 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java +++ b/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java @@ -2,6 +2,7 @@ import java.util.List; import javax.validation.Valid; + import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java index ff774cea..55bea2c0 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java @@ -2,6 +2,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; + import lombok.Getter; /** diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java index 4ce706e7..22b30875 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java @@ -2,6 +2,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; + import lombok.Getter; /** diff --git a/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java b/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java index 15c7a540..ab0fb211 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java +++ b/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java @@ -6,6 +6,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; + import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java index 0dec229d..c58d4a3e 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java +++ b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Optional; + import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.entity.DeliveryPolicy; diff --git a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java index 9731fc74..260ce94d 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java +++ b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java @@ -1,8 +1,10 @@ package store.ckin.api.deliverypolicy.repository; import com.querydsl.core.types.Projections; + import java.util.List; import java.util.Optional; + import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.entity.DeliveryPolicy; diff --git a/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java b/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java index bcb01fc8..cab06469 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java +++ b/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java @@ -1,6 +1,7 @@ package store.ckin.api.deliverypolicy.service; import java.util.List; + import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyCreateRequestDto; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyUpdateRequestDto; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; @@ -38,8 +39,8 @@ public interface DeliveryPolicyService { /** * 배송비 정책을 수정하는 메서드입니다. * - * @param id 수정할 배송비 정책 ID - * @param updateDeliveryPolicy 수정할 배송비 정책 DTO + * @param id 수정할 배송비 정책 ID + * @param updateDeliveryPolicy 수정할 배송비 정책 DTO */ void updateDeliveryPolicy(Long id, DeliveryPolicyUpdateRequestDto updateDeliveryPolicy); diff --git a/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java b/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java index 89acd912..3f580efa 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java +++ b/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java @@ -1,6 +1,7 @@ package store.ckin.api.deliverypolicy.service.impl; import java.util.List; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java b/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java index 6383804d..15a191b7 100644 --- a/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java +++ b/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java @@ -44,7 +44,7 @@ public ApplicationStatusController(ApplicationInfoManager applicationInfoManager @PostMapping @ResponseStatus(value = HttpStatus.OK) - public void stopStatus(){ + public void stopStatus() { applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.DOWN); applicationStatus.stopService(); } diff --git a/src/main/java/store/ckin/api/file/entity/File.java b/src/main/java/store/ckin/api/file/entity/File.java index 9037d97b..e1b1b1ec 100644 --- a/src/main/java/store/ckin/api/file/entity/File.java +++ b/src/main/java/store/ckin/api/file/entity/File.java @@ -1,13 +1,5 @@ package store.ckin.api.file.entity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -16,6 +8,9 @@ import store.ckin.api.book.entity.Book; import store.ckin.api.review.entity.Review; +import javax.persistence.*; +import javax.validation.constraints.NotNull; + /** * File 업로드를 위한 엔티티 클래스. * diff --git a/src/main/java/store/ckin/api/file/repository/FileRepository.java b/src/main/java/store/ckin/api/file/repository/FileRepository.java index df67a5b2..593fed33 100644 --- a/src/main/java/store/ckin/api/file/repository/FileRepository.java +++ b/src/main/java/store/ckin/api/file/repository/FileRepository.java @@ -1,20 +1,19 @@ package store.ckin.api.file.repository; -import java.util.List; -import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.file.entity.File; +import java.util.Optional; + /** * {class name}. * * @author 나국로 * @version 2024. 03. 03. */ -public interface FileRepository extends JpaRepository { +public interface FileRepository extends JpaRepository, FileRepositoryCustom { Optional findByFileUrl(String fileUrl); Optional findByBook_BookId(Long bookId); - List findAllByReview_ReviewId(Long reviewId); } diff --git a/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java b/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java new file mode 100644 index 00000000..f17621f9 --- /dev/null +++ b/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java @@ -0,0 +1,16 @@ +package store.ckin.api.file.repository; + +import org.springframework.data.repository.NoRepositoryBean; + +import java.util.List; + +/** + * description: + * + * @author : gaeun + * @version : 2024. 03. 13 + */ +@NoRepositoryBean +public interface FileRepositoryCustom { + List findFilePathByReviewId(Long reviewId); +} diff --git a/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java b/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java new file mode 100644 index 00000000..3fdc46f3 --- /dev/null +++ b/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java @@ -0,0 +1,29 @@ +package store.ckin.api.file.repository; + +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; +import store.ckin.api.file.entity.File; +import store.ckin.api.file.entity.QFile; + +import java.util.List; + +/** + * description: + * + * @author : gaeun + * @version : 2024. 03. 13 + */ +public class FileRepositoryImpl extends QuerydslRepositorySupport implements FileRepositoryCustom { + public FileRepositoryImpl() { + super(File.class); + } + + QFile file = QFile.file; + + @Override + public List findFilePathByReviewId(Long reviewId) { + return from(file) + .where(file.review.reviewId.eq(reviewId)) + .select(file.fileUrl) + .fetch(); + } +} diff --git a/src/main/java/store/ckin/api/grade/entity/Grade.java b/src/main/java/store/ckin/api/grade/entity/Grade.java index 8f745675..0e9565b0 100644 --- a/src/main/java/store/ckin/api/grade/entity/Grade.java +++ b/src/main/java/store/ckin/api/grade/entity/Grade.java @@ -1,15 +1,8 @@ package store.ckin.api.grade.entity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; + +import javax.persistence.*; /** * Grade 테이블에 대한 Entity 입니다. diff --git a/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java b/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java index b6182441..427739e6 100644 --- a/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java +++ b/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java @@ -6,5 +6,5 @@ * @author : jinwoolee * @version : 2024. 02. 26. */ -public class GradeNotFoundException extends RuntimeException{ +public class GradeNotFoundException extends RuntimeException { } diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index b9841442..9ad4f83b 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -1,27 +1,22 @@ package store.ckin.api.member.controller; -import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -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 org.springframework.web.bind.annotation.*; +import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.service.MemberService; +import javax.validation.Valid; + /** * Member 에 관한 REST Controller 입니다. * diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java index c51b7aef..03362364 100644 --- a/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java +++ b/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.member.domain.request; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; + /** * 로그인할 때 필요한 정보를 가져오는 DTO 입니다. * diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java index 7b7aee7b..f6b15741 100644 --- a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java +++ b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java @@ -1,13 +1,14 @@ package store.ckin.api.member.domain.request; -import java.time.LocalDate; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDate; /** * Member 생성을 할 때 필요한 정보를 가져오는 DTO 입니다. diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index 319bdf5b..02b062c6 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -1,26 +1,14 @@ package store.ckin.api.member.entity; -import java.time.LocalDate; -import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; import store.ckin.api.grade.entity.Grade; +import javax.persistence.*; +import java.time.LocalDate; +import java.time.LocalDateTime; + /** * Member 테이블에 대한 Entity 입니다. diff --git a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java index 06dead83..123dd84d 100644 --- a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java +++ b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java @@ -1,10 +1,10 @@ package store.ckin.api.member.repository; import org.springframework.data.repository.NoRepositoryBean; +import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; /** * Member Entity 에 Query dsl 을 적용할 메서드를 기술한 interface 입니다. @@ -19,7 +19,7 @@ public interface MemberRepositoryCustom { MemberInfoDetailResponseDto getMemberInfoDetail(Long id); MemberMyPageResponseDto getMyPageInfo(Long id); - + /** * 회원 포인트를 조회하는 메서드 입니다. * diff --git a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java index 53d9cf22..8f883b46 100644 --- a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java +++ b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java @@ -3,10 +3,10 @@ import com.querydsl.core.types.Projections; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.grade.entity.QGrade; +import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.entity.QMember; import store.ckin.api.member.repository.MemberRepositoryCustom; @@ -70,7 +70,7 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { .groupBy(member.name, grade.name, member.accumulateAmount, member.point) .fetchOne(); } - + /** * {@inheritDoc} * diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 08dc9d61..0ec3ab7a 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -1,11 +1,11 @@ package store.ckin.api.member.service; +import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; /** * Member 의 관한 로직을 처리하는 서비스 인터페이스 입니다. @@ -44,7 +44,7 @@ public interface MemberService { /** * 회원의 포인트를 업데이트하는 메서드 입니다. * - * @param memberId 회원 ID + * @param memberId 회원 ID * @param pointUsage 사용한 포인트 */ void updatePoint(Long memberId, Integer pointUsage); diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 6c580e9a..4975f0c3 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -1,24 +1,25 @@ package store.ckin.api.member.service.impl; -import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import store.ckin.api.grade.entity.Grade; import store.ckin.api.grade.exception.GradeNotFoundException; import store.ckin.api.grade.repository.GradeRepository; +import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.member.service.MemberService; +import java.time.LocalDateTime; + /** * MemberService interface 의 구현체 입니다. * @@ -87,7 +88,7 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { return memberRepository.getMyPageInfo(id); } - + /** * {@inheritDoc} * diff --git a/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java b/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java index 7ab3e5a8..47cb8140 100644 --- a/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java +++ b/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java @@ -1,6 +1,7 @@ package store.ckin.api.objectstorage.dto.response; import java.time.LocalDateTime; + import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java b/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java index 134d1a4d..3fb5e863 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java +++ b/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java @@ -1,6 +1,7 @@ package store.ckin.api.objectstorage.service; import java.io.IOException; + import org.springframework.web.multipart.MultipartFile; import store.ckin.api.file.entity.File; diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index 67854618..17fd2f3b 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -9,6 +9,7 @@ import java.util.Objects; import java.util.Optional; import java.util.UUID; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.http.fileupload.IOUtils; diff --git a/src/main/java/store/ckin/api/packaging/controller/PackagingController.java b/src/main/java/store/ckin/api/packaging/controller/PackagingController.java index d3079d14..c04cd9fe 100644 --- a/src/main/java/store/ckin/api/packaging/controller/PackagingController.java +++ b/src/main/java/store/ckin/api/packaging/controller/PackagingController.java @@ -1,23 +1,17 @@ package store.ckin.api.packaging.controller; -import java.util.List; -import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.packaging.dto.request.PackagingCreateRequestDto; import store.ckin.api.packaging.dto.request.PackagingUpdateRequestDto; import store.ckin.api.packaging.dto.response.PackagingResponseDto; import store.ckin.api.packaging.service.PackagingService; +import javax.validation.Valid; +import java.util.List; + /** * 포장 정책 컨트롤러입니다. * diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java index 4db75d38..c8c4d8ed 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.packaging.dto.request; +import lombok.Getter; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.Size; -import lombok.Getter; /** * 포장 정책 생성 요청 DTO. diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java index 1f8f485c..c666e857 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.packaging.dto.request; +import lombok.Getter; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.Size; -import lombok.Getter; /** * 포장 정책 수정 요청 DTO. diff --git a/src/main/java/store/ckin/api/packaging/entity/Packaging.java b/src/main/java/store/ckin/api/packaging/entity/Packaging.java index f2c27189..79fbe227 100644 --- a/src/main/java/store/ckin/api/packaging/entity/Packaging.java +++ b/src/main/java/store/ckin/api/packaging/entity/Packaging.java @@ -1,16 +1,12 @@ package store.ckin.api.packaging.entity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.persistence.*; + /** * 포장 정책 엔티티입니다. * diff --git a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java index 78cb3799..00cfe8a9 100644 --- a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java +++ b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java @@ -1,10 +1,11 @@ package store.ckin.api.packaging.repository; -import java.util.List; -import java.util.Optional; import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.packaging.dto.response.PackagingResponseDto; +import java.util.List; +import java.util.Optional; + /** * 포장 정책 Repository Querydsl 사용할 메서드가 있는 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java index a2bbffc6..378219f8 100644 --- a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java +++ b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java @@ -1,13 +1,14 @@ package store.ckin.api.packaging.repository; import com.querydsl.core.types.Projections; -import java.util.List; -import java.util.Optional; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.packaging.dto.response.PackagingResponseDto; import store.ckin.api.packaging.entity.Packaging; import store.ckin.api.packaging.entity.QPackaging; +import java.util.List; +import java.util.Optional; + /** * 포장 정책 Repository Querydsl 사용을 위한 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/packaging/service/PackagingService.java b/src/main/java/store/ckin/api/packaging/service/PackagingService.java index c7999026..1f86b596 100644 --- a/src/main/java/store/ckin/api/packaging/service/PackagingService.java +++ b/src/main/java/store/ckin/api/packaging/service/PackagingService.java @@ -1,10 +1,11 @@ package store.ckin.api.packaging.service; -import java.util.List; import store.ckin.api.packaging.dto.request.PackagingCreateRequestDto; import store.ckin.api.packaging.dto.request.PackagingUpdateRequestDto; import store.ckin.api.packaging.dto.response.PackagingResponseDto; +import java.util.List; + /** * 포장 정책 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java b/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java index 4ca97492..11a21567 100644 --- a/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java +++ b/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java @@ -1,6 +1,5 @@ package store.ckin.api.packaging.service.impl; -import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -14,6 +13,8 @@ import store.ckin.api.packaging.repository.PackagingRepository; import store.ckin.api.packaging.service.PackagingService; +import java.util.List; + /** * 포장 정책 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java index 59c0f5e6..04ec1f00 100644 --- a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java +++ b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java @@ -1,9 +1,10 @@ package store.ckin.api.payment.dto.request; -import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; +import java.time.LocalDateTime; + /** * 결제 요청 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java index 8cfb5260..684e6029 100644 --- a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java +++ b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java @@ -1,10 +1,11 @@ package store.ckin.api.payment.dto.response; -import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; +import java.time.LocalDateTime; + /** * 결제 조회 응답 DTO. * diff --git a/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java b/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java index f2e237cf..6d59731c 100644 --- a/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java +++ b/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java @@ -1,10 +1,11 @@ package store.ckin.api.payment.dto.response; -import java.time.LocalDate; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import java.time.LocalDate; + /** * 결제 성공 응답 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/entity/Payment.java b/src/main/java/store/ckin/api/payment/entity/Payment.java index 1637caab..02e9a02c 100644 --- a/src/main/java/store/ckin/api/payment/entity/Payment.java +++ b/src/main/java/store/ckin/api/payment/entity/Payment.java @@ -1,21 +1,14 @@ package store.ckin.api.payment.entity; -import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.sale.entity.Sale; +import javax.persistence.*; +import java.time.LocalDateTime; + /** * 결제 엔티티 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java b/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java index 85fcd557..0ae5f51a 100644 --- a/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java +++ b/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java @@ -6,7 +6,7 @@ * @author 정승조 * @version 2024. 03. 11. */ -public class PaymentNotCompleteException extends RuntimeException{ +public class PaymentNotCompleteException extends RuntimeException { public PaymentNotCompleteException() { super("Payment is not complete."); diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index f247f15a..4a936bc5 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -1,6 +1,5 @@ package store.ckin.api.payment.facade; -import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -13,6 +12,8 @@ import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.service.SaleService; +import java.util.Objects; + /** * 결제 퍼사드 클래스입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java b/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java index ff1f2828..71964d32 100644 --- a/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java +++ b/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java @@ -2,6 +2,7 @@ import java.util.List; import javax.validation.Valid; + import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java index 73a5f438..3d471af8 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java @@ -1,12 +1,9 @@ package store.ckin.api.pointpolicy.dto.request; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; -import javax.validation.constraints.Size; import lombok.Getter; +import javax.validation.constraints.*; + /** * 포인트 정책 생성 요청 DTO. * diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java index 48ac50b8..7588a135 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java @@ -1,10 +1,11 @@ package store.ckin.api.pointpolicy.dto.request; +import lombok.Getter; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; import javax.validation.constraints.Size; -import lombok.Getter; /** * 포인트 정책 수정 요청 DTO. @@ -15,7 +16,7 @@ @Getter public class PointPolicyUpdateRequestDto { - + @Size(min = 1, max = 15, message = "포인트 정책 이름은 1자 이상 15자 이하로 입력해주세요.") @NotBlank(message = "포인트 정책 이름을 입력해주세요.") private String pointPolicyName; diff --git a/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java b/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java index 205f2379..60bb0df9 100644 --- a/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java +++ b/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java @@ -1,14 +1,15 @@ package store.ckin.api.pointpolicy.entity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + /** * 포인트 정책 엔티티입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java index 13f5027f..92dc0e36 100644 --- a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java +++ b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Optional; + import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; diff --git a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java index 39ca632d..6cd78fe1 100644 --- a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java +++ b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java @@ -1,8 +1,10 @@ package store.ckin.api.pointpolicy.repository; import com.querydsl.core.types.Projections; + import java.util.List; import java.util.Optional; + import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; import store.ckin.api.pointpolicy.entity.PointPolicy; diff --git a/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java b/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java index 2bef2c30..7d929358 100644 --- a/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java +++ b/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java @@ -1,6 +1,7 @@ package store.ckin.api.pointpolicy.service; import java.util.List; + import store.ckin.api.pointpolicy.dto.request.PointPolicyCreateRequestDto; import store.ckin.api.pointpolicy.dto.request.PointPolicyUpdateRequestDto; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; diff --git a/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java b/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java index 81c9cad5..e4168b16 100644 --- a/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java +++ b/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java @@ -1,6 +1,5 @@ package store.ckin.api.pointpolicy.service.impl; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,6 +12,8 @@ import store.ckin.api.pointpolicy.repository.PointPolicyRepository; import store.ckin.api.pointpolicy.service.PointPolicyService; +import java.util.List; + /** * 포인트 정책을 관리하는 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index bf52032f..0fb3451e 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -36,7 +36,7 @@ public class ReviewController { */ @PostMapping public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto createRequestDto, - @RequestPart(value = "imageList", required = false) List imageList) { + @RequestPart(value = "imageList", required = false) List imageList) { reviewService.postReview(createRequestDto, imageList); //TODO: point 적립 @@ -53,7 +53,7 @@ public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto creat */ @GetMapping("{bookId}") public ResponseEntity> getReviewPageList(@PageableDefault(page = 0, size = 5) Pageable pageable, - @PathVariable("bookId") Long bookId) { + @PathVariable("bookId") Long bookId) { Page content = reviewService.getReviewPageList(pageable, bookId); return ResponseEntity.ok().body(content); diff --git a/src/main/java/store/ckin/api/review/dto/request/ReviewCreateRequestDto.java b/src/main/java/store/ckin/api/review/dto/request/ReviewCreateRequestDto.java index aa114b80..7593e23a 100644 --- a/src/main/java/store/ckin/api/review/dto/request/ReviewCreateRequestDto.java +++ b/src/main/java/store/ckin/api/review/dto/request/ReviewCreateRequestDto.java @@ -1,6 +1,5 @@ package store.ckin.api.review.dto.request; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java b/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java index 1ffe94af..14d89aff 100644 --- a/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java +++ b/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java @@ -4,6 +4,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.List; + /** * ReviewResponseDto 리뷰 응답 dto. * @@ -18,6 +20,18 @@ public class ReviewResponseDto { private String message; private Integer reviewRate; private String reviewDate; + private List filePath; + + @Builder + public ReviewResponseDto(Long reviewId, String author, String message, Integer reviewRate, + String reviewDate, List filePath) { + this.reviewId = reviewId; + this.author = author; + this.message = message; + this.reviewRate = reviewRate; + this.reviewDate = reviewDate; + this.filePath = filePath; + } @Builder public ReviewResponseDto(Long reviewId, String author, String message, Integer reviewRate, String reviewDate) { @@ -27,4 +41,8 @@ public ReviewResponseDto(Long reviewId, String author, String message, Integer r this.reviewRate = reviewRate; this.reviewDate = reviewDate; } + + public void setFilePath(List filePath) { + this.filePath = filePath; + } } diff --git a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java index 498dd063..32adc52a 100644 --- a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java +++ b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java @@ -6,5 +6,5 @@ * @author 나국로 * @version 2024. 03. 01. */ -public class ReviewNotFoundException extends RuntimeException{ +public class ReviewNotFoundException extends RuntimeException { } diff --git a/src/main/java/store/ckin/api/review/repository/ReviewRepository.java b/src/main/java/store/ckin/api/review/repository/ReviewRepository.java index ef1e8103..40ddbb82 100644 --- a/src/main/java/store/ckin/api/review/repository/ReviewRepository.java +++ b/src/main/java/store/ckin/api/review/repository/ReviewRepository.java @@ -1,11 +1,6 @@ package store.ckin.api.review.repository; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import store.ckin.api.member.repository.MemberRepositoryCustom; -import store.ckin.api.review.dto.request.ReviewCreateRequestDto; -import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.entity.Review; /** diff --git a/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java b/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java index d17ff2fe..11e75388 100644 --- a/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java +++ b/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java @@ -1,12 +1,6 @@ package store.ckin.api.review.repository.impl; import com.querydsl.jpa.impl.JPAQueryFactory; - -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import javax.persistence.EntityManager; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -18,6 +12,12 @@ import store.ckin.api.review.entity.Review; import store.ckin.api.review.repository.ReviewRepositoryCustom; +import javax.persistence.EntityManager; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + /** * ReviewRepository 구현클래스. * @@ -104,5 +104,4 @@ private ReviewResponseDto convertToReviewResponseDto(Review review) { } - } diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index c1cfffec..4846ca45 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -93,7 +93,10 @@ public Page getReviewPageList(Pageable pageable, Long bookId) if (!bookRepository.existsById(bookId)) { throw new BookNotFoundException(bookId); } - - return reviewRepository.getReviewPageList(pageable, bookId); + Page reviewPage = reviewRepository.getReviewPageList(pageable, bookId); + reviewPage.stream().forEach(reviewResponseDto -> { + reviewResponseDto.setFilePath(fileRepository.findFilePathByReviewId(reviewResponseDto.getReviewId())); + }); + return reviewPage; } } diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index 3963231d..5e797296 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -1,19 +1,11 @@ package store.ckin.api.sale.controller; -import java.util.List; -import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; @@ -22,6 +14,9 @@ import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.facade.SaleFacade; +import javax.validation.Valid; +import java.util.List; + /** * 주문 컨트롤러 입니다. * diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java index a2bde2cd..b12f696a 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java @@ -1,13 +1,14 @@ package store.ckin.api.sale.dto.request; -import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.format.annotation.DateTimeFormat; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.PositiveOrZero; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDate; /** * 도서 정보를 제외한 주문 생성 요청 DTO . diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java index e2a24154..a48040a7 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java @@ -1,18 +1,15 @@ package store.ckin.api.sale.dto.request; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; -import javax.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Getter; import org.springframework.format.annotation.DateTimeFormat; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; +import javax.validation.constraints.*; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + /** * 주문 생성 요청 DTO. * diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java index 229a431b..c1748b42 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java @@ -1,11 +1,12 @@ package store.ckin.api.sale.dto.response; -import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.payment.dto.response.PaymentResponseDto; +import java.util.List; + /** * 주문 상세 조회 응답 DTO 입니다. * diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java index 4ab05f7a..71905ab8 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java @@ -1,13 +1,14 @@ package store.ckin.api.sale.dto.response; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; import store.ckin.api.sale.entity.Sale; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Objects; + /** * 주문 조회 응답 DTO. * diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java index c15ff1f8..bdae6292 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java @@ -1,10 +1,11 @@ package store.ckin.api.sale.dto.response; +import lombok.Getter; +import store.ckin.api.booksale.dto.response.BookSaleResponseDto; + import java.time.LocalDate; import java.util.ArrayList; import java.util.List; -import lombok.Getter; -import store.ckin.api.booksale.dto.response.BookSaleResponseDto; /** * 주문 상세 정보와 주문한 책 정보 응답 DTO 클래스입니다. diff --git a/src/main/java/store/ckin/api/sale/entity/Sale.java b/src/main/java/store/ckin/api/sale/entity/Sale.java index 99f129b1..b17959b8 100644 --- a/src/main/java/store/ckin/api/sale/entity/Sale.java +++ b/src/main/java/store/ckin/api/sale/entity/Sale.java @@ -1,20 +1,5 @@ package store.ckin.api.sale.entity; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -22,6 +7,11 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.member.entity.Member; +import javax.persistence.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Set; + /** * 주문 엔티티 클래스입니다. * diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 65d01f3e..722a2c4d 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -1,6 +1,5 @@ package store.ckin.api.sale.facade; -import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; @@ -21,6 +20,8 @@ import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.service.SaleService; +import java.util.List; + /** * 주문 퍼사드 클래스입니다. * diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java index 44d2f37b..67b2d982 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java @@ -1,7 +1,6 @@ package store.ckin.api.sale.repository; import com.querydsl.core.types.Projections; -import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.book.entity.QBook; import store.ckin.api.booksale.dto.response.BookSaleResponseDto; @@ -12,6 +11,8 @@ import store.ckin.api.sale.entity.QSale; import store.ckin.api.sale.entity.Sale; +import java.util.List; + /** * 주문 Repository Querydsl 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/sale/service/SaleService.java b/src/main/java/store/ckin/api/sale/service/SaleService.java index 17308b02..ee87e8fe 100644 --- a/src/main/java/store/ckin/api/sale/service/SaleService.java +++ b/src/main/java/store/ckin/api/sale/service/SaleService.java @@ -1,6 +1,5 @@ package store.ckin.api.sale.service; -import java.util.List; import org.springframework.data.domain.Pageable; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.sale.dto.request.SaleCreateNoBookRequestDto; @@ -8,6 +7,8 @@ import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; +import java.util.List; + /** * 주문 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index b916e4e5..3933ed7b 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -1,11 +1,5 @@ package store.ckin.api.sale.service.impl; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -26,6 +20,13 @@ import store.ckin.api.sale.repository.SaleRepository; import store.ckin.api.sale.service.SaleService; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + /** * 주문 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/skm/exception/KeyMangerException.java b/src/main/java/store/ckin/api/skm/exception/KeyMangerException.java index 87a93ac7..6bf61766 100644 --- a/src/main/java/store/ckin/api/skm/exception/KeyMangerException.java +++ b/src/main/java/store/ckin/api/skm/exception/KeyMangerException.java @@ -6,7 +6,7 @@ * @author 김준현 * @version 2024. 02. 19 */ -public class KeyMangerException extends RuntimeException{ +public class KeyMangerException extends RuntimeException { public KeyMangerException(String message) { super(message); } diff --git a/src/main/java/store/ckin/api/skm/util/KeyManager.java b/src/main/java/store/ckin/api/skm/util/KeyManager.java index 4132e20e..7e3006f8 100644 --- a/src/main/java/store/ckin/api/skm/util/KeyManager.java +++ b/src/main/java/store/ckin/api/skm/util/KeyManager.java @@ -1,17 +1,5 @@ package store.ckin.api.skm.util; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateException; -import java.util.List; -import java.util.Objects; -import javax.net.ssl.SSLContext; import lombok.RequiredArgsConstructor; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; @@ -31,6 +19,15 @@ import store.ckin.api.skm.dto.KeyResponseDto; import store.ckin.api.skm.exception.KeyMangerException; +import javax.net.ssl.SSLContext; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.security.*; +import java.security.cert.CertificateException; +import java.util.List; +import java.util.Objects; + /** * NHN Cloud SKM 에서 저장된 데이터를 가져오기 위한 매니저 클래스 * diff --git a/src/main/java/store/ckin/api/tag/controller/TagController.java b/src/main/java/store/ckin/api/tag/controller/TagController.java index ddb66159..367683f3 100644 --- a/src/main/java/store/ckin/api/tag/controller/TagController.java +++ b/src/main/java/store/ckin/api/tag/controller/TagController.java @@ -1,20 +1,11 @@ package store.ckin.api.tag.controller; -import java.util.List; -import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.common.dto.ErrorResponse; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.tag.dto.request.TagCreateRequestDto; @@ -25,6 +16,9 @@ import store.ckin.api.tag.exception.TagNotFoundException; import store.ckin.api.tag.service.TagService; +import javax.validation.Valid; +import java.util.List; + /** * 태그 요청을 받는 컨트롤러 클래스 * @@ -50,6 +44,7 @@ public ResponseEntity>> getAllTagList(@Pageab /** * 태그를 저장하는 컨트롤러 메서드 + * * @param tagCreateRequestDto 태그 생성 요청 Dto * @return 성공시 CREATED, 태그 이름 이미 존재할 시 BAD_REQUEST, Validation Fail 시 BAD_REQUEST */ @@ -61,6 +56,7 @@ public ResponseEntity saveTag(@Valid @RequestBody TagCreateRequestDto tagC /** * 태그를 수정하는 컨트롤러 메서드 + * * @param tagUpdateRequestDto 태그 수정 요청 Dto * @return 성공 시 Ok, 존재하지 않는 태그 수정 요청시 NOT_FOUND */ @@ -72,6 +68,7 @@ public ResponseEntity updateTag(@Valid @RequestBody TagUpdateRequestDto ta /** * 태그를 삭제하는 컨트롤러 메서드 + * * @param tagDeleteRequestDto 태그 삭제 요청 Dto * @return 성공 시 Ok, 존재하지 않는 태그 삭제 요청시 NOT_FOUND */ @@ -99,6 +96,7 @@ public ResponseEntity handleTagAlreadyExistException(TagNameAlrea /** * 존재하지 않는 태그 아이디일 때 발생하는 TagNotFoundException 핸들링 메서드 + * * @param e 태그 아이디가 존재하지 않을 때 발생 * @return NOT_FOUND 상태와 코드, 메세지를 담은 JSON 응답 */ diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java index 6ea7b47b..4387f2a2 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java @@ -1,8 +1,9 @@ package store.ckin.api.tag.dto.request; +import lombok.Getter; + import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import lombok.Getter; /** * 태그 생성을 위한 요청 DTO diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java index cf6787c7..24099408 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java @@ -1,8 +1,9 @@ package store.ckin.api.tag.dto.request; -import javax.validation.constraints.NotNull; import lombok.Getter; +import javax.validation.constraints.NotNull; + /** * description * diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java index 8bb679fd..33f1f6a8 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java @@ -1,8 +1,9 @@ package store.ckin.api.tag.dto.request; +import lombok.Getter; + import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import lombok.Getter; /** * 태그 업데이트 요청 Dto diff --git a/src/main/java/store/ckin/api/tag/entity/Tag.java b/src/main/java/store/ckin/api/tag/entity/Tag.java index 5ca80537..efd7b2d8 100644 --- a/src/main/java/store/ckin/api/tag/entity/Tag.java +++ b/src/main/java/store/ckin/api/tag/entity/Tag.java @@ -1,16 +1,8 @@ package store.ckin.api.tag.entity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; + +import javax.persistence.*; /** * description: diff --git a/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java b/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java index ad6eefc3..93ea05a0 100644 --- a/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java +++ b/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java @@ -6,7 +6,7 @@ * @author 김준현 * @version 2024. 02. 17 */ -public class TagNameAlreadyExistException extends RuntimeException{ +public class TagNameAlreadyExistException extends RuntimeException { public TagNameAlreadyExistException(String tagName) { super(String.format("태그(name: %s)는 이미 존재하는 태그 이름입니다", tagName)); } diff --git a/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java b/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java index 15be39c7..5f45baea 100644 --- a/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java +++ b/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java @@ -6,7 +6,7 @@ * @author 김준현 * @version 2024. 02. 17 */ -public class TagNotFoundException extends RuntimeException{ +public class TagNotFoundException extends RuntimeException { public TagNotFoundException(Long tagId) { super(String.format("태그(id: %d)를 찾을 수 없습니다", tagId)); } diff --git a/src/main/java/store/ckin/api/tag/repository/TagRepository.java b/src/main/java/store/ckin/api/tag/repository/TagRepository.java index 97d3d35c..11a47c22 100644 --- a/src/main/java/store/ckin/api/tag/repository/TagRepository.java +++ b/src/main/java/store/ckin/api/tag/repository/TagRepository.java @@ -1,11 +1,8 @@ package store.ckin.api.tag.repository; -import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import store.ckin.api.tag.dto.response.TagResponseDto; import store.ckin.api.tag.entity.Tag; /** @@ -15,7 +12,7 @@ * @version : 2024. 02. 14 */ -public interface TagRepository extends JpaRepository, TagRepositoryCustom{ +public interface TagRepository extends JpaRepository, TagRepositoryCustom { Page findAllByOrderByTagId(Pageable pageable); boolean existsByTagName(String tagName); diff --git a/src/main/java/store/ckin/api/tag/repository/TagRepositoryImpl.java b/src/main/java/store/ckin/api/tag/repository/TagRepositoryImpl.java index 24f52953..169f03d9 100644 --- a/src/main/java/store/ckin/api/tag/repository/TagRepositoryImpl.java +++ b/src/main/java/store/ckin/api/tag/repository/TagRepositoryImpl.java @@ -1,8 +1,6 @@ package store.ckin.api.tag.repository; -import org.springframework.data.domain.Page; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; -import store.ckin.api.tag.dto.response.TagResponseDto; import store.ckin.api.tag.entity.Tag; /** diff --git a/src/main/java/store/ckin/api/tag/service/TagService.java b/src/main/java/store/ckin/api/tag/service/TagService.java index 837f76ac..a91c8a33 100644 --- a/src/main/java/store/ckin/api/tag/service/TagService.java +++ b/src/main/java/store/ckin/api/tag/service/TagService.java @@ -1,6 +1,5 @@ package store.ckin.api.tag.service; -import java.util.List; import org.springframework.data.domain.Pageable; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.tag.dto.request.TagCreateRequestDto; @@ -8,6 +7,8 @@ import store.ckin.api.tag.dto.request.TagUpdateRequestDto; import store.ckin.api.tag.dto.response.TagResponseDto; +import java.util.List; + /** * 태그 서비스 인터페이스 * @@ -17,6 +18,7 @@ public interface TagService { /** * 저장된 모든 태그 목록을 읽어오는 메서드 + * * @return 저장된 모든 태그 목록 */ PagedResponse> readTagList(Pageable pageable); @@ -30,6 +32,7 @@ public interface TagService { * 단일 태그의 이름을 변경하는 메서드 */ void updateTag(TagUpdateRequestDto tagUpdateRequestDto); + /** * 단일 태그를 삭제하는 메서드 */ diff --git a/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java b/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java index bd8c9b71..15da4f1c 100644 --- a/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java +++ b/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java @@ -1,12 +1,8 @@ package store.ckin.api.tag.service.impl; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.web.PageableDefault; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import store.ckin.api.common.domain.PageInfo; @@ -21,6 +17,10 @@ import store.ckin.api.tag.repository.TagRepository; import store.ckin.api.tag.service.TagService; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + /** * 태그 서비스 구현 클래스 * @@ -50,7 +50,7 @@ public PagedResponse> readTagList(Pageable pageable) { @Transactional public void createTag(TagCreateRequestDto tagCreateRequestDto) { - if(tagRepository.existsByTagName(tagCreateRequestDto.getTagName())) { + if (tagRepository.existsByTagName(tagCreateRequestDto.getTagName())) { throw new TagNameAlreadyExistException(tagCreateRequestDto.getTagName()); } else { Tag tag = Tag.builder() @@ -63,7 +63,7 @@ public void createTag(TagCreateRequestDto tagCreateRequestDto) { @Transactional public void updateTag(TagUpdateRequestDto tagUpdateRequestDto) { Optional tagWrapped = tagRepository.findById(tagUpdateRequestDto.getTagId()); - if(tagWrapped.isPresent()) { + if (tagWrapped.isPresent()) { Tag tag = tagWrapped.get(); tag.updateTagName(tagUpdateRequestDto.getTagName()); } else { @@ -73,7 +73,7 @@ public void updateTag(TagUpdateRequestDto tagUpdateRequestDto) { @Transactional public void deleteTag(TagDeleteRequestDto tagDeleteRequestDto) { - if(tagRepository.existsById(tagDeleteRequestDto.getTagId())) { + if (tagRepository.existsById(tagDeleteRequestDto.getTagId())) { tagRepository.deleteById(tagDeleteRequestDto.getTagId()); } else { throw new TagNotFoundException(tagDeleteRequestDto.getTagId()); From ad03ea3afc66afba6a134ba8443f9160b5832593 Mon Sep 17 00:00:00 2001 From: dduneon Date: Wed, 13 Mar 2024 14:21:47 +0900 Subject: [PATCH 005/161] =?UTF-8?q?[UPDATE]=20modification=5Ftime=20?= =?UTF-8?q?=ED=95=84=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 --- src/main/java/store/ckin/api/book/entity/Book.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/book/entity/Book.java b/src/main/java/store/ckin/api/book/entity/Book.java index 7c6c9bfa..8334045e 100644 --- a/src/main/java/store/ckin/api/book/entity/Book.java +++ b/src/main/java/store/ckin/api/book/entity/Book.java @@ -1,10 +1,12 @@ package store.ckin.api.book.entity; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EntityListeners; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -17,6 +19,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; import store.ckin.api.book.relationship.bookauthor.entity.BookAuthor; import store.ckin.api.book.relationship.bookcategory.entity.BookCategory; import store.ckin.api.book.relationship.booktag.entity.BookTag; @@ -37,6 +41,7 @@ @AllArgsConstructor @Builder(toBuilder = true) @Table(name = "Book") +@EntityListeners(AuditingEntityListener.class) public class Book { @Id @@ -86,6 +91,10 @@ public class Book { @Builder.Default private String bookReviewRate = "0"; + @LastModifiedDate + @Column(name = "modification_time", nullable = false) + private LocalDateTime modifiedAt = LocalDateTime.now(); + @OneToOne(mappedBy = "book", fetch = FetchType.LAZY) private File thumbnail; @@ -100,5 +109,4 @@ public class Book { @OneToMany(mappedBy = "book", fetch = FetchType.LAZY) private Set sales; - } From 6b452f6fd9c1470156217c43018ab4e6293498cb Mon Sep 17 00:00:00 2001 From: nayoseb Date: Wed, 13 Mar 2024 15:40:35 +0900 Subject: [PATCH 006/161] =?UTF-8?q?[REFACTOR]=20DB=EB=A5=BC=20Full=20Scan?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=ED=8E=98=EC=9D=B4=EC=A7=95=EC=9D=84=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=ED=95=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/impl/BookRepositoryImpl.java | 60 ++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index a8c3e797..f0599f72 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -53,17 +53,24 @@ public BookRepositoryImpl(EntityManager entityManager) { @Override public Page findByAuthorName(String authorName, Pageable pageable) { JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); - + List bookIds = queryFactory + .select(book.bookId) + .from(book) + .join(book.authors, bookAuthor) + .join(bookAuthor.author, author) + .where(author.authorName.eq(authorName)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); List books = queryFactory .selectFrom(book) .leftJoin(book.authors, bookAuthor).fetchJoin() .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.thumbnail, file) - .where(author.authorName.eq(authorName)) - .offset(pageable.getOffset()) - .limit(pageable.getPageSize()) + .where(book.bookId.in(bookIds)) .fetch(); + Long total = Optional.ofNullable(queryFactory .select(book.count()) .from(book) @@ -89,16 +96,24 @@ public Page findByAuthorName(String authorName, Pageable pa public Page findByBookTitleContaining(String bookTitle, Pageable pageable) { JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); + List bookIds = queryFactory + .select(book.bookId) + .from(book) + .where(book.bookTitle.containsIgnoreCase(bookTitle)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + List books = queryFactory .selectFrom(book) .leftJoin(book.authors, bookAuthor).fetchJoin() .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.thumbnail, file) - .where(book.bookTitle.containsIgnoreCase(bookTitle)) - .offset(pageable.getOffset()) - .limit(pageable.getPageSize()) + .where(book.bookId.in(bookIds)) .fetch(); + + Long total = Optional.ofNullable(queryFactory .select(book.count()) .from(book) @@ -120,14 +135,25 @@ public Page findByBookTitleContaining(String bookTitle, Pag public Page findByCategoryId(Long categoryId, Pageable pageable) { JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); +// 먼저 페이징된 ID를 가져옵니다. + List bookIds = queryFactory + .select(book.bookId) + .from(book) + .join(book.categories, bookCategory) + .where(bookCategory.category.categoryId.eq(categoryId)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + +// 이후에 해당 ID를 가진 책들을 조회합니다. List books = queryFactory .selectFrom(book) .leftJoin(book.authors, bookAuthor).fetchJoin() + .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.categories, bookCategory).fetchJoin() - .leftJoin(book.thumbnail, file) - .where(bookCategory.category.categoryId.eq(categoryId)) - .offset(pageable.getOffset()) - .limit(pageable.getPageSize()) + .leftJoin(bookCategory.category, category).fetchJoin() + .leftJoin(book.thumbnail, file).fetchJoin() + .where(book.bookId.in(bookIds)) .fetch(); Long total = Optional.ofNullable(queryFactory @@ -152,13 +178,19 @@ public Page findByCategoryId(Long categoryId, Pageable page public Page findAllBooks(Pageable pageable) { JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); + List bookIds = queryFactory + .select(book.bookId) + .from(book) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + List books = queryFactory .selectFrom(book) .leftJoin(book.authors, bookAuthor).fetchJoin() .leftJoin(bookAuthor.author, author).fetchJoin() - .leftJoin(book.thumbnail, file) - .offset(pageable.getOffset()) - .limit(pageable.getPageSize()) + .leftJoin(book.thumbnail, file).fetchJoin() + .where(book.bookId.in(bookIds)) .fetch(); Long total = Optional.ofNullable(queryFactory From 760ed9b102595bcaf1c92936a7b5301a33b4bcb1 Mon Sep 17 00:00:00 2001 From: gaeun Date: Wed, 13 Mar 2024 15:55:08 +0900 Subject: [PATCH 007/161] =?UTF-8?q?[REFACTOR]=20=EB=8F=84=EC=84=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=A0=90=EC=88=98=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/book/entity/Book.java | 3 +++ .../api/review/dto/response/ReviewResponseDto.java | 11 ----------- .../api/review/service/impl/ReviewServiceImpl.java | 4 +++- src/main/resources/application-dev.properties | 2 ++ 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/store/ckin/api/book/entity/Book.java b/src/main/java/store/ckin/api/book/entity/Book.java index 927f7a95..4f89550b 100644 --- a/src/main/java/store/ckin/api/book/entity/Book.java +++ b/src/main/java/store/ckin/api/book/entity/Book.java @@ -89,4 +89,7 @@ public class Book { @OneToMany(mappedBy = "book", fetch = FetchType.LAZY) private Set sales; + public void setBookReviewRate(Integer reviewRate) { + this.bookReviewRate = String.valueOf(Integer.parseInt(this.bookReviewRate) + reviewRate); + } } diff --git a/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java b/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java index 14d89aff..5abd3fe6 100644 --- a/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java +++ b/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java @@ -22,17 +22,6 @@ public class ReviewResponseDto { private String reviewDate; private List filePath; - @Builder - public ReviewResponseDto(Long reviewId, String author, String message, Integer reviewRate, - String reviewDate, List filePath) { - this.reviewId = reviewId; - this.author = author; - this.message = message; - this.reviewRate = reviewRate; - this.reviewDate = reviewDate; - this.filePath = filePath; - } - @Builder public ReviewResponseDto(Long reviewId, String author, String message, Integer reviewRate, String reviewDate) { this.reviewId = reviewId; diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index 4846ca45..b337e88c 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -1,6 +1,7 @@ package store.ckin.api.review.service.impl; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -31,6 +32,7 @@ * @version 2024. 03. 11. */ @Service +@Slf4j @RequiredArgsConstructor public class ReviewServiceImpl implements ReviewService { private final ReviewRepository reviewRepository; @@ -59,7 +61,7 @@ public void postReview(ReviewCreateRequestDto createRequestDto, List Date: Wed, 13 Mar 2024 15:56:03 +0900 Subject: [PATCH 008/161] Update maven.yml --- .github/workflows/maven.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 3e581d44..26b2436d 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -10,9 +10,9 @@ name: Docker Image CI on: push: - branches: [ "main" ] + branches: [ "develop" ] pull_request: - branches: [ "main" ] + branches: [ "develop" ] jobs: From d7612de700f8967727a2352f6df14ffe2944407b Mon Sep 17 00:00:00 2001 From: gaeun Date: Wed, 13 Mar 2024 16:23:07 +0900 Subject: [PATCH 009/161] =?UTF-8?q?[REFACTOR]=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ReviewServiceImpl.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index c1cfffec..a71d8557 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -22,6 +22,7 @@ import store.ckin.api.review.service.ReviewService; import java.util.List; +import java.util.Objects; import java.util.Optional; /** @@ -66,18 +67,18 @@ public void postReview(ReviewCreateRequestDto createRequestDto, List Date: Wed, 13 Mar 2024 19:30:04 +0900 Subject: [PATCH 010/161] =?UTF-8?q?[REFACTOR]=20ObjectStorage=EC=97=90=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EB=93=B1=EB=A1=9D=20=EC=8B=9C=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EC=9E=AC=EB=B0=9C=EA=B8=89=ED=95=98=EB=8D=98=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objectstorage/service/impl/ObjectStorageServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index 67854618..33f585fa 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -66,7 +66,7 @@ public String requestToken() { String identityUrl = keyManager.keyStore(properties.getIdentity()) + "/tokens"; if (Objects.isNull(tokenId) - || expires.minusMinutes(1).isAfter(LocalDateTime.now())) { + || expires.minusMinutes(1).isBefore(LocalDateTime.now())) { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); @@ -84,6 +84,7 @@ public String requestToken() { response.getBody()).getAccess().getToken().getId(); expires = Objects.requireNonNull( response.getBody()).getAccess().getToken().getExpires(); + log.info("Token expires at: {}", expires); } return tokenId; From 14273578453d796534aa9e6619fba1527dc32caf Mon Sep 17 00:00:00 2001 From: nayoseb Date: Thu, 14 Mar 2024 09:02:44 +0900 Subject: [PATCH 011/161] =?UTF-8?q?[REFACTOR]=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=A1=9C=EA=B7=B8=20=EC=82=AD=EC=9E=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/objectstorage/service/impl/ObjectStorageServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index 33f585fa..066e69b3 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -84,7 +84,6 @@ public String requestToken() { response.getBody()).getAccess().getToken().getId(); expires = Objects.requireNonNull( response.getBody()).getAccess().getToken().getExpires(); - log.info("Token expires at: {}", expires); } return tokenId; From a1220062fdaaf94ff1dfec52dc521ccef704f3f7 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 09:19:54 +0900 Subject: [PATCH 012/161] =?UTF-8?q?[TEST]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/booksale/repository/BookSaleRepositoryTest.java | 2 ++ .../ckin/api/payment/repository/PaymentRepositoryTest.java | 1 + .../ckin/api/review/repository/impl/ReviewRepositoryTest.java | 1 + .../java/store/ckin/api/sale/repository/SaleRepositoryTest.java | 1 + 4 files changed, 5 insertions(+) diff --git a/src/test/java/store/ckin/api/booksale/repository/BookSaleRepositoryTest.java b/src/test/java/store/ckin/api/booksale/repository/BookSaleRepositoryTest.java index 5510c22f..5acf6418 100644 --- a/src/test/java/store/ckin/api/booksale/repository/BookSaleRepositoryTest.java +++ b/src/test/java/store/ckin/api/booksale/repository/BookSaleRepositoryTest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import java.time.LocalDate; +import java.time.LocalDateTime; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -76,6 +77,7 @@ void setUp() { .bookPublisher("테스트 출판사") .bookPublicationDate(LocalDate.now()) .bookRegularPrice(10000) + .modifiedAt(LocalDateTime.now()) .build(); entityManager.persist(book); diff --git a/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java b/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java index c48437a3..9207126d 100644 --- a/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java +++ b/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java @@ -83,6 +83,7 @@ void setUp() { .bookRegularPrice(10000) .bookDiscountRate(0) .bookSalePrice(10000) + .modifiedAt(LocalDateTime.now()) .build(); entityManager.persist(book); diff --git a/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java b/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java index e5e0bb73..b89b605f 100644 --- a/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java +++ b/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java @@ -73,6 +73,7 @@ void setUp() { .bookDiscountRate(10) .bookSalePrice(18000) .bookReviewRate("4.3") + .modifiedAt(LocalDateTime.now()) .build(); testEntityManager.persist(book); diff --git a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java index 4b130dfd..d5b225a9 100644 --- a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java +++ b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java @@ -86,6 +86,7 @@ void setUp() { .bookRegularPrice(10000) .bookDiscountRate(0) .bookSalePrice(10000) + .modifiedAt(LocalDateTime.now()) .build(); entityManager.persist(book); From 893fc97e96f4b92135b2a5409e880139667d8abb Mon Sep 17 00:00:00 2001 From: nayoseb <115917642+nayoseb@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:36:05 +0900 Subject: [PATCH 013/161] Update maven.yml --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 26b2436d..c24b26de 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -12,7 +12,7 @@ on: push: branches: [ "develop" ] pull_request: - branches: [ "develop" ] + branches: [ "main" ] jobs: From c147ac53c1d5358e9dff015acbd318adb2ec232c Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 11:12:36 +0900 Subject: [PATCH 014/161] =?UTF-8?q?[TEST]=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/payment/facade/PaymentFacadeTest.java | 10 +++++----- .../api/sale/service/impl/SaleServiceImplTest.java | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java index 6302dad9..c99b3bb2 100644 --- a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java +++ b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java @@ -83,7 +83,7 @@ void testCreatePayment_NotCompleteException() { () -> paymentFacade.createPayment(failPayment) ); - verify(saleService, times(0)).getSaleDetailBySaleNumber(anyString()); + verify(saleService, times(0)).getSaleBySaleNumber(anyString()); verify(paymentService, times(0)).createPayment(anyLong(), any()); } @@ -112,7 +112,7 @@ void testCreatePayment_AmountNotCorrectException() { "123456" ); - given(saleService.getSaleDetailBySaleNumber(anyString())) + given(saleService.getSaleBySaleNumber(anyString())) .willReturn(saleResponseDto); Assertions.assertThrows( @@ -120,7 +120,7 @@ void testCreatePayment_AmountNotCorrectException() { () -> paymentFacade.createPayment(successPayment) ); - verify(saleService, times(1)).getSaleDetailBySaleNumber(anyString()); + verify(saleService, times(1)).getSaleBySaleNumber(anyString()); verify(paymentService, times(0)).createPayment(anyLong(), any()); } @@ -149,12 +149,12 @@ void testCreatePayment() { "123456" ); - given(saleService.getSaleDetailBySaleNumber(anyString())) + given(saleService.getSaleBySaleNumber(anyString())) .willReturn(saleResponseDto); paymentFacade.createPayment(successPayment); - verify(saleService, times(1)).getSaleDetailBySaleNumber(anyString()); + verify(saleService, times(1)).getSaleBySaleNumber(anyString()); verify(paymentService, times(1)).createPayment(anyLong(), any()); } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java index 1f1d7ad9..b1471d87 100644 --- a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java @@ -356,7 +356,7 @@ void testGetSaleDetailBySaleNumber_Fail() { given(saleRepository.existsBySaleNumber(anyString())) .willReturn(false); - assertThrows(SaleNumberNotFoundException.class, () -> saleService.getSaleDetailBySaleNumber("123456")); + assertThrows(SaleNumberNotFoundException.class, () -> saleService.getSaleBySaleNumber("123456")); verify(saleRepository, times(1)).existsBySaleNumber(anyString()); verify(saleRepository, times(0)).findBySaleNumber(anyString()); @@ -372,7 +372,7 @@ void testGetSaleDetailBySaleNumber_Success() { given(saleRepository.findBySaleNumber(anyString())) .willReturn(SaleResponseDto.toDto(sale)); - SaleResponseDto saleDetail = saleService.getSaleDetailBySaleNumber("12345213"); + SaleResponseDto saleDetail = saleService.getSaleBySaleNumber("12345213"); assertAll( () -> assertEquals(saleDetail.getSaleId(), sale.getSaleId()), From ca557313cd5d0a5f1bec3613a7977b6c0c70bb98 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 11:13:08 +0900 Subject: [PATCH 015/161] =?UTF-8?q?[REFACTOR]=20=EC=A3=BC=EB=AC=B8=20-=20?= =?UTF-8?q?=EB=B9=84=ED=9A=8C=EC=9B=90=20=EC=A3=BC=EB=AC=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20(=EC=A3=BC=EB=AC=B8=EB=B2=88=ED=98=B8=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/payment/facade/PaymentFacade.java | 2 +- .../api/sale/controller/SaleController.java | 6 ++++++ .../dto/response/SaleDetailResponseDto.java | 2 +- .../store/ckin/api/sale/facade/SaleFacade.java | 17 +++++++++++++++++ .../ckin/api/sale/service/SaleService.java | 5 +++-- .../api/sale/service/impl/SaleServiceImpl.java | 3 +-- 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index f247f15a..8129c85b 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -36,7 +36,7 @@ public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { throw new PaymentNotCompleteException(); } - SaleResponseDto sale = saleService.getSaleDetailBySaleNumber(requestDto.getSaleNumber()); + SaleResponseDto sale = saleService.getSaleBySaleNumber(requestDto.getSaleNumber()); if (!Objects.equals(sale.getSaleTotalPrice(), requestDto.getAmount())) { throw new PaymentAmountNotCorrectException(); diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index 2061e975..a2e8074e 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -106,4 +106,10 @@ public ResponseEntity getSaleWithBooks(@PathVariable St public ResponseEntity getSalePaymentInfo(@PathVariable("saleNumber") String saleNumber) { return ResponseEntity.ok(saleFacade.getSalePaymentInfo(saleNumber)); } + + @GetMapping("/guest/{saleNumber}") + public ResponseEntity getSaleDetailBySaleNumber( + @PathVariable("saleNumber") String saleNumber) { + return ResponseEntity.ok(saleFacade.getSaleDetailBySaleNumber(saleNumber)); + } } diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java index 229a431b..1ba889e2 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java @@ -17,7 +17,7 @@ @AllArgsConstructor public class SaleDetailResponseDto { - private List booksaleList; + private List bookSaleList; private SaleResponseDto saleResponseDto; diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index b5072b12..88f1bd66 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -85,6 +85,9 @@ public PagedResponse> getSales(Pageable pageable) { public SaleDetailResponseDto getSaleDetail(Long saleId) { List bookSale = bookSaleService.getBookSaleDetail(saleId); + + log.info("bookSale = {}", bookSale); + SaleResponseDto saleDetail = saleService.getSaleDetail(saleId); PaymentResponseDto payment = paymentService.getPayment(saleId); @@ -125,4 +128,18 @@ public SaleWithBookResponseDto getSaleWithBookResponseDto(String saleNumber) { public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { return saleService.getSalePaymentInfo(saleNumber); } + + /** + * 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. + * + * @param saleNumber 주문 번호 (UUID) + * @return 주문 상세 정보 DTO + */ + public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber) { + + SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); + List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); + PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); + return new SaleDetailResponseDto(bookSale, saleDetail, payment); + } } diff --git a/src/main/java/store/ckin/api/sale/service/SaleService.java b/src/main/java/store/ckin/api/sale/service/SaleService.java index 64c2c526..eae3686a 100644 --- a/src/main/java/store/ckin/api/sale/service/SaleService.java +++ b/src/main/java/store/ckin/api/sale/service/SaleService.java @@ -70,7 +70,8 @@ public interface SaleService { * 주문 번호로 주문을 조회합니다. * * @param saleNumber 주문 번호 (UUID) - * @return 주문 상세 정보 DTO + * @return 주문 정보 DTO */ - SaleResponseDto getSaleDetailBySaleNumber(String saleNumber); + SaleResponseDto getSaleBySaleNumber(String saleNumber); + } diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index 06fc18c8..d8eaac57 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -177,7 +177,7 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { * @return 주문 조회 응답 DTO */ @Override - public SaleResponseDto getSaleDetailBySaleNumber(String saleNumber) { + public SaleResponseDto getSaleBySaleNumber(String saleNumber) { if (!saleRepository.existsBySaleNumber(saleNumber)) { throw new SaleNumberNotFoundException(saleNumber); @@ -188,5 +188,4 @@ public SaleResponseDto getSaleDetailBySaleNumber(String saleNumber) { log.debug("responseDto = {}", responseDto); return responseDto; } - } From 2829584b3074d468d7ddb2b9deeb8c6a14e9bf22 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 11:13:38 +0900 Subject: [PATCH 016/161] =?UTF-8?q?[REFACTOR]=20=EB=8F=84=EC=84=9C=20-=20m?= =?UTF-8?q?odifiedAt=20nullable=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/book/entity/Book.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/book/entity/Book.java b/src/main/java/store/ckin/api/book/entity/Book.java index 8334045e..3ce6a064 100644 --- a/src/main/java/store/ckin/api/book/entity/Book.java +++ b/src/main/java/store/ckin/api/book/entity/Book.java @@ -92,7 +92,7 @@ public class Book { private String bookReviewRate = "0"; @LastModifiedDate - @Column(name = "modification_time", nullable = false) + @Column(name = "modification_time") private LocalDateTime modifiedAt = LocalDateTime.now(); @OneToOne(mappedBy = "book", fetch = FetchType.LAZY) From 6e1b26263dc42ef8476b84cb2ea38ed6c47506cf Mon Sep 17 00:00:00 2001 From: nayoseb Date: Thu, 14 Mar 2024 11:31:43 +0900 Subject: [PATCH 017/161] =?UTF-8?q?[REFACTOR]=20=EC=B1=85=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A4=91=EB=B3=B5=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/book/repository/impl/BookRepositoryImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index f0599f72..e92dfe37 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -68,6 +68,7 @@ public Page findByAuthorName(String authorName, Pageable pa .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.thumbnail, file) .where(book.bookId.in(bookIds)) + .distinct() .fetch(); @@ -110,6 +111,7 @@ public Page findByBookTitleContaining(String bookTitle, Pag .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.thumbnail, file) .where(book.bookId.in(bookIds)) + .distinct() .fetch(); @@ -154,6 +156,7 @@ public Page findByCategoryId(Long categoryId, Pageable page .leftJoin(bookCategory.category, category).fetchJoin() .leftJoin(book.thumbnail, file).fetchJoin() .where(book.bookId.in(bookIds)) + .distinct() .fetch(); Long total = Optional.ofNullable(queryFactory @@ -191,6 +194,7 @@ public Page findAllBooks(Pageable pageable) { .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.thumbnail, file).fetchJoin() .where(book.bookId.in(bookIds)) + .distinct() .fetch(); Long total = Optional.ofNullable(queryFactory From 9cffd7e05171686dc47dd2b9dfd0f52a7a5a7248 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Thu, 14 Mar 2024 11:32:27 +0900 Subject: [PATCH 018/161] =?UTF-8?q?[REFACTOR]=20ObjectStorageServiceImpl?= =?UTF-8?q?=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81=20=EB=B0=8F=20propertie?= =?UTF-8?q?s=EC=97=90=20=ED=8C=8C=EC=9D=BC=20=ED=81=AC=EA=B8=B0=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95=20=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ObjectStorageServiceImpl.java | 6 ------ src/main/resources/application.properties | 5 ++++- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index 066e69b3..6265440c 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -102,12 +102,6 @@ public File saveFile(MultipartFile file, String category) throws IOException { String fileExtension = getContentTypeFromFileName(originalFileName); - // 확장자를 제외한 파일 이름 추출 - String fileNameWithoutExtension = originalFileName; - int posImage = originalFileName.lastIndexOf("."); - if (posImage > 0) { - fileNameWithoutExtension = originalFileName.substring(0, posImage); - } // UUID를 추가하여 저장될 파일 이름 생성 String fileId = UUID.randomUUID().toString(); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 695a6e4d..0ebe8ffa 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -31,4 +31,7 @@ storage.username=95d4dbe7842f447bbb43ab4c48a760a6 storage.containerName=98618fabf4c3446a909b5606083dca90 storage.tenantId=85ad588a05b545b197c0ba775cc9d3b3 storage.password=a6d5144a67624ad5b7e47ad04083045c -storage.identity=258ec250904445ff97d196ca34a86fdc \ No newline at end of file +storage.identity=258ec250904445ff97d196ca34a86fdc +# file size option +spring.servlet.multipart.max-file-size=500MB +spring.servlet.multipart.max-request-size=500MB \ No newline at end of file From cce665454a4a9f0647f7e465b8bdecbd909bf243 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 13:20:56 +0900 Subject: [PATCH 019/161] =?UTF-8?q?[TEST]=20=EC=A3=BC=EB=AC=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=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 --- .../api/sale/controller/SaleControllerTest.java | 16 ++++++++-------- .../ckin/api/sale/facade/SaleFacadeTest.java | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index 1e779ab4..6c3d5bc0 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -204,14 +204,14 @@ void testGetSaleDetail() throws Exception { .andExpectAll( status().isOk(), content().contentType(MediaType.APPLICATION_JSON), - jsonPath("$.booksaleList[0].bookId").value(bookSale.getBookId()), - jsonPath("$.booksaleList[0].fileUrl").value(bookSale.getFileUrl()), - jsonPath("$.booksaleList[0].bookTitle").value(bookSale.getBookTitle()), - jsonPath("$.booksaleList[0].quantity").value(bookSale.getQuantity()), - jsonPath("$.booksaleList[0].couponId").value(bookSale.getCouponId()), - jsonPath("$.booksaleList[0].packagingType").value(bookSale.getPackagingType()), - jsonPath("$.booksaleList[0].packagingPrice").value(bookSale.getPackagingPrice()), - jsonPath("$.booksaleList[0].paymentAmount").value(bookSale.getPaymentAmount()), + jsonPath("$.bookSaleList[0].bookId").value(bookSale.getBookId()), + jsonPath("$.bookSaleList[0].fileUrl").value(bookSale.getFileUrl()), + jsonPath("$.bookSaleList[0].bookTitle").value(bookSale.getBookTitle()), + jsonPath("$.bookSaleList[0].quantity").value(bookSale.getQuantity()), + jsonPath("$.bookSaleList[0].couponId").value(bookSale.getCouponId()), + jsonPath("$.bookSaleList[0].packagingType").value(bookSale.getPackagingType()), + jsonPath("$.bookSaleList[0].packagingPrice").value(bookSale.getPackagingPrice()), + jsonPath("$.bookSaleList[0].paymentAmount").value(bookSale.getPaymentAmount()), jsonPath("$.saleResponseDto.saleId").value(sale.getSaleId()), jsonPath("$.saleResponseDto.memberEmail").value(sale.getMemberEmail()), jsonPath("$.saleResponseDto.saleNumber").value(sale.getSaleNumber()), diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index 2ebf139d..fe4b030f 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -206,7 +206,7 @@ void testGetSaleDetail() { assertAll( () -> assertEquals(saleDetail.getSaleResponseDto(), sale), - () -> assertEquals(saleDetail.getBooksaleList().get(0), bookSale), + () -> assertEquals(saleDetail.getBookSaleList().get(0), bookSale), () -> assertEquals(saleDetail.getPaymentResponseDto(), payment)); verify(saleService, times(1)).getSaleDetail(1L); From 5424abb95ca79d977b073a51eccf33bcf9fbab97 Mon Sep 17 00:00:00 2001 From: gaeun Date: Thu, 14 Mar 2024 16:14:50 +0900 Subject: [PATCH 020/161] =?UTF-8?q?[FEAT]=20=EC=82=AC=EC=A7=84=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objectstorage/service/impl/ObjectStorageServiceImpl.java | 2 +- src/main/resources/application.properties | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index 17fd2f3b..343581be 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -67,7 +67,7 @@ public String requestToken() { String identityUrl = keyManager.keyStore(properties.getIdentity()) + "/tokens"; if (Objects.isNull(tokenId) - || expires.minusMinutes(1).isAfter(LocalDateTime.now())) { + || expires.minusMinutes(1).isBefore(LocalDateTime.now())) { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 695a6e4d..0f0caee3 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -31,4 +31,5 @@ storage.username=95d4dbe7842f447bbb43ab4c48a760a6 storage.containerName=98618fabf4c3446a909b5606083dca90 storage.tenantId=85ad588a05b545b197c0ba775cc9d3b3 storage.password=a6d5144a67624ad5b7e47ad04083045c -storage.identity=258ec250904445ff97d196ca34a86fdc \ No newline at end of file +storage.identity=258ec250904445ff97d196ca34a86fdc + From ecea7904c71a5a62164b58677ed78f07d3f9eb4a Mon Sep 17 00:00:00 2001 From: gaeun Date: Thu, 14 Mar 2024 16:55:04 +0900 Subject: [PATCH 021/161] =?UTF-8?q?[REFACTOR]=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 --- .../java/store/ckin/api/review/service/ReviewServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java b/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java index 961bf490..8aaad353 100644 --- a/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java +++ b/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java @@ -103,7 +103,7 @@ void setUp() { .bookRegularPrice(20000) .bookDiscountRate(10) .bookSalePrice(18000) - .bookReviewRate("4.3") + .bookReviewRate("4") .build(); review = new Review(1L, 5, "good", member, book); From bf2b17bd7986b73442f5ae7e42cd68d3688b8c44 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 17:19:52 +0900 Subject: [PATCH 022/161] =?UTF-8?q?[REFACTOR]=20=EC=A3=BC=EB=AC=B8=20-=20?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=EB=AA=85=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/sale/controller/SaleController.java | 14 +++++ .../request/SaleCreateNoBookRequestDto.java | 3 ++ .../dto/request/SaleCreateRequestDto.java | 4 ++ .../dto/response/SaleWithBookResponseDto.java | 30 +++-------- .../java/store/ckin/api/sale/entity/Sale.java | 24 ++++----- .../ckin/api/sale/facade/SaleFacade.java | 18 ++++--- .../api/sale/repository/SaleRepository.java | 1 + .../sale/repository/SaleRepositoryCustom.java | 13 +++++ .../sale/repository/SaleRepositoryImpl.java | 51 ++++++++++++++----- .../ckin/api/sale/service/SaleService.java | 8 +++ .../sale/service/impl/SaleServiceImpl.java | 17 ++++++- 11 files changed, 128 insertions(+), 55 deletions(-) diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index a2e8074e..c5cdaf2f 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -107,9 +107,23 @@ public ResponseEntity getSalePaymentInfo(@PathVariable("sal return ResponseEntity.ok(saleFacade.getSalePaymentInfo(saleNumber)); } + /** + * 비회원의 주문 상세 정보를 조회하는 메서드입니다. + * + * @param saleNumber 주문 번호 + * @return 200 (OK), 주문 상세 정보 + */ @GetMapping("/guest/{saleNumber}") public ResponseEntity getSaleDetailBySaleNumber( @PathVariable("saleNumber") String saleNumber) { return ResponseEntity.ok(saleFacade.getSaleDetailBySaleNumber(saleNumber)); } + + @GetMapping("/member/{memberId}") + public ResponseEntity>> getSalesByMemberId( + @PathVariable Long memberId, + @PageableDefault Pageable pageable) { + + return ResponseEntity.ok(saleFacade.getSalesByMemberId(memberId, pageable)); + } } diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java index a2bde2cd..d7aeaf8e 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java @@ -22,6 +22,9 @@ public class SaleCreateNoBookRequestDto { private Long memberId; + @NotBlank(message = "주문명 입력해주세요.") + private String saleTitle; + @NotBlank(message = "주문자 이름을 입력해주세요.") private String saleOrderName; diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java index e2a24154..87bbee12 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java @@ -28,6 +28,9 @@ public class SaleCreateRequestDto { private Long memberId; + @NotBlank(message = "주문명을 입력해주세요") + private String saleTitle; + @NotBlank(message = "주문자 이름을 입력해주세요.") private String saleOrdererName; @@ -69,6 +72,7 @@ public class SaleCreateRequestDto { public SaleCreateNoBookRequestDto toCreateSaleWithoutBookRequestDto() { return new SaleCreateNoBookRequestDto( memberId, + saleTitle, saleOrdererName, saleOrdererContact, saleReceiverName, diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java index c15ff1f8..7c51e0a5 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java @@ -47,11 +47,11 @@ public class SaleWithBookResponseDto { private Integer totalPrice; - public SaleWithBookResponseDto(Long saleId, String saleNumber, String memberEmail, String saleOrderName, - String saleOrderContact, - String saleReceiverName, String saleReceiverContact, Integer deliveryFee, - LocalDate saleDeliveryDate, String postcode, String address, Integer pointUsage, - Integer totalPrice) { + public SaleWithBookResponseDto(String saleTitle, Long saleId, String saleNumber, String memberEmail, + String saleOrderName, String saleOrderContact, String saleReceiverName, + String saleReceiverContact, Integer deliveryFee, LocalDate saleDeliveryDate, + String postcode, String address, Integer pointUsage, Integer totalPrice) { + this.saleTitle = saleTitle; this.saleId = saleId; this.saleNumber = saleNumber; this.memberEmail = memberEmail; @@ -71,24 +71,8 @@ public void addBookSale(BookSaleResponseDto bookSale) { this.bookSaleList.add(bookSale); } - public void updateSaleTitle(String saleTitle) { - - if (bookSaleList.size() == 1) { - this.saleTitle = saleTitle; - return; - } - - this.saleTitle = saleTitle + " 외 " + (bookSaleList.size() - 1) + "권"; - } - public SaleInfoResponseDto extractSaleInfoResponseDto() { - return new SaleInfoResponseDto( - saleTitle, - saleNumber, - memberEmail, - saleOrdererName, - saleOrdererContact, - totalPrice - ); + return new SaleInfoResponseDto(saleTitle, saleNumber, memberEmail, saleOrdererName, saleOrdererContact, + totalPrice); } } diff --git a/src/main/java/store/ckin/api/sale/entity/Sale.java b/src/main/java/store/ckin/api/sale/entity/Sale.java index 99f129b1..5e345e9a 100644 --- a/src/main/java/store/ckin/api/sale/entity/Sale.java +++ b/src/main/java/store/ckin/api/sale/entity/Sale.java @@ -40,17 +40,14 @@ public class Sale { * 주문의 배송 상태를 나타내는 Enum. */ public enum DeliveryStatus { - READY, - IN_PROGRESS, - DONE + READY, IN_PROGRESS, DONE } /** * 주문의 결제 상태를 나타내는 Enum. */ public enum PaymentStatus { - WAITING, - PAID + WAITING, PAID } @Id @@ -65,6 +62,9 @@ public enum PaymentStatus { @OneToMany(mappedBy = "sale", fetch = FetchType.EAGER) private Set bookSales; + @Column(name = "sale_title") + private String saleTitle; + @Column(name = "sale_number") private String saleNumber; @@ -113,16 +113,16 @@ public enum PaymentStatus { private String saleShippingPostCode; @Builder - public Sale(Long saleId, Member member, Set bookSales, String saleNumber, String saleOrdererName, - String saleOrdererContact, String saleReceiverName, String saleReceiverContact, - String saleReceiverAddress, - LocalDateTime saleDate, LocalDateTime saleShippingDate, LocalDate saleDeliveryDate, - DeliveryStatus saleDeliveryStatus, Integer saleDeliveryFee, Integer salePointUsage, - Integer saleTotalPrice, - PaymentStatus salePaymentStatus, String saleShippingPostCode) { + public Sale(Long saleId, Member member, Set bookSales, String saleTitle, String saleNumber, + String saleOrdererName, String saleOrdererContact, String saleReceiverName, String saleReceiverContact, + String saleReceiverAddress, LocalDateTime saleDate, LocalDateTime saleShippingDate, + LocalDate saleDeliveryDate, DeliveryStatus saleDeliveryStatus, Integer saleDeliveryFee, + Integer salePointUsage, Integer saleTotalPrice, PaymentStatus salePaymentStatus, + String saleShippingPostCode) { this.saleId = saleId; this.member = member; this.bookSales = bookSales; + this.saleTitle = saleTitle; this.saleNumber = saleNumber; this.saleOrdererName = saleOrdererName; this.saleOrdererContact = saleOrdererContact; diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 88f1bd66..e53a5c8f 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -13,7 +13,6 @@ import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.service.PaymentService; -import store.ckin.api.sale.dto.request.SaleCreateNoBookRequestDto; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; @@ -50,11 +49,7 @@ public class SaleFacade { @Transactional public String createSale(SaleCreateRequestDto requestDto) { - SaleCreateNoBookRequestDto saleInfo = - requestDto.toCreateSaleWithoutBookRequestDto(); - - SaleResponseDto sale = saleService.createSale(saleInfo); - + SaleResponseDto sale = saleService.createSale(requestDto.toCreateSaleWithoutBookRequestDto()); bookSaleService.createBookSale(sale.getSaleId(), requestDto.getBookSaleList()); if (requestDto.getMemberId() != null && requestDto.getPointUsage() > 0) { @@ -142,4 +137,15 @@ public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber) { PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); return new SaleDetailResponseDto(bookSale, saleDetail, payment); } + + /** + * 회원 ID를 통해 해당 회원의 모든 주문 내역을 조회하는 메서드입니다. + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 페이징 처리된 주문 응답 DTO 리스트 + */ + public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { + return saleService.getSalesByMemberId(memberId, pageable); + } } diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepository.java b/src/main/java/store/ckin/api/sale/repository/SaleRepository.java index d02f29be..0a42054a 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepository.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepository.java @@ -36,4 +36,5 @@ public interface SaleRepository extends JpaRepository, SaleRepositor * @return 주문 */ Sale getBySaleNumber(String saleNumber); + } diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryCustom.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryCustom.java index 44f50334..72001f23 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryCustom.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryCustom.java @@ -1,6 +1,10 @@ package store.ckin.api.sale.repository; +import java.util.List; +import org.springframework.data.domain.Pageable; import org.springframework.data.repository.NoRepositoryBean; +import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; @@ -38,4 +42,13 @@ public interface SaleRepositoryCustom { * @return 주문 응답 DTO */ SaleResponseDto findBySaleNumber(String saleNumber); + + /** + * 회원 ID로 전체 주문 정보를 조회하는 메서드입니다. + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 주문 응답 DTO 리스트 + */ + PagedResponse> findAllByMemberId(Long memberId, Pageable pageable); } diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java index 3fafb705..42ae5d1b 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java @@ -2,11 +2,14 @@ import com.querydsl.core.types.Projections; import java.util.List; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; -import store.ckin.api.book.entity.QBook; import store.ckin.api.booksale.dto.response.BookSaleResponseDto; import store.ckin.api.booksale.entity.QBookSale; +import store.ckin.api.common.domain.PageInfo; +import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.member.entity.QMember; +import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.entity.QSale; @@ -72,11 +75,7 @@ public SaleResponseDto findBySaleId(Long saleId) { public SaleWithBookResponseDto getSaleWithBook(String saleNumber) { QSale sale = QSale.sale; - QBookSale bookSale = QBookSale.bookSale; - - QBook book = QBook.book; - QMember member = QMember.member; @@ -100,6 +99,7 @@ public SaleWithBookResponseDto getSaleWithBook(String saleNumber) { .leftJoin(sale.member, member) .on(sale.member.id.eq(member.id)) .select(Projections.constructor(SaleWithBookResponseDto.class, + sale.saleTitle, sale.saleId, sale.saleNumber, sale.member.email, @@ -120,13 +120,6 @@ public SaleWithBookResponseDto getSaleWithBook(String saleNumber) { responseDto.addBookSale(bookSaleResponseDto); } - String saleTitle = from(book) - .where(book.bookId.eq(bookSaleResponseDtoList.get(0).getBookId())) - .select(book.bookTitle) - .fetchFirst(); - - responseDto.updateSaleTitle(saleTitle); - return responseDto; } @@ -168,4 +161,38 @@ public SaleResponseDto findBySaleNumber(String saleNumber) { } + @Override + public PagedResponse> findAllByMemberId(Long memberId, Pageable pageable) { + + QSale sale = QSale.sale; + + List responseDto = from(sale) + .where(sale.member.id.eq(memberId)) + .select(Projections.constructor(SaleInfoResponseDto.class, + sale.saleTitle, + sale.saleNumber, + sale.member.email, + sale.saleOrdererName, + sale.saleOrdererContact, + sale.saleTotalPrice)) + .orderBy(sale.saleId.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + + long totalElements = from(sale) + .where(sale.member.id.eq(memberId)) + .fetchCount(); + + return new PagedResponse<>( + responseDto, + PageInfo.builder() + .page(pageable.getPageNumber()) + .size(pageable.getPageSize()) + .totalElements((int) totalElements) + .totalPages((int) Math.ceil((double) totalElements / pageable.getPageSize())) + .build()); + } + } diff --git a/src/main/java/store/ckin/api/sale/service/SaleService.java b/src/main/java/store/ckin/api/sale/service/SaleService.java index eae3686a..87db7c65 100644 --- a/src/main/java/store/ckin/api/sale/service/SaleService.java +++ b/src/main/java/store/ckin/api/sale/service/SaleService.java @@ -74,4 +74,12 @@ public interface SaleService { */ SaleResponseDto getSaleBySaleNumber(String saleNumber); + /** + * 회원 ID를 통해 해당 회원의 모든 주문 내역을 조회합니다. + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 페이징 처리된 주문 응답 DTO 리스트 + */ + PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable); } diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index d8eaac57..9e0aab36 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -59,9 +59,11 @@ public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) { } + String saleNumber = UUID.randomUUID().toString().replace("-", "").substring(0, 20); Sale sale = Sale.builder() .member(member.orElse(null)) + .saleTitle(requestDto.getSaleTitle()) .saleNumber(saleNumber) .saleOrdererName(requestDto.getSaleOrderName()) .saleOrdererContact(requestDto.getSaleOrderContact()) @@ -94,8 +96,12 @@ public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) { public PagedResponse> getSales(Pageable pageable) { Page salePage = saleRepository.findAllByOrderBySaleIdDesc(pageable); - PageInfo pageInfo = PageInfo.builder().page(pageable.getPageNumber()).size(pageable.getPageSize()) - .totalElements((int) salePage.getTotalElements()).totalPages(salePage.getTotalPages()).build(); + PageInfo pageInfo = PageInfo.builder() + .page(pageable.getPageNumber()) + .size(pageable.getPageSize()) + .totalElements((int) salePage.getTotalElements()) + .totalPages(salePage.getTotalPages()) + .build(); List currentPageSalesResponse = salePage.getContent().stream().map(SaleResponseDto::toDto).collect(Collectors.toList()); @@ -176,6 +182,7 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { * @param saleNumber * @return 주문 조회 응답 DTO */ + @Transactional(readOnly = true) @Override public SaleResponseDto getSaleBySaleNumber(String saleNumber) { @@ -188,4 +195,10 @@ public SaleResponseDto getSaleBySaleNumber(String saleNumber) { log.debug("responseDto = {}", responseDto); return responseDto; } + + @Transactional(readOnly = true) + @Override + public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { + return saleRepository.findAllByMemberId(memberId, pageable); + } } From eda2cc826fd580834ceceac8389f92d16eb05dc0 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 17:19:58 +0900 Subject: [PATCH 023/161] =?UTF-8?q?[TEST]=20=EC=A3=BC=EB=AC=B8=20-=20?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=EB=AA=85=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/sale/controller/SaleControllerTest.java | 2 ++ .../java/store/ckin/api/sale/facade/SaleFacadeTest.java | 2 ++ .../store/ckin/api/sale/repository/SaleRepositoryTest.java | 6 ++++++ .../ckin/api/sale/service/impl/SaleServiceImplTest.java | 3 +++ 4 files changed, 13 insertions(+) diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index 6c3d5bc0..991164aa 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -65,6 +65,7 @@ void testCreateSale() throws Exception { SaleCreateRequestDto requestDto = new SaleCreateRequestDto( 1L, + "테스트 책", "정승조", "01012345678", "정승조", @@ -258,6 +259,7 @@ void testUpdateSalePaymentPaidStatus() throws Exception { void testGetSaleWithBooks() throws Exception { SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( + "홍길동전", 1L, "ABC1234DEF", "test@test.com", diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index fe4b030f..0bf74e94 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -87,6 +87,7 @@ void testCreateSale() { SaleCreateRequestDto requestDto = new SaleCreateRequestDto( 1L, + "테스트 책", "정승조", "01012345678", "정승조", @@ -227,6 +228,7 @@ void testUpdateSalePaymentPaidStatus() { void testGetSaleWithBookResponse() { SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( + "홍길동전", 1L, "ABC1234DEF", "test@test.com", diff --git a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java index d5b225a9..976a688e 100644 --- a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java +++ b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java @@ -104,6 +104,7 @@ void testSaveSale() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -148,6 +149,7 @@ void testFindAllByOrderBySaleIdDesc() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -169,6 +171,7 @@ void testFindAllByOrderBySaleIdDesc() { Sale sale2 = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책2") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -198,6 +201,7 @@ void testFindBySaleId() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -242,6 +246,7 @@ void testGetSaleWithBook() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -302,6 +307,7 @@ void testFindBySaleNumber() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") diff --git a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java index b1471d87..58eadf22 100644 --- a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java @@ -113,6 +113,7 @@ void testCreateSale() { // given SaleCreateNoBookRequestDto requestDto = new SaleCreateNoBookRequestDto( 1L, + "홍길동전", "정승조", "01012345678", "정승조", @@ -255,6 +256,7 @@ void testGetSaleWithBook_Success() { .willReturn(true); SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( + "홍길동전", 1L, "ABC1234DEF", "test@test.com", @@ -316,6 +318,7 @@ void testGetSalePaymentInfo_Success() { .willReturn(true); SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( + "홍길동전", 1L, "ABC1234DEF", "test@test.com", From 4d16fe3273bf48bd712d5997ff933b8be2078f32 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 19:12:47 +0900 Subject: [PATCH 024/161] =?UTF-8?q?[CHORE]=20Querydsl=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index ea2e1e67..f065b3e2 100644 --- a/pom.xml +++ b/pom.xml @@ -180,17 +180,14 @@ com.mysema.maven apt-maven-plugin 1.1.3 - - com.querydsl.apt.jpa.JPAAnnotationProcessor - - generate-sources process - target/generated-sources/annotations + target/generated-sources/java + com.querydsl.apt.jpa.JPAAnnotationProcessor From 20da72c8b7ff1b44fdddd15708db9e68427d6bc0 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 19:13:08 +0900 Subject: [PATCH 025/161] =?UTF-8?q?[REFACTOR]=20=EC=A3=BC=EB=AC=B8=20-=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/sale/controller/SaleController.java | 15 ++++++++++++--- .../sale/dto/response/SaleInfoResponseDto.java | 3 +++ .../api/sale/dto/response/SaleResponseDto.java | 3 +++ .../dto/response/SaleWithBookResponseDto.java | 11 +++++++++-- .../SaleOrdererContactNotMatchException.java | 14 ++++++++++++++ .../store/ckin/api/sale/facade/SaleFacade.java | 11 +++++++++-- .../api/sale/repository/SaleRepositoryImpl.java | 6 +++++- 7 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index c5cdaf2f..c32bbf1b 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; @@ -113,12 +114,20 @@ public ResponseEntity getSalePaymentInfo(@PathVariable("sal * @param saleNumber 주문 번호 * @return 200 (OK), 주문 상세 정보 */ - @GetMapping("/guest/{saleNumber}") + @GetMapping("/guest") public ResponseEntity getSaleDetailBySaleNumber( - @PathVariable("saleNumber") String saleNumber) { - return ResponseEntity.ok(saleFacade.getSaleDetailBySaleNumber(saleNumber)); + @RequestParam("saleNumber") String saleNumber, + @RequestParam("ordererContact") String ordererContact) { + return ResponseEntity.ok(saleFacade.getSaleDetailBySaleNumber(saleNumber, ordererContact)); } + /** + * 회원의 모든 주문을 조회하는 메서드입니다. + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 200 (OK), 회원의 주문 응답 DTO 리스트 + */ @GetMapping("/member/{memberId}") public ResponseEntity>> getSalesByMemberId( @PathVariable Long memberId, diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleInfoResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleInfoResponseDto.java index b6440974..f6988626 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleInfoResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleInfoResponseDto.java @@ -1,5 +1,6 @@ package store.ckin.api.sale.dto.response; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; @@ -25,4 +26,6 @@ public class SaleInfoResponseDto { private String saleOrdererContact; private Integer totalPrice; + + private LocalDateTime saleDate; } diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java index 4ab05f7a..c6e815c7 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java @@ -22,6 +22,8 @@ public class SaleResponseDto { private Long saleId; + private String title; + private String memberEmail; private String saleNumber; @@ -58,6 +60,7 @@ public static SaleResponseDto toDto(Sale sale) { return new SaleResponseDto( sale.getSaleId(), + sale.getSaleTitle(), Objects.nonNull(sale.getMember()) ? sale.getMember().getEmail() : "비회원", sale.getSaleNumber(), sale.getSaleOrdererName(), diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java index 7c51e0a5..4012b0ee 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java @@ -1,8 +1,10 @@ package store.ckin.api.sale.dto.response; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import lombok.Builder; import lombok.Getter; import store.ckin.api.booksale.dto.response.BookSaleResponseDto; @@ -39,6 +41,8 @@ public class SaleWithBookResponseDto { private LocalDate saleDeliveryDate; + private LocalDateTime saleDate; + private String postcode; private String address; @@ -47,10 +51,12 @@ public class SaleWithBookResponseDto { private Integer totalPrice; + @Builder public SaleWithBookResponseDto(String saleTitle, Long saleId, String saleNumber, String memberEmail, String saleOrderName, String saleOrderContact, String saleReceiverName, String saleReceiverContact, Integer deliveryFee, LocalDate saleDeliveryDate, - String postcode, String address, Integer pointUsage, Integer totalPrice) { + LocalDateTime saleDate, String postcode, String address, Integer pointUsage, + Integer totalPrice) { this.saleTitle = saleTitle; this.saleId = saleId; this.saleNumber = saleNumber; @@ -61,6 +67,7 @@ public SaleWithBookResponseDto(String saleTitle, Long saleId, String saleNumber, this.saleReceiverContact = saleReceiverContact; this.deliveryFee = deliveryFee; this.saleDeliveryDate = saleDeliveryDate; + this.saleDate = saleDate; this.postcode = postcode; this.address = address; this.pointUsage = pointUsage; @@ -73,6 +80,6 @@ public void addBookSale(BookSaleResponseDto bookSale) { public SaleInfoResponseDto extractSaleInfoResponseDto() { return new SaleInfoResponseDto(saleTitle, saleNumber, memberEmail, saleOrdererName, saleOrdererContact, - totalPrice); + totalPrice, saleDate); } } diff --git a/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java b/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java new file mode 100644 index 00000000..722d8af2 --- /dev/null +++ b/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java @@ -0,0 +1,14 @@ +package store.ckin.api.sale.exception; + +/** + * {class name}. + * + * @author 정승조 + * @version 2024. 03. 14. + */ +public class SaleOrdererContactNotMatchException extends RuntimeException { + + public SaleOrdererContactNotMatchException(String saleNumber, String ordererContact) { + super(String.format("주문 번호 (%s)의 주문자 연락처 (%s)가 일치하지 않습니다.", saleNumber, ordererContact)); + } +} diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index e53a5c8f..2b0da492 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -18,6 +18,7 @@ import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; +import store.ckin.api.sale.exception.SaleOrdererContactNotMatchException; import store.ckin.api.sale.service.SaleService; /** @@ -127,12 +128,18 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { /** * 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. * - * @param saleNumber 주문 번호 (UUID) + * @param saleNumber 주문 번호 (UUID) + * @param ordererContact 주문자 연락처 * @return 주문 상세 정보 DTO */ - public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber) { + public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, String ordererContact) { SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); + + if (!ordererContact.equals(saleDetail.getSaleOrdererContact())) { + throw new SaleOrdererContactNotMatchException(saleNumber, ordererContact); + } + List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); return new SaleDetailResponseDto(bookSale, saleDetail, payment); diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java index 42ae5d1b..e8ca1a67 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java @@ -46,6 +46,7 @@ public SaleResponseDto findBySaleId(Long saleId) { .on(sale.member.eq(member)) .select(Projections.constructor(SaleResponseDto.class, sale.saleId, + sale.saleTitle, sale.member.email, sale.saleNumber, sale.saleOrdererName, @@ -109,6 +110,7 @@ public SaleWithBookResponseDto getSaleWithBook(String saleNumber) { sale.saleReceiverContact, sale.saleDeliveryFee, sale.saleDeliveryDate, + sale.saleDate, sale.saleShippingPostCode, sale.saleReceiverAddress, sale.salePointUsage, @@ -141,6 +143,7 @@ public SaleResponseDto findBySaleNumber(String saleNumber) { .on(sale.member.eq(member)) .select(Projections.constructor(SaleResponseDto.class, sale.saleId, + sale.saleTitle, sale.member.email, sale.saleNumber, sale.saleOrdererName, @@ -174,7 +177,8 @@ public PagedResponse> findAllByMemberId(Long memberId, sale.member.email, sale.saleOrdererName, sale.saleOrdererContact, - sale.saleTotalPrice)) + sale.saleTotalPrice, + sale.saleDate)) .orderBy(sale.saleId.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) From 2b4572432e277f139cfeef78d29b27dca832faf6 Mon Sep 17 00:00:00 2001 From: gaeun Date: Thu, 14 Mar 2024 21:37:51 +0900 Subject: [PATCH 026/161] =?UTF-8?q?[REFACTOR]=20=EC=BF=A0=ED=8F=B0=20?= =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EB=B3=80=EA=B2=BD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/impl/BookRepositoryImpl.java | 1 - .../controller/DeliveryPolicyController.java | 14 ++++---------- .../DeliveryPolicyCreateRequestDto.java | 4 ++-- .../DeliveryPolicyUpdateRequestDto.java | 4 ++-- .../deliverypolicy/entity/DeliveryPolicy.java | 9 ++------- .../DeliveryPolicyRepositoryCustom.java | 6 +++--- .../DeliveryPolicyRepositoryImpl.java | 7 +++---- .../service/DeliveryPolicyService.java | 4 ++-- .../impl/DeliveryPolicyServiceImpl.java | 4 ++-- .../dto/response/TokenResponse.java | 4 ++-- .../service/ObjectStorageService.java | 4 ++-- .../service/impl/ObjectStorageServiceImpl.java | 18 +++++++----------- .../controller/PointPolicyController.java | 15 ++++----------- .../PointPolicyRepositoryCustom.java | 6 +++--- .../repository/PointPolicyRepositoryImpl.java | 7 +++---- .../service/PointPolicyService.java | 4 ++-- .../review/service/impl/ReviewServiceImpl.java | 2 +- 17 files changed, 44 insertions(+), 69 deletions(-) diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index 71e3c846..2f1a6063 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -116,7 +116,6 @@ public Page findByBookTitleContaining(String bookTitle, Pag .fetch(); - Long total = Optional.ofNullable(queryFactory .select(book.count()) .from(book) diff --git a/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java b/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java index f5bb4f5d..b255d934 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java +++ b/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java @@ -1,23 +1,17 @@ package store.ckin.api.deliverypolicy.controller; -import java.util.List; -import javax.validation.Valid; - import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyCreateRequestDto; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyUpdateRequestDto; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.service.DeliveryPolicyService; +import javax.validation.Valid; +import java.util.List; + /** * 배송비 정책 Controller. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java index 55bea2c0..25a33379 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java @@ -1,10 +1,10 @@ package store.ckin.api.deliverypolicy.dto.request; +import lombok.Getter; + import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; -import lombok.Getter; - /** * 배송비 정책 생성 요청 DTO. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java index 22b30875..b6dcd485 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java @@ -1,10 +1,10 @@ package store.ckin.api.deliverypolicy.dto.request; +import lombok.Getter; + import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; -import lombok.Getter; - /** * 배송비 정책 수정 요청 DTO. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java b/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java index ab0fb211..7f57c6d9 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java +++ b/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java @@ -1,17 +1,12 @@ package store.ckin.api.deliverypolicy.entity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.persistence.*; + /** * 배송비 정책 Entity. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java index c58d4a3e..460495ba 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java +++ b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java @@ -1,12 +1,12 @@ package store.ckin.api.deliverypolicy.repository; -import java.util.List; -import java.util.Optional; - import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.entity.DeliveryPolicy; +import java.util.List; +import java.util.Optional; + /** * 배송비 정책 Repository Querydsl 사용할 메서드가 있는 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java index 260ce94d..254bfa8e 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java +++ b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java @@ -1,15 +1,14 @@ package store.ckin.api.deliverypolicy.repository; import com.querydsl.core.types.Projections; - -import java.util.List; -import java.util.Optional; - import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.entity.DeliveryPolicy; import store.ckin.api.deliverypolicy.entity.QDeliveryPolicy; +import java.util.List; +import java.util.Optional; + /** * 배송비 정책 Repository Querydsl 사용을 위한 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java b/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java index cab06469..74bde112 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java +++ b/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java @@ -1,11 +1,11 @@ package store.ckin.api.deliverypolicy.service; -import java.util.List; - import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyCreateRequestDto; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyUpdateRequestDto; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; +import java.util.List; + /** * 배송비 정책을 관리하는 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java b/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java index 3f580efa..ffecf87b 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java +++ b/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java @@ -1,7 +1,5 @@ package store.ckin.api.deliverypolicy.service.impl; -import java.util.List; - import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,6 +12,8 @@ import store.ckin.api.deliverypolicy.repository.DeliveryPolicyRepository; import store.ckin.api.deliverypolicy.service.DeliveryPolicyService; +import java.util.List; + /** * 배송비 정책을 관리하는 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java b/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java index 47cb8140..34d858d3 100644 --- a/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java +++ b/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java @@ -1,10 +1,10 @@ package store.ckin.api.objectstorage.dto.response; -import java.time.LocalDateTime; - import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + /** * {class name}. * diff --git a/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java b/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java index 3fb5e863..ca292fe9 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java +++ b/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java @@ -1,10 +1,10 @@ package store.ckin.api.objectstorage.service; -import java.io.IOException; - import org.springframework.web.multipart.MultipartFile; import store.ckin.api.file.entity.File; +import java.io.IOException; + /** * ObjectStorageService 인터페이스. * diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index daf13ab8..8d4bfd44 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -1,15 +1,5 @@ package store.ckin.api.objectstorage.service.impl; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.http.fileupload.IOUtils; @@ -31,6 +21,12 @@ import store.ckin.api.objectstorage.service.ObjectStorageService; import store.ckin.api.skm.util.KeyManager; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.*; + /** * ObjectStorageService 구현 클래스. * @@ -67,7 +63,7 @@ public String requestToken() { String identityUrl = keyManager.keyStore(properties.getIdentity()) + "/tokens"; if (Objects.isNull(tokenId) - || expires.minusMinutes(1).isBefore(LocalDateTime.now())) { + || expires.minusMinutes(1).isBefore(LocalDateTime.now())) { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); diff --git a/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java b/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java index 71964d32..a4770f16 100644 --- a/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java +++ b/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java @@ -1,24 +1,17 @@ package store.ckin.api.pointpolicy.controller; -import java.util.List; -import javax.validation.Valid; - import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.pointpolicy.dto.request.PointPolicyCreateRequestDto; import store.ckin.api.pointpolicy.dto.request.PointPolicyUpdateRequestDto; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; import store.ckin.api.pointpolicy.service.PointPolicyService; +import javax.validation.Valid; +import java.util.List; + /** * 포인트 정책 컨트롤러입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java index 92dc0e36..8137e440 100644 --- a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java +++ b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java @@ -1,11 +1,11 @@ package store.ckin.api.pointpolicy.repository; -import java.util.List; -import java.util.Optional; - import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; +import java.util.List; +import java.util.Optional; + /** * 포인트 정책 Repository Querydsl 사용할 메서드가 있는 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java index 6cd78fe1..84a6dbcd 100644 --- a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java +++ b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java @@ -1,15 +1,14 @@ package store.ckin.api.pointpolicy.repository; import com.querydsl.core.types.Projections; - -import java.util.List; -import java.util.Optional; - import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; import store.ckin.api.pointpolicy.entity.PointPolicy; import store.ckin.api.pointpolicy.entity.QPointPolicy; +import java.util.List; +import java.util.Optional; + /** * 포인트 정책 Repository Querydsl 사용을 위한 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java b/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java index 7d929358..4a598ed1 100644 --- a/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java +++ b/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java @@ -1,11 +1,11 @@ package store.ckin.api.pointpolicy.service; -import java.util.List; - import store.ckin.api.pointpolicy.dto.request.PointPolicyCreateRequestDto; import store.ckin.api.pointpolicy.dto.request.PointPolicyUpdateRequestDto; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; +import java.util.List; + /** * 포인트 정책을 관리하는 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index 5f91ba54..6a285e06 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -69,7 +69,7 @@ public void postReview(ReviewCreateRequestDto createRequestDto, List Date: Thu, 14 Mar 2024 21:42:54 +0900 Subject: [PATCH 027/161] =?UTF-8?q?[TEST]=20=EC=A3=BC=EB=AC=B8=20-=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=A1=B0=ED=9A=8C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=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 --- .../service/impl/BookSaleServiceImplTest.java | 37 +++++ .../api/payment/facade/PaymentFacadeTest.java | 2 + .../sale/controller/SaleControllerTest.java | 140 +++++++++++++++++- .../ckin/api/sale/facade/SaleFacadeTest.java | 78 ++++++++++ .../sale/repository/SaleRepositoryTest.java | 54 +++++++ .../service/impl/SaleServiceImplTest.java | 39 ++++- 6 files changed, 348 insertions(+), 2 deletions(-) diff --git a/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java b/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java index 8151728a..a3cb72dd 100644 --- a/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java @@ -1,5 +1,6 @@ package store.ckin.api.booksale.service.impl; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; @@ -22,6 +23,7 @@ import store.ckin.api.book.exception.BookNotFoundException; import store.ckin.api.book.repository.BookRepository; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; +import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.repository.BookSaleRepository; import store.ckin.api.packaging.dto.response.PackagingResponseDto; @@ -212,4 +214,39 @@ void testUpdateBookSaleState() { assertEquals(BookSale.BookSaleState.COMPLETE, firstBookSale.getBookSaleState()); assertEquals(BookSale.BookSaleState.COMPLETE, secondBookSale.getBookSaleState()); } + + @Test + @DisplayName("주문 ID로 주문 도서 상세 정보 조회 테스트") + void testGetBookSaleDetail() { + + BookAndBookSaleResponseDto responseDto = + new BookAndBookSaleResponseDto( + 1L, + "test.com", + "테스트 책", + 3, + 1L, + "A포장", + 3000, + 15000 + ); + + List responseDtoList = List.of(responseDto); + + given(bookSaleRepository.getBookSaleDetailBySaleId(anyLong())) + .willReturn(responseDtoList); + + List bookSaleDetail = bookSaleService.getBookSaleDetail(1L); + + assertAll( + () -> assertEquals(responseDto.getBookId(), bookSaleDetail.get(0).getBookId()), + () -> assertEquals(responseDto.getFileUrl(), bookSaleDetail.get(0).getFileUrl()), + () -> assertEquals(responseDto.getBookTitle(), bookSaleDetail.get(0).getBookTitle()), + () -> assertEquals(responseDto.getQuantity(), bookSaleDetail.get(0).getQuantity()), + () -> assertEquals(responseDto.getCouponId(), bookSaleDetail.get(0).getCouponId()), + () -> assertEquals(responseDto.getPackagingType(), bookSaleDetail.get(0).getPackagingType()), + () -> assertEquals(responseDto.getPackagingPrice(), bookSaleDetail.get(0).getPackagingPrice()), + () -> assertEquals(responseDto.getPaymentAmount(), bookSaleDetail.get(0).getPaymentAmount()) + ); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java index c99b3bb2..399c31c1 100644 --- a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java +++ b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java @@ -94,6 +94,7 @@ void testCreatePayment_AmountNotCorrectException() { SaleResponseDto saleResponseDto = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -131,6 +132,7 @@ void testCreatePayment() { SaleResponseDto saleResponseDto = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index 991164aa..2ad2d78f 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -97,6 +97,7 @@ void testGetSales() throws Exception { SaleResponseDto responseDto = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -156,6 +157,7 @@ void testGetSaleDetail() throws Exception { SaleResponseDto sale = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -269,6 +271,7 @@ void testGetSaleWithBooks() throws Exception { "01011112222", 3000, LocalDate.of(2024, 3, 7).plusDays(1), + LocalDateTime.of(2024, 3, 7, 12, 0), "12345", "광주광역시 동구 조선대 5길", 0, @@ -311,7 +314,8 @@ void testGetSalePaymentInfo() throws Exception { "test@test.com", "Tester", "01012341234", - 45000 + 45000, + LocalDateTime.of(2024, 3, 7, 12, 0) ); given(saleFacade.getSalePaymentInfo(anyString())) @@ -331,4 +335,138 @@ void testGetSalePaymentInfo() throws Exception { verify(saleFacade, times(1)).getSalePaymentInfo(anyString()); } + + @Test + @DisplayName("비회원 주문 상세 정보를 조회 테스트") + void testGetSaleDetailBySaleNumber() throws Exception { + + BookAndBookSaleResponseDto bookSale = + new BookAndBookSaleResponseDto( + 1L, + "test-img.com", + "홍길동전", + 5, + 3L, + "A 포장", + 1000, + 50000); + + + SaleResponseDto sale = + new SaleResponseDto( + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.of(2024, 3, 7, 12, 0, 0), + LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 10000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + + PaymentResponseDto payment = new PaymentResponseDto( + 1L, + 1L, + "1232321", + "1234", + LocalDateTime.now(), + LocalDateTime.now().plusHours(1), + "test.com"); + + + SaleDetailResponseDto responseDto = + new SaleDetailResponseDto(List.of(bookSale), sale, payment); + + given(saleFacade.getSaleDetailBySaleNumber(anyString(), anyString())) + .willReturn(responseDto); + + mockMvc.perform(get("/api/sales/guest") + .param("saleNumber", "12abc23") + .param("ordererContact", "01012341234")) + .andExpectAll( + status().isOk(), + content().contentType(MediaType.APPLICATION_JSON), + jsonPath("$.bookSaleList[0].bookId").value(bookSale.getBookId()), + jsonPath("$.bookSaleList[0].fileUrl").value(bookSale.getFileUrl()), + jsonPath("$.bookSaleList[0].bookTitle").value(bookSale.getBookTitle()), + jsonPath("$.bookSaleList[0].quantity").value(bookSale.getQuantity()), + jsonPath("$.bookSaleList[0].couponId").value(bookSale.getCouponId()), + jsonPath("$.bookSaleList[0].packagingType").value(bookSale.getPackagingType()), + jsonPath("$.bookSaleList[0].packagingPrice").value(bookSale.getPackagingPrice()), + jsonPath("$.bookSaleList[0].paymentAmount").value(bookSale.getPaymentAmount()), + jsonPath("$.saleResponseDto.saleId").value(sale.getSaleId()), + jsonPath("$.saleResponseDto.memberEmail").value(sale.getMemberEmail()), + jsonPath("$.saleResponseDto.saleNumber").value(sale.getSaleNumber()), + jsonPath("$.saleResponseDto.saleOrdererName").value(sale.getSaleOrdererName()), + jsonPath("$.saleResponseDto.saleOrdererContact").value(sale.getSaleOrdererContact()), + jsonPath("$.saleResponseDto.saleReceiverName").value(sale.getSaleReceiverName()), + jsonPath("$.saleResponseDto.saleReceiverContact").value(sale.getSaleReceiverContact()), + jsonPath("$.saleResponseDto.saleReceiverAddress").value(sale.getSaleReceiverAddress()), + jsonPath("$.saleResponseDto.saleDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleShippingDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleDeliveryDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleDeliveryStatus").value(sale.getSaleDeliveryStatus().name()), + jsonPath("$.saleResponseDto.saleDeliveryFee").value(sale.getSaleDeliveryFee()), + jsonPath("$.saleResponseDto.salePointUsage").value(sale.getSalePointUsage()), + jsonPath("$.saleResponseDto.saleTotalPrice").value(sale.getSaleTotalPrice()), + jsonPath("$.saleResponseDto.salePaymentStatus").value(sale.getSalePaymentStatus().name()), + jsonPath("$.saleResponseDto.saleShippingPostCode").value(sale.getSaleShippingPostCode()), + jsonPath("$.paymentResponseDto.paymentId").value(payment.getPaymentId()), + jsonPath("$.paymentResponseDto.saleId").value(payment.getSaleId()), + jsonPath("$.paymentResponseDto.paymentKey").value(payment.getPaymentKey()), + jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus()), + jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(), + jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), + jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) + ); + } + + @Test + @DisplayName("회원 ID로 회원의 모든 주문 리스트 조회") + void testGetSalesByMemberId() throws Exception { + SaleInfoResponseDto saleInfo + = new SaleInfoResponseDto("홍길동전 외 3권", + "123aqbc4", + "test@test.com", + "Tester", + "010123211234", + 45000, + LocalDateTime.of(2024, 3, 7, 12, 0)); + + PageInfo pageInfo = PageInfo.builder() + .page(1) + .size(10) + .build(); + + PagedResponse> pagedResponse = new PagedResponse<>(List.of(saleInfo), pageInfo); + + given(saleFacade.getSalesByMemberId(anyLong(), any())) + .willReturn(pagedResponse); + + mockMvc.perform(get("/api/sales/member/{memberId}", 1L)) + .andExpectAll( + status().isOk(), + content().contentType(MediaType.APPLICATION_JSON), + jsonPath("$.data[0].saleTitle").value(saleInfo.getSaleTitle()), + jsonPath("$.data[0].saleNumber").value(saleInfo.getSaleNumber()), + jsonPath("$.data[0].memberEmail").value(saleInfo.getMemberEmail()), + jsonPath("$.data[0].saleOrdererName").value(saleInfo.getSaleOrdererName()), + jsonPath("$.data[0].saleOrdererContact").value(saleInfo.getSaleOrdererContact()), + jsonPath("$.data[0].totalPrice").value(saleInfo.getTotalPrice()), + jsonPath("$.data[0].saleDate").isNotEmpty(), + jsonPath("$.pageInfo.page").value(pageInfo.getPage()), + jsonPath("$.pageInfo.size").value(pageInfo.getSize()) + ); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index 0bf74e94..702ef42d 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; @@ -33,6 +34,7 @@ import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.exception.SaleOrdererContactNotMatchException; import store.ckin.api.sale.service.SaleService; /** @@ -106,6 +108,7 @@ void testCreateSale() { SaleResponseDto sale = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -167,6 +170,7 @@ void testGetSaleDetail() { SaleResponseDto sale = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -238,6 +242,7 @@ void testGetSaleWithBookResponse() { "01011112222", 3000, LocalDate.of(2024, 3, 7).plusDays(1), + LocalDateTime.of(2024, 3, 7, 12, 0), "12345", "광주광역시 동구 조선대 5길", 0, @@ -263,4 +268,77 @@ void testGetSalePaymentInfo() { verify(saleService, times(1)).getSalePaymentInfo("123456"); } + + @Test + @DisplayName("주문 번호로 주문 상세 조회 테스트 - 실패 (주문자 전화번호와 넘겨받은 전화번호가 다른 경우)") + void testGetSaleDetailBySaleNumber_Fail_Contact_Different() { + + SaleResponseDto sale = + new SaleResponseDto( + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.of(2024, 3, 7, 12, 0, 0), + LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 10000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleBySaleNumber(anyString())) + .willReturn(sale); + + assertThrows(SaleOrdererContactNotMatchException.class, + () -> saleFacade.getSaleDetailBySaleNumber("1234", "010111111111")); + } + + @Test + @DisplayName("주문 번호로 주문 상세 조회 테스트 - 성공") + void testGetSaleDetailBySaleNumber_Success() { + SaleResponseDto sale = + new SaleResponseDto( + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.of(2024, 3, 7, 12, 0, 0), + LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 10000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleBySaleNumber(anyString())) + .willReturn(sale); + + SaleDetailResponseDto actual = saleFacade.getSaleDetailBySaleNumber("1234", "01012345678"); + + assertEquals(sale, actual.getSaleResponseDto()); + } + + @Test + @DisplayName("회원 ID로 회원의 모든 주문 내역 조회") + void testGetSalesByMemberId() { + saleFacade.getSalesByMemberId(1L, Pageable.ofSize(10)); + verify(saleService, times(1)).getSalesByMemberId(1L, Pageable.ofSize(10)); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java index 976a688e..3b58ad88 100644 --- a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java +++ b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java @@ -15,10 +15,14 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import store.ckin.api.book.entity.Book; import store.ckin.api.booksale.entity.BookSale; +import store.ckin.api.common.domain.PageInfo; +import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.grade.entity.Grade; import store.ckin.api.member.entity.Member; +import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.entity.Sale; @@ -345,4 +349,54 @@ void testFindBySaleNumber() { () -> assertEquals(actual.getSaleShippingPostCode(), savedSale.getSaleShippingPostCode()) ); } + + @Test + @DisplayName("회원 ID로 회원의 주문 조회 테스트") + void testFindAllByMemberId() { + + Sale sale = Sale.builder() + .member(member) + .saleNumber(saleNumber) + .saleTitle("테스트 책") + .saleOrdererName("정승조") + .saleOrdererContact("01012341234") + .saleReceiverName("정승조") + .saleReceiverContact("01012341234") + .saleReceiverAddress("광주광역시 동구 조선대 5길 IT 융합대학") + .saleDate(LocalDateTime.now()) + .saleShippingDate(LocalDateTime.now()) + .saleDeliveryDate(LocalDate.now().plusDays(2)) + .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryFee(3000) + .salePointUsage(1000) + .salePaymentStatus(Sale.PaymentStatus.WAITING) + .saleShippingPostCode("123456") + .build(); + + entityManager.persist(sale); + + entityManager.flush(); + + PagedResponse> pagedResponse = + saleRepository.findAllByMemberId(member.getId(), Pageable.ofSize(10)); + + SaleInfoResponseDto actual = pagedResponse.getData().get(0); + PageInfo pageInfo = pagedResponse.getPageInfo(); + + assertAll( + () -> assertEquals(sale.getSaleTitle(), actual.getSaleTitle()), + () -> assertEquals(sale.getSaleNumber(), actual.getSaleNumber()), + () -> assertEquals(sale.getMember().getEmail(), actual.getMemberEmail()), + () -> assertEquals(sale.getSaleOrdererName(), actual.getSaleOrdererName()), + () -> assertEquals(sale.getSaleOrdererContact(), actual.getSaleOrdererContact()), + () -> assertEquals(sale.getSaleTotalPrice(), actual.getTotalPrice()), + () -> assertEquals(sale.getSaleDate(), actual.getSaleDate()), + () -> assertEquals(0, pageInfo.getPage()), + () -> assertEquals(10, pageInfo.getSize()), + () -> assertEquals(1, pageInfo.getTotalElements()), + () -> assertEquals(1, pageInfo.getTotalPages()) + ); + + + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java index 58eadf22..d116fcb8 100644 --- a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java @@ -25,6 +25,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import store.ckin.api.common.domain.PageInfo; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.grade.entity.Grade; import store.ckin.api.member.entity.Member; @@ -265,7 +266,8 @@ void testGetSaleWithBook_Success() { "Tester", "01011112222", 3000, - LocalDate.now().plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(1), + LocalDateTime.of(2024, 3, 7, 12, 0), "12345", "광주광역시 동구 조선대 5길", 0, @@ -328,6 +330,7 @@ void testGetSalePaymentInfo_Success() { "01011112222", 3000, LocalDate.now().plusDays(1), + LocalDateTime.now(), "12345", "광주광역시 동구 조선대 5길", 0, @@ -394,6 +397,40 @@ void testGetSaleDetailBySaleNumber_Success() { () -> assertEquals(saleDetail.getSaleShippingPostCode(), sale.getSaleShippingPostCode()) ); + verify(saleRepository, times(1)).existsBySaleNumber(anyString()); } + @Test + @DisplayName("회원 ID로 주문 조회 테스트") + void testGetSalesByMemberId() { + + SaleInfoResponseDto saleInfo + = new SaleInfoResponseDto("홍길동전 외 3권", + "123aqbc4", + "test@test.com", + "Tester", + "010123211234", + 45000, + LocalDateTime.of(2024, 3, 7, 12, 0)); + + + PageInfo pageInfo = new PageInfo(1, 10, 45, 5); + PagedResponse> sales = new PagedResponse<>(List.of(saleInfo), pageInfo); + + given(saleRepository.findAllByMemberId(anyLong(), any())) + .willReturn(sales); + + PagedResponse> responseDto = + saleService.getSalesByMemberId(1L, Pageable.ofSize(10)); + + + + assertAll( + () -> assertNotNull(responseDto), + () -> assertEquals(responseDto.getData().get(0), saleInfo), + () -> assertEquals(sales.getPageInfo(), pageInfo) + ); + + verify(saleRepository, times(1)).findAllByMemberId(anyLong(), any()); + } } \ No newline at end of file From 8cd622018f3b93c74c942087cd263619199352ca Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 14 Mar 2024 21:43:15 +0900 Subject: [PATCH 028/161] =?UTF-8?q?[COMMENT]=20Javadoc=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/sale/facade/SaleFacade.java | 2 ++ .../ckin/api/sale/repository/SaleRepositoryImpl.java | 7 +++++++ .../store/ckin/api/sale/service/impl/SaleServiceImpl.java | 8 +++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 2b0da492..785ef168 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -132,6 +132,7 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { * @param ordererContact 주문자 연락처 * @return 주문 상세 정보 DTO */ + @Transactional(readOnly = true) public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, String ordererContact) { SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); @@ -152,6 +153,7 @@ public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, String * @param pageable 페이지 정보 * @return 페이징 처리된 주문 응답 DTO 리스트 */ + @Transactional(readOnly = true) public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { return saleService.getSalesByMemberId(memberId, pageable); } diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java index e8ca1a67..ca7b174f 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java @@ -164,6 +164,13 @@ public SaleResponseDto findBySaleNumber(String saleNumber) { } + /** + * {@inheritDoc} + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 주문 응답 DTO 리스트 + */ @Override public PagedResponse> findAllByMemberId(Long memberId, Pageable pageable) { diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index 9e0aab36..7469aec1 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -59,7 +59,6 @@ public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) { } - String saleNumber = UUID.randomUUID().toString().replace("-", "").substring(0, 20); Sale sale = Sale.builder() .member(member.orElse(null)) @@ -196,6 +195,13 @@ public SaleResponseDto getSaleBySaleNumber(String saleNumber) { return responseDto; } + /** + * {@inheritDoc} + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 페이징 처리된 주문 응답 DTO 리스트 + */ @Transactional(readOnly = true) @Override public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { From 35cf12addaca42e537540c416f6518f2629d91f7 Mon Sep 17 00:00:00 2001 From: gaeun Date: Fri, 15 Mar 2024 00:27:40 +0900 Subject: [PATCH 029/161] =?UTF-8?q?[REFACTOR]=20=EC=BF=A0=ED=8F=B0=20?= =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EB=B3=80=EA=B2=BD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/category/controller/CategoryController.java | 13 +++++++++++++ .../ckin/api/category/service/CategoryService.java | 7 +++++++ .../category/service/impl/CategoryServiceImpl.java | 13 +++++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/main/java/store/ckin/api/category/controller/CategoryController.java b/src/main/java/store/ckin/api/category/controller/CategoryController.java index e5f6ed8f..ca50d0ce 100644 --- a/src/main/java/store/ckin/api/category/controller/CategoryController.java +++ b/src/main/java/store/ckin/api/category/controller/CategoryController.java @@ -89,4 +89,17 @@ public ResponseEntity deleteCategory(@PathVariable Long categoryId) { categoryService.deleteCategory(categoryId); return ResponseEntity.ok().build(); } + + /** + * 카테고리 이름을 가져옵니다. + * + * @param categoryId + * @return 카테고리 이름 + */ + @GetMapping("/get/{categoryId}") + public ResponseEntity getCategoryName(@PathVariable("categoryId") Long categoryId) { + String categoryName = categoryService.getCategoryName(categoryId); + + return ResponseEntity.ok().body(categoryName); + } } diff --git a/src/main/java/store/ckin/api/category/service/CategoryService.java b/src/main/java/store/ckin/api/category/service/CategoryService.java index 75f9a944..4f24747b 100644 --- a/src/main/java/store/ckin/api/category/service/CategoryService.java +++ b/src/main/java/store/ckin/api/category/service/CategoryService.java @@ -55,4 +55,11 @@ public interface CategoryService { */ void deleteCategory(Long categoryId); + /** + * 카테고리 이름을 가져옵니다. + * + * @param categoryId 카테고리 아이디 + * @return 카테고리 이름 + */ + String getCategoryName(Long categoryId); } diff --git a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java index 35731da8..6da81dbd 100644 --- a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java +++ b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java @@ -109,6 +109,19 @@ public void deleteCategory(Long categoryId) { categoryRepository.deleteById(categoryId); } + /** + * {@inheritDoc} + */ + @Override + public String getCategoryName(Long categoryId) { + + Category category = categoryRepository.findById(categoryId) + .orElseThrow(() -> new CategoryNotFoundException(categoryId)); + + return category.getCategoryName(); + + } + } From bb7d8b4c5f94bf5d06e0f0992614ee6747fe564c Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 15 Mar 2024 01:15:19 +0900 Subject: [PATCH 030/161] =?UTF-8?q?[FEAT]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20-=20=ED=9A=8C=EC=9B=90,=20=EB=B9=84?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=A3=BC=EB=AC=B8=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/sale/controller/SaleController.java | 13 +++++++++++-- .../exception/SaleMemberNotMatchException.java | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index c32bbf1b..f75b082b 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -115,10 +115,19 @@ public ResponseEntity getSalePaymentInfo(@PathVariable("sal * @return 200 (OK), 주문 상세 정보 */ @GetMapping("/guest") - public ResponseEntity getSaleDetailBySaleNumber( + public ResponseEntity getGuestSaleDetailBySaleNumber( @RequestParam("saleNumber") String saleNumber, @RequestParam("ordererContact") String ordererContact) { - return ResponseEntity.ok(saleFacade.getSaleDetailBySaleNumber(saleNumber, ordererContact)); + return ResponseEntity.ok(saleFacade.getGuestSaleDetailBySaleNumber(saleNumber, ordererContact)); + } + + @GetMapping("/member") + public ResponseEntity getMemberSaleDetailBySaleNumber( + @RequestParam("saleNumber") String saleNumber, + @RequestParam("memberId") Long memberId) { + + + return ResponseEntity.ok(saleFacade.getMemberSaleDetailBySaleNumber(saleNumber, memberId)); } /** diff --git a/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java b/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java new file mode 100644 index 00000000..4b955625 --- /dev/null +++ b/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java @@ -0,0 +1,14 @@ +package store.ckin.api.sale.exception; + +/** + * 주문자 정보와 회원 아이디가 일치하지 않을 때 발생하는 예외입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ +public class SaleMemberNotMatchException extends RuntimeException { + + public SaleMemberNotMatchException(String saleNumber) { + super(String.format("주문 번호 (%s)의 주문자 ID와 요청한 회원 ID가 일치하지 않습니다.", saleNumber)); + } +} From 390823bbd97f9729d6d08d60920396edba0d2c39 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 15 Mar 2024 01:15:23 +0900 Subject: [PATCH 031/161] =?UTF-8?q?[FEAT]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20-=20=ED=9A=8C=EC=9B=90,=20=EB=B9=84?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=A3=BC=EB=AC=B8=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/sale/facade/SaleFacade.java | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 785ef168..3975b376 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -1,6 +1,7 @@ package store.ckin.api.sale.facade; import java.util.List; +import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; @@ -10,6 +11,7 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.service.BookSaleService; import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.service.PaymentService; @@ -18,6 +20,7 @@ import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; +import store.ckin.api.sale.exception.SaleMemberNotMatchException; import store.ckin.api.sale.exception.SaleOrdererContactNotMatchException; import store.ckin.api.sale.service.SaleService; @@ -126,14 +129,14 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { } /** - * 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. + * 비회원의 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. * * @param saleNumber 주문 번호 (UUID) * @param ordererContact 주문자 연락처 * @return 주문 상세 정보 DTO */ @Transactional(readOnly = true) - public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, String ordererContact) { + public SaleDetailResponseDto getGuestSaleDetailBySaleNumber(String saleNumber, String ordererContact) { SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); @@ -146,6 +149,58 @@ public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, String return new SaleDetailResponseDto(bookSale, saleDetail, payment); } + /** + * 회원의 주문 번호를 통해 주문 상세 정보를 조회하는 메서드입니다. + * + * @param saleNumber 주문 번호 + * @param memberId 회원 ID + * @return 주문 상세 정보 응답 DTO + */ + @Transactional(readOnly = true) + public SaleDetailResponseDto getMemberSaleDetailBySaleNumber(String saleNumber, Long memberId) { + + SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); + MemberInfoDetailResponseDto memberInfo = memberService.getMemberInfoDetail(memberId); + + if (!Objects.equals(memberInfo.getEmail(), saleDetail.getMemberEmail())) { + throw new SaleMemberNotMatchException(saleNumber); + } + + List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); + PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); + + return new SaleDetailResponseDto(bookSale, saleDetail, payment); + } + + /** + * 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. + * + * @param saleNumber 주문 번호 + * @param memberId 회원 ID + * @param ordererContact 주문자 연락처 + * @return 주문 상세 정보 응답 DTO + */ + @Transactional(readOnly = true) + public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, Long memberId, String ordererContact) { + SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); + + if (memberId != null) { // 회원인 경우 + if (!Objects.equals(memberId, saleDetail.getSaleId())) { + throw new SaleMemberNotMatchException(saleNumber); + } + } else { // 비회원인 경우 + if (!ordererContact.equals(saleDetail.getSaleOrdererContact())) { + throw new SaleOrdererContactNotMatchException(saleNumber, ordererContact); + } + } + + List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); + PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); + + return new SaleDetailResponseDto(bookSale, saleDetail, payment); + } + + /** * 회원 ID를 통해 해당 회원의 모든 주문 내역을 조회하는 메서드입니다. * @@ -157,4 +212,6 @@ public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, String public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { return saleService.getSalesByMemberId(memberId, pageable); } + + } From 4ed6b8e97fa4832faa202bb10ff2829d1b6affe4 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 15 Mar 2024 01:15:39 +0900 Subject: [PATCH 032/161] =?UTF-8?q?[TEST]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=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 --- .../store/ckin/api/sale/controller/SaleControllerTest.java | 2 +- src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index 2ad2d78f..a6951a8f 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -388,7 +388,7 @@ void testGetSaleDetailBySaleNumber() throws Exception { SaleDetailResponseDto responseDto = new SaleDetailResponseDto(List.of(bookSale), sale, payment); - given(saleFacade.getSaleDetailBySaleNumber(anyString(), anyString())) + given(saleFacade.getGuestSaleDetailBySaleNumber(anyString(), anyString())) .willReturn(responseDto); mockMvc.perform(get("/api/sales/guest") diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index 702ef42d..dce9f9ec 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -299,7 +299,7 @@ void testGetSaleDetailBySaleNumber_Fail_Contact_Different() { .willReturn(sale); assertThrows(SaleOrdererContactNotMatchException.class, - () -> saleFacade.getSaleDetailBySaleNumber("1234", "010111111111")); + () -> saleFacade.getGuestSaleDetailBySaleNumber("1234", "010111111111")); } @Test @@ -330,7 +330,7 @@ void testGetSaleDetailBySaleNumber_Success() { given(saleService.getSaleBySaleNumber(anyString())) .willReturn(sale); - SaleDetailResponseDto actual = saleFacade.getSaleDetailBySaleNumber("1234", "01012345678"); + SaleDetailResponseDto actual = saleFacade.getGuestSaleDetailBySaleNumber("1234", "01012345678"); assertEquals(sale, actual.getSaleResponseDto()); } From 02f8c76c28d0ae478c6c1cdc3d2d3ca03e6f21c9 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 15 Mar 2024 03:05:39 +0900 Subject: [PATCH 033/161] =?UTF-8?q?[FEATURE]=20=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A7=88=20=EC=B1=85=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20api?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/book/controller/BookController.java | 24 +++++ .../dto/response/BookMainPageResponseDto.java | 41 ++++++++ .../book/repository/BookRepositoryCustom.java | 5 + .../repository/impl/BookRepositoryImpl.java | 94 +++++++++++++++++-- .../ckin/api/book/service/BookService.java | 12 ++- .../book/service/impl/BookServiceImpl.java | 12 +++ 6 files changed, 179 insertions(+), 9 deletions(-) create mode 100644 src/main/java/store/ckin/api/book/dto/response/BookMainPageResponseDto.java diff --git a/src/main/java/store/ckin/api/book/controller/BookController.java b/src/main/java/store/ckin/api/book/controller/BookController.java index 9d2c0d21..70328244 100644 --- a/src/main/java/store/ckin/api/book/controller/BookController.java +++ b/src/main/java/store/ckin/api/book/controller/BookController.java @@ -13,6 +13,7 @@ import store.ckin.api.book.dto.request.BookModifyRequestDto; import store.ckin.api.book.dto.response.BookExtractionResponseDto; import store.ckin.api.book.dto.response.BookListResponseDto; +import store.ckin.api.book.dto.response.BookMainPageResponseDto; import store.ckin.api.book.dto.response.BookResponseDto; import store.ckin.api.book.service.BookService; import store.ckin.api.objectstorage.service.ObjectStorageService; @@ -189,5 +190,28 @@ public ResponseEntity updateBookThumbnail(@PathVariable Long bookId, return ResponseEntity.ok().build(); } + /** + * 주어진 카테고리 ID에 해당하는 메인 페이지 도서 목록을 반환합니다. + * + * @param categoryId 카테고리 ID + * @param limit 반환할 도서의 수 + * @return 카테고리에 해당하는 도서 목록 + */ + @GetMapping("/category/{categoryId}/main-page") + public ResponseEntity> getMainPageBooksByCategoryId( + @PathVariable Long categoryId, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + + List books = bookService.getMainPageBookListByCategoryId(categoryId, limit); + return ResponseEntity.ok(books); + } + + @GetMapping("/main-page") + public ResponseEntity> getMainPageBooksOrderByBookPublicationDate( + @RequestParam(required = false, defaultValue = "10") Integer limit) { + List books = bookService.getMainPageBookListOrderByBookPublicationDate(limit); + return ResponseEntity.ok(books); + } + } diff --git a/src/main/java/store/ckin/api/book/dto/response/BookMainPageResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookMainPageResponseDto.java new file mode 100644 index 00000000..a3de52b1 --- /dev/null +++ b/src/main/java/store/ckin/api/book/dto/response/BookMainPageResponseDto.java @@ -0,0 +1,41 @@ +package store.ckin.api.book.dto.response; + +import java.util.List; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * {class name}. + * + * @author 나국로 + * @version 2024. 03. 15. + */ +@Getter +@NoArgsConstructor +public class BookMainPageResponseDto { + private Long bookId; + private String bookTitle; + private Integer bookRegularPrice; + private Integer bookDiscountRate; + private Integer bookSalePrice; + private String thumbnail; + private List productCategories; + private List productAuthorNames; + private List productTags; + + @Builder + public BookMainPageResponseDto(Long bookId, String bookTitle, Integer bookRegularPrice, Integer bookDiscountRate, + Integer bookSalePrice, String thumbnail, List productCategories, + List productAuthorNames, List productTags) { + this.bookId = bookId; + this.bookTitle = bookTitle; + this.bookRegularPrice = bookRegularPrice; + this.bookDiscountRate = bookDiscountRate; + this.bookSalePrice = bookSalePrice; + this.thumbnail = thumbnail; + this.productCategories = productCategories; + this.productAuthorNames = productAuthorNames; + this.productTags = productTags; + } +} diff --git a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java index a7a58f70..930bd67b 100644 --- a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java +++ b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java @@ -5,6 +5,7 @@ import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.book.dto.response.BookExtractionResponseDto; import store.ckin.api.book.dto.response.BookListResponseDto; +import store.ckin.api.book.dto.response.BookMainPageResponseDto; import store.ckin.api.book.entity.Book; import java.util.List; @@ -69,4 +70,8 @@ public interface BookRepositoryCustom { * @return 도서 추출 정보 응답 DTO 리스트 */ List getExtractBookListByBookIds(List bookIds); + + List getMainPageResponseDtoByCategoryId(Long categoryId, Integer limit); + + List getMainPageResponseDtoOrderByBookPublicationDate(Integer limit); } diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index 71e3c846..b51b0f28 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -2,6 +2,10 @@ import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import javax.persistence.EntityManager; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -9,6 +13,7 @@ import store.ckin.api.author.entity.QAuthor; import store.ckin.api.book.dto.response.BookExtractionResponseDto; import store.ckin.api.book.dto.response.BookListResponseDto; +import store.ckin.api.book.dto.response.BookMainPageResponseDto; import store.ckin.api.book.entity.Book; import store.ckin.api.book.entity.QBook; import store.ckin.api.book.relationship.bookauthor.entity.QBookAuthor; @@ -20,11 +25,6 @@ import store.ckin.api.file.entity.QFile; import store.ckin.api.tag.entity.QTag; -import javax.persistence.EntityManager; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - /** * BookRepository의 구현클래스. * @@ -116,7 +116,6 @@ public Page findByBookTitleContaining(String bookTitle, Pag .fetch(); - Long total = Optional.ofNullable(queryFactory .select(book.count()) .from(book) @@ -276,6 +275,64 @@ public List getExtractBookListByBookIds(List bo return bookInfoList; } + @Override + public List getMainPageResponseDtoByCategoryId(Long categoryId, Integer limit) { + JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); + + List bookIds = queryFactory + .select(book.bookId) + .from(book) + .join(book.categories, bookCategory) + .where(bookCategory.category.categoryId.eq(categoryId)) + .orderBy(book.bookPublicationDate.desc()) + .limit(limit) + .fetch(); + +// 이후에 해당 ID를 가진 책들을 조회합니다. + List books = queryFactory + .selectFrom(book) + .leftJoin(book.authors, bookAuthor).fetchJoin() + .leftJoin(bookAuthor.author, author).fetchJoin() + .leftJoin(book.categories, bookCategory).fetchJoin() + .leftJoin(bookCategory.category, category).fetchJoin() + .leftJoin(book.thumbnail, file).fetchJoin() + .where(book.bookId.in(bookIds)) + .distinct() + .fetch(); + + return books.stream() + .map(this::convertToBookMainPageResponseDto) + .collect(Collectors.toList()); + } + + @Override + public List getMainPageResponseDtoOrderByBookPublicationDate(Integer limit) { + JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); + + List bookIds = queryFactory + .select(book.bookId) + .from(book) + .orderBy(book.bookPublicationDate.desc()) + .limit(limit) + .fetch(); + +// 이후에 해당 ID를 가진 책들을 조회합니다. + List books = queryFactory + .selectFrom(book) + .leftJoin(book.authors, bookAuthor).fetchJoin() + .leftJoin(bookAuthor.author, author).fetchJoin() + .leftJoin(book.categories, bookCategory).fetchJoin() + .leftJoin(bookCategory.category, category).fetchJoin() + .leftJoin(book.thumbnail, file).fetchJoin() + .where(book.bookId.in(bookIds)) + .distinct() + .fetch(); + + return books.stream() + .map(this::convertToBookMainPageResponseDto) + .collect(Collectors.toList()); + } + private BookListResponseDto convertToBookListResponseDto(Book book) { List authorNames = book.getAuthors().stream() @@ -303,4 +360,29 @@ private BookListResponseDto convertToBookListResponseDto(Book book) { .thumbnail(thumbnailUrl) // 썸네일 URL 추가 .build(); } + private BookMainPageResponseDto convertToBookMainPageResponseDto(Book book) { + List authorNames = book.getAuthors().stream() + .map(bookAuthorElement -> bookAuthorElement.getAuthor().getAuthorName()) + .collect(Collectors.toList()); + List categoryNames = book.getCategories().stream() + .map(bookAuthorElement -> bookAuthorElement.getCategory().getCategoryName()) + .collect(Collectors.toList()); + List tagNames = book.getTags().stream() + .map(bookAuthorElement -> bookAuthorElement.getTag().getTagName()) + .collect(Collectors.toList()); + + String thumbnailUrl = book.getThumbnail() != null ? book.getThumbnail().getFileUrl() : null; + + return BookMainPageResponseDto.builder() + .bookId(book.getBookId()) + .bookTitle(book.getBookTitle()) + .bookRegularPrice(book.getBookRegularPrice()) + .bookDiscountRate(book.getBookDiscountRate()) + .bookSalePrice(book.getBookSalePrice()) + .productCategories(categoryNames) + .productAuthorNames(authorNames) + .productTags(tagNames) + .thumbnail(thumbnailUrl) + .build(); + } } diff --git a/src/main/java/store/ckin/api/book/service/BookService.java b/src/main/java/store/ckin/api/book/service/BookService.java index 877f9f9d..5454847e 100644 --- a/src/main/java/store/ckin/api/book/service/BookService.java +++ b/src/main/java/store/ckin/api/book/service/BookService.java @@ -1,5 +1,7 @@ package store.ckin.api.book.service; +import java.io.IOException; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; @@ -7,11 +9,9 @@ import store.ckin.api.book.dto.request.BookModifyRequestDto; import store.ckin.api.book.dto.response.BookExtractionResponseDto; import store.ckin.api.book.dto.response.BookListResponseDto; +import store.ckin.api.book.dto.response.BookMainPageResponseDto; import store.ckin.api.book.dto.response.BookResponseDto; -import java.io.IOException; -import java.util.List; - /** * BookService 인터페이스. * @@ -104,6 +104,12 @@ public interface BookService { * @throws IOException 파일 처리 중 발생하는 예외 */ void updateBookThumbnail(Long bookId, MultipartFile newThumbnail) throws IOException; + + List getMainPageBookListByCategoryId(Long categoryId, Integer limit); + + List getMainPageBookListOrderByBookPublicationDate(Integer limit); + + } diff --git a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java index d27c1099..364fc90a 100644 --- a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java +++ b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java @@ -13,6 +13,7 @@ import store.ckin.api.book.dto.request.BookModifyRequestDto; import store.ckin.api.book.dto.response.BookExtractionResponseDto; import store.ckin.api.book.dto.response.BookListResponseDto; +import store.ckin.api.book.dto.response.BookMainPageResponseDto; import store.ckin.api.book.dto.response.BookResponseDto; import store.ckin.api.book.entity.Book; import store.ckin.api.book.exception.BookNotFoundException; @@ -206,6 +207,7 @@ public void updateBookThumbnail(Long bookId, MultipartFile file) throws IOExcept fileRepository.save(updateThumbnailFile); } + /** * {@inheritDoc} */ @@ -229,6 +231,16 @@ public List getExtractBookListByBookIds(List bo return bookRepository.getExtractBookListByBookIds(bookIds); } + @Override + public List getMainPageBookListByCategoryId(Long categoryId, Integer limit) { + return bookRepository.getMainPageResponseDtoByCategoryId(categoryId,limit); + } + @Override + public List getMainPageBookListOrderByBookPublicationDate( Integer limit) { + return bookRepository.getMainPageResponseDtoOrderByBookPublicationDate(limit); + } + + /** * {@inheritDoc} */ From 6fc1ab96fe2505e4a04d64be2a7a19aa12d05f1e Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 15 Mar 2024 10:07:27 +0900 Subject: [PATCH 034/161] =?UTF-8?q?[FEATURE]=20BookController=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/store/ckin/api/book/controller/BookController.java | 2 +- .../ckin/api/book/dto/response/BookMainPageResponseDto.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/book/controller/BookController.java b/src/main/java/store/ckin/api/book/controller/BookController.java index 70328244..368de409 100644 --- a/src/main/java/store/ckin/api/book/controller/BookController.java +++ b/src/main/java/store/ckin/api/book/controller/BookController.java @@ -197,7 +197,7 @@ public ResponseEntity updateBookThumbnail(@PathVariable Long bookId, * @param limit 반환할 도서의 수 * @return 카테고리에 해당하는 도서 목록 */ - @GetMapping("/category/{categoryId}/main-page") + @GetMapping("/main-page/category/{categoryId}") public ResponseEntity> getMainPageBooksByCategoryId( @PathVariable Long categoryId, @RequestParam(required = false, defaultValue = "10") Integer limit) { diff --git a/src/main/java/store/ckin/api/book/dto/response/BookMainPageResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookMainPageResponseDto.java index a3de52b1..babbc25b 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookMainPageResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookMainPageResponseDto.java @@ -6,7 +6,7 @@ import lombok.NoArgsConstructor; /** - * {class name}. + * BookMainPageResponseDto. * * @author 나국로 * @version 2024. 03. 15. From 6def4f5a8410bb8c76fca79cbb67b1b5e7af3635 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 15 Mar 2024 10:30:30 +0900 Subject: [PATCH 035/161] =?UTF-8?q?[REMOVE]=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 14 -------------- .../member/domain/MemberPointResponseDto.java | 18 ------------------ .../repository/MemberRepositoryCustom.java | 10 +--------- .../repository/impl/MemberRepositoryImpl.java | 18 ------------------ .../ckin/api/member/service/MemberService.java | 11 +---------- .../member/service/impl/MemberServiceImpl.java | 16 ---------------- 6 files changed, 2 insertions(+), 85 deletions(-) delete mode 100644 src/main/java/store/ckin/api/member/domain/MemberPointResponseDto.java diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 068d59f7..3719ad24 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -17,7 +17,6 @@ import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.service.MemberService; @@ -122,17 +121,4 @@ public ResponseEntity memberNotFoundExceptionHandler(MemberNotFoundExcepti return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } - /** - * 회원의 포인트를 조회하는 메서드 입니다. - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - @GetMapping("/members/{id}/point") - public ResponseEntity getMemberPoint(@PathVariable("id") Long id) { - MemberPointResponseDto responseDto = memberService.getMemberPoint(id); - - log.debug("MemberPointResponseDto = {}", responseDto.getPoint()); - return ResponseEntity.ok(responseDto); - } } diff --git a/src/main/java/store/ckin/api/member/domain/MemberPointResponseDto.java b/src/main/java/store/ckin/api/member/domain/MemberPointResponseDto.java deleted file mode 100644 index 0bca5f97..00000000 --- a/src/main/java/store/ckin/api/member/domain/MemberPointResponseDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package store.ckin.api.member.domain; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 회원의 포인트 응답 DTO 입니다. - * - * @author 정승조 - * @version 2024. 03. 05. - */ - -@Getter -@AllArgsConstructor -public class MemberPointResponseDto { - - private Integer point; -} diff --git a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java index 06dead83..005ca9ea 100644 --- a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java +++ b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java @@ -4,7 +4,6 @@ import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; /** * Member Entity 에 Query dsl 을 적용할 메서드를 기술한 interface 입니다. @@ -19,12 +18,5 @@ public interface MemberRepositoryCustom { MemberInfoDetailResponseDto getMemberInfoDetail(Long id); MemberMyPageResponseDto getMyPageInfo(Long id); - - /** - * 회원 포인트를 조회하는 메서드 입니다. - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - MemberPointResponseDto getMemberPointById(Long id); + } diff --git a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java index 53d9cf22..393ca38c 100644 --- a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java +++ b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java @@ -6,7 +6,6 @@ import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.entity.QMember; import store.ckin.api.member.repository.MemberRepositoryCustom; @@ -70,22 +69,5 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { .groupBy(member.name, grade.name, member.accumulateAmount, member.point) .fetchOne(); } - - /** - * {@inheritDoc} - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - @Override - public MemberPointResponseDto getMemberPointById(Long id) { - - QMember member = QMember.member; - return from(member) - .where(member.id.eq(id)) - .select(Projections.constructor(MemberPointResponseDto.class, - member.point)) - .fetchOne(); - } } diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 08dc9d61..481a104c 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -5,7 +5,6 @@ import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; /** * Member 의 관한 로직을 처리하는 서비스 인터페이스 입니다. @@ -33,18 +32,10 @@ public interface MemberService { MemberMyPageResponseDto getMyPageInfo(Long id); - /** - * 회원의 포인트를 조회하는 메서드 입니다. - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - MemberPointResponseDto getMemberPoint(Long id); - /** * 회원의 포인트를 업데이트하는 메서드 입니다. * - * @param memberId 회원 ID + * @param memberId 회원 ID * @param pointUsage 사용한 포인트 */ void updatePoint(Long memberId, Integer pointUsage); diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 6c580e9a..879622c2 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -12,7 +12,6 @@ import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.exception.MemberNotFoundException; @@ -87,22 +86,7 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { return memberRepository.getMyPageInfo(id); } - - /** - * {@inheritDoc} - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - @Transactional(readOnly = true) - @Override - public MemberPointResponseDto getMemberPoint(Long id) { - if (!memberRepository.existsById(id)) { - throw new MemberNotFoundException(id); - } - return memberRepository.getMemberPointById(id); - } /** * {@inheritDoc} From dd4d9aea97db7fa9a08d154bcf1846729353c8e7 Mon Sep 17 00:00:00 2001 From: gaeun Date: Fri, 15 Mar 2024 12:47:59 +0900 Subject: [PATCH 036/161] =?UTF-8?q?[REFACTOR]=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=AC=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/store/ckin/api/adit/Auditable.java | 9 +++---- .../ckin/api/advice/WebControllerAdvice.java | 5 ++-- .../author/controller/AuthorController.java | 13 +++++++--- .../dto/request/AuthorCreateRequestDto.java | 5 ++-- .../dto/request/AuthorModifyRequestDto.java | 5 ++-- .../store/ckin/api/author/entity/Author.java | 11 +++++--- .../repository/impl/AuthorRepositoryImpl.java | 3 +-- .../api/book/controller/BookController.java | 17 +++++++++---- .../dto/request/BookCreateRequestDto.java | 11 +++++--- .../dto/request/BookModifyRequestDto.java | 11 +++++--- .../response/BookExtractionResponseDto.java | 5 ++-- .../dto/response/BookListResponseDto.java | 5 ++-- .../book/dto/response/BookResponseDto.java | 5 ++-- .../java/store/ckin/api/book/entity/Book.java | 25 ++++++++++++++----- .../bookauthor/entity/BookAuthor.java | 18 ++++++++++--- .../bookcategory/entity/BookCategory.java | 18 ++++++++++--- .../relationship/booktag/entity/BookTag.java | 18 ++++++++++--- .../book/repository/BookRepositoryCustom.java | 5 ++-- .../repository/impl/BookRepositoryImpl.java | 9 +++---- .../ckin/api/book/service/BookService.java | 5 ++-- .../book/service/impl/BookServiceImpl.java | 11 ++++---- .../dto/request/BookSaleCreateRequestDto.java | 5 ++-- .../ckin/api/booksale/entity/BookSale.java | 23 ++++++++++++++--- .../repository/BookSaleRepository.java | 3 +-- .../repository/BookSaleRepositoryCustom.java | 3 +-- .../repository/BookSaleRepositoryImpl.java | 3 +-- .../api/booksale/service/BookSaleService.java | 3 +-- .../service/impl/BookSaleServiceImpl.java | 3 +-- .../controller/CategoryController.java | 14 ++++++++--- .../dto/request/CategoryCreateRequestDto.java | 3 +-- .../dto/request/CategoryUpdateRequestDto.java | 3 +-- .../ckin/api/category/entity/Category.java | 13 +++++++--- .../repository/CategoryRepository.java | 5 ++-- .../api/category/service/CategoryService.java | 3 +-- .../service/impl/CategoryServiceImpl.java | 5 ++-- .../ckin/api/config/DataSourceConfig.java | 3 +-- .../store/ckin/api/config/QuerydslConfig.java | 3 +-- .../DeliveryPolicyCreateRequestDto.java | 3 +-- .../DeliveryPolicyUpdateRequestDto.java | 3 +-- .../deliverypolicy/entity/DeliveryPolicy.java | 8 ++++-- .../impl/DeliveryPolicyServiceImpl.java | 3 +-- .../ApplicationStatusController.java | 3 ++- .../java/store/ckin/api/file/entity/File.java | 11 +++++--- .../api/file/repository/FileRepository.java | 3 +-- .../file/repository/FileRepositoryCustom.java | 3 +-- .../file/repository/FileRepositoryImpl.java | 3 +-- .../store/ckin/api/grade/entity/Grade.java | 13 +++++++--- .../member/controller/MemberController.java | 11 +++++--- .../domain/request/MemberAuthRequestDto.java | 5 ++-- .../request/MemberCreateRequestDto.java | 9 +++---- .../store/ckin/api/member/entity/Member.java | 22 ++++++++++++---- .../service/impl/MemberServiceImpl.java | 3 +-- .../dto/response/TokenResponse.java | 3 +-- .../service/ObjectStorageService.java | 3 +-- .../impl/ObjectStorageServiceImpl.java | 15 ++++++----- .../controller/PackagingController.java | 14 ++++++++--- .../request/PackagingCreateRequestDto.java | 3 +-- .../request/PackagingUpdateRequestDto.java | 3 +-- .../ckin/api/packaging/entity/Packaging.java | 8 ++++-- .../repository/PackagingRepositoryCustom.java | 5 ++-- .../repository/PackagingRepositoryImpl.java | 5 ++-- .../packaging/service/PackagingService.java | 3 +-- .../service/impl/PackagingServiceImpl.java | 3 +-- .../dto/request/PaymentRequestDto.java | 3 +-- .../dto/response/PaymentResponseDto.java | 3 +-- .../response/PaymentSuccessResponseDto.java | 3 +-- .../ckin/api/payment/entity/Payment.java | 13 +++++++--- .../api/payment/facade/PaymentFacade.java | 3 +-- .../controller/PointPolicyController.java | 14 ++++++++--- .../request/PointPolicyCreateRequestDto.java | 7 ++++-- .../request/PointPolicyUpdateRequestDto.java | 3 +-- .../api/pointpolicy/entity/PointPolicy.java | 9 +++---- .../PointPolicyRepositoryCustom.java | 5 ++-- .../repository/PointPolicyRepositoryImpl.java | 5 ++-- .../service/PointPolicyService.java | 3 +-- .../service/impl/PointPolicyServiceImpl.java | 3 +-- .../review/controller/ReviewController.java | 18 ++++++++----- .../dto/response/ReviewResponseDto.java | 3 +-- .../store/ckin/api/review/entity/Review.java | 11 ++++++-- .../repository/impl/ReviewRepositoryImpl.java | 11 ++++---- .../api/review/service/ReviewService.java | 3 +-- .../service/impl/ReviewServiceImpl.java | 7 +++--- .../api/sale/controller/SaleController.java | 13 +++++++--- .../request/SaleCreateNoBookRequestDto.java | 9 +++---- .../dto/request/SaleCreateRequestDto.java | 13 ++++++---- .../dto/response/SaleDetailResponseDto.java | 3 +-- .../sale/dto/response/SaleResponseDto.java | 7 +++--- .../dto/response/SaleWithBookResponseDto.java | 5 ++-- .../java/store/ckin/api/sale/entity/Sale.java | 20 +++++++++++---- .../ckin/api/sale/facade/SaleFacade.java | 3 +-- .../sale/repository/SaleRepositoryImpl.java | 3 +-- .../ckin/api/sale/service/SaleService.java | 3 +-- .../sale/service/impl/SaleServiceImpl.java | 13 +++++----- .../store/ckin/api/skm/util/KeyManager.java | 21 +++++++++------- .../api/tag/controller/TagController.java | 17 +++++++++---- .../tag/dto/request/TagCreateRequestDto.java | 3 +-- .../tag/dto/request/TagDeleteRequestDto.java | 3 +-- .../tag/dto/request/TagUpdateRequestDto.java | 3 +-- .../java/store/ckin/api/tag/entity/Tag.java | 14 ++++++++--- .../ckin/api/tag/service/TagService.java | 3 +-- .../api/tag/service/impl/TagServiceImpl.java | 7 +++--- 101 files changed, 453 insertions(+), 314 deletions(-) diff --git a/src/main/java/store/ckin/api/adit/Auditable.java b/src/main/java/store/ckin/api/adit/Auditable.java index e1c00fe1..12eca415 100644 --- a/src/main/java/store/ckin/api/adit/Auditable.java +++ b/src/main/java/store/ckin/api/adit/Auditable.java @@ -1,13 +1,12 @@ package store.ckin.api.adit; -import lombok.Getter; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - +import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.EntityListeners; import javax.persistence.MappedSuperclass; -import java.time.LocalDateTime; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; /** * 엔티티의 생성 시간을 추적하기 위한 공통 필드 'createdAt'을 포함한 Auditable 추상 클래스입니다. diff --git a/src/main/java/store/ckin/api/advice/WebControllerAdvice.java b/src/main/java/store/ckin/api/advice/WebControllerAdvice.java index 8ba874a0..236ea3d7 100644 --- a/src/main/java/store/ckin/api/advice/WebControllerAdvice.java +++ b/src/main/java/store/ckin/api/advice/WebControllerAdvice.java @@ -1,5 +1,7 @@ package store.ckin.api.advice; +import java.util.List; +import java.util.stream.Collectors; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -8,9 +10,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import store.ckin.api.deliverypolicy.exception.DeliveryPolicyNotActiveException; -import java.util.List; -import java.util.stream.Collectors; - /** * Controller Advice 입니다. * diff --git a/src/main/java/store/ckin/api/author/controller/AuthorController.java b/src/main/java/store/ckin/api/author/controller/AuthorController.java index 168a2bb4..3c806c81 100644 --- a/src/main/java/store/ckin/api/author/controller/AuthorController.java +++ b/src/main/java/store/ckin/api/author/controller/AuthorController.java @@ -1,19 +1,26 @@ package store.ckin.api.author.controller; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.author.dto.request.AuthorCreateRequestDto; import store.ckin.api.author.dto.request.AuthorModifyRequestDto; import store.ckin.api.author.dto.response.AuthorResponseDto; import store.ckin.api.author.service.AuthorService; -import javax.validation.Valid; - /** * AuthorController. * diff --git a/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java b/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java index 338a091d..b1848f30 100644 --- a/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java +++ b/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.author.dto.request; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * AuthorCreateRequestDto. diff --git a/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java b/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java index 770f40cc..e491d1eb 100644 --- a/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java +++ b/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.author.dto.request; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * AuthorModifyRequestDto. diff --git a/src/main/java/store/ckin/api/author/entity/Author.java b/src/main/java/store/ckin/api/author/entity/Author.java index 452ca9e5..0b884d75 100644 --- a/src/main/java/store/ckin/api/author/entity/Author.java +++ b/src/main/java/store/ckin/api/author/entity/Author.java @@ -1,14 +1,19 @@ package store.ckin.api.author.entity; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.book.relationship.bookauthor.entity.BookAuthor; -import javax.persistence.*; -import java.util.Set; - /** * Author 테이블. * diff --git a/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java b/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java index cc643534..0607a961 100644 --- a/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java +++ b/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java @@ -1,6 +1,7 @@ package store.ckin.api.author.repository.impl; import com.querydsl.core.types.Projections; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -10,8 +11,6 @@ import store.ckin.api.author.entity.QAuthor; import store.ckin.api.author.repository.AuthorRepositoryCustom; -import java.util.List; - /** * AuthorRepositoryImpl. * diff --git a/src/main/java/store/ckin/api/book/controller/BookController.java b/src/main/java/store/ckin/api/book/controller/BookController.java index 9d2c0d21..19a000f6 100644 --- a/src/main/java/store/ckin/api/book/controller/BookController.java +++ b/src/main/java/store/ckin/api/book/controller/BookController.java @@ -1,5 +1,8 @@ package store.ckin.api.book.controller; +import java.io.IOException; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -7,7 +10,15 @@ import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.book.dto.request.BookCreateRequestDto; import store.ckin.api.book.dto.request.BookModifyRequestDto; @@ -17,10 +28,6 @@ import store.ckin.api.book.service.BookService; import store.ckin.api.objectstorage.service.ObjectStorageService; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - /** * BookController 클래스입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java b/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java index 517a0d7a..9a3875d7 100644 --- a/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java +++ b/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java @@ -1,13 +1,16 @@ package store.ckin.api.book.dto.request; +import java.time.LocalDate; +import java.util.Set; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.*; -import java.time.LocalDate; -import java.util.Set; - /** * BookCreateRequestDto 클래스. * diff --git a/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java b/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java index ec49f94c..2440eca1 100644 --- a/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java +++ b/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java @@ -1,13 +1,16 @@ package store.ckin.api.book.dto.request; +import java.time.LocalDate; +import java.util.Set; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.*; -import java.time.LocalDate; -import java.util.Set; - /** * BookModifyRequestDto. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java index 107ff695..37a8f84f 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java @@ -1,13 +1,12 @@ package store.ckin.api.book.dto.response; +import java.util.ArrayList; +import java.util.List; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.ArrayList; -import java.util.List; - /** * 도서 추출 정보 응답 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java index 2287cc31..95adc321 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java @@ -1,12 +1,11 @@ package store.ckin.api.book.dto.response; +import java.time.LocalDate; +import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDate; -import java.util.List; - /** * BookListResponseDto 리스트로 받아올 떄 Dto입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java index 949a039d..bfa4a8f4 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java @@ -1,12 +1,11 @@ package store.ckin.api.book.dto.response; +import java.time.LocalDate; +import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDate; -import java.util.List; - /** * BookResponseDto 단일 조회 dto클래스. * diff --git a/src/main/java/store/ckin/api/book/entity/Book.java b/src/main/java/store/ckin/api/book/entity/Book.java index 94f32726..cf029450 100644 --- a/src/main/java/store/ckin/api/book/entity/Book.java +++ b/src/main/java/store/ckin/api/book/entity/Book.java @@ -1,6 +1,24 @@ package store.ckin.api.book.entity; -import lombok.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Set; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import store.ckin.api.book.relationship.bookauthor.entity.BookAuthor; @@ -9,11 +27,6 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.file.entity.File; -import javax.persistence.*; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Set; - /** * Book Entity. * diff --git a/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java b/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java index e24dee11..028f4a9d 100644 --- a/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java +++ b/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java @@ -1,12 +1,22 @@ package store.ckin.api.book.relationship.bookauthor.entity; -import lombok.*; +import java.io.Serializable; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; import store.ckin.api.author.entity.Author; import store.ckin.api.book.entity.Book; -import javax.persistence.*; -import java.io.Serializable; - /** * BookAuthor 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java b/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java index 57342ede..5b015ce3 100644 --- a/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java +++ b/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java @@ -1,12 +1,22 @@ package store.ckin.api.book.relationship.bookcategory.entity; -import lombok.*; +import java.io.Serializable; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; import store.ckin.api.book.entity.Book; import store.ckin.api.category.entity.Category; -import javax.persistence.*; -import java.io.Serializable; - /** * BookCategory 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java b/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java index cb65bd6f..13b0e64d 100644 --- a/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java +++ b/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java @@ -1,12 +1,22 @@ package store.ckin.api.book.relationship.booktag.entity; -import lombok.*; +import java.io.Serializable; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; import store.ckin.api.book.entity.Book; import store.ckin.api.tag.entity.Tag; -import javax.persistence.*; -import java.io.Serializable; - /** * BookTag 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java index a7a58f70..3d0b20e4 100644 --- a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java +++ b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java @@ -1,5 +1,7 @@ package store.ckin.api.book.repository; +import java.util.List; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.NoRepositoryBean; @@ -7,9 +9,6 @@ import store.ckin.api.book.dto.response.BookListResponseDto; import store.ckin.api.book.entity.Book; -import java.util.List; -import java.util.Optional; - /** * BookRepositoryCustom 인터페이스. * diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index 2f1a6063..e36edbfd 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -2,6 +2,10 @@ import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import javax.persistence.EntityManager; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -20,11 +24,6 @@ import store.ckin.api.file.entity.QFile; import store.ckin.api.tag.entity.QTag; -import javax.persistence.EntityManager; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - /** * BookRepository의 구현클래스. * diff --git a/src/main/java/store/ckin/api/book/service/BookService.java b/src/main/java/store/ckin/api/book/service/BookService.java index 877f9f9d..47479350 100644 --- a/src/main/java/store/ckin/api/book/service/BookService.java +++ b/src/main/java/store/ckin/api/book/service/BookService.java @@ -1,5 +1,7 @@ package store.ckin.api.book.service; +import java.io.IOException; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; @@ -9,9 +11,6 @@ import store.ckin.api.book.dto.response.BookListResponseDto; import store.ckin.api.book.dto.response.BookResponseDto; -import java.io.IOException; -import java.util.List; - /** * BookService 인터페이스. * diff --git a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java index d27c1099..9a4ab7c7 100644 --- a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java +++ b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java @@ -1,5 +1,10 @@ package store.ckin.api.book.service.impl; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -31,12 +36,6 @@ import store.ckin.api.tag.exception.TagNotFoundException; import store.ckin.api.tag.repository.TagRepository; -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - /** * BookService 구현클래스. * diff --git a/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java b/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java index 5ffd097f..03c3b53f 100644 --- a/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java +++ b/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.booksale.dto.request; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * 주문 도서 생성 요청 DTO. diff --git a/src/main/java/store/ckin/api/booksale/entity/BookSale.java b/src/main/java/store/ckin/api/booksale/entity/BookSale.java index 6f42e76e..5823154d 100644 --- a/src/main/java/store/ckin/api/booksale/entity/BookSale.java +++ b/src/main/java/store/ckin/api/booksale/entity/BookSale.java @@ -1,12 +1,27 @@ package store.ckin.api.booksale.entity; -import lombok.*; +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; import store.ckin.api.book.entity.Book; import store.ckin.api.sale.entity.Sale; -import javax.persistence.*; -import java.io.Serializable; - /** * 주문 도서 (리스트) Entity. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java index c5c1c11e..b499a217 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java @@ -1,10 +1,9 @@ package store.ckin.api.booksale.repository; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.booksale.entity.BookSale; -import java.util.List; - /** * 주문 도서 (리스트) JPA 레포지토리입니다. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java index 6f5afa7d..f251520a 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java @@ -1,10 +1,9 @@ package store.ckin.api.booksale.repository; +import java.util.List; import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; -import java.util.List; - /** * 도서 주문 리스트 레포지토리 커스텀 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java index 11eed7c1..ebbd0823 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java @@ -1,14 +1,13 @@ package store.ckin.api.booksale.repository; import com.querydsl.core.types.Projections; +import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.entity.QBookSale; import store.ckin.api.file.entity.QFile; -import java.util.List; - /** * 도서 주문 리스트 Querydsl 레포지토리 클래스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/service/BookSaleService.java b/src/main/java/store/ckin/api/booksale/service/BookSaleService.java index afc61edb..ad127f6a 100644 --- a/src/main/java/store/ckin/api/booksale/service/BookSaleService.java +++ b/src/main/java/store/ckin/api/booksale/service/BookSaleService.java @@ -1,11 +1,10 @@ package store.ckin.api.booksale.service; +import java.util.List; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.booksale.entity.BookSale; -import java.util.List; - /** * 주문 도서 (리스트) 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java b/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java index 8855e6db..cb1c6e93 100644 --- a/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java +++ b/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.booksale.service.impl; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,8 +18,6 @@ import store.ckin.api.sale.exception.SaleNotFoundException; import store.ckin.api.sale.repository.SaleRepository; -import java.util.List; - /** * 주문 도서 (리스트) 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/category/controller/CategoryController.java b/src/main/java/store/ckin/api/category/controller/CategoryController.java index ca50d0ce..afd1f088 100644 --- a/src/main/java/store/ckin/api/category/controller/CategoryController.java +++ b/src/main/java/store/ckin/api/category/controller/CategoryController.java @@ -1,17 +1,23 @@ package store.ckin.api.category.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; import store.ckin.api.category.dto.response.CategoryResponseDto; import store.ckin.api.category.service.CategoryService; -import javax.validation.Valid; -import java.util.List; - /** * CategoryController 클래스. * diff --git a/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java b/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java index aabed998..68c4d435 100644 --- a/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java +++ b/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.category.dto.request; +import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.NotBlank; - /** * CategoryCreateRequestDto. * diff --git a/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java b/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java index 18255756..5a73eaee 100644 --- a/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.category.dto.request; +import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.NotBlank; - /** * CategoryUpdateRequestDto. * diff --git a/src/main/java/store/ckin/api/category/entity/Category.java b/src/main/java/store/ckin/api/category/entity/Category.java index b58b3ff1..a67b9273 100644 --- a/src/main/java/store/ckin/api/category/entity/Category.java +++ b/src/main/java/store/ckin/api/category/entity/Category.java @@ -1,14 +1,21 @@ package store.ckin.api.category.entity; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.book.relationship.bookcategory.entity.BookCategory; -import javax.persistence.*; -import java.util.Set; - /** * Category 엔티티 클래스. * diff --git a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java index 35804909..87f29d5a 100644 --- a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java +++ b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java @@ -1,10 +1,9 @@ package store.ckin.api.category.repository; -import org.springframework.data.jpa.repository.JpaRepository; -import store.ckin.api.category.entity.Category; - import java.util.List; import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; +import store.ckin.api.category.entity.Category; /** * CategoryRepository. diff --git a/src/main/java/store/ckin/api/category/service/CategoryService.java b/src/main/java/store/ckin/api/category/service/CategoryService.java index 4f24747b..d7968a84 100644 --- a/src/main/java/store/ckin/api/category/service/CategoryService.java +++ b/src/main/java/store/ckin/api/category/service/CategoryService.java @@ -1,11 +1,10 @@ package store.ckin.api.category.service; +import java.util.List; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; import store.ckin.api.category.dto.response.CategoryResponseDto; -import java.util.List; - /** * CategoryService. * diff --git a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java index 6da81dbd..88801ced 100644 --- a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java +++ b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java @@ -1,5 +1,7 @@ package store.ckin.api.category.service.impl; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -11,9 +13,6 @@ import store.ckin.api.category.repository.CategoryRepository; import store.ckin.api.category.service.CategoryService; -import java.util.List; -import java.util.stream.Collectors; - /** * CategoryServiceImpl. * diff --git a/src/main/java/store/ckin/api/config/DataSourceConfig.java b/src/main/java/store/ckin/api/config/DataSourceConfig.java index f9436154..b0a74b80 100644 --- a/src/main/java/store/ckin/api/config/DataSourceConfig.java +++ b/src/main/java/store/ckin/api/config/DataSourceConfig.java @@ -1,5 +1,6 @@ package store.ckin.api.config; +import javax.sql.DataSource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.dbcp2.BasicDataSource; @@ -7,8 +8,6 @@ import org.springframework.context.annotation.Configuration; import store.ckin.api.skm.util.KeyManager; -import javax.sql.DataSource; - /** * DBCP2 설정을 위한 클래스입니다. * diff --git a/src/main/java/store/ckin/api/config/QuerydslConfig.java b/src/main/java/store/ckin/api/config/QuerydslConfig.java index cb4abf66..eafb0941 100644 --- a/src/main/java/store/ckin/api/config/QuerydslConfig.java +++ b/src/main/java/store/ckin/api/config/QuerydslConfig.java @@ -1,11 +1,10 @@ package store.ckin.api.config; import com.querydsl.jpa.impl.JPAQueryFactory; +import javax.persistence.EntityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import javax.persistence.EntityManager; - /** * JPAQueryFactory Bean 등록을 위한 클래스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java index 25a33379..ff774cea 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java @@ -1,9 +1,8 @@ package store.ckin.api.deliverypolicy.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; +import lombok.Getter; /** * 배송비 정책 생성 요청 DTO. diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java index b6dcd485..4ce706e7 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java @@ -1,9 +1,8 @@ package store.ckin.api.deliverypolicy.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; +import lombok.Getter; /** * 배송비 정책 수정 요청 DTO. diff --git a/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java b/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java index 7f57c6d9..15c7a540 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java +++ b/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java @@ -1,12 +1,16 @@ package store.ckin.api.deliverypolicy.entity; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import javax.persistence.*; - /** * 배송비 정책 Entity. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java b/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java index ffecf87b..89acd912 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java +++ b/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.deliverypolicy.service.impl; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,8 +13,6 @@ import store.ckin.api.deliverypolicy.repository.DeliveryPolicyRepository; import store.ckin.api.deliverypolicy.service.DeliveryPolicyService; -import java.util.List; - /** * 배송비 정책을 관리하는 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java b/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java index 15a191b7..f43ed2df 100644 --- a/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java +++ b/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java @@ -37,7 +37,8 @@ public class ApplicationStatusController { private final ApplicationStatus applicationStatus; - public ApplicationStatusController(ApplicationInfoManager applicationInfoManager, ApplicationStatus applicationStatus) { + public ApplicationStatusController(ApplicationInfoManager applicationInfoManager, + ApplicationStatus applicationStatus) { this.applicationInfoManager = applicationInfoManager; this.applicationStatus = applicationStatus; } diff --git a/src/main/java/store/ckin/api/file/entity/File.java b/src/main/java/store/ckin/api/file/entity/File.java index e1b1b1ec..9037d97b 100644 --- a/src/main/java/store/ckin/api/file/entity/File.java +++ b/src/main/java/store/ckin/api/file/entity/File.java @@ -1,5 +1,13 @@ package store.ckin.api.file.entity; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -8,9 +16,6 @@ import store.ckin.api.book.entity.Book; import store.ckin.api.review.entity.Review; -import javax.persistence.*; -import javax.validation.constraints.NotNull; - /** * File 업로드를 위한 엔티티 클래스. * diff --git a/src/main/java/store/ckin/api/file/repository/FileRepository.java b/src/main/java/store/ckin/api/file/repository/FileRepository.java index 593fed33..4608d5ef 100644 --- a/src/main/java/store/ckin/api/file/repository/FileRepository.java +++ b/src/main/java/store/ckin/api/file/repository/FileRepository.java @@ -1,10 +1,9 @@ package store.ckin.api.file.repository; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.file.entity.File; -import java.util.Optional; - /** * {class name}. * diff --git a/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java b/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java index f17621f9..8064aac6 100644 --- a/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java +++ b/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java @@ -1,8 +1,7 @@ package store.ckin.api.file.repository; -import org.springframework.data.repository.NoRepositoryBean; - import java.util.List; +import org.springframework.data.repository.NoRepositoryBean; /** * description: diff --git a/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java b/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java index 3fdc46f3..57152f1a 100644 --- a/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java +++ b/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java @@ -1,11 +1,10 @@ package store.ckin.api.file.repository; +import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.file.entity.File; import store.ckin.api.file.entity.QFile; -import java.util.List; - /** * description: * diff --git a/src/main/java/store/ckin/api/grade/entity/Grade.java b/src/main/java/store/ckin/api/grade/entity/Grade.java index 0e9565b0..8f745675 100644 --- a/src/main/java/store/ckin/api/grade/entity/Grade.java +++ b/src/main/java/store/ckin/api/grade/entity/Grade.java @@ -1,8 +1,15 @@ package store.ckin.api.grade.entity; -import lombok.*; - -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * Grade 테이블에 대한 Entity 입니다. diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index a1649bfb..c34935ad 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -1,10 +1,17 @@ package store.ckin.api.member.controller; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +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 store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; @@ -15,8 +22,6 @@ import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.service.MemberService; -import javax.validation.Valid; - /** * Member 에 관한 REST Controller 입니다. * diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java index 03362364..c51b7aef 100644 --- a/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java +++ b/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.member.domain.request; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * 로그인할 때 필요한 정보를 가져오는 DTO 입니다. diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java index f6b15741..7b7aee7b 100644 --- a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java +++ b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java @@ -1,14 +1,13 @@ package store.ckin.api.member.domain.request; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.format.annotation.DateTimeFormat; - +import java.time.LocalDate; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import java.time.LocalDate; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; /** * Member 생성을 할 때 필요한 정보를 가져오는 DTO 입니다. diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index 02b062c6..319bdf5b 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -1,14 +1,26 @@ package store.ckin.api.member.entity; -import lombok.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; import store.ckin.api.grade.entity.Grade; -import javax.persistence.*; -import java.time.LocalDate; -import java.time.LocalDateTime; - /** * Member 테이블에 대한 Entity 입니다. diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 4975f0c3..08c2dfb5 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.member.service.impl; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,8 +19,6 @@ import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.member.service.MemberService; -import java.time.LocalDateTime; - /** * MemberService interface 의 구현체 입니다. * diff --git a/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java b/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java index 34d858d3..7ab3e5a8 100644 --- a/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java +++ b/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java @@ -1,10 +1,9 @@ package store.ckin.api.objectstorage.dto.response; +import java.time.LocalDateTime; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - /** * {class name}. * diff --git a/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java b/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java index ca292fe9..134d1a4d 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java +++ b/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java @@ -1,10 +1,9 @@ package store.ckin.api.objectstorage.service; +import java.io.IOException; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.file.entity.File; -import java.io.IOException; - /** * ObjectStorageService 인터페이스. * diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index 8d4bfd44..40498ce4 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -1,5 +1,14 @@ package store.ckin.api.objectstorage.service.impl; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.http.fileupload.IOUtils; @@ -21,12 +30,6 @@ import store.ckin.api.objectstorage.service.ObjectStorageService; import store.ckin.api.skm.util.KeyManager; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.time.LocalDateTime; -import java.util.*; - /** * ObjectStorageService 구현 클래스. * diff --git a/src/main/java/store/ckin/api/packaging/controller/PackagingController.java b/src/main/java/store/ckin/api/packaging/controller/PackagingController.java index c04cd9fe..d3079d14 100644 --- a/src/main/java/store/ckin/api/packaging/controller/PackagingController.java +++ b/src/main/java/store/ckin/api/packaging/controller/PackagingController.java @@ -1,17 +1,23 @@ package store.ckin.api.packaging.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.packaging.dto.request.PackagingCreateRequestDto; import store.ckin.api.packaging.dto.request.PackagingUpdateRequestDto; import store.ckin.api.packaging.dto.response.PackagingResponseDto; import store.ckin.api.packaging.service.PackagingService; -import javax.validation.Valid; -import java.util.List; - /** * 포장 정책 컨트롤러입니다. * diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java index c8c4d8ed..4db75d38 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.packaging.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.Size; +import lombok.Getter; /** * 포장 정책 생성 요청 DTO. diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java index c666e857..1f8f485c 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.packaging.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.Size; +import lombok.Getter; /** * 포장 정책 수정 요청 DTO. diff --git a/src/main/java/store/ckin/api/packaging/entity/Packaging.java b/src/main/java/store/ckin/api/packaging/entity/Packaging.java index 79fbe227..f2c27189 100644 --- a/src/main/java/store/ckin/api/packaging/entity/Packaging.java +++ b/src/main/java/store/ckin/api/packaging/entity/Packaging.java @@ -1,12 +1,16 @@ package store.ckin.api.packaging.entity; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import javax.persistence.*; - /** * 포장 정책 엔티티입니다. * diff --git a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java index 00cfe8a9..78cb3799 100644 --- a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java +++ b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java @@ -1,10 +1,9 @@ package store.ckin.api.packaging.repository; -import org.springframework.data.repository.NoRepositoryBean; -import store.ckin.api.packaging.dto.response.PackagingResponseDto; - import java.util.List; import java.util.Optional; +import org.springframework.data.repository.NoRepositoryBean; +import store.ckin.api.packaging.dto.response.PackagingResponseDto; /** * 포장 정책 Repository Querydsl 사용할 메서드가 있는 인터페이스입니다. diff --git a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java index 378219f8..a2bbffc6 100644 --- a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java +++ b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java @@ -1,14 +1,13 @@ package store.ckin.api.packaging.repository; import com.querydsl.core.types.Projections; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.packaging.dto.response.PackagingResponseDto; import store.ckin.api.packaging.entity.Packaging; import store.ckin.api.packaging.entity.QPackaging; -import java.util.List; -import java.util.Optional; - /** * 포장 정책 Repository Querydsl 사용을 위한 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/packaging/service/PackagingService.java b/src/main/java/store/ckin/api/packaging/service/PackagingService.java index 1f86b596..c7999026 100644 --- a/src/main/java/store/ckin/api/packaging/service/PackagingService.java +++ b/src/main/java/store/ckin/api/packaging/service/PackagingService.java @@ -1,11 +1,10 @@ package store.ckin.api.packaging.service; +import java.util.List; import store.ckin.api.packaging.dto.request.PackagingCreateRequestDto; import store.ckin.api.packaging.dto.request.PackagingUpdateRequestDto; import store.ckin.api.packaging.dto.response.PackagingResponseDto; -import java.util.List; - /** * 포장 정책 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java b/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java index 11a21567..4ca97492 100644 --- a/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java +++ b/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.packaging.service.impl; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -13,8 +14,6 @@ import store.ckin.api.packaging.repository.PackagingRepository; import store.ckin.api.packaging.service.PackagingService; -import java.util.List; - /** * 포장 정책 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java index 04ec1f00..59c0f5e6 100644 --- a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java +++ b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.payment.dto.request; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; -import java.time.LocalDateTime; - /** * 결제 요청 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java index 684e6029..8cfb5260 100644 --- a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java +++ b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java @@ -1,11 +1,10 @@ package store.ckin.api.payment.dto.response; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; -import java.time.LocalDateTime; - /** * 결제 조회 응답 DTO. * diff --git a/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java b/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java index 6d59731c..f2e237cf 100644 --- a/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java +++ b/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java @@ -1,11 +1,10 @@ package store.ckin.api.payment.dto.response; +import java.time.LocalDate; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import java.time.LocalDate; - /** * 결제 성공 응답 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/entity/Payment.java b/src/main/java/store/ckin/api/payment/entity/Payment.java index 02e9a02c..1637caab 100644 --- a/src/main/java/store/ckin/api/payment/entity/Payment.java +++ b/src/main/java/store/ckin/api/payment/entity/Payment.java @@ -1,14 +1,21 @@ package store.ckin.api.payment.entity; +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; +import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.sale.entity.Sale; -import javax.persistence.*; -import java.time.LocalDateTime; - /** * 결제 엔티티 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index 3ecbce72..8129c85b 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -1,5 +1,6 @@ package store.ckin.api.payment.facade; +import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -12,8 +13,6 @@ import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.service.SaleService; -import java.util.Objects; - /** * 결제 퍼사드 클래스입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java b/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java index a4770f16..ff1f2828 100644 --- a/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java +++ b/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java @@ -1,17 +1,23 @@ package store.ckin.api.pointpolicy.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.pointpolicy.dto.request.PointPolicyCreateRequestDto; import store.ckin.api.pointpolicy.dto.request.PointPolicyUpdateRequestDto; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; import store.ckin.api.pointpolicy.service.PointPolicyService; -import javax.validation.Valid; -import java.util.List; - /** * 포인트 정책 컨트롤러입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java index 3d471af8..73a5f438 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java @@ -1,9 +1,12 @@ package store.ckin.api.pointpolicy.dto.request; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; +import javax.validation.constraints.Size; import lombok.Getter; -import javax.validation.constraints.*; - /** * 포인트 정책 생성 요청 DTO. * diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java index 7588a135..990fe8ea 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.pointpolicy.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; import javax.validation.constraints.Size; +import lombok.Getter; /** * 포인트 정책 수정 요청 DTO. diff --git a/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java b/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java index 60bb0df9..205f2379 100644 --- a/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java +++ b/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java @@ -1,14 +1,13 @@ package store.ckin.api.pointpolicy.entity; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * 포인트 정책 엔티티입니다. diff --git a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java index 8137e440..13f5027f 100644 --- a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java +++ b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java @@ -1,10 +1,9 @@ package store.ckin.api.pointpolicy.repository; -import org.springframework.data.repository.NoRepositoryBean; -import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; - import java.util.List; import java.util.Optional; +import org.springframework.data.repository.NoRepositoryBean; +import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; /** * 포인트 정책 Repository Querydsl 사용할 메서드가 있는 인터페이스입니다. diff --git a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java index 84a6dbcd..39ca632d 100644 --- a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java +++ b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java @@ -1,14 +1,13 @@ package store.ckin.api.pointpolicy.repository; import com.querydsl.core.types.Projections; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; import store.ckin.api.pointpolicy.entity.PointPolicy; import store.ckin.api.pointpolicy.entity.QPointPolicy; -import java.util.List; -import java.util.Optional; - /** * 포인트 정책 Repository Querydsl 사용을 위한 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java b/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java index 4a598ed1..2bef2c30 100644 --- a/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java +++ b/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java @@ -1,11 +1,10 @@ package store.ckin.api.pointpolicy.service; +import java.util.List; import store.ckin.api.pointpolicy.dto.request.PointPolicyCreateRequestDto; import store.ckin.api.pointpolicy.dto.request.PointPolicyUpdateRequestDto; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; -import java.util.List; - /** * 포인트 정책을 관리하는 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java b/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java index e4168b16..81c9cad5 100644 --- a/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java +++ b/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.pointpolicy.service.impl; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,8 +13,6 @@ import store.ckin.api.pointpolicy.repository.PointPolicyRepository; import store.ckin.api.pointpolicy.service.PointPolicyService; -import java.util.List; - /** * 포인트 정책을 관리하는 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index 0fb3451e..44b2ec37 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -1,5 +1,6 @@ package store.ckin.api.review.controller; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -7,14 +8,17 @@ import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +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.RequestPart; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.service.ReviewService; -import java.util.List; - /** * ReviewController 클래스. * @@ -36,7 +40,8 @@ public class ReviewController { */ @PostMapping public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto createRequestDto, - @RequestPart(value = "imageList", required = false) List imageList) { + @RequestPart(value = "imageList", required = false) + List imageList) { reviewService.postReview(createRequestDto, imageList); //TODO: point 적립 @@ -52,8 +57,9 @@ public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto creat * @return 리뷰 DTO 페이지 */ @GetMapping("{bookId}") - public ResponseEntity> getReviewPageList(@PageableDefault(page = 0, size = 5) Pageable pageable, - @PathVariable("bookId") Long bookId) { + public ResponseEntity> getReviewPageList( + @PageableDefault(page = 0, size = 5) Pageable pageable, + @PathVariable("bookId") Long bookId) { Page content = reviewService.getReviewPageList(pageable, bookId); return ResponseEntity.ok().body(content); diff --git a/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java b/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java index 5abd3fe6..cff9dae8 100644 --- a/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java +++ b/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java @@ -1,11 +1,10 @@ package store.ckin.api.review.dto.response; +import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - /** * ReviewResponseDto 리뷰 응답 dto. * diff --git a/src/main/java/store/ckin/api/review/entity/Review.java b/src/main/java/store/ckin/api/review/entity/Review.java index 27b87b29..281e5883 100644 --- a/src/main/java/store/ckin/api/review/entity/Review.java +++ b/src/main/java/store/ckin/api/review/entity/Review.java @@ -1,5 +1,14 @@ package store.ckin.api.review.entity; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -8,8 +17,6 @@ import store.ckin.api.book.entity.Book; import store.ckin.api.member.entity.Member; -import javax.persistence.*; - /** * Review 엔티티 클래스입니다. * diff --git a/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java b/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java index 11e75388..9fe55cfb 100644 --- a/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java +++ b/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java @@ -1,6 +1,11 @@ package store.ckin.api.review.repository.impl; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import javax.persistence.EntityManager; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -12,12 +17,6 @@ import store.ckin.api.review.entity.Review; import store.ckin.api.review.repository.ReviewRepositoryCustom; -import javax.persistence.EntityManager; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - /** * ReviewRepository 구현클래스. * diff --git a/src/main/java/store/ckin/api/review/service/ReviewService.java b/src/main/java/store/ckin/api/review/service/ReviewService.java index f33fd0b3..216e6876 100644 --- a/src/main/java/store/ckin/api/review/service/ReviewService.java +++ b/src/main/java/store/ckin/api/review/service/ReviewService.java @@ -1,13 +1,12 @@ package store.ckin.api.review.service; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; import store.ckin.api.review.dto.response.ReviewResponseDto; -import java.util.List; - /** * ReviewService * diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index 6a285e06..d8bdc1bf 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -1,5 +1,8 @@ package store.ckin.api.review.service.impl; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -22,10 +25,6 @@ import store.ckin.api.review.repository.ReviewRepository; import store.ckin.api.review.service.ReviewService; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - /** * ReviewService * diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index 3d9d9232..a2e8074e 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -1,11 +1,19 @@ package store.ckin.api.sale.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; @@ -14,9 +22,6 @@ import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.facade.SaleFacade; -import javax.validation.Valid; -import java.util.List; - /** * 주문 컨트롤러 입니다. * diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java index b12f696a..a2bde2cd 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java @@ -1,14 +1,13 @@ package store.ckin.api.sale.dto.request; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.springframework.format.annotation.DateTimeFormat; - +import java.time.LocalDate; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.PositiveOrZero; -import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.format.annotation.DateTimeFormat; /** * 도서 정보를 제외한 주문 생성 요청 DTO . diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java index a48040a7..e2a24154 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java @@ -1,15 +1,18 @@ package store.ckin.api.sale.dto.request; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; +import javax.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Getter; import org.springframework.format.annotation.DateTimeFormat; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; -import javax.validation.constraints.*; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - /** * 주문 생성 요청 DTO. * diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java index 225e02a0..1ba889e2 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java @@ -1,12 +1,11 @@ package store.ckin.api.sale.dto.response; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.payment.dto.response.PaymentResponseDto; -import java.util.List; - /** * 주문 상세 조회 응답 DTO 입니다. * diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java index 71905ab8..4ab05f7a 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java @@ -1,14 +1,13 @@ package store.ckin.api.sale.dto.response; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; import store.ckin.api.sale.entity.Sale; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Objects; - /** * 주문 조회 응답 DTO. * diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java index bdae6292..c15ff1f8 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java @@ -1,11 +1,10 @@ package store.ckin.api.sale.dto.response; -import lombok.Getter; -import store.ckin.api.booksale.dto.response.BookSaleResponseDto; - import java.time.LocalDate; import java.util.ArrayList; import java.util.List; +import lombok.Getter; +import store.ckin.api.booksale.dto.response.BookSaleResponseDto; /** * 주문 상세 정보와 주문한 책 정보 응답 DTO 클래스입니다. diff --git a/src/main/java/store/ckin/api/sale/entity/Sale.java b/src/main/java/store/ckin/api/sale/entity/Sale.java index b17959b8..99f129b1 100644 --- a/src/main/java/store/ckin/api/sale/entity/Sale.java +++ b/src/main/java/store/ckin/api/sale/entity/Sale.java @@ -1,5 +1,20 @@ package store.ckin.api.sale.entity; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -7,11 +22,6 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.member.entity.Member; -import javax.persistence.*; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Set; - /** * 주문 엔티티 클래스입니다. * diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 1c604ea6..88f1bd66 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -1,5 +1,6 @@ package store.ckin.api.sale.facade; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; @@ -20,8 +21,6 @@ import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.service.SaleService; -import java.util.List; - /** * 주문 퍼사드 클래스입니다. * diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java index 365cbeba..3fafb705 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java @@ -1,6 +1,7 @@ package store.ckin.api.sale.repository; import com.querydsl.core.types.Projections; +import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.book.entity.QBook; import store.ckin.api.booksale.dto.response.BookSaleResponseDto; @@ -11,8 +12,6 @@ import store.ckin.api.sale.entity.QSale; import store.ckin.api.sale.entity.Sale; -import java.util.List; - /** * 주문 Repository Querydsl 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/sale/service/SaleService.java b/src/main/java/store/ckin/api/sale/service/SaleService.java index f282180d..eae3686a 100644 --- a/src/main/java/store/ckin/api/sale/service/SaleService.java +++ b/src/main/java/store/ckin/api/sale/service/SaleService.java @@ -1,5 +1,6 @@ package store.ckin.api.sale.service; +import java.util.List; import org.springframework.data.domain.Pageable; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.sale.dto.request.SaleCreateNoBookRequestDto; @@ -7,8 +8,6 @@ import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; -import java.util.List; - /** * 주문 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index 0cd9a0f5..d8eaac57 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -1,5 +1,11 @@ package store.ckin.api.sale.service.impl; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -21,13 +27,6 @@ import store.ckin.api.sale.repository.SaleRepository; import store.ckin.api.sale.service.SaleService; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Collectors; - /** * 주문 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/skm/util/KeyManager.java b/src/main/java/store/ckin/api/skm/util/KeyManager.java index 7e3006f8..4132e20e 100644 --- a/src/main/java/store/ckin/api/skm/util/KeyManager.java +++ b/src/main/java/store/ckin/api/skm/util/KeyManager.java @@ -1,5 +1,17 @@ package store.ckin.api.skm.util; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.util.List; +import java.util.Objects; +import javax.net.ssl.SSLContext; import lombok.RequiredArgsConstructor; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; @@ -19,15 +31,6 @@ import store.ckin.api.skm.dto.KeyResponseDto; import store.ckin.api.skm.exception.KeyMangerException; -import javax.net.ssl.SSLContext; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.security.*; -import java.security.cert.CertificateException; -import java.util.List; -import java.util.Objects; - /** * NHN Cloud SKM 에서 저장된 데이터를 가져오기 위한 매니저 클래스 * diff --git a/src/main/java/store/ckin/api/tag/controller/TagController.java b/src/main/java/store/ckin/api/tag/controller/TagController.java index 367683f3..0c35a9ca 100644 --- a/src/main/java/store/ckin/api/tag/controller/TagController.java +++ b/src/main/java/store/ckin/api/tag/controller/TagController.java @@ -1,11 +1,20 @@ package store.ckin.api.tag.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.common.dto.ErrorResponse; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.tag.dto.request.TagCreateRequestDto; @@ -16,9 +25,6 @@ import store.ckin.api.tag.exception.TagNotFoundException; import store.ckin.api.tag.service.TagService; -import javax.validation.Valid; -import java.util.List; - /** * 태그 요청을 받는 컨트롤러 클래스 * @@ -38,7 +44,8 @@ public class TagController { * @return 모든 태그 리스트 */ @GetMapping - public ResponseEntity>> getAllTagList(@PageableDefault(page = 0, size = 10) Pageable pageable) { + public ResponseEntity>> getAllTagList( + @PageableDefault(page = 0, size = 10) Pageable pageable) { return ResponseEntity.ok(tagService.readTagList(pageable)); } diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java index 4387f2a2..6ea7b47b 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java @@ -1,9 +1,8 @@ package store.ckin.api.tag.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.Getter; /** * 태그 생성을 위한 요청 DTO diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java index 24099408..cf6787c7 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java @@ -1,8 +1,7 @@ package store.ckin.api.tag.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotNull; +import lombok.Getter; /** * description diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java index 33f1f6a8..8bb679fd 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java @@ -1,9 +1,8 @@ package store.ckin.api.tag.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.Getter; /** * 태그 업데이트 요청 Dto diff --git a/src/main/java/store/ckin/api/tag/entity/Tag.java b/src/main/java/store/ckin/api/tag/entity/Tag.java index efd7b2d8..5ca80537 100644 --- a/src/main/java/store/ckin/api/tag/entity/Tag.java +++ b/src/main/java/store/ckin/api/tag/entity/Tag.java @@ -1,8 +1,16 @@ package store.ckin.api.tag.entity; -import lombok.*; - -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * description: diff --git a/src/main/java/store/ckin/api/tag/service/TagService.java b/src/main/java/store/ckin/api/tag/service/TagService.java index a91c8a33..331f7186 100644 --- a/src/main/java/store/ckin/api/tag/service/TagService.java +++ b/src/main/java/store/ckin/api/tag/service/TagService.java @@ -1,5 +1,6 @@ package store.ckin.api.tag.service; +import java.util.List; import org.springframework.data.domain.Pageable; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.tag.dto.request.TagCreateRequestDto; @@ -7,8 +8,6 @@ import store.ckin.api.tag.dto.request.TagUpdateRequestDto; import store.ckin.api.tag.dto.response.TagResponseDto; -import java.util.List; - /** * 태그 서비스 인터페이스 * diff --git a/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java b/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java index 15da4f1c..05806c8e 100644 --- a/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java +++ b/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java @@ -1,5 +1,8 @@ package store.ckin.api.tag.service.impl; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -17,10 +20,6 @@ import store.ckin.api.tag.repository.TagRepository; import store.ckin.api.tag.service.TagService; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - /** * 태그 서비스 구현 클래스 * From e65cb08cd92d88a9dd222c05ed9d2c0b04e851f0 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 15 Mar 2024 13:30:20 +0900 Subject: [PATCH 037/161] =?UTF-8?q?[REFACTOR]=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=95=88=ED=95=98=EB=8A=94=20import=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/member/controller/MemberController.java | 1 - .../ckin/api/member/repository/MemberRepositoryCustom.java | 3 +-- .../ckin/api/member/repository/impl/MemberRepositoryImpl.java | 1 - src/main/java/store/ckin/api/member/service/MemberService.java | 1 - .../store/ckin/api/member/service/impl/MemberServiceImpl.java | 2 -- 5 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 44b976fd..3719ad24 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; diff --git a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java index 99bd9e4e..005ca9ea 100644 --- a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java +++ b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java @@ -1,7 +1,6 @@ package store.ckin.api.member.repository; import org.springframework.data.repository.NoRepositoryBean; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; @@ -19,5 +18,5 @@ public interface MemberRepositoryCustom { MemberInfoDetailResponseDto getMemberInfoDetail(Long id); MemberMyPageResponseDto getMyPageInfo(Long id); - + } diff --git a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java index 88579947..393ca38c 100644 --- a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java +++ b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java @@ -3,7 +3,6 @@ import com.querydsl.core.types.Projections; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.grade.entity.QGrade; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index f9183d1e..481a104c 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -1,6 +1,5 @@ package store.ckin.api.member.service; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 5ee6ed3c..6572bcfc 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -7,7 +7,6 @@ import store.ckin.api.grade.entity.Grade; import store.ckin.api.grade.exception.GradeNotFoundException; import store.ckin.api.grade.repository.GradeRepository; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; @@ -101,7 +100,6 @@ public void updatePoint(Long memberId, Integer pointUsage) { .orElseThrow(() -> new MemberNotFoundException(memberId)); // TODO : PointHistory - 사용한 포인트 기록 남기기 (추후 구현) - member.updatePoint(pointUsage); } } From ba097ee41d73a34ce2c0a51851aa14c834490df1 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Sat, 16 Mar 2024 00:09:16 +0900 Subject: [PATCH 038/161] =?UTF-8?q?[FEATURE]=20ReviewRepository=EC=97=90?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=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 --- .../file/repository/FileRepositoryImpl.java | 3 +- .../dto/response/MyPageReviewResponseDto.java | 48 ++++++++++++++++++ .../review/repository/ReviewRepository.java | 2 +- .../repository/ReviewRepositoryCustom.java | 3 +- .../repository/impl/ReviewRepositoryImpl.java | 50 +++++++++++++------ .../repository/impl/ReviewRepositoryTest.java | 39 ++++++++++++--- 6 files changed, 120 insertions(+), 25 deletions(-) create mode 100644 src/main/java/store/ckin/api/review/dto/response/MyPageReviewResponseDto.java diff --git a/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java b/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java index 3fdc46f3..57152f1a 100644 --- a/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java +++ b/src/main/java/store/ckin/api/file/repository/FileRepositoryImpl.java @@ -1,11 +1,10 @@ package store.ckin.api.file.repository; +import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.file.entity.File; import store.ckin.api.file.entity.QFile; -import java.util.List; - /** * description: * diff --git a/src/main/java/store/ckin/api/review/dto/response/MyPageReviewResponseDto.java b/src/main/java/store/ckin/api/review/dto/response/MyPageReviewResponseDto.java new file mode 100644 index 00000000..36f3d48e --- /dev/null +++ b/src/main/java/store/ckin/api/review/dto/response/MyPageReviewResponseDto.java @@ -0,0 +1,48 @@ +package store.ckin.api.review.dto.response; + +import java.util.List; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * MyPageReviewResponseDto. + * + * @author 나국로 + * @version 2024. 03. 14. + */ +@Getter +@NoArgsConstructor +public class MyPageReviewResponseDto { + private Long reviewId; + private String author; + private String message; + private Integer reviewRate; + private String reviewDate; + private String thumbnailPath; + private Long bookId; + private String bookTitle; + private List filePath; + + @Builder + public MyPageReviewResponseDto(Long reviewId, String author, String message, Integer reviewRate, String reviewDate, + List filePath, String thumbnailPath, Long bookId, String bookTitle) { + this.reviewId = reviewId; + this.author = author; + this.message = message; + this.reviewRate = reviewRate; + this.reviewDate = reviewDate; + this.filePath = filePath; + this.thumbnailPath = thumbnailPath; + this.bookId = bookId; + this.bookTitle = bookTitle; + } + + public void setFilePath(List filePath) { + this.filePath = filePath; + } + + public void setFilePath(String thumbnailPath) { + this.thumbnailPath = thumbnailPath; + } +} diff --git a/src/main/java/store/ckin/api/review/repository/ReviewRepository.java b/src/main/java/store/ckin/api/review/repository/ReviewRepository.java index 40ddbb82..6d3e0787 100644 --- a/src/main/java/store/ckin/api/review/repository/ReviewRepository.java +++ b/src/main/java/store/ckin/api/review/repository/ReviewRepository.java @@ -4,7 +4,7 @@ import store.ckin.api.review.entity.Review; /** - * {class name}. + * ReviewRepository 인터페이스. * * @author 나국로 * @version 2024. 03. 03. diff --git a/src/main/java/store/ckin/api/review/repository/ReviewRepositoryCustom.java b/src/main/java/store/ckin/api/review/repository/ReviewRepositoryCustom.java index 3eb3c885..22417531 100644 --- a/src/main/java/store/ckin/api/review/repository/ReviewRepositoryCustom.java +++ b/src/main/java/store/ckin/api/review/repository/ReviewRepositoryCustom.java @@ -3,6 +3,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.NoRepositoryBean; +import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; /** @@ -13,7 +14,7 @@ */ @NoRepositoryBean public interface ReviewRepositoryCustom { - Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable); + Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable); Page getReviewPageList(Pageable pageable, Long bookId); } diff --git a/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java b/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java index 11e75388..736fb239 100644 --- a/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java +++ b/src/main/java/store/ckin/api/review/repository/impl/ReviewRepositoryImpl.java @@ -1,23 +1,23 @@ package store.ckin.api.review.repository.impl; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import javax.persistence.EntityManager; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.book.entity.QBook; import store.ckin.api.member.entity.QMember; +import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.entity.QReview; import store.ckin.api.review.entity.Review; import store.ckin.api.review.repository.ReviewRepositoryCustom; -import javax.persistence.EntityManager; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - /** * ReviewRepository 구현클래스. * @@ -34,22 +34,31 @@ public ReviewRepositoryImpl(EntityManager entityManager) { QReview review = QReview.review; QMember member = QMember.member; - QBook book = QBook.book; @Override - public Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable) { + public Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable) { JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); + List reviewIds = queryFactory + .select(review.reviewId) + .from(review) + .orderBy(review.createdAt.desc()) + .where(review.member.id.eq(memberId)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); List reviews = queryFactory .selectFrom(review) - .leftJoin(review.member, member) - .where(member.id.eq(memberId)) - .offset(pageable.getOffset()) - .limit(pageable.getPageSize()) + .leftJoin(review.member, member).fetchJoin() + .leftJoin(review.book, book).fetchJoin() + .orderBy(review.createdAt.desc()) + .where(review.reviewId.in(reviewIds)) + .distinct() .fetch(); + Long total = Optional.ofNullable(queryFactory .select(review.count()) .from(review) @@ -59,8 +68,8 @@ public Page findReviewsByMemberWithPagination(Long memberId, .orElse(0L); - List reviewResponseDtos = reviews.stream() - .map(this::convertToReviewResponseDto) + List reviewResponseDtos = reviews.stream() + .map(this::convertToMyPageReviewResponseDto) .collect(Collectors.toList()); return new PageImpl<>(reviewResponseDtos, pageable, total); @@ -73,6 +82,7 @@ public Page getReviewPageList(Pageable pageable, Long bookId) List reviews = queryFactory .selectFrom(review) .leftJoin(review.book, book) + .orderBy(review.createdAt.desc()) .where(book.bookId.eq(bookId)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) @@ -103,5 +113,17 @@ private ReviewResponseDto convertToReviewResponseDto(Review review) { review.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); } + private MyPageReviewResponseDto convertToMyPageReviewResponseDto(Review review) { + return MyPageReviewResponseDto.builder() + .bookId(review.getBook().getBookId()) + .reviewId(review.getReviewId()) + .author(review.getMember().getName()) + .message(review.getReviewComment()) + .reviewRate(review.getReviewRate()) + .reviewDate(review.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .bookTitle(review.getBook().getBookTitle()) + .thumbnailPath(review.getBook().getThumbnail().getFileUrl()) + .build(); + } } diff --git a/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java b/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java index b89b605f..013b7479 100644 --- a/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java +++ b/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java @@ -9,10 +9,13 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; import org.springframework.context.annotation.Import; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import store.ckin.api.book.entity.Book; +import store.ckin.api.file.entity.File; import store.ckin.api.grade.entity.Grade; import store.ckin.api.member.entity.Member; +import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.entity.Review; import store.ckin.api.review.repository.ReviewRepository; @@ -60,6 +63,16 @@ void setUp() { .build(); testEntityManager.persist(member); + File thumbnail = File.builder() + .fileId("fileId123") + .fileOriginName("thumbnail.jpg") + .fileUrl("http://example.com/thumbnail.jpg") + .fileExtension("jpg") + .fileCategory("image") + .build(); + testEntityManager.persist(thumbnail); + + book = Book.builder() .bookTitle("사람은 무엇으로 사는가") .bookIsbn("1234567890123") @@ -69,6 +82,7 @@ void setUp() { .bookPackaging(true) .bookState("ON_SALE") .bookStock(180) + .thumbnail(thumbnail) .bookRegularPrice(20000) .bookDiscountRate(10) .bookSalePrice(18000) @@ -88,14 +102,25 @@ void setUp() { @Test @DisplayName("멤버 아이디로 리뷰 목록 조회 테스트") void testFindReviewsByMemberWithPagination() { - Page results = reviewRepository.findReviewsByMemberWithPagination(1L, pageable); + PageRequest pageable = PageRequest.of(0, 10); // 첫 번째 페이지, 페이지당 10개 항목 + Long memberId = member.getId(); + + Page result = reviewRepository.findReviewsByMemberWithPagination(memberId, pageable); + + Assertions.assertThat(result).isNotNull(); + Assertions.assertThat(result.getContent()).isNotEmpty(); + Assertions.assertThat(result.getContent().size()).isGreaterThan(0); + + + Assertions.assertThat(result).isNotNull(); + Assertions.assertThat(result.getContent()).hasSize(1); + MyPageReviewResponseDto dto = result.getContent().get(0); + Assertions.assertThat(dto.getReviewId()).isEqualTo(review.getReviewId()); + Assertions.assertThat(dto.getAuthor()).isEqualTo("ckin"); + Assertions.assertThat(dto.getMessage()).isEqualTo(review.getReviewComment()); + // 필요한 나머지 필드에 대한 검증 + - Assertions.assertThat(results.getNumber()).isEqualTo(pageable.getPageNumber()); - Assertions.assertThat(results.getContent().get(0).getReviewRate()).isEqualTo(review.getReviewRate()); - Assertions.assertThat(results.getContent().get(0).getReviewDate()).isEqualTo(review.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); - Assertions.assertThat(results.getContent().get(0).getMessage()).isEqualTo(review.getReviewComment()); - Assertions.assertThat(results.getContent().get(0).getAuthor()).isEqualTo("***" + review.getMember().getEmail().substring(3)); - Assertions.assertThat(results.getContent().get(0).getReviewId()).isNotNull(); } @Test From 66fb9797793010cc095e033a4834ad5ff61cd45f Mon Sep 17 00:00:00 2001 From: nayoseb Date: Sat, 16 Mar 2024 00:09:31 +0900 Subject: [PATCH 039/161] =?UTF-8?q?[FEATURE]=20ReviewService=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=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 --- .../ckin/api/review/service/ReviewService.java | 4 ++++ .../review/service/impl/ReviewServiceImpl.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/main/java/store/ckin/api/review/service/ReviewService.java b/src/main/java/store/ckin/api/review/service/ReviewService.java index f33fd0b3..66fe21fd 100644 --- a/src/main/java/store/ckin/api/review/service/ReviewService.java +++ b/src/main/java/store/ckin/api/review/service/ReviewService.java @@ -2,8 +2,10 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import java.util.List; @@ -32,4 +34,6 @@ public interface ReviewService { * @return 리뷰 DTO 페이지 */ Page getReviewPageList(Pageable pageable, Long bookId); + @Transactional(readOnly = true) + Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable); } diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index 5f91ba54..63cf3fc3 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -17,6 +17,7 @@ import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.objectstorage.service.ObjectStorageService; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.entity.Review; import store.ckin.api.review.repository.ReviewRepository; @@ -102,4 +103,18 @@ public Page getReviewPageList(Pageable pageable, Long bookId) }); return reviewPage; } + + @Override + @Transactional(readOnly = true) + public Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable) { + if (!memberRepository.existsById(memberId)) { + throw new MemberNotFoundException(memberId); + } + Page reviewPage = + reviewRepository.findReviewsByMemberWithPagination(memberId, pageable); + reviewPage.stream().forEach(reviewResponseDto -> reviewResponseDto.setFilePath( + fileRepository.findFilePathByReviewId(reviewResponseDto.getReviewId()))); + return reviewPage; + } + } From 0deff941b925c0ec59a80958cf64e8ae0a77424b Mon Sep 17 00:00:00 2001 From: nayoseb Date: Sat, 16 Mar 2024 00:09:40 +0900 Subject: [PATCH 040/161] =?UTF-8?q?[FEATURE]=20ReviewController=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=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 --- .../api/review/controller/ReviewController.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index 0fb3451e..c53ea043 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.service.ReviewService; @@ -58,4 +59,20 @@ public ResponseEntity> getReviewPageList(@PageableDefaul return ResponseEntity.ok().body(content); } + + /** + * 도서 아이디로 해당되는 리뷰 목록을 반환하는 메소드 입니다. + * + * @param pageable 리뷰 페이지 + * @param memberId 회원 아이디 + * @return 리뷰 DTO 페이지 + */ + @GetMapping("/my-page/{memberId}") + public ResponseEntity> getReviewPageListByMemberId( + @PageableDefault(page = 0, size = 5) Pageable pageable, + @PathVariable("memberId") Long memberId) { + Page content = reviewService.findReviewsByMemberWithPagination(memberId, pageable); + + return ResponseEntity.ok().body(content); + } } From 109b7d820d8de7ab4c4eb3f4152366eb7ee9950c Mon Sep 17 00:00:00 2001 From: nayoseb Date: Sat, 16 Mar 2024 00:15:48 +0900 Subject: [PATCH 041/161] =?UTF-8?q?[FEATURE]=20=EB=A8=B8=EC=A7=80=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 +- .../java/store/ckin/api/adit/Auditable.java | 9 +- .../ckin/api/advice/WebControllerAdvice.java | 5 +- .../author/controller/AuthorController.java | 13 +- .../dto/request/AuthorCreateRequestDto.java | 5 +- .../dto/request/AuthorModifyRequestDto.java | 5 +- .../store/ckin/api/author/entity/Author.java | 11 +- .../repository/impl/AuthorRepositoryImpl.java | 3 +- .../api/book/controller/BookController.java | 17 ++- .../dto/request/BookCreateRequestDto.java | 11 +- .../dto/request/BookModifyRequestDto.java | 11 +- .../response/BookExtractionResponseDto.java | 5 +- .../dto/response/BookListResponseDto.java | 5 +- .../book/dto/response/BookResponseDto.java | 5 +- .../java/store/ckin/api/book/entity/Book.java | 25 ++- .../bookauthor/entity/BookAuthor.java | 18 ++- .../bookcategory/entity/BookCategory.java | 18 ++- .../relationship/booktag/entity/BookTag.java | 18 ++- .../book/repository/BookRepositoryCustom.java | 5 +- .../book/service/impl/BookServiceImpl.java | 11 +- .../dto/request/BookSaleCreateRequestDto.java | 5 +- .../ckin/api/booksale/entity/BookSale.java | 23 ++- .../repository/BookSaleRepository.java | 3 +- .../repository/BookSaleRepositoryCustom.java | 3 +- .../repository/BookSaleRepositoryImpl.java | 3 +- .../api/booksale/service/BookSaleService.java | 3 +- .../service/impl/BookSaleServiceImpl.java | 3 +- .../controller/CategoryController.java | 27 +++- .../dto/request/CategoryCreateRequestDto.java | 3 +- .../dto/request/CategoryUpdateRequestDto.java | 3 +- .../ckin/api/category/entity/Category.java | 13 +- .../repository/CategoryRepository.java | 5 +- .../api/category/service/CategoryService.java | 10 +- .../service/impl/CategoryServiceImpl.java | 18 ++- .../ckin/api/config/DataSourceConfig.java | 3 +- .../store/ckin/api/config/QuerydslConfig.java | 3 +- .../controller/DeliveryPolicyController.java | 14 +- .../DeliveryPolicyCreateRequestDto.java | 1 - .../DeliveryPolicyUpdateRequestDto.java | 1 - .../deliverypolicy/entity/DeliveryPolicy.java | 1 - .../DeliveryPolicyRepositoryCustom.java | 6 +- .../DeliveryPolicyRepositoryImpl.java | 7 +- .../service/DeliveryPolicyService.java | 4 +- .../impl/DeliveryPolicyServiceImpl.java | 1 - .../ApplicationStatusController.java | 3 +- .../java/store/ckin/api/file/entity/File.java | 11 +- .../api/file/repository/FileRepository.java | 3 +- .../file/repository/FileRepositoryCustom.java | 3 +- .../store/ckin/api/grade/entity/Grade.java | 13 +- .../member/controller/MemberController.java | 25 +-- .../member/domain/MemberPointResponseDto.java | 18 --- .../domain/request/MemberAuthRequestDto.java | 5 +- .../request/MemberCreateRequestDto.java | 9 +- .../store/ckin/api/member/entity/Member.java | 22 ++- .../repository/MemberRepositoryCustom.java | 8 - .../repository/impl/MemberRepositoryImpl.java | 18 --- .../api/member/service/MemberService.java | 9 -- .../service/impl/MemberServiceImpl.java | 21 +-- .../dto/response/TokenResponse.java | 1 - .../service/ObjectStorageService.java | 1 - .../impl/ObjectStorageServiceImpl.java | 3 +- .../controller/PackagingController.java | 14 +- .../request/PackagingCreateRequestDto.java | 3 +- .../request/PackagingUpdateRequestDto.java | 3 +- .../ckin/api/packaging/entity/Packaging.java | 8 +- .../repository/PackagingRepositoryCustom.java | 5 +- .../repository/PackagingRepositoryImpl.java | 5 +- .../packaging/service/PackagingService.java | 3 +- .../service/impl/PackagingServiceImpl.java | 3 +- .../dto/request/PaymentRequestDto.java | 3 +- .../dto/response/PaymentResponseDto.java | 3 +- .../response/PaymentSuccessResponseDto.java | 3 +- .../ckin/api/payment/entity/Payment.java | 13 +- .../api/payment/facade/PaymentFacade.java | 3 +- .../controller/PointPolicyController.java | 1 - .../request/PointPolicyCreateRequestDto.java | 7 +- .../request/PointPolicyUpdateRequestDto.java | 3 +- .../api/pointpolicy/entity/PointPolicy.java | 9 +- .../PointPolicyRepositoryCustom.java | 1 - .../repository/PointPolicyRepositoryImpl.java | 2 - .../service/PointPolicyService.java | 1 - .../service/impl/PointPolicyServiceImpl.java | 3 +- .../review/controller/ReviewController.java | 18 ++- .../dto/response/ReviewResponseDto.java | 3 +- .../store/ckin/api/review/entity/Review.java | 11 +- .../api/review/service/ReviewService.java | 3 +- .../service/impl/ReviewServiceImpl.java | 9 +- .../api/sale/controller/SaleController.java | 53 ++++++- .../request/SaleCreateNoBookRequestDto.java | 12 +- .../dto/request/SaleCreateRequestDto.java | 17 ++- .../dto/response/SaleDetailResponseDto.java | 3 +- .../dto/response/SaleInfoResponseDto.java | 3 + .../sale/dto/response/SaleResponseDto.java | 10 +- .../dto/response/SaleWithBookResponseDto.java | 40 ++--- .../java/store/ckin/api/sale/entity/Sale.java | 44 +++--- .../SaleMemberNotMatchException.java | 14 ++ .../SaleOrdererContactNotMatchException.java | 14 ++ .../ckin/api/sale/facade/SaleFacade.java | 93 ++++++++++-- .../api/sale/repository/SaleRepository.java | 1 + .../sale/repository/SaleRepositoryCustom.java | 13 ++ .../sale/repository/SaleRepositoryImpl.java | 65 ++++++-- .../ckin/api/sale/service/SaleService.java | 11 +- .../sale/service/impl/SaleServiceImpl.java | 36 +++-- .../store/ckin/api/skm/util/KeyManager.java | 21 +-- .../api/tag/controller/TagController.java | 17 ++- .../tag/dto/request/TagCreateRequestDto.java | 3 +- .../tag/dto/request/TagDeleteRequestDto.java | 3 +- .../tag/dto/request/TagUpdateRequestDto.java | 3 +- .../java/store/ckin/api/tag/entity/Tag.java | 14 +- .../ckin/api/tag/service/TagService.java | 3 +- .../api/tag/service/impl/TagServiceImpl.java | 7 +- .../service/impl/BookSaleServiceImplTest.java | 37 +++++ .../api/payment/facade/PaymentFacadeTest.java | 2 + .../api/review/service/ReviewServiceTest.java | 2 +- .../sale/controller/SaleControllerTest.java | 142 +++++++++++++++++- .../ckin/api/sale/facade/SaleFacadeTest.java | 80 ++++++++++ .../sale/repository/SaleRepositoryTest.java | 60 ++++++++ .../service/impl/SaleServiceImplTest.java | 42 +++++- 118 files changed, 1093 insertions(+), 455 deletions(-) delete mode 100644 src/main/java/store/ckin/api/member/domain/MemberPointResponseDto.java create mode 100644 src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java create mode 100644 src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java diff --git a/pom.xml b/pom.xml index ea2e1e67..f065b3e2 100644 --- a/pom.xml +++ b/pom.xml @@ -180,17 +180,14 @@ com.mysema.maven apt-maven-plugin 1.1.3 - - com.querydsl.apt.jpa.JPAAnnotationProcessor - - generate-sources process - target/generated-sources/annotations + target/generated-sources/java + com.querydsl.apt.jpa.JPAAnnotationProcessor diff --git a/src/main/java/store/ckin/api/adit/Auditable.java b/src/main/java/store/ckin/api/adit/Auditable.java index e1c00fe1..12eca415 100644 --- a/src/main/java/store/ckin/api/adit/Auditable.java +++ b/src/main/java/store/ckin/api/adit/Auditable.java @@ -1,13 +1,12 @@ package store.ckin.api.adit; -import lombok.Getter; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - +import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.EntityListeners; import javax.persistence.MappedSuperclass; -import java.time.LocalDateTime; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; /** * 엔티티의 생성 시간을 추적하기 위한 공통 필드 'createdAt'을 포함한 Auditable 추상 클래스입니다. diff --git a/src/main/java/store/ckin/api/advice/WebControllerAdvice.java b/src/main/java/store/ckin/api/advice/WebControllerAdvice.java index 8ba874a0..236ea3d7 100644 --- a/src/main/java/store/ckin/api/advice/WebControllerAdvice.java +++ b/src/main/java/store/ckin/api/advice/WebControllerAdvice.java @@ -1,5 +1,7 @@ package store.ckin.api.advice; +import java.util.List; +import java.util.stream.Collectors; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -8,9 +10,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import store.ckin.api.deliverypolicy.exception.DeliveryPolicyNotActiveException; -import java.util.List; -import java.util.stream.Collectors; - /** * Controller Advice 입니다. * diff --git a/src/main/java/store/ckin/api/author/controller/AuthorController.java b/src/main/java/store/ckin/api/author/controller/AuthorController.java index 168a2bb4..3c806c81 100644 --- a/src/main/java/store/ckin/api/author/controller/AuthorController.java +++ b/src/main/java/store/ckin/api/author/controller/AuthorController.java @@ -1,19 +1,26 @@ package store.ckin.api.author.controller; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.author.dto.request.AuthorCreateRequestDto; import store.ckin.api.author.dto.request.AuthorModifyRequestDto; import store.ckin.api.author.dto.response.AuthorResponseDto; import store.ckin.api.author.service.AuthorService; -import javax.validation.Valid; - /** * AuthorController. * diff --git a/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java b/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java index 338a091d..b1848f30 100644 --- a/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java +++ b/src/main/java/store/ckin/api/author/dto/request/AuthorCreateRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.author.dto.request; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * AuthorCreateRequestDto. diff --git a/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java b/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java index 770f40cc..e491d1eb 100644 --- a/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java +++ b/src/main/java/store/ckin/api/author/dto/request/AuthorModifyRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.author.dto.request; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * AuthorModifyRequestDto. diff --git a/src/main/java/store/ckin/api/author/entity/Author.java b/src/main/java/store/ckin/api/author/entity/Author.java index 452ca9e5..0b884d75 100644 --- a/src/main/java/store/ckin/api/author/entity/Author.java +++ b/src/main/java/store/ckin/api/author/entity/Author.java @@ -1,14 +1,19 @@ package store.ckin.api.author.entity; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.book.relationship.bookauthor.entity.BookAuthor; -import javax.persistence.*; -import java.util.Set; - /** * Author 테이블. * diff --git a/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java b/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java index cc643534..0607a961 100644 --- a/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java +++ b/src/main/java/store/ckin/api/author/repository/impl/AuthorRepositoryImpl.java @@ -1,6 +1,7 @@ package store.ckin.api.author.repository.impl; import com.querydsl.core.types.Projections; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -10,8 +11,6 @@ import store.ckin.api.author.entity.QAuthor; import store.ckin.api.author.repository.AuthorRepositoryCustom; -import java.util.List; - /** * AuthorRepositoryImpl. * diff --git a/src/main/java/store/ckin/api/book/controller/BookController.java b/src/main/java/store/ckin/api/book/controller/BookController.java index 368de409..8bb69f3d 100644 --- a/src/main/java/store/ckin/api/book/controller/BookController.java +++ b/src/main/java/store/ckin/api/book/controller/BookController.java @@ -1,5 +1,8 @@ package store.ckin.api.book.controller; +import java.io.IOException; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -7,7 +10,15 @@ import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.book.dto.request.BookCreateRequestDto; import store.ckin.api.book.dto.request.BookModifyRequestDto; @@ -18,10 +29,6 @@ import store.ckin.api.book.service.BookService; import store.ckin.api.objectstorage.service.ObjectStorageService; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - /** * BookController 클래스입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java b/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java index 517a0d7a..9a3875d7 100644 --- a/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java +++ b/src/main/java/store/ckin/api/book/dto/request/BookCreateRequestDto.java @@ -1,13 +1,16 @@ package store.ckin.api.book.dto.request; +import java.time.LocalDate; +import java.util.Set; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.*; -import java.time.LocalDate; -import java.util.Set; - /** * BookCreateRequestDto 클래스. * diff --git a/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java b/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java index ec49f94c..2440eca1 100644 --- a/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java +++ b/src/main/java/store/ckin/api/book/dto/request/BookModifyRequestDto.java @@ -1,13 +1,16 @@ package store.ckin.api.book.dto.request; +import java.time.LocalDate; +import java.util.Set; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.*; -import java.time.LocalDate; -import java.util.Set; - /** * BookModifyRequestDto. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java index 107ff695..37a8f84f 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java @@ -1,13 +1,12 @@ package store.ckin.api.book.dto.response; +import java.util.ArrayList; +import java.util.List; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.ArrayList; -import java.util.List; - /** * 도서 추출 정보 응답 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java index 2287cc31..95adc321 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookListResponseDto.java @@ -1,12 +1,11 @@ package store.ckin.api.book.dto.response; +import java.time.LocalDate; +import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDate; -import java.util.List; - /** * BookListResponseDto 리스트로 받아올 떄 Dto입니다. * diff --git a/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java index 949a039d..bfa4a8f4 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java @@ -1,12 +1,11 @@ package store.ckin.api.book.dto.response; +import java.time.LocalDate; +import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDate; -import java.util.List; - /** * BookResponseDto 단일 조회 dto클래스. * diff --git a/src/main/java/store/ckin/api/book/entity/Book.java b/src/main/java/store/ckin/api/book/entity/Book.java index 94f32726..cf029450 100644 --- a/src/main/java/store/ckin/api/book/entity/Book.java +++ b/src/main/java/store/ckin/api/book/entity/Book.java @@ -1,6 +1,24 @@ package store.ckin.api.book.entity; -import lombok.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Set; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import store.ckin.api.book.relationship.bookauthor.entity.BookAuthor; @@ -9,11 +27,6 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.file.entity.File; -import javax.persistence.*; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Set; - /** * Book Entity. * diff --git a/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java b/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java index e24dee11..028f4a9d 100644 --- a/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java +++ b/src/main/java/store/ckin/api/book/relationship/bookauthor/entity/BookAuthor.java @@ -1,12 +1,22 @@ package store.ckin.api.book.relationship.bookauthor.entity; -import lombok.*; +import java.io.Serializable; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; import store.ckin.api.author.entity.Author; import store.ckin.api.book.entity.Book; -import javax.persistence.*; -import java.io.Serializable; - /** * BookAuthor 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java b/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java index 57342ede..5b015ce3 100644 --- a/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java +++ b/src/main/java/store/ckin/api/book/relationship/bookcategory/entity/BookCategory.java @@ -1,12 +1,22 @@ package store.ckin.api.book.relationship.bookcategory.entity; -import lombok.*; +import java.io.Serializable; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; import store.ckin.api.book.entity.Book; import store.ckin.api.category.entity.Category; -import javax.persistence.*; -import java.io.Serializable; - /** * BookCategory 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java b/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java index cb65bd6f..13b0e64d 100644 --- a/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java +++ b/src/main/java/store/ckin/api/book/relationship/booktag/entity/BookTag.java @@ -1,12 +1,22 @@ package store.ckin.api.book.relationship.booktag.entity; -import lombok.*; +import java.io.Serializable; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; import store.ckin.api.book.entity.Book; import store.ckin.api.tag.entity.Tag; -import javax.persistence.*; -import java.io.Serializable; - /** * BookTag 연결 테이블. * diff --git a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java index 930bd67b..cf14469a 100644 --- a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java +++ b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java @@ -1,5 +1,7 @@ package store.ckin.api.book.repository; +import java.util.List; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.NoRepositoryBean; @@ -8,9 +10,6 @@ import store.ckin.api.book.dto.response.BookMainPageResponseDto; import store.ckin.api.book.entity.Book; -import java.util.List; -import java.util.Optional; - /** * BookRepositoryCustom 인터페이스. * diff --git a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java index 364fc90a..96a37347 100644 --- a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java +++ b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java @@ -1,5 +1,10 @@ package store.ckin.api.book.service.impl; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -32,12 +37,6 @@ import store.ckin.api.tag.exception.TagNotFoundException; import store.ckin.api.tag.repository.TagRepository; -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - /** * BookService 구현클래스. * diff --git a/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java b/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java index 5ffd097f..03c3b53f 100644 --- a/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java +++ b/src/main/java/store/ckin/api/booksale/dto/request/BookSaleCreateRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.booksale.dto.request; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * 주문 도서 생성 요청 DTO. diff --git a/src/main/java/store/ckin/api/booksale/entity/BookSale.java b/src/main/java/store/ckin/api/booksale/entity/BookSale.java index 6f42e76e..5823154d 100644 --- a/src/main/java/store/ckin/api/booksale/entity/BookSale.java +++ b/src/main/java/store/ckin/api/booksale/entity/BookSale.java @@ -1,12 +1,27 @@ package store.ckin.api.booksale.entity; -import lombok.*; +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; import store.ckin.api.book.entity.Book; import store.ckin.api.sale.entity.Sale; -import javax.persistence.*; -import java.io.Serializable; - /** * 주문 도서 (리스트) Entity. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java index c5c1c11e..b499a217 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepository.java @@ -1,10 +1,9 @@ package store.ckin.api.booksale.repository; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.booksale.entity.BookSale; -import java.util.List; - /** * 주문 도서 (리스트) JPA 레포지토리입니다. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java index 6f5afa7d..f251520a 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryCustom.java @@ -1,10 +1,9 @@ package store.ckin.api.booksale.repository; +import java.util.List; import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; -import java.util.List; - /** * 도서 주문 리스트 레포지토리 커스텀 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java index 11eed7c1..ebbd0823 100644 --- a/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/booksale/repository/BookSaleRepositoryImpl.java @@ -1,14 +1,13 @@ package store.ckin.api.booksale.repository; import com.querydsl.core.types.Projections; +import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.entity.QBookSale; import store.ckin.api.file.entity.QFile; -import java.util.List; - /** * 도서 주문 리스트 Querydsl 레포지토리 클래스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/service/BookSaleService.java b/src/main/java/store/ckin/api/booksale/service/BookSaleService.java index afc61edb..ad127f6a 100644 --- a/src/main/java/store/ckin/api/booksale/service/BookSaleService.java +++ b/src/main/java/store/ckin/api/booksale/service/BookSaleService.java @@ -1,11 +1,10 @@ package store.ckin.api.booksale.service; +import java.util.List; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.booksale.entity.BookSale; -import java.util.List; - /** * 주문 도서 (리스트) 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java b/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java index 8855e6db..cb1c6e93 100644 --- a/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java +++ b/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.booksale.service.impl; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,8 +18,6 @@ import store.ckin.api.sale.exception.SaleNotFoundException; import store.ckin.api.sale.repository.SaleRepository; -import java.util.List; - /** * 주문 도서 (리스트) 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/category/controller/CategoryController.java b/src/main/java/store/ckin/api/category/controller/CategoryController.java index e5f6ed8f..afd1f088 100644 --- a/src/main/java/store/ckin/api/category/controller/CategoryController.java +++ b/src/main/java/store/ckin/api/category/controller/CategoryController.java @@ -1,17 +1,23 @@ package store.ckin.api.category.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; import store.ckin.api.category.dto.response.CategoryResponseDto; import store.ckin.api.category.service.CategoryService; -import javax.validation.Valid; -import java.util.List; - /** * CategoryController 클래스. * @@ -89,4 +95,17 @@ public ResponseEntity deleteCategory(@PathVariable Long categoryId) { categoryService.deleteCategory(categoryId); return ResponseEntity.ok().build(); } + + /** + * 카테고리 이름을 가져옵니다. + * + * @param categoryId + * @return 카테고리 이름 + */ + @GetMapping("/get/{categoryId}") + public ResponseEntity getCategoryName(@PathVariable("categoryId") Long categoryId) { + String categoryName = categoryService.getCategoryName(categoryId); + + return ResponseEntity.ok().body(categoryName); + } } diff --git a/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java b/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java index aabed998..68c4d435 100644 --- a/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java +++ b/src/main/java/store/ckin/api/category/dto/request/CategoryCreateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.category.dto.request; +import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.NotBlank; - /** * CategoryCreateRequestDto. * diff --git a/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java b/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java index 18255756..5a73eaee 100644 --- a/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/category/dto/request/CategoryUpdateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.category.dto.request; +import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.NotBlank; - /** * CategoryUpdateRequestDto. * diff --git a/src/main/java/store/ckin/api/category/entity/Category.java b/src/main/java/store/ckin/api/category/entity/Category.java index b58b3ff1..a67b9273 100644 --- a/src/main/java/store/ckin/api/category/entity/Category.java +++ b/src/main/java/store/ckin/api/category/entity/Category.java @@ -1,14 +1,21 @@ package store.ckin.api.category.entity; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.book.relationship.bookcategory.entity.BookCategory; -import javax.persistence.*; -import java.util.Set; - /** * Category 엔티티 클래스. * diff --git a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java index 35804909..87f29d5a 100644 --- a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java +++ b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java @@ -1,10 +1,9 @@ package store.ckin.api.category.repository; -import org.springframework.data.jpa.repository.JpaRepository; -import store.ckin.api.category.entity.Category; - import java.util.List; import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; +import store.ckin.api.category.entity.Category; /** * CategoryRepository. diff --git a/src/main/java/store/ckin/api/category/service/CategoryService.java b/src/main/java/store/ckin/api/category/service/CategoryService.java index 75f9a944..d7968a84 100644 --- a/src/main/java/store/ckin/api/category/service/CategoryService.java +++ b/src/main/java/store/ckin/api/category/service/CategoryService.java @@ -1,11 +1,10 @@ package store.ckin.api.category.service; +import java.util.List; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; import store.ckin.api.category.dto.response.CategoryResponseDto; -import java.util.List; - /** * CategoryService. * @@ -55,4 +54,11 @@ public interface CategoryService { */ void deleteCategory(Long categoryId); + /** + * 카테고리 이름을 가져옵니다. + * + * @param categoryId 카테고리 아이디 + * @return 카테고리 이름 + */ + String getCategoryName(Long categoryId); } diff --git a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java index 35731da8..88801ced 100644 --- a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java +++ b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java @@ -1,5 +1,7 @@ package store.ckin.api.category.service.impl; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -11,9 +13,6 @@ import store.ckin.api.category.repository.CategoryRepository; import store.ckin.api.category.service.CategoryService; -import java.util.List; -import java.util.stream.Collectors; - /** * CategoryServiceImpl. * @@ -109,6 +108,19 @@ public void deleteCategory(Long categoryId) { categoryRepository.deleteById(categoryId); } + /** + * {@inheritDoc} + */ + @Override + public String getCategoryName(Long categoryId) { + + Category category = categoryRepository.findById(categoryId) + .orElseThrow(() -> new CategoryNotFoundException(categoryId)); + + return category.getCategoryName(); + + } + } diff --git a/src/main/java/store/ckin/api/config/DataSourceConfig.java b/src/main/java/store/ckin/api/config/DataSourceConfig.java index f9436154..b0a74b80 100644 --- a/src/main/java/store/ckin/api/config/DataSourceConfig.java +++ b/src/main/java/store/ckin/api/config/DataSourceConfig.java @@ -1,5 +1,6 @@ package store.ckin.api.config; +import javax.sql.DataSource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.dbcp2.BasicDataSource; @@ -7,8 +8,6 @@ import org.springframework.context.annotation.Configuration; import store.ckin.api.skm.util.KeyManager; -import javax.sql.DataSource; - /** * DBCP2 설정을 위한 클래스입니다. * diff --git a/src/main/java/store/ckin/api/config/QuerydslConfig.java b/src/main/java/store/ckin/api/config/QuerydslConfig.java index cb4abf66..eafb0941 100644 --- a/src/main/java/store/ckin/api/config/QuerydslConfig.java +++ b/src/main/java/store/ckin/api/config/QuerydslConfig.java @@ -1,11 +1,10 @@ package store.ckin.api.config; import com.querydsl.jpa.impl.JPAQueryFactory; +import javax.persistence.EntityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import javax.persistence.EntityManager; - /** * JPAQueryFactory Bean 등록을 위한 클래스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java b/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java index f5bb4f5d..b255d934 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java +++ b/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java @@ -1,23 +1,17 @@ package store.ckin.api.deliverypolicy.controller; -import java.util.List; -import javax.validation.Valid; - import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyCreateRequestDto; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyUpdateRequestDto; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.service.DeliveryPolicyService; +import javax.validation.Valid; +import java.util.List; + /** * 배송비 정책 Controller. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java index 55bea2c0..ff774cea 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java @@ -2,7 +2,6 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; - import lombok.Getter; /** diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java index 22b30875..4ce706e7 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java @@ -2,7 +2,6 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; - import lombok.Getter; /** diff --git a/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java b/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java index ab0fb211..15c7a540 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java +++ b/src/main/java/store/ckin/api/deliverypolicy/entity/DeliveryPolicy.java @@ -6,7 +6,6 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; - import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java index c58d4a3e..460495ba 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java +++ b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java @@ -1,12 +1,12 @@ package store.ckin.api.deliverypolicy.repository; -import java.util.List; -import java.util.Optional; - import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.entity.DeliveryPolicy; +import java.util.List; +import java.util.Optional; + /** * 배송비 정책 Repository Querydsl 사용할 메서드가 있는 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java index 260ce94d..254bfa8e 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java +++ b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java @@ -1,15 +1,14 @@ package store.ckin.api.deliverypolicy.repository; import com.querydsl.core.types.Projections; - -import java.util.List; -import java.util.Optional; - import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.entity.DeliveryPolicy; import store.ckin.api.deliverypolicy.entity.QDeliveryPolicy; +import java.util.List; +import java.util.Optional; + /** * 배송비 정책 Repository Querydsl 사용을 위한 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java b/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java index cab06469..74bde112 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java +++ b/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java @@ -1,11 +1,11 @@ package store.ckin.api.deliverypolicy.service; -import java.util.List; - import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyCreateRequestDto; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyUpdateRequestDto; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; +import java.util.List; + /** * 배송비 정책을 관리하는 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java b/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java index 3f580efa..89acd912 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java +++ b/src/main/java/store/ckin/api/deliverypolicy/service/impl/DeliveryPolicyServiceImpl.java @@ -1,7 +1,6 @@ package store.ckin.api.deliverypolicy.service.impl; import java.util.List; - import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java b/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java index 15a191b7..f43ed2df 100644 --- a/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java +++ b/src/main/java/store/ckin/api/eureka/controller/ApplicationStatusController.java @@ -37,7 +37,8 @@ public class ApplicationStatusController { private final ApplicationStatus applicationStatus; - public ApplicationStatusController(ApplicationInfoManager applicationInfoManager, ApplicationStatus applicationStatus) { + public ApplicationStatusController(ApplicationInfoManager applicationInfoManager, + ApplicationStatus applicationStatus) { this.applicationInfoManager = applicationInfoManager; this.applicationStatus = applicationStatus; } diff --git a/src/main/java/store/ckin/api/file/entity/File.java b/src/main/java/store/ckin/api/file/entity/File.java index e1b1b1ec..9037d97b 100644 --- a/src/main/java/store/ckin/api/file/entity/File.java +++ b/src/main/java/store/ckin/api/file/entity/File.java @@ -1,5 +1,13 @@ package store.ckin.api.file.entity; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -8,9 +16,6 @@ import store.ckin.api.book.entity.Book; import store.ckin.api.review.entity.Review; -import javax.persistence.*; -import javax.validation.constraints.NotNull; - /** * File 업로드를 위한 엔티티 클래스. * diff --git a/src/main/java/store/ckin/api/file/repository/FileRepository.java b/src/main/java/store/ckin/api/file/repository/FileRepository.java index 593fed33..4608d5ef 100644 --- a/src/main/java/store/ckin/api/file/repository/FileRepository.java +++ b/src/main/java/store/ckin/api/file/repository/FileRepository.java @@ -1,10 +1,9 @@ package store.ckin.api.file.repository; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.file.entity.File; -import java.util.Optional; - /** * {class name}. * diff --git a/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java b/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java index f17621f9..8064aac6 100644 --- a/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java +++ b/src/main/java/store/ckin/api/file/repository/FileRepositoryCustom.java @@ -1,8 +1,7 @@ package store.ckin.api.file.repository; -import org.springframework.data.repository.NoRepositoryBean; - import java.util.List; +import org.springframework.data.repository.NoRepositoryBean; /** * description: diff --git a/src/main/java/store/ckin/api/grade/entity/Grade.java b/src/main/java/store/ckin/api/grade/entity/Grade.java index 0e9565b0..8f745675 100644 --- a/src/main/java/store/ckin/api/grade/entity/Grade.java +++ b/src/main/java/store/ckin/api/grade/entity/Grade.java @@ -1,8 +1,15 @@ package store.ckin.api.grade.entity; -import lombok.*; - -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * Grade 테이블에 대한 Entity 입니다. diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index a1649bfb..3719ad24 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -1,11 +1,17 @@ package store.ckin.api.member.controller; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import store.ckin.api.member.domain.MemberPointResponseDto; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +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 store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; @@ -15,8 +21,6 @@ import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.service.MemberService; -import javax.validation.Valid; - /** * Member 에 관한 REST Controller 입니다. * @@ -117,17 +121,4 @@ public ResponseEntity memberNotFoundExceptionHandler(MemberNotFoundExcepti return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } - /** - * 회원의 포인트를 조회하는 메서드 입니다. - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - @GetMapping("/members/{id}/point") - public ResponseEntity getMemberPoint(@PathVariable("id") Long id) { - MemberPointResponseDto responseDto = memberService.getMemberPoint(id); - - log.debug("MemberPointResponseDto = {}", responseDto.getPoint()); - return ResponseEntity.ok(responseDto); - } } diff --git a/src/main/java/store/ckin/api/member/domain/MemberPointResponseDto.java b/src/main/java/store/ckin/api/member/domain/MemberPointResponseDto.java deleted file mode 100644 index 0bca5f97..00000000 --- a/src/main/java/store/ckin/api/member/domain/MemberPointResponseDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package store.ckin.api.member.domain; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 회원의 포인트 응답 DTO 입니다. - * - * @author 정승조 - * @version 2024. 03. 05. - */ - -@Getter -@AllArgsConstructor -public class MemberPointResponseDto { - - private Integer point; -} diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java index 03362364..c51b7aef 100644 --- a/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java +++ b/src/main/java/store/ckin/api/member/domain/request/MemberAuthRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.member.domain.request; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * 로그인할 때 필요한 정보를 가져오는 DTO 입니다. diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java index f6b15741..7b7aee7b 100644 --- a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java +++ b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java @@ -1,14 +1,13 @@ package store.ckin.api.member.domain.request; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.format.annotation.DateTimeFormat; - +import java.time.LocalDate; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import java.time.LocalDate; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; /** * Member 생성을 할 때 필요한 정보를 가져오는 DTO 입니다. diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index 02b062c6..319bdf5b 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -1,14 +1,26 @@ package store.ckin.api.member.entity; -import lombok.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; import store.ckin.api.grade.entity.Grade; -import javax.persistence.*; -import java.time.LocalDate; -import java.time.LocalDateTime; - /** * Member 테이블에 대한 Entity 입니다. diff --git a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java index 123dd84d..005ca9ea 100644 --- a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java +++ b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java @@ -1,7 +1,6 @@ package store.ckin.api.member.repository; import org.springframework.data.repository.NoRepositoryBean; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; @@ -20,11 +19,4 @@ public interface MemberRepositoryCustom { MemberMyPageResponseDto getMyPageInfo(Long id); - /** - * 회원 포인트를 조회하는 메서드 입니다. - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - MemberPointResponseDto getMemberPointById(Long id); } diff --git a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java index 8f883b46..393ca38c 100644 --- a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java +++ b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java @@ -3,7 +3,6 @@ import com.querydsl.core.types.Projections; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.grade.entity.QGrade; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; @@ -71,21 +70,4 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { .fetchOne(); } - /** - * {@inheritDoc} - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - @Override - public MemberPointResponseDto getMemberPointById(Long id) { - - QMember member = QMember.member; - - return from(member) - .where(member.id.eq(id)) - .select(Projections.constructor(MemberPointResponseDto.class, - member.point)) - .fetchOne(); - } } diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 0ec3ab7a..481a104c 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -1,6 +1,5 @@ package store.ckin.api.member.service; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; @@ -33,14 +32,6 @@ public interface MemberService { MemberMyPageResponseDto getMyPageInfo(Long id); - /** - * 회원의 포인트를 조회하는 메서드 입니다. - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - MemberPointResponseDto getMemberPoint(Long id); - /** * 회원의 포인트를 업데이트하는 메서드 입니다. * diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 4975f0c3..6572bcfc 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -1,12 +1,12 @@ package store.ckin.api.member.service.impl; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import store.ckin.api.grade.entity.Grade; import store.ckin.api.grade.exception.GradeNotFoundException; import store.ckin.api.grade.repository.GradeRepository; -import store.ckin.api.member.domain.MemberPointResponseDto; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; @@ -18,8 +18,6 @@ import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.member.service.MemberService; -import java.time.LocalDateTime; - /** * MemberService interface 의 구현체 입니다. * @@ -89,22 +87,6 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { return memberRepository.getMyPageInfo(id); } - /** - * {@inheritDoc} - * - * @param id 회원 ID - * @return 회원 포인트 응답 DTO - */ - @Transactional(readOnly = true) - @Override - public MemberPointResponseDto getMemberPoint(Long id) { - if (!memberRepository.existsById(id)) { - throw new MemberNotFoundException(id); - } - - return memberRepository.getMemberPointById(id); - } - /** * {@inheritDoc} * @@ -118,7 +100,6 @@ public void updatePoint(Long memberId, Integer pointUsage) { .orElseThrow(() -> new MemberNotFoundException(memberId)); // TODO : PointHistory - 사용한 포인트 기록 남기기 (추후 구현) - member.updatePoint(pointUsage); } } diff --git a/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java b/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java index 47cb8140..7ab3e5a8 100644 --- a/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java +++ b/src/main/java/store/ckin/api/objectstorage/dto/response/TokenResponse.java @@ -1,7 +1,6 @@ package store.ckin.api.objectstorage.dto.response; import java.time.LocalDateTime; - import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java b/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java index 3fb5e863..134d1a4d 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java +++ b/src/main/java/store/ckin/api/objectstorage/service/ObjectStorageService.java @@ -1,7 +1,6 @@ package store.ckin.api.objectstorage.service; import java.io.IOException; - import org.springframework.web.multipart.MultipartFile; import store.ckin.api.file.entity.File; diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index daf13ab8..40498ce4 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -9,7 +9,6 @@ import java.util.Objects; import java.util.Optional; import java.util.UUID; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.http.fileupload.IOUtils; @@ -67,7 +66,7 @@ public String requestToken() { String identityUrl = keyManager.keyStore(properties.getIdentity()) + "/tokens"; if (Objects.isNull(tokenId) - || expires.minusMinutes(1).isBefore(LocalDateTime.now())) { + || expires.minusMinutes(1).isBefore(LocalDateTime.now())) { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); diff --git a/src/main/java/store/ckin/api/packaging/controller/PackagingController.java b/src/main/java/store/ckin/api/packaging/controller/PackagingController.java index c04cd9fe..d3079d14 100644 --- a/src/main/java/store/ckin/api/packaging/controller/PackagingController.java +++ b/src/main/java/store/ckin/api/packaging/controller/PackagingController.java @@ -1,17 +1,23 @@ package store.ckin.api.packaging.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.packaging.dto.request.PackagingCreateRequestDto; import store.ckin.api.packaging.dto.request.PackagingUpdateRequestDto; import store.ckin.api.packaging.dto.response.PackagingResponseDto; import store.ckin.api.packaging.service.PackagingService; -import javax.validation.Valid; -import java.util.List; - /** * 포장 정책 컨트롤러입니다. * diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java index c8c4d8ed..4db75d38 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.packaging.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.Size; +import lombok.Getter; /** * 포장 정책 생성 요청 DTO. diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java index c666e857..1f8f485c 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.packaging.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.Size; +import lombok.Getter; /** * 포장 정책 수정 요청 DTO. diff --git a/src/main/java/store/ckin/api/packaging/entity/Packaging.java b/src/main/java/store/ckin/api/packaging/entity/Packaging.java index 79fbe227..f2c27189 100644 --- a/src/main/java/store/ckin/api/packaging/entity/Packaging.java +++ b/src/main/java/store/ckin/api/packaging/entity/Packaging.java @@ -1,12 +1,16 @@ package store.ckin.api.packaging.entity; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import javax.persistence.*; - /** * 포장 정책 엔티티입니다. * diff --git a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java index 00cfe8a9..78cb3799 100644 --- a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java +++ b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryCustom.java @@ -1,10 +1,9 @@ package store.ckin.api.packaging.repository; -import org.springframework.data.repository.NoRepositoryBean; -import store.ckin.api.packaging.dto.response.PackagingResponseDto; - import java.util.List; import java.util.Optional; +import org.springframework.data.repository.NoRepositoryBean; +import store.ckin.api.packaging.dto.response.PackagingResponseDto; /** * 포장 정책 Repository Querydsl 사용할 메서드가 있는 인터페이스입니다. diff --git a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java index 378219f8..a2bbffc6 100644 --- a/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java +++ b/src/main/java/store/ckin/api/packaging/repository/PackagingRepositoryImpl.java @@ -1,14 +1,13 @@ package store.ckin.api.packaging.repository; import com.querydsl.core.types.Projections; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.packaging.dto.response.PackagingResponseDto; import store.ckin.api.packaging.entity.Packaging; import store.ckin.api.packaging.entity.QPackaging; -import java.util.List; -import java.util.Optional; - /** * 포장 정책 Repository Querydsl 사용을 위한 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/packaging/service/PackagingService.java b/src/main/java/store/ckin/api/packaging/service/PackagingService.java index 1f86b596..c7999026 100644 --- a/src/main/java/store/ckin/api/packaging/service/PackagingService.java +++ b/src/main/java/store/ckin/api/packaging/service/PackagingService.java @@ -1,11 +1,10 @@ package store.ckin.api.packaging.service; +import java.util.List; import store.ckin.api.packaging.dto.request.PackagingCreateRequestDto; import store.ckin.api.packaging.dto.request.PackagingUpdateRequestDto; import store.ckin.api.packaging.dto.response.PackagingResponseDto; -import java.util.List; - /** * 포장 정책 서비스 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java b/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java index 11a21567..4ca97492 100644 --- a/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java +++ b/src/main/java/store/ckin/api/packaging/service/impl/PackagingServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.packaging.service.impl; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -13,8 +14,6 @@ import store.ckin.api.packaging.repository.PackagingRepository; import store.ckin.api.packaging.service.PackagingService; -import java.util.List; - /** * 포장 정책 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java index 04ec1f00..59c0f5e6 100644 --- a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java +++ b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java @@ -1,10 +1,9 @@ package store.ckin.api.payment.dto.request; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; -import java.time.LocalDateTime; - /** * 결제 요청 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java index 684e6029..8cfb5260 100644 --- a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java +++ b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java @@ -1,11 +1,10 @@ package store.ckin.api.payment.dto.response; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; -import java.time.LocalDateTime; - /** * 결제 조회 응답 DTO. * diff --git a/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java b/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java index 6d59731c..f2e237cf 100644 --- a/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java +++ b/src/main/java/store/ckin/api/payment/dto/response/PaymentSuccessResponseDto.java @@ -1,11 +1,10 @@ package store.ckin.api.payment.dto.response; +import java.time.LocalDate; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import java.time.LocalDate; - /** * 결제 성공 응답 DTO 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/entity/Payment.java b/src/main/java/store/ckin/api/payment/entity/Payment.java index 02e9a02c..1637caab 100644 --- a/src/main/java/store/ckin/api/payment/entity/Payment.java +++ b/src/main/java/store/ckin/api/payment/entity/Payment.java @@ -1,14 +1,21 @@ package store.ckin.api.payment.entity; +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; +import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.sale.entity.Sale; -import javax.persistence.*; -import java.time.LocalDateTime; - /** * 결제 엔티티 클래스입니다. * diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index 3ecbce72..8129c85b 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -1,5 +1,6 @@ package store.ckin.api.payment.facade; +import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -12,8 +13,6 @@ import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.service.SaleService; -import java.util.Objects; - /** * 결제 퍼사드 클래스입니다. * diff --git a/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java b/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java index 71964d32..ff1f2828 100644 --- a/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java +++ b/src/main/java/store/ckin/api/pointpolicy/controller/PointPolicyController.java @@ -2,7 +2,6 @@ import java.util.List; import javax.validation.Valid; - import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java index 3d471af8..73a5f438 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java @@ -1,9 +1,12 @@ package store.ckin.api.pointpolicy.dto.request; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; +import javax.validation.constraints.Size; import lombok.Getter; -import javax.validation.constraints.*; - /** * 포인트 정책 생성 요청 DTO. * diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java index 7588a135..990fe8ea 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java @@ -1,11 +1,10 @@ package store.ckin.api.pointpolicy.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; import javax.validation.constraints.Size; +import lombok.Getter; /** * 포인트 정책 수정 요청 DTO. diff --git a/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java b/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java index 60bb0df9..205f2379 100644 --- a/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java +++ b/src/main/java/store/ckin/api/pointpolicy/entity/PointPolicy.java @@ -1,14 +1,13 @@ package store.ckin.api.pointpolicy.entity; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * 포인트 정책 엔티티입니다. diff --git a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java index 92dc0e36..13f5027f 100644 --- a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java +++ b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryCustom.java @@ -2,7 +2,6 @@ import java.util.List; import java.util.Optional; - import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; diff --git a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java index 6cd78fe1..39ca632d 100644 --- a/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java +++ b/src/main/java/store/ckin/api/pointpolicy/repository/PointPolicyRepositoryImpl.java @@ -1,10 +1,8 @@ package store.ckin.api.pointpolicy.repository; import com.querydsl.core.types.Projections; - import java.util.List; import java.util.Optional; - import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; import store.ckin.api.pointpolicy.entity.PointPolicy; diff --git a/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java b/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java index 7d929358..2bef2c30 100644 --- a/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java +++ b/src/main/java/store/ckin/api/pointpolicy/service/PointPolicyService.java @@ -1,7 +1,6 @@ package store.ckin.api.pointpolicy.service; import java.util.List; - import store.ckin.api.pointpolicy.dto.request.PointPolicyCreateRequestDto; import store.ckin.api.pointpolicy.dto.request.PointPolicyUpdateRequestDto; import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; diff --git a/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java b/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java index e4168b16..81c9cad5 100644 --- a/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java +++ b/src/main/java/store/ckin/api/pointpolicy/service/impl/PointPolicyServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.pointpolicy.service.impl; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,8 +13,6 @@ import store.ckin.api.pointpolicy.repository.PointPolicyRepository; import store.ckin.api.pointpolicy.service.PointPolicyService; -import java.util.List; - /** * 포인트 정책을 관리하는 서비스 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index c53ea043..50f41f98 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -1,5 +1,6 @@ package store.ckin.api.review.controller; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -7,15 +8,18 @@ import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +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.RequestPart; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.service.ReviewService; -import java.util.List; - /** * ReviewController 클래스. * @@ -37,7 +41,8 @@ public class ReviewController { */ @PostMapping public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto createRequestDto, - @RequestPart(value = "imageList", required = false) List imageList) { + @RequestPart(value = "imageList", required = false) + List imageList) { reviewService.postReview(createRequestDto, imageList); //TODO: point 적립 @@ -53,8 +58,9 @@ public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto creat * @return 리뷰 DTO 페이지 */ @GetMapping("{bookId}") - public ResponseEntity> getReviewPageList(@PageableDefault(page = 0, size = 5) Pageable pageable, - @PathVariable("bookId") Long bookId) { + public ResponseEntity> getReviewPageList( + @PageableDefault(page = 0, size = 5) Pageable pageable, + @PathVariable("bookId") Long bookId) { Page content = reviewService.getReviewPageList(pageable, bookId); return ResponseEntity.ok().body(content); diff --git a/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java b/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java index 5abd3fe6..cff9dae8 100644 --- a/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java +++ b/src/main/java/store/ckin/api/review/dto/response/ReviewResponseDto.java @@ -1,11 +1,10 @@ package store.ckin.api.review.dto.response; +import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - /** * ReviewResponseDto 리뷰 응답 dto. * diff --git a/src/main/java/store/ckin/api/review/entity/Review.java b/src/main/java/store/ckin/api/review/entity/Review.java index 27b87b29..281e5883 100644 --- a/src/main/java/store/ckin/api/review/entity/Review.java +++ b/src/main/java/store/ckin/api/review/entity/Review.java @@ -1,5 +1,14 @@ package store.ckin.api.review.entity; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -8,8 +17,6 @@ import store.ckin.api.book.entity.Book; import store.ckin.api.member.entity.Member; -import javax.persistence.*; - /** * Review 엔티티 클래스입니다. * diff --git a/src/main/java/store/ckin/api/review/service/ReviewService.java b/src/main/java/store/ckin/api/review/service/ReviewService.java index 66fe21fd..87875927 100644 --- a/src/main/java/store/ckin/api/review/service/ReviewService.java +++ b/src/main/java/store/ckin/api/review/service/ReviewService.java @@ -1,5 +1,6 @@ package store.ckin.api.review.service; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.transaction.annotation.Transactional; @@ -8,8 +9,6 @@ import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; -import java.util.List; - /** * ReviewService * diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index 63cf3fc3..6a2aab9e 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -1,5 +1,8 @@ package store.ckin.api.review.service.impl; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -23,10 +26,6 @@ import store.ckin.api.review.repository.ReviewRepository; import store.ckin.api.review.service.ReviewService; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - /** * ReviewService * @@ -70,7 +69,7 @@ public void postReview(ReviewCreateRequestDto createRequestDto, List getSalePaymentInfo(@PathVariable("sal return ResponseEntity.ok(saleFacade.getSalePaymentInfo(saleNumber)); } - @GetMapping("/guest/{saleNumber}") - public ResponseEntity getSaleDetailBySaleNumber( - @PathVariable("saleNumber") String saleNumber) { - return ResponseEntity.ok(saleFacade.getSaleDetailBySaleNumber(saleNumber)); + /** + * 비회원의 주문 상세 정보를 조회하는 메서드입니다. + * + * @param saleNumber 주문 번호 + * @return 200 (OK), 주문 상세 정보 + */ + @GetMapping("/guest") + public ResponseEntity getGuestSaleDetailBySaleNumber( + @RequestParam("saleNumber") String saleNumber, + @RequestParam("ordererContact") String ordererContact) { + return ResponseEntity.ok(saleFacade.getGuestSaleDetailBySaleNumber(saleNumber, ordererContact)); + } + + @GetMapping("/member") + public ResponseEntity getMemberSaleDetailBySaleNumber( + @RequestParam("saleNumber") String saleNumber, + @RequestParam("memberId") Long memberId) { + + + return ResponseEntity.ok(saleFacade.getMemberSaleDetailBySaleNumber(saleNumber, memberId)); + } + + /** + * 회원의 모든 주문을 조회하는 메서드입니다. + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 200 (OK), 회원의 주문 응답 DTO 리스트 + */ + @GetMapping("/member/{memberId}") + public ResponseEntity>> getSalesByMemberId( + @PathVariable Long memberId, + @PageableDefault Pageable pageable) { + + return ResponseEntity.ok(saleFacade.getSalesByMemberId(memberId, pageable)); } } diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java index b12f696a..d7aeaf8e 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateNoBookRequestDto.java @@ -1,14 +1,13 @@ package store.ckin.api.sale.dto.request; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.springframework.format.annotation.DateTimeFormat; - +import java.time.LocalDate; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.PositiveOrZero; -import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.format.annotation.DateTimeFormat; /** * 도서 정보를 제외한 주문 생성 요청 DTO . @@ -23,6 +22,9 @@ public class SaleCreateNoBookRequestDto { private Long memberId; + @NotBlank(message = "주문명 입력해주세요.") + private String saleTitle; + @NotBlank(message = "주문자 이름을 입력해주세요.") private String saleOrderName; diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java index a48040a7..87bbee12 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java @@ -1,15 +1,18 @@ package store.ckin.api.sale.dto.request; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; +import javax.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Getter; import org.springframework.format.annotation.DateTimeFormat; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; -import javax.validation.constraints.*; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - /** * 주문 생성 요청 DTO. * @@ -25,6 +28,9 @@ public class SaleCreateRequestDto { private Long memberId; + @NotBlank(message = "주문명을 입력해주세요") + private String saleTitle; + @NotBlank(message = "주문자 이름을 입력해주세요.") private String saleOrdererName; @@ -66,6 +72,7 @@ public class SaleCreateRequestDto { public SaleCreateNoBookRequestDto toCreateSaleWithoutBookRequestDto() { return new SaleCreateNoBookRequestDto( memberId, + saleTitle, saleOrdererName, saleOrdererContact, saleReceiverName, diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java index 225e02a0..1ba889e2 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleDetailResponseDto.java @@ -1,12 +1,11 @@ package store.ckin.api.sale.dto.response; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.payment.dto.response.PaymentResponseDto; -import java.util.List; - /** * 주문 상세 조회 응답 DTO 입니다. * diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleInfoResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleInfoResponseDto.java index b6440974..f6988626 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleInfoResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleInfoResponseDto.java @@ -1,5 +1,6 @@ package store.ckin.api.sale.dto.response; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; @@ -25,4 +26,6 @@ public class SaleInfoResponseDto { private String saleOrdererContact; private Integer totalPrice; + + private LocalDateTime saleDate; } diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java index 71905ab8..c6e815c7 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java @@ -1,14 +1,13 @@ package store.ckin.api.sale.dto.response; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; import store.ckin.api.sale.entity.Sale; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Objects; - /** * 주문 조회 응답 DTO. * @@ -23,6 +22,8 @@ public class SaleResponseDto { private Long saleId; + private String title; + private String memberEmail; private String saleNumber; @@ -59,6 +60,7 @@ public static SaleResponseDto toDto(Sale sale) { return new SaleResponseDto( sale.getSaleId(), + sale.getSaleTitle(), Objects.nonNull(sale.getMember()) ? sale.getMember().getEmail() : "비회원", sale.getSaleNumber(), sale.getSaleOrdererName(), diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java index bdae6292..4012b0ee 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java @@ -1,11 +1,12 @@ package store.ckin.api.sale.dto.response; -import lombok.Getter; -import store.ckin.api.booksale.dto.response.BookSaleResponseDto; - import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import lombok.Builder; +import lombok.Getter; +import store.ckin.api.booksale.dto.response.BookSaleResponseDto; /** * 주문 상세 정보와 주문한 책 정보 응답 DTO 클래스입니다. @@ -40,6 +41,8 @@ public class SaleWithBookResponseDto { private LocalDate saleDeliveryDate; + private LocalDateTime saleDate; + private String postcode; private String address; @@ -48,11 +51,13 @@ public class SaleWithBookResponseDto { private Integer totalPrice; - public SaleWithBookResponseDto(Long saleId, String saleNumber, String memberEmail, String saleOrderName, - String saleOrderContact, - String saleReceiverName, String saleReceiverContact, Integer deliveryFee, - LocalDate saleDeliveryDate, String postcode, String address, Integer pointUsage, + @Builder + public SaleWithBookResponseDto(String saleTitle, Long saleId, String saleNumber, String memberEmail, + String saleOrderName, String saleOrderContact, String saleReceiverName, + String saleReceiverContact, Integer deliveryFee, LocalDate saleDeliveryDate, + LocalDateTime saleDate, String postcode, String address, Integer pointUsage, Integer totalPrice) { + this.saleTitle = saleTitle; this.saleId = saleId; this.saleNumber = saleNumber; this.memberEmail = memberEmail; @@ -62,6 +67,7 @@ public SaleWithBookResponseDto(Long saleId, String saleNumber, String memberEmai this.saleReceiverContact = saleReceiverContact; this.deliveryFee = deliveryFee; this.saleDeliveryDate = saleDeliveryDate; + this.saleDate = saleDate; this.postcode = postcode; this.address = address; this.pointUsage = pointUsage; @@ -72,24 +78,8 @@ public void addBookSale(BookSaleResponseDto bookSale) { this.bookSaleList.add(bookSale); } - public void updateSaleTitle(String saleTitle) { - - if (bookSaleList.size() == 1) { - this.saleTitle = saleTitle; - return; - } - - this.saleTitle = saleTitle + " 외 " + (bookSaleList.size() - 1) + "권"; - } - public SaleInfoResponseDto extractSaleInfoResponseDto() { - return new SaleInfoResponseDto( - saleTitle, - saleNumber, - memberEmail, - saleOrdererName, - saleOrdererContact, - totalPrice - ); + return new SaleInfoResponseDto(saleTitle, saleNumber, memberEmail, saleOrdererName, saleOrdererContact, + totalPrice, saleDate); } } diff --git a/src/main/java/store/ckin/api/sale/entity/Sale.java b/src/main/java/store/ckin/api/sale/entity/Sale.java index b17959b8..5e345e9a 100644 --- a/src/main/java/store/ckin/api/sale/entity/Sale.java +++ b/src/main/java/store/ckin/api/sale/entity/Sale.java @@ -1,5 +1,20 @@ package store.ckin.api.sale.entity; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -7,11 +22,6 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.member.entity.Member; -import javax.persistence.*; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Set; - /** * 주문 엔티티 클래스입니다. * @@ -30,17 +40,14 @@ public class Sale { * 주문의 배송 상태를 나타내는 Enum. */ public enum DeliveryStatus { - READY, - IN_PROGRESS, - DONE + READY, IN_PROGRESS, DONE } /** * 주문의 결제 상태를 나타내는 Enum. */ public enum PaymentStatus { - WAITING, - PAID + WAITING, PAID } @Id @@ -55,6 +62,9 @@ public enum PaymentStatus { @OneToMany(mappedBy = "sale", fetch = FetchType.EAGER) private Set bookSales; + @Column(name = "sale_title") + private String saleTitle; + @Column(name = "sale_number") private String saleNumber; @@ -103,16 +113,16 @@ public enum PaymentStatus { private String saleShippingPostCode; @Builder - public Sale(Long saleId, Member member, Set bookSales, String saleNumber, String saleOrdererName, - String saleOrdererContact, String saleReceiverName, String saleReceiverContact, - String saleReceiverAddress, - LocalDateTime saleDate, LocalDateTime saleShippingDate, LocalDate saleDeliveryDate, - DeliveryStatus saleDeliveryStatus, Integer saleDeliveryFee, Integer salePointUsage, - Integer saleTotalPrice, - PaymentStatus salePaymentStatus, String saleShippingPostCode) { + public Sale(Long saleId, Member member, Set bookSales, String saleTitle, String saleNumber, + String saleOrdererName, String saleOrdererContact, String saleReceiverName, String saleReceiverContact, + String saleReceiverAddress, LocalDateTime saleDate, LocalDateTime saleShippingDate, + LocalDate saleDeliveryDate, DeliveryStatus saleDeliveryStatus, Integer saleDeliveryFee, + Integer salePointUsage, Integer saleTotalPrice, PaymentStatus salePaymentStatus, + String saleShippingPostCode) { this.saleId = saleId; this.member = member; this.bookSales = bookSales; + this.saleTitle = saleTitle; this.saleNumber = saleNumber; this.saleOrdererName = saleOrdererName; this.saleOrdererContact = saleOrdererContact; diff --git a/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java b/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java new file mode 100644 index 00000000..4b955625 --- /dev/null +++ b/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java @@ -0,0 +1,14 @@ +package store.ckin.api.sale.exception; + +/** + * 주문자 정보와 회원 아이디가 일치하지 않을 때 발생하는 예외입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ +public class SaleMemberNotMatchException extends RuntimeException { + + public SaleMemberNotMatchException(String saleNumber) { + super(String.format("주문 번호 (%s)의 주문자 ID와 요청한 회원 ID가 일치하지 않습니다.", saleNumber)); + } +} diff --git a/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java b/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java new file mode 100644 index 00000000..722d8af2 --- /dev/null +++ b/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java @@ -0,0 +1,14 @@ +package store.ckin.api.sale.exception; + +/** + * {class name}. + * + * @author 정승조 + * @version 2024. 03. 14. + */ +public class SaleOrdererContactNotMatchException extends RuntimeException { + + public SaleOrdererContactNotMatchException(String saleNumber, String ordererContact) { + super(String.format("주문 번호 (%s)의 주문자 연락처 (%s)가 일치하지 않습니다.", saleNumber, ordererContact)); + } +} diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 1c604ea6..3975b376 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -1,5 +1,7 @@ package store.ckin.api.sale.facade; +import java.util.List; +import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; @@ -9,19 +11,19 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.service.BookSaleService; import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.service.PaymentService; -import store.ckin.api.sale.dto.request.SaleCreateNoBookRequestDto; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; +import store.ckin.api.sale.exception.SaleMemberNotMatchException; +import store.ckin.api.sale.exception.SaleOrdererContactNotMatchException; import store.ckin.api.sale.service.SaleService; -import java.util.List; - /** * 주문 퍼사드 클래스입니다. * @@ -51,11 +53,7 @@ public class SaleFacade { @Transactional public String createSale(SaleCreateRequestDto requestDto) { - SaleCreateNoBookRequestDto saleInfo = - requestDto.toCreateSaleWithoutBookRequestDto(); - - SaleResponseDto sale = saleService.createSale(saleInfo); - + SaleResponseDto sale = saleService.createSale(requestDto.toCreateSaleWithoutBookRequestDto()); bookSaleService.createBookSale(sale.getSaleId(), requestDto.getBookSaleList()); if (requestDto.getMemberId() != null && requestDto.getPointUsage() > 0) { @@ -131,16 +129,89 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { } /** - * 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. + * 비회원의 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. * - * @param saleNumber 주문 번호 (UUID) + * @param saleNumber 주문 번호 (UUID) + * @param ordererContact 주문자 연락처 * @return 주문 상세 정보 DTO */ - public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber) { + @Transactional(readOnly = true) + public SaleDetailResponseDto getGuestSaleDetailBySaleNumber(String saleNumber, String ordererContact) { + + SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); + + if (!ordererContact.equals(saleDetail.getSaleOrdererContact())) { + throw new SaleOrdererContactNotMatchException(saleNumber, ordererContact); + } + + List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); + PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); + return new SaleDetailResponseDto(bookSale, saleDetail, payment); + } + + /** + * 회원의 주문 번호를 통해 주문 상세 정보를 조회하는 메서드입니다. + * + * @param saleNumber 주문 번호 + * @param memberId 회원 ID + * @return 주문 상세 정보 응답 DTO + */ + @Transactional(readOnly = true) + public SaleDetailResponseDto getMemberSaleDetailBySaleNumber(String saleNumber, Long memberId) { + + SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); + MemberInfoDetailResponseDto memberInfo = memberService.getMemberInfoDetail(memberId); + + if (!Objects.equals(memberInfo.getEmail(), saleDetail.getMemberEmail())) { + throw new SaleMemberNotMatchException(saleNumber); + } + + List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); + PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); + + return new SaleDetailResponseDto(bookSale, saleDetail, payment); + } + /** + * 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. + * + * @param saleNumber 주문 번호 + * @param memberId 회원 ID + * @param ordererContact 주문자 연락처 + * @return 주문 상세 정보 응답 DTO + */ + @Transactional(readOnly = true) + public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, Long memberId, String ordererContact) { SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); + + if (memberId != null) { // 회원인 경우 + if (!Objects.equals(memberId, saleDetail.getSaleId())) { + throw new SaleMemberNotMatchException(saleNumber); + } + } else { // 비회원인 경우 + if (!ordererContact.equals(saleDetail.getSaleOrdererContact())) { + throw new SaleOrdererContactNotMatchException(saleNumber, ordererContact); + } + } + List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); + return new SaleDetailResponseDto(bookSale, saleDetail, payment); } + + + /** + * 회원 ID를 통해 해당 회원의 모든 주문 내역을 조회하는 메서드입니다. + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 페이징 처리된 주문 응답 DTO 리스트 + */ + @Transactional(readOnly = true) + public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { + return saleService.getSalesByMemberId(memberId, pageable); + } + + } diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepository.java b/src/main/java/store/ckin/api/sale/repository/SaleRepository.java index d02f29be..0a42054a 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepository.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepository.java @@ -36,4 +36,5 @@ public interface SaleRepository extends JpaRepository, SaleRepositor * @return 주문 */ Sale getBySaleNumber(String saleNumber); + } diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryCustom.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryCustom.java index 44f50334..72001f23 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryCustom.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryCustom.java @@ -1,6 +1,10 @@ package store.ckin.api.sale.repository; +import java.util.List; +import org.springframework.data.domain.Pageable; import org.springframework.data.repository.NoRepositoryBean; +import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; @@ -38,4 +42,13 @@ public interface SaleRepositoryCustom { * @return 주문 응답 DTO */ SaleResponseDto findBySaleNumber(String saleNumber); + + /** + * 회원 ID로 전체 주문 정보를 조회하는 메서드입니다. + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 주문 응답 DTO 리스트 + */ + PagedResponse> findAllByMemberId(Long memberId, Pageable pageable); } diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java index 365cbeba..ca7b174f 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java @@ -1,18 +1,20 @@ package store.ckin.api.sale.repository; import com.querydsl.core.types.Projections; +import java.util.List; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; -import store.ckin.api.book.entity.QBook; import store.ckin.api.booksale.dto.response.BookSaleResponseDto; import store.ckin.api.booksale.entity.QBookSale; +import store.ckin.api.common.domain.PageInfo; +import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.member.entity.QMember; +import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.entity.QSale; import store.ckin.api.sale.entity.Sale; -import java.util.List; - /** * 주문 Repository Querydsl 구현 클래스입니다. * @@ -44,6 +46,7 @@ public SaleResponseDto findBySaleId(Long saleId) { .on(sale.member.eq(member)) .select(Projections.constructor(SaleResponseDto.class, sale.saleId, + sale.saleTitle, sale.member.email, sale.saleNumber, sale.saleOrdererName, @@ -73,11 +76,7 @@ public SaleResponseDto findBySaleId(Long saleId) { public SaleWithBookResponseDto getSaleWithBook(String saleNumber) { QSale sale = QSale.sale; - QBookSale bookSale = QBookSale.bookSale; - - QBook book = QBook.book; - QMember member = QMember.member; @@ -101,6 +100,7 @@ public SaleWithBookResponseDto getSaleWithBook(String saleNumber) { .leftJoin(sale.member, member) .on(sale.member.id.eq(member.id)) .select(Projections.constructor(SaleWithBookResponseDto.class, + sale.saleTitle, sale.saleId, sale.saleNumber, sale.member.email, @@ -110,6 +110,7 @@ public SaleWithBookResponseDto getSaleWithBook(String saleNumber) { sale.saleReceiverContact, sale.saleDeliveryFee, sale.saleDeliveryDate, + sale.saleDate, sale.saleShippingPostCode, sale.saleReceiverAddress, sale.salePointUsage, @@ -121,13 +122,6 @@ public SaleWithBookResponseDto getSaleWithBook(String saleNumber) { responseDto.addBookSale(bookSaleResponseDto); } - String saleTitle = from(book) - .where(book.bookId.eq(bookSaleResponseDtoList.get(0).getBookId())) - .select(book.bookTitle) - .fetchFirst(); - - responseDto.updateSaleTitle(saleTitle); - return responseDto; } @@ -149,6 +143,7 @@ public SaleResponseDto findBySaleNumber(String saleNumber) { .on(sale.member.eq(member)) .select(Projections.constructor(SaleResponseDto.class, sale.saleId, + sale.saleTitle, sale.member.email, sale.saleNumber, sale.saleOrdererName, @@ -169,4 +164,46 @@ public SaleResponseDto findBySaleNumber(String saleNumber) { } + /** + * {@inheritDoc} + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 주문 응답 DTO 리스트 + */ + @Override + public PagedResponse> findAllByMemberId(Long memberId, Pageable pageable) { + + QSale sale = QSale.sale; + + List responseDto = from(sale) + .where(sale.member.id.eq(memberId)) + .select(Projections.constructor(SaleInfoResponseDto.class, + sale.saleTitle, + sale.saleNumber, + sale.member.email, + sale.saleOrdererName, + sale.saleOrdererContact, + sale.saleTotalPrice, + sale.saleDate)) + .orderBy(sale.saleId.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + + long totalElements = from(sale) + .where(sale.member.id.eq(memberId)) + .fetchCount(); + + return new PagedResponse<>( + responseDto, + PageInfo.builder() + .page(pageable.getPageNumber()) + .size(pageable.getPageSize()) + .totalElements((int) totalElements) + .totalPages((int) Math.ceil((double) totalElements / pageable.getPageSize())) + .build()); + } + } diff --git a/src/main/java/store/ckin/api/sale/service/SaleService.java b/src/main/java/store/ckin/api/sale/service/SaleService.java index f282180d..87db7c65 100644 --- a/src/main/java/store/ckin/api/sale/service/SaleService.java +++ b/src/main/java/store/ckin/api/sale/service/SaleService.java @@ -1,5 +1,6 @@ package store.ckin.api.sale.service; +import java.util.List; import org.springframework.data.domain.Pageable; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.sale.dto.request.SaleCreateNoBookRequestDto; @@ -7,8 +8,6 @@ import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; -import java.util.List; - /** * 주문 서비스 인터페이스입니다. * @@ -75,4 +74,12 @@ public interface SaleService { */ SaleResponseDto getSaleBySaleNumber(String saleNumber); + /** + * 회원 ID를 통해 해당 회원의 모든 주문 내역을 조회합니다. + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 페이징 처리된 주문 응답 DTO 리스트 + */ + PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable); } diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index 0cd9a0f5..7469aec1 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -1,5 +1,11 @@ package store.ckin.api.sale.service.impl; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -21,13 +27,6 @@ import store.ckin.api.sale.repository.SaleRepository; import store.ckin.api.sale.service.SaleService; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Collectors; - /** * 주문 서비스 구현 클래스입니다. * @@ -63,6 +62,7 @@ public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) { String saleNumber = UUID.randomUUID().toString().replace("-", "").substring(0, 20); Sale sale = Sale.builder() .member(member.orElse(null)) + .saleTitle(requestDto.getSaleTitle()) .saleNumber(saleNumber) .saleOrdererName(requestDto.getSaleOrderName()) .saleOrdererContact(requestDto.getSaleOrderContact()) @@ -95,8 +95,12 @@ public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) { public PagedResponse> getSales(Pageable pageable) { Page salePage = saleRepository.findAllByOrderBySaleIdDesc(pageable); - PageInfo pageInfo = PageInfo.builder().page(pageable.getPageNumber()).size(pageable.getPageSize()) - .totalElements((int) salePage.getTotalElements()).totalPages(salePage.getTotalPages()).build(); + PageInfo pageInfo = PageInfo.builder() + .page(pageable.getPageNumber()) + .size(pageable.getPageSize()) + .totalElements((int) salePage.getTotalElements()) + .totalPages(salePage.getTotalPages()) + .build(); List currentPageSalesResponse = salePage.getContent().stream().map(SaleResponseDto::toDto).collect(Collectors.toList()); @@ -177,6 +181,7 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { * @param saleNumber * @return 주문 조회 응답 DTO */ + @Transactional(readOnly = true) @Override public SaleResponseDto getSaleBySaleNumber(String saleNumber) { @@ -189,4 +194,17 @@ public SaleResponseDto getSaleBySaleNumber(String saleNumber) { log.debug("responseDto = {}", responseDto); return responseDto; } + + /** + * {@inheritDoc} + * + * @param memberId 회원 ID + * @param pageable 페이지 정보 + * @return 페이징 처리된 주문 응답 DTO 리스트 + */ + @Transactional(readOnly = true) + @Override + public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { + return saleRepository.findAllByMemberId(memberId, pageable); + } } diff --git a/src/main/java/store/ckin/api/skm/util/KeyManager.java b/src/main/java/store/ckin/api/skm/util/KeyManager.java index 7e3006f8..4132e20e 100644 --- a/src/main/java/store/ckin/api/skm/util/KeyManager.java +++ b/src/main/java/store/ckin/api/skm/util/KeyManager.java @@ -1,5 +1,17 @@ package store.ckin.api.skm.util; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.util.List; +import java.util.Objects; +import javax.net.ssl.SSLContext; import lombok.RequiredArgsConstructor; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; @@ -19,15 +31,6 @@ import store.ckin.api.skm.dto.KeyResponseDto; import store.ckin.api.skm.exception.KeyMangerException; -import javax.net.ssl.SSLContext; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.security.*; -import java.security.cert.CertificateException; -import java.util.List; -import java.util.Objects; - /** * NHN Cloud SKM 에서 저장된 데이터를 가져오기 위한 매니저 클래스 * diff --git a/src/main/java/store/ckin/api/tag/controller/TagController.java b/src/main/java/store/ckin/api/tag/controller/TagController.java index 367683f3..0c35a9ca 100644 --- a/src/main/java/store/ckin/api/tag/controller/TagController.java +++ b/src/main/java/store/ckin/api/tag/controller/TagController.java @@ -1,11 +1,20 @@ package store.ckin.api.tag.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.common.dto.ErrorResponse; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.tag.dto.request.TagCreateRequestDto; @@ -16,9 +25,6 @@ import store.ckin.api.tag.exception.TagNotFoundException; import store.ckin.api.tag.service.TagService; -import javax.validation.Valid; -import java.util.List; - /** * 태그 요청을 받는 컨트롤러 클래스 * @@ -38,7 +44,8 @@ public class TagController { * @return 모든 태그 리스트 */ @GetMapping - public ResponseEntity>> getAllTagList(@PageableDefault(page = 0, size = 10) Pageable pageable) { + public ResponseEntity>> getAllTagList( + @PageableDefault(page = 0, size = 10) Pageable pageable) { return ResponseEntity.ok(tagService.readTagList(pageable)); } diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java index 4387f2a2..6ea7b47b 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagCreateRequestDto.java @@ -1,9 +1,8 @@ package store.ckin.api.tag.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.Getter; /** * 태그 생성을 위한 요청 DTO diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java index 24099408..cf6787c7 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagDeleteRequestDto.java @@ -1,8 +1,7 @@ package store.ckin.api.tag.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotNull; +import lombok.Getter; /** * description diff --git a/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java b/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java index 33f1f6a8..8bb679fd 100644 --- a/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/tag/dto/request/TagUpdateRequestDto.java @@ -1,9 +1,8 @@ package store.ckin.api.tag.dto.request; -import lombok.Getter; - import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.Getter; /** * 태그 업데이트 요청 Dto diff --git a/src/main/java/store/ckin/api/tag/entity/Tag.java b/src/main/java/store/ckin/api/tag/entity/Tag.java index efd7b2d8..5ca80537 100644 --- a/src/main/java/store/ckin/api/tag/entity/Tag.java +++ b/src/main/java/store/ckin/api/tag/entity/Tag.java @@ -1,8 +1,16 @@ package store.ckin.api.tag.entity; -import lombok.*; - -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; /** * description: diff --git a/src/main/java/store/ckin/api/tag/service/TagService.java b/src/main/java/store/ckin/api/tag/service/TagService.java index a91c8a33..331f7186 100644 --- a/src/main/java/store/ckin/api/tag/service/TagService.java +++ b/src/main/java/store/ckin/api/tag/service/TagService.java @@ -1,5 +1,6 @@ package store.ckin.api.tag.service; +import java.util.List; import org.springframework.data.domain.Pageable; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.tag.dto.request.TagCreateRequestDto; @@ -7,8 +8,6 @@ import store.ckin.api.tag.dto.request.TagUpdateRequestDto; import store.ckin.api.tag.dto.response.TagResponseDto; -import java.util.List; - /** * 태그 서비스 인터페이스 * diff --git a/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java b/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java index 15da4f1c..05806c8e 100644 --- a/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java +++ b/src/main/java/store/ckin/api/tag/service/impl/TagServiceImpl.java @@ -1,5 +1,8 @@ package store.ckin.api.tag.service.impl; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -17,10 +20,6 @@ import store.ckin.api.tag.repository.TagRepository; import store.ckin.api.tag.service.TagService; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - /** * 태그 서비스 구현 클래스 * diff --git a/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java b/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java index 8151728a..a3cb72dd 100644 --- a/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java @@ -1,5 +1,6 @@ package store.ckin.api.booksale.service.impl; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; @@ -22,6 +23,7 @@ import store.ckin.api.book.exception.BookNotFoundException; import store.ckin.api.book.repository.BookRepository; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; +import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.repository.BookSaleRepository; import store.ckin.api.packaging.dto.response.PackagingResponseDto; @@ -212,4 +214,39 @@ void testUpdateBookSaleState() { assertEquals(BookSale.BookSaleState.COMPLETE, firstBookSale.getBookSaleState()); assertEquals(BookSale.BookSaleState.COMPLETE, secondBookSale.getBookSaleState()); } + + @Test + @DisplayName("주문 ID로 주문 도서 상세 정보 조회 테스트") + void testGetBookSaleDetail() { + + BookAndBookSaleResponseDto responseDto = + new BookAndBookSaleResponseDto( + 1L, + "test.com", + "테스트 책", + 3, + 1L, + "A포장", + 3000, + 15000 + ); + + List responseDtoList = List.of(responseDto); + + given(bookSaleRepository.getBookSaleDetailBySaleId(anyLong())) + .willReturn(responseDtoList); + + List bookSaleDetail = bookSaleService.getBookSaleDetail(1L); + + assertAll( + () -> assertEquals(responseDto.getBookId(), bookSaleDetail.get(0).getBookId()), + () -> assertEquals(responseDto.getFileUrl(), bookSaleDetail.get(0).getFileUrl()), + () -> assertEquals(responseDto.getBookTitle(), bookSaleDetail.get(0).getBookTitle()), + () -> assertEquals(responseDto.getQuantity(), bookSaleDetail.get(0).getQuantity()), + () -> assertEquals(responseDto.getCouponId(), bookSaleDetail.get(0).getCouponId()), + () -> assertEquals(responseDto.getPackagingType(), bookSaleDetail.get(0).getPackagingType()), + () -> assertEquals(responseDto.getPackagingPrice(), bookSaleDetail.get(0).getPackagingPrice()), + () -> assertEquals(responseDto.getPaymentAmount(), bookSaleDetail.get(0).getPaymentAmount()) + ); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java index c99b3bb2..399c31c1 100644 --- a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java +++ b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java @@ -94,6 +94,7 @@ void testCreatePayment_AmountNotCorrectException() { SaleResponseDto saleResponseDto = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -131,6 +132,7 @@ void testCreatePayment() { SaleResponseDto saleResponseDto = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", diff --git a/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java b/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java index 961bf490..8aaad353 100644 --- a/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java +++ b/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java @@ -103,7 +103,7 @@ void setUp() { .bookRegularPrice(20000) .bookDiscountRate(10) .bookSalePrice(18000) - .bookReviewRate("4.3") + .bookReviewRate("4") .build(); review = new Review(1L, 5, "good", member, book); diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index 6c3d5bc0..a6951a8f 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -65,6 +65,7 @@ void testCreateSale() throws Exception { SaleCreateRequestDto requestDto = new SaleCreateRequestDto( 1L, + "테스트 책", "정승조", "01012345678", "정승조", @@ -96,6 +97,7 @@ void testGetSales() throws Exception { SaleResponseDto responseDto = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -155,6 +157,7 @@ void testGetSaleDetail() throws Exception { SaleResponseDto sale = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -258,6 +261,7 @@ void testUpdateSalePaymentPaidStatus() throws Exception { void testGetSaleWithBooks() throws Exception { SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( + "홍길동전", 1L, "ABC1234DEF", "test@test.com", @@ -267,6 +271,7 @@ void testGetSaleWithBooks() throws Exception { "01011112222", 3000, LocalDate.of(2024, 3, 7).plusDays(1), + LocalDateTime.of(2024, 3, 7, 12, 0), "12345", "광주광역시 동구 조선대 5길", 0, @@ -309,7 +314,8 @@ void testGetSalePaymentInfo() throws Exception { "test@test.com", "Tester", "01012341234", - 45000 + 45000, + LocalDateTime.of(2024, 3, 7, 12, 0) ); given(saleFacade.getSalePaymentInfo(anyString())) @@ -329,4 +335,138 @@ void testGetSalePaymentInfo() throws Exception { verify(saleFacade, times(1)).getSalePaymentInfo(anyString()); } + + @Test + @DisplayName("비회원 주문 상세 정보를 조회 테스트") + void testGetSaleDetailBySaleNumber() throws Exception { + + BookAndBookSaleResponseDto bookSale = + new BookAndBookSaleResponseDto( + 1L, + "test-img.com", + "홍길동전", + 5, + 3L, + "A 포장", + 1000, + 50000); + + + SaleResponseDto sale = + new SaleResponseDto( + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.of(2024, 3, 7, 12, 0, 0), + LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 10000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + + PaymentResponseDto payment = new PaymentResponseDto( + 1L, + 1L, + "1232321", + "1234", + LocalDateTime.now(), + LocalDateTime.now().plusHours(1), + "test.com"); + + + SaleDetailResponseDto responseDto = + new SaleDetailResponseDto(List.of(bookSale), sale, payment); + + given(saleFacade.getGuestSaleDetailBySaleNumber(anyString(), anyString())) + .willReturn(responseDto); + + mockMvc.perform(get("/api/sales/guest") + .param("saleNumber", "12abc23") + .param("ordererContact", "01012341234")) + .andExpectAll( + status().isOk(), + content().contentType(MediaType.APPLICATION_JSON), + jsonPath("$.bookSaleList[0].bookId").value(bookSale.getBookId()), + jsonPath("$.bookSaleList[0].fileUrl").value(bookSale.getFileUrl()), + jsonPath("$.bookSaleList[0].bookTitle").value(bookSale.getBookTitle()), + jsonPath("$.bookSaleList[0].quantity").value(bookSale.getQuantity()), + jsonPath("$.bookSaleList[0].couponId").value(bookSale.getCouponId()), + jsonPath("$.bookSaleList[0].packagingType").value(bookSale.getPackagingType()), + jsonPath("$.bookSaleList[0].packagingPrice").value(bookSale.getPackagingPrice()), + jsonPath("$.bookSaleList[0].paymentAmount").value(bookSale.getPaymentAmount()), + jsonPath("$.saleResponseDto.saleId").value(sale.getSaleId()), + jsonPath("$.saleResponseDto.memberEmail").value(sale.getMemberEmail()), + jsonPath("$.saleResponseDto.saleNumber").value(sale.getSaleNumber()), + jsonPath("$.saleResponseDto.saleOrdererName").value(sale.getSaleOrdererName()), + jsonPath("$.saleResponseDto.saleOrdererContact").value(sale.getSaleOrdererContact()), + jsonPath("$.saleResponseDto.saleReceiverName").value(sale.getSaleReceiverName()), + jsonPath("$.saleResponseDto.saleReceiverContact").value(sale.getSaleReceiverContact()), + jsonPath("$.saleResponseDto.saleReceiverAddress").value(sale.getSaleReceiverAddress()), + jsonPath("$.saleResponseDto.saleDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleShippingDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleDeliveryDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleDeliveryStatus").value(sale.getSaleDeliveryStatus().name()), + jsonPath("$.saleResponseDto.saleDeliveryFee").value(sale.getSaleDeliveryFee()), + jsonPath("$.saleResponseDto.salePointUsage").value(sale.getSalePointUsage()), + jsonPath("$.saleResponseDto.saleTotalPrice").value(sale.getSaleTotalPrice()), + jsonPath("$.saleResponseDto.salePaymentStatus").value(sale.getSalePaymentStatus().name()), + jsonPath("$.saleResponseDto.saleShippingPostCode").value(sale.getSaleShippingPostCode()), + jsonPath("$.paymentResponseDto.paymentId").value(payment.getPaymentId()), + jsonPath("$.paymentResponseDto.saleId").value(payment.getSaleId()), + jsonPath("$.paymentResponseDto.paymentKey").value(payment.getPaymentKey()), + jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus()), + jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(), + jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), + jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) + ); + } + + @Test + @DisplayName("회원 ID로 회원의 모든 주문 리스트 조회") + void testGetSalesByMemberId() throws Exception { + SaleInfoResponseDto saleInfo + = new SaleInfoResponseDto("홍길동전 외 3권", + "123aqbc4", + "test@test.com", + "Tester", + "010123211234", + 45000, + LocalDateTime.of(2024, 3, 7, 12, 0)); + + PageInfo pageInfo = PageInfo.builder() + .page(1) + .size(10) + .build(); + + PagedResponse> pagedResponse = new PagedResponse<>(List.of(saleInfo), pageInfo); + + given(saleFacade.getSalesByMemberId(anyLong(), any())) + .willReturn(pagedResponse); + + mockMvc.perform(get("/api/sales/member/{memberId}", 1L)) + .andExpectAll( + status().isOk(), + content().contentType(MediaType.APPLICATION_JSON), + jsonPath("$.data[0].saleTitle").value(saleInfo.getSaleTitle()), + jsonPath("$.data[0].saleNumber").value(saleInfo.getSaleNumber()), + jsonPath("$.data[0].memberEmail").value(saleInfo.getMemberEmail()), + jsonPath("$.data[0].saleOrdererName").value(saleInfo.getSaleOrdererName()), + jsonPath("$.data[0].saleOrdererContact").value(saleInfo.getSaleOrdererContact()), + jsonPath("$.data[0].totalPrice").value(saleInfo.getTotalPrice()), + jsonPath("$.data[0].saleDate").isNotEmpty(), + jsonPath("$.pageInfo.page").value(pageInfo.getPage()), + jsonPath("$.pageInfo.size").value(pageInfo.getSize()) + ); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index fe4b030f..dce9f9ec 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; @@ -33,6 +34,7 @@ import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.exception.SaleOrdererContactNotMatchException; import store.ckin.api.sale.service.SaleService; /** @@ -87,6 +89,7 @@ void testCreateSale() { SaleCreateRequestDto requestDto = new SaleCreateRequestDto( 1L, + "테스트 책", "정승조", "01012345678", "정승조", @@ -105,6 +108,7 @@ void testCreateSale() { SaleResponseDto sale = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -166,6 +170,7 @@ void testGetSaleDetail() { SaleResponseDto sale = new SaleResponseDto( 1L, + "테스트 제목", "test@test.com", "1234", "정승조", @@ -227,6 +232,7 @@ void testUpdateSalePaymentPaidStatus() { void testGetSaleWithBookResponse() { SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( + "홍길동전", 1L, "ABC1234DEF", "test@test.com", @@ -236,6 +242,7 @@ void testGetSaleWithBookResponse() { "01011112222", 3000, LocalDate.of(2024, 3, 7).plusDays(1), + LocalDateTime.of(2024, 3, 7, 12, 0), "12345", "광주광역시 동구 조선대 5길", 0, @@ -261,4 +268,77 @@ void testGetSalePaymentInfo() { verify(saleService, times(1)).getSalePaymentInfo("123456"); } + + @Test + @DisplayName("주문 번호로 주문 상세 조회 테스트 - 실패 (주문자 전화번호와 넘겨받은 전화번호가 다른 경우)") + void testGetSaleDetailBySaleNumber_Fail_Contact_Different() { + + SaleResponseDto sale = + new SaleResponseDto( + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.of(2024, 3, 7, 12, 0, 0), + LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 10000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleBySaleNumber(anyString())) + .willReturn(sale); + + assertThrows(SaleOrdererContactNotMatchException.class, + () -> saleFacade.getGuestSaleDetailBySaleNumber("1234", "010111111111")); + } + + @Test + @DisplayName("주문 번호로 주문 상세 조회 테스트 - 성공") + void testGetSaleDetailBySaleNumber_Success() { + SaleResponseDto sale = + new SaleResponseDto( + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.of(2024, 3, 7, 12, 0, 0), + LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 10000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleBySaleNumber(anyString())) + .willReturn(sale); + + SaleDetailResponseDto actual = saleFacade.getGuestSaleDetailBySaleNumber("1234", "01012345678"); + + assertEquals(sale, actual.getSaleResponseDto()); + } + + @Test + @DisplayName("회원 ID로 회원의 모든 주문 내역 조회") + void testGetSalesByMemberId() { + saleFacade.getSalesByMemberId(1L, Pageable.ofSize(10)); + verify(saleService, times(1)).getSalesByMemberId(1L, Pageable.ofSize(10)); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java index d5b225a9..3b58ad88 100644 --- a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java +++ b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java @@ -15,10 +15,14 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import store.ckin.api.book.entity.Book; import store.ckin.api.booksale.entity.BookSale; +import store.ckin.api.common.domain.PageInfo; +import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.grade.entity.Grade; import store.ckin.api.member.entity.Member; +import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.entity.Sale; @@ -104,6 +108,7 @@ void testSaveSale() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -148,6 +153,7 @@ void testFindAllByOrderBySaleIdDesc() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -169,6 +175,7 @@ void testFindAllByOrderBySaleIdDesc() { Sale sale2 = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책2") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -198,6 +205,7 @@ void testFindBySaleId() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -242,6 +250,7 @@ void testGetSaleWithBook() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -302,6 +311,7 @@ void testFindBySaleNumber() { Sale sale = Sale.builder() .member(member) .saleNumber(saleNumber) + .saleTitle("테스트 책") .saleOrdererName("정승조") .saleOrdererContact("01012341234") .saleReceiverName("정승조") @@ -339,4 +349,54 @@ void testFindBySaleNumber() { () -> assertEquals(actual.getSaleShippingPostCode(), savedSale.getSaleShippingPostCode()) ); } + + @Test + @DisplayName("회원 ID로 회원의 주문 조회 테스트") + void testFindAllByMemberId() { + + Sale sale = Sale.builder() + .member(member) + .saleNumber(saleNumber) + .saleTitle("테스트 책") + .saleOrdererName("정승조") + .saleOrdererContact("01012341234") + .saleReceiverName("정승조") + .saleReceiverContact("01012341234") + .saleReceiverAddress("광주광역시 동구 조선대 5길 IT 융합대학") + .saleDate(LocalDateTime.now()) + .saleShippingDate(LocalDateTime.now()) + .saleDeliveryDate(LocalDate.now().plusDays(2)) + .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryFee(3000) + .salePointUsage(1000) + .salePaymentStatus(Sale.PaymentStatus.WAITING) + .saleShippingPostCode("123456") + .build(); + + entityManager.persist(sale); + + entityManager.flush(); + + PagedResponse> pagedResponse = + saleRepository.findAllByMemberId(member.getId(), Pageable.ofSize(10)); + + SaleInfoResponseDto actual = pagedResponse.getData().get(0); + PageInfo pageInfo = pagedResponse.getPageInfo(); + + assertAll( + () -> assertEquals(sale.getSaleTitle(), actual.getSaleTitle()), + () -> assertEquals(sale.getSaleNumber(), actual.getSaleNumber()), + () -> assertEquals(sale.getMember().getEmail(), actual.getMemberEmail()), + () -> assertEquals(sale.getSaleOrdererName(), actual.getSaleOrdererName()), + () -> assertEquals(sale.getSaleOrdererContact(), actual.getSaleOrdererContact()), + () -> assertEquals(sale.getSaleTotalPrice(), actual.getTotalPrice()), + () -> assertEquals(sale.getSaleDate(), actual.getSaleDate()), + () -> assertEquals(0, pageInfo.getPage()), + () -> assertEquals(10, pageInfo.getSize()), + () -> assertEquals(1, pageInfo.getTotalElements()), + () -> assertEquals(1, pageInfo.getTotalPages()) + ); + + + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java index b1471d87..d116fcb8 100644 --- a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java @@ -25,6 +25,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import store.ckin.api.common.domain.PageInfo; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.grade.entity.Grade; import store.ckin.api.member.entity.Member; @@ -113,6 +114,7 @@ void testCreateSale() { // given SaleCreateNoBookRequestDto requestDto = new SaleCreateNoBookRequestDto( 1L, + "홍길동전", "정승조", "01012345678", "정승조", @@ -255,6 +257,7 @@ void testGetSaleWithBook_Success() { .willReturn(true); SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( + "홍길동전", 1L, "ABC1234DEF", "test@test.com", @@ -263,7 +266,8 @@ void testGetSaleWithBook_Success() { "Tester", "01011112222", 3000, - LocalDate.now().plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(1), + LocalDateTime.of(2024, 3, 7, 12, 0), "12345", "광주광역시 동구 조선대 5길", 0, @@ -316,6 +320,7 @@ void testGetSalePaymentInfo_Success() { .willReturn(true); SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( + "홍길동전", 1L, "ABC1234DEF", "test@test.com", @@ -325,6 +330,7 @@ void testGetSalePaymentInfo_Success() { "01011112222", 3000, LocalDate.now().plusDays(1), + LocalDateTime.now(), "12345", "광주광역시 동구 조선대 5길", 0, @@ -391,6 +397,40 @@ void testGetSaleDetailBySaleNumber_Success() { () -> assertEquals(saleDetail.getSaleShippingPostCode(), sale.getSaleShippingPostCode()) ); + verify(saleRepository, times(1)).existsBySaleNumber(anyString()); } + @Test + @DisplayName("회원 ID로 주문 조회 테스트") + void testGetSalesByMemberId() { + + SaleInfoResponseDto saleInfo + = new SaleInfoResponseDto("홍길동전 외 3권", + "123aqbc4", + "test@test.com", + "Tester", + "010123211234", + 45000, + LocalDateTime.of(2024, 3, 7, 12, 0)); + + + PageInfo pageInfo = new PageInfo(1, 10, 45, 5); + PagedResponse> sales = new PagedResponse<>(List.of(saleInfo), pageInfo); + + given(saleRepository.findAllByMemberId(anyLong(), any())) + .willReturn(sales); + + PagedResponse> responseDto = + saleService.getSalesByMemberId(1L, Pageable.ofSize(10)); + + + + assertAll( + () -> assertNotNull(responseDto), + () -> assertEquals(responseDto.getData().get(0), saleInfo), + () -> assertEquals(sales.getPageInfo(), pageInfo) + ); + + verify(saleRepository, times(1)).findAllByMemberId(anyLong(), any()); + } } \ No newline at end of file From bfd2e139b706cc85018ff0c03c373d03fd283084 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Sat, 16 Mar 2024 00:43:55 +0900 Subject: [PATCH 042/161] =?UTF-8?q?[TEST]=20=EA=B2=80=EC=A6=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/review/repository/impl/ReviewRepositoryTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java b/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java index 013b7479..6defd456 100644 --- a/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java +++ b/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java @@ -118,7 +118,8 @@ void testFindReviewsByMemberWithPagination() { Assertions.assertThat(dto.getReviewId()).isEqualTo(review.getReviewId()); Assertions.assertThat(dto.getAuthor()).isEqualTo("ckin"); Assertions.assertThat(dto.getMessage()).isEqualTo(review.getReviewComment()); - // 필요한 나머지 필드에 대한 검증 + Assertions.assertThat(dto.getReviewRate()).isEqualTo(review.getReviewRate()); + Assertions.assertThat(dto.getReviewDate()).isEqualTo(review.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); } From 90a0142f50b7a704f972380ed222ea503fd73bcd Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 15 Mar 2024 22:25:19 +0900 Subject: [PATCH 043/161] =?UTF-8?q?[FEAT]=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EB=82=B4=EC=97=AD=20(PointHistory)=20=EC=83=9D=EC=84=B1,=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PointHistoryController.java | 50 ++++++++++++++ .../request/PointHistoryCreateRequestDto.java | 35 ++++++++++ .../dto/response/PointHistoryResponseDto.java | 23 +++++++ .../api/pointhistory/entity/PointHistory.java | 49 +++++++++++++ .../repository/PointHistoryRepository.java | 13 ++++ .../PointHistoryRepositoryCustom.java | 16 +++++ .../PointHistoryRepositoryImpl.java | 47 +++++++++++++ .../service/PointHistoryService.java | 20 ++++++ .../service/impl/PointHistoryServiceImpl.java | 68 +++++++++++++++++++ 9 files changed, 321 insertions(+) create mode 100644 src/main/java/store/ckin/api/pointhistory/controller/PointHistoryController.java create mode 100644 src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java create mode 100644 src/main/java/store/ckin/api/pointhistory/dto/response/PointHistoryResponseDto.java create mode 100644 src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java create mode 100644 src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepository.java create mode 100644 src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryCustom.java create mode 100644 src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java create mode 100644 src/main/java/store/ckin/api/pointhistory/service/PointHistoryService.java create mode 100644 src/main/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImpl.java diff --git a/src/main/java/store/ckin/api/pointhistory/controller/PointHistoryController.java b/src/main/java/store/ckin/api/pointhistory/controller/PointHistoryController.java new file mode 100644 index 00000000..6cd618ba --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/controller/PointHistoryController.java @@ -0,0 +1,50 @@ +package store.ckin.api.pointhistory.controller; + +import java.util.List; +import javax.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.pointhistory.dto.request.PointHistoryCreateRequestDto; +import store.ckin.api.pointhistory.dto.response.PointHistoryResponseDto; +import store.ckin.api.pointhistory.service.PointHistoryService; + +/** + * 포인트 내역 컨트롤러입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/point-history") +public class PointHistoryController { + + private final PointHistoryService pointHistoryService; + + @PostMapping + public ResponseEntity createPointHistory(@Valid @RequestBody PointHistoryCreateRequestDto requestDto) { + + pointHistoryService.createPointHistory(requestDto); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + @GetMapping + public ResponseEntity>> getPointHistoryList( + @RequestParam("memberId") Long memberId, + @PageableDefault Pageable pageable) { + PagedResponse> responseDto = + pointHistoryService.getPointHistoryList(memberId, pageable); + return ResponseEntity.ok().body(responseDto); + } +} diff --git a/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java b/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java new file mode 100644 index 00000000..c4a999d5 --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java @@ -0,0 +1,35 @@ +package store.ckin.api.pointhistory.dto.request; + +import java.time.LocalDate; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +/** + * 포인트 내역 생성 요청 DTO. + * + * @author 정승조 + * @version 2024. 03. 15. + */ + +@Getter +@Builder +@AllArgsConstructor +public class PointHistoryCreateRequestDto { + + @NotNull(message = "회원 아이디는 필수입니다.") + private Long memberId; + + @NotBlank(message = "포인트 내역 사유를 입력해주세요.") + @Size(max = 50, message = "포인트 내역 사유는 50자 이내로 입력해주세요.") + private String pointHistoryReason; + + @NotNull(message = "포인트를 입력해주세요.") + private Integer pointHistoryPoint; + + @NotNull(message = "기록하신 시간을 입력해주세요.") + private LocalDate pointHistoryTime; +} diff --git a/src/main/java/store/ckin/api/pointhistory/dto/response/PointHistoryResponseDto.java b/src/main/java/store/ckin/api/pointhistory/dto/response/PointHistoryResponseDto.java new file mode 100644 index 00000000..68b31231 --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/dto/response/PointHistoryResponseDto.java @@ -0,0 +1,23 @@ +package store.ckin.api.pointhistory.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 포인트 내역 응답 DTO. + * + * @author 정승조 + * @version 2024. 03. 15. + */ + +@Getter +@AllArgsConstructor +public class PointHistoryResponseDto { + + private Long id; + private Long memberId; + private String pointHistoryReason; + private Integer pointHistoryPoint; + private String pointHistoryTime; + +} diff --git a/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java b/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java new file mode 100644 index 00000000..c6268495 --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java @@ -0,0 +1,49 @@ +package store.ckin.api.pointhistory.entity; + +import java.time.LocalDate; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import store.ckin.api.member.entity.Member; + +/** + * 포인트 내역 엔티티입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ + +@Entity +@Table(name = "PointHistory") +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PointHistory { + + @Id + @Column(name = "pointhistory_id") + private Long pointHistoryId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @Column(name = "pointhistory_reason") + private String pointHistoryReason; + + @Column(name = "pointhistory_point") + private Integer pointHistoryPoint; + + @Column(name = "pointhistory_time") + private LocalDate pointHistoryTime; + +} diff --git a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepository.java b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepository.java new file mode 100644 index 00000000..82ed4726 --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepository.java @@ -0,0 +1,13 @@ +package store.ckin.api.pointhistory.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import store.ckin.api.pointhistory.entity.PointHistory; + +/** + * PointHistory 레포지토리입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ +public interface PointHistoryRepository extends JpaRepository, PointHistoryRepositoryCustom { +} diff --git a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryCustom.java b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryCustom.java new file mode 100644 index 00000000..99636eab --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryCustom.java @@ -0,0 +1,16 @@ +package store.ckin.api.pointhistory.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import store.ckin.api.pointhistory.dto.response.PointHistoryResponseDto; + +/** + * 포인트 내역 레포지토리 커스텀 인터페이스입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ +public interface PointHistoryRepositoryCustom { + + Page getPointHistoryList(Long memberId, Pageable pageable); +} diff --git a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java new file mode 100644 index 00000000..ffc9abb0 --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java @@ -0,0 +1,47 @@ +package store.ckin.api.pointhistory.repository; + +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.JPQLQuery; +import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; +import org.springframework.data.support.PageableExecutionUtils; +import store.ckin.api.pointhistory.dto.response.PointHistoryResponseDto; +import store.ckin.api.pointhistory.entity.PointHistory; +import store.ckin.api.pointhistory.entity.QPointHistory; + +/** + * 포인트 내역 레포지토리 Querydsl 구현 클래스입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ +public class PointHistoryRepositoryImpl extends QuerydslRepositorySupport implements PointHistoryRepositoryCustom { + + public PointHistoryRepositoryImpl() { + super(PointHistory.class); + } + + @Override + public Page getPointHistoryList(Long memberId, Pageable pageable) { + + QPointHistory pointHistory = QPointHistory.pointHistory; + + List pointHistoryList = from(pointHistory) + .where(pointHistory.member.id.eq(memberId)) + .select(Projections.constructor(PointHistoryResponseDto.class, + pointHistory.pointHistoryReason, + pointHistory.pointHistoryPoint, + pointHistory.pointHistoryTime)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + JPQLQuery count = from(pointHistory) + .where(pointHistory.member.id.eq(memberId)) + .select(getBuilder().count()); + + return PageableExecutionUtils.getPage(pointHistoryList, pageable, count::fetchCount); + } +} diff --git a/src/main/java/store/ckin/api/pointhistory/service/PointHistoryService.java b/src/main/java/store/ckin/api/pointhistory/service/PointHistoryService.java new file mode 100644 index 00000000..5bd48d1e --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/service/PointHistoryService.java @@ -0,0 +1,20 @@ +package store.ckin.api.pointhistory.service; + +import java.util.List; +import org.springframework.data.domain.Pageable; +import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.pointhistory.dto.request.PointHistoryCreateRequestDto; +import store.ckin.api.pointhistory.dto.response.PointHistoryResponseDto; + +/** + * 포인트 내역 서비스 인터페이스입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ +public interface PointHistoryService { + + void createPointHistory(PointHistoryCreateRequestDto requestDto); + + PagedResponse> getPointHistoryList(Long memberId, Pageable pageable); +} diff --git a/src/main/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImpl.java b/src/main/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImpl.java new file mode 100644 index 00000000..eaacd4e4 --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImpl.java @@ -0,0 +1,68 @@ +package store.ckin.api.pointhistory.service.impl; + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import store.ckin.api.common.domain.PageInfo; +import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.member.entity.Member; +import store.ckin.api.member.exception.MemberNotFoundException; +import store.ckin.api.member.repository.MemberRepository; +import store.ckin.api.pointhistory.dto.request.PointHistoryCreateRequestDto; +import store.ckin.api.pointhistory.dto.response.PointHistoryResponseDto; +import store.ckin.api.pointhistory.entity.PointHistory; +import store.ckin.api.pointhistory.repository.PointHistoryRepository; +import store.ckin.api.pointhistory.service.PointHistoryService; + +/** + * 포인트 내역 서비스 인터페이스입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ + +@Service +@RequiredArgsConstructor +public class PointHistoryServiceImpl implements PointHistoryService { + + private final PointHistoryRepository pointHistoryRepository; + + private final MemberRepository memberRepository; + + @Override + @Transactional + public void createPointHistory(PointHistoryCreateRequestDto requestDto) { + + Long memberId = requestDto.getMemberId(); + + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new MemberNotFoundException(memberId)); + + + PointHistory pointHistory = PointHistory.builder() + .member(member) + .pointHistoryReason(requestDto.getPointHistoryReason()) + .pointHistoryPoint(requestDto.getPointHistoryPoint()) + .pointHistoryTime(requestDto.getPointHistoryTime()) + .build(); + + pointHistoryRepository.save(pointHistory); + } + + @Override + @Transactional(readOnly = true) + public PagedResponse> getPointHistoryList(Long memberId, Pageable pageable) { + Page pointHistoryList = pointHistoryRepository.getPointHistoryList(memberId, pageable); + PageInfo pageInfo = PageInfo.builder() + .page(pointHistoryList.getNumber()) + .totalPages(pointHistoryList.getTotalPages()) + .totalElements((int) pointHistoryList.getTotalElements()) + .size(pointHistoryList.getSize()) + .build(); + + return new PagedResponse<>(pointHistoryList.getContent(), pageInfo); + } +} From d21af59c3ed160960830f81ce0fe2870c44a2257 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Sat, 16 Mar 2024 01:39:56 +0900 Subject: [PATCH 044/161] =?UTF-8?q?[REFACTOR]=20=ED=8F=AC=EC=9D=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=81=EB=A6=BD,=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/store/ckin/api/book/entity/Book.java | 2 +- .../store/ckin/api/member/entity/Member.java | 2 +- .../api/member/service/MemberService.java | 8 +++ .../service/impl/MemberServiceImpl.java | 52 +++++++++++++-- .../request/PointHistoryCreateRequestDto.java | 2 + .../dto/response/PointHistoryResponseDto.java | 6 +- .../api/pointhistory/entity/PointHistory.java | 3 + .../PointHistoryRepositoryImpl.java | 2 + .../service/impl/PointHistoryServiceImpl.java | 1 - .../review/controller/ReviewController.java | 10 +-- .../review/exception/SaveFileException.java | 14 ++++ .../ckin/api/review/facade/ReviewFacade.java | 66 +++++++++++++++++++ .../service/impl/ReviewServiceImpl.java | 41 ++++++------ .../api/sale/controller/SaleController.java | 2 + .../ckin/api/sale/facade/SaleFacade.java | 25 ++++++- .../sale/service/impl/SaleServiceImpl.java | 3 + 16 files changed, 206 insertions(+), 33 deletions(-) create mode 100644 src/main/java/store/ckin/api/review/exception/SaveFileException.java create mode 100644 src/main/java/store/ckin/api/review/facade/ReviewFacade.java diff --git a/src/main/java/store/ckin/api/book/entity/Book.java b/src/main/java/store/ckin/api/book/entity/Book.java index cf029450..42abecd9 100644 --- a/src/main/java/store/ckin/api/book/entity/Book.java +++ b/src/main/java/store/ckin/api/book/entity/Book.java @@ -110,7 +110,7 @@ public class Book { @OneToMany(mappedBy = "book", fetch = FetchType.LAZY) private Set sales; - public void setBookReviewRate(Integer reviewRate) { + public void updateBookReviewRate(Integer reviewRate) { this.bookReviewRate = String.valueOf(Integer.parseInt(this.bookReviewRate) + reviewRate); } } diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index 319bdf5b..af7d2d21 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -105,6 +105,6 @@ public enum Role { public void updatePoint(Integer pointUsage) { - this.point -= pointUsage; + this.point += pointUsage; } } diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 481a104c..85a8ae5d 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -39,4 +39,12 @@ public interface MemberService { * @param pointUsage 사용한 포인트 */ void updatePoint(Long memberId, Integer pointUsage); + + /** + * 회원 등급의 적립률에 따라 적립 포인트를 업데이트하는 메서드입니다. + * + * @param memberId 회원 ID + * @param totalPrice 총 가격 + */ + void updateRewardPoint(Long memberId, Integer totalPrice); } diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 6572bcfc..35ae855d 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -1,5 +1,6 @@ package store.ckin.api.member.service.impl; +import java.time.LocalDate; import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -17,6 +18,11 @@ import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.member.service.MemberService; +import store.ckin.api.pointhistory.entity.PointHistory; +import store.ckin.api.pointhistory.repository.PointHistoryRepository; +import store.ckin.api.pointpolicy.entity.PointPolicy; +import store.ckin.api.pointpolicy.exception.PointPolicyNotFoundException; +import store.ckin.api.pointpolicy.repository.PointPolicyRepository; /** * MemberService interface 의 구현체 입니다. @@ -31,6 +37,12 @@ public class MemberServiceImpl implements MemberService { private final GradeRepository gradeRepository; + private final PointHistoryRepository pointHistoryRepository; + + private final PointPolicyRepository pointPolicyRepository; + + private static final Long REGISTER_POINT_POLICY_ID = 100L; + @Transactional @Override public void createMember(MemberCreateRequestDto memberCreateRequestDto) { @@ -41,6 +53,11 @@ public void createMember(MemberCreateRequestDto memberCreateRequestDto) { Grade grade = gradeRepository.findById(1L) .orElseThrow(GradeNotFoundException::new); + // 회원가입 포인트 정책 조회 + PointPolicy registerPolicy = pointPolicyRepository.findById(REGISTER_POINT_POLICY_ID) + .orElseThrow(() -> new PointPolicyNotFoundException(REGISTER_POINT_POLICY_ID)); + + Member member = Member.builder() .grade(grade) .email(memberCreateRequestDto.getEmail()) @@ -51,10 +68,19 @@ public void createMember(MemberCreateRequestDto memberCreateRequestDto) { .state(Member.State.ACTIVE) .latestLoginAt(LocalDateTime.now()) .role(Member.Role.MEMBER) - .point(5000) + .point(registerPolicy.getPointPolicyReserve()) .build(); - memberRepository.save(member); + Member savedMember = memberRepository.save(member); + + PointHistory pointHistory = PointHistory.builder() + .member(savedMember) + .pointHistoryPoint(registerPolicy.getPointPolicyReserve()) + .pointHistoryReason(registerPolicy.getPointPolicyName()) + .pointHistoryTime(LocalDate.now()) + .build(); + + pointHistoryRepository.save(pointHistory); } @Transactional(readOnly = true) @@ -98,8 +124,26 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { public void updatePoint(Long memberId, Integer pointUsage) { Member member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberNotFoundException(memberId)); - - // TODO : PointHistory - 사용한 포인트 기록 남기기 (추후 구현) member.updatePoint(pointUsage); + + pointHistoryRepository.save(PointHistory.builder() + .member(member) + .pointHistoryPoint(-pointUsage) + .pointHistoryReason("주문 사용") + .pointHistoryTime(LocalDate.now()) + .build()); + } + + @Override + public void updateRewardPoint(Long memberId, Integer totalPrice) { + + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new MemberNotFoundException(memberId)); + + Grade grade = gradeRepository.findById(member.getGrade().getGradeId()) + .orElseThrow(GradeNotFoundException::new); + + long reward = Math.round(((double) grade.getPointRatio() / 100) * totalPrice); + member.updatePoint((int) reward); } } diff --git a/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java b/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java index c4a999d5..dcec93be 100644 --- a/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java +++ b/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.ToString; /** * 포인트 내역 생성 요청 DTO. @@ -18,6 +19,7 @@ @Getter @Builder @AllArgsConstructor +@ToString public class PointHistoryCreateRequestDto { @NotNull(message = "회원 아이디는 필수입니다.") diff --git a/src/main/java/store/ckin/api/pointhistory/dto/response/PointHistoryResponseDto.java b/src/main/java/store/ckin/api/pointhistory/dto/response/PointHistoryResponseDto.java index 68b31231..275cb868 100644 --- a/src/main/java/store/ckin/api/pointhistory/dto/response/PointHistoryResponseDto.java +++ b/src/main/java/store/ckin/api/pointhistory/dto/response/PointHistoryResponseDto.java @@ -1,5 +1,6 @@ package store.ckin.api.pointhistory.dto.response; +import java.time.LocalDate; import lombok.AllArgsConstructor; import lombok.Getter; @@ -15,9 +16,12 @@ public class PointHistoryResponseDto { private Long id; + private Long memberId; + private String pointHistoryReason; + private Integer pointHistoryPoint; - private String pointHistoryTime; + private LocalDate pointHistoryTime; } diff --git a/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java b/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java index c6268495..fec2d4f5 100644 --- a/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java +++ b/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java @@ -4,6 +4,8 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @@ -30,6 +32,7 @@ public class PointHistory { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "pointhistory_id") private Long pointHistoryId; diff --git a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java index ffc9abb0..b7bd48ff 100644 --- a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java +++ b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java @@ -31,6 +31,8 @@ public Page getPointHistoryList(Long memberId, Pageable List pointHistoryList = from(pointHistory) .where(pointHistory.member.id.eq(memberId)) .select(Projections.constructor(PointHistoryResponseDto.class, + pointHistory.pointHistoryId, + pointHistory.member.id, pointHistory.pointHistoryReason, pointHistory.pointHistoryPoint, pointHistory.pointHistoryTime)) diff --git a/src/main/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImpl.java b/src/main/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImpl.java index eaacd4e4..6a317d06 100644 --- a/src/main/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImpl.java +++ b/src/main/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImpl.java @@ -41,7 +41,6 @@ public void createPointHistory(PointHistoryCreateRequestDto requestDto) { Member member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberNotFoundException(memberId)); - PointHistory pointHistory = PointHistory.builder() .member(member) .pointHistoryReason(requestDto.getPointHistoryReason()) diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index 44b2ec37..154f8aea 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -17,7 +17,7 @@ import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; import store.ckin.api.review.dto.response.ReviewResponseDto; -import store.ckin.api.review.service.ReviewService; +import store.ckin.api.review.facade.ReviewFacade; /** * ReviewController 클래스. @@ -30,7 +30,8 @@ @RequiredArgsConstructor @RequestMapping("/api/review") public class ReviewController { - private final ReviewService reviewService; + + private final ReviewFacade reviewFacade; /** * 리뷰 업로드를 구현하는 메소드 입니다. @@ -43,8 +44,7 @@ public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto creat @RequestPart(value = "imageList", required = false) List imageList) { - reviewService.postReview(createRequestDto, imageList); - //TODO: point 적립 + reviewFacade.postReview(createRequestDto, imageList); return ResponseEntity.status(HttpStatus.CREATED).build(); } @@ -60,7 +60,7 @@ public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto creat public ResponseEntity> getReviewPageList( @PageableDefault(page = 0, size = 5) Pageable pageable, @PathVariable("bookId") Long bookId) { - Page content = reviewService.getReviewPageList(pageable, bookId); + Page content = reviewFacade.getReviewPageList(pageable, bookId); return ResponseEntity.ok().body(content); } diff --git a/src/main/java/store/ckin/api/review/exception/SaveFileException.java b/src/main/java/store/ckin/api/review/exception/SaveFileException.java new file mode 100644 index 00000000..cd68e6bd --- /dev/null +++ b/src/main/java/store/ckin/api/review/exception/SaveFileException.java @@ -0,0 +1,14 @@ +package store.ckin.api.review.exception; + +/** + * 이미지 저장에 실패한 경우 발생하는 예외입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ +public class SaveFileException extends RuntimeException { + + public SaveFileException() { + super("Failed to save image."); + } +} diff --git a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java new file mode 100644 index 00000000..50688a88 --- /dev/null +++ b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java @@ -0,0 +1,66 @@ +package store.ckin.api.review.facade; + +import java.time.LocalDate; +import java.util.List; +import java.util.Objects; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import store.ckin.api.member.service.MemberService; +import store.ckin.api.pointhistory.dto.request.PointHistoryCreateRequestDto; +import store.ckin.api.pointhistory.service.PointHistoryService; +import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; +import store.ckin.api.pointpolicy.service.PointPolicyService; +import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.response.ReviewResponseDto; +import store.ckin.api.review.service.ReviewService; + +/** + * 리뷰 퍼사드 클래스입니다. + * + * @author 정승조 + * @version 2024. 03. 15. + */ +@Service +@RequiredArgsConstructor +public class ReviewFacade { + + private final ReviewService reviewService; + + private final PointPolicyService pointPolicyService; + + private final PointHistoryService pointHistoryService; + + private final MemberService memberService; + + private static final Long REVIEW_POINT_POLICY_ID = 200L; + + private static final Long REVIEW_WITH_PHOTO_POINT_POLICY_ID = 201L; + + @Transactional + public void postReview(ReviewCreateRequestDto createRequestDto, List imageList) { + + reviewService.postReview(createRequestDto, imageList); + + Long pointPolicyId = Objects.isNull(imageList) ? REVIEW_POINT_POLICY_ID : REVIEW_WITH_PHOTO_POINT_POLICY_ID; + PointPolicyResponseDto pointPolicy = pointPolicyService.getPointPolicy(pointPolicyId); + + PointHistoryCreateRequestDto pointHistory = PointHistoryCreateRequestDto.builder() + .memberId(createRequestDto.getMemberId()) + .pointHistoryPoint(pointPolicy.getPointPolicyReserve()) + .pointHistoryReason(pointPolicy.getPointPolicyName()) + .pointHistoryTime(LocalDate.now()) + .build(); + + pointHistoryService.createPointHistory(pointHistory); + memberService.updatePoint(createRequestDto.getMemberId(), pointPolicy.getPointPolicyReserve()); + } + + @Transactional(readOnly = true) + public Page getReviewPageList(Pageable pageable, Long bookId) { + return reviewService.getReviewPageList(pageable, bookId); + } +} diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index d8bdc1bf..9c012158 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -1,8 +1,8 @@ package store.ckin.api.review.service.impl; +import java.io.IOException; import java.util.List; import java.util.Objects; -import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -22,6 +22,7 @@ import store.ckin.api.review.dto.request.ReviewCreateRequestDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.entity.Review; +import store.ckin.api.review.exception.SaveFileException; import store.ckin.api.review.repository.ReviewRepository; import store.ckin.api.review.service.ReviewService; @@ -31,8 +32,8 @@ * @author 이가은 * @version 2024. 03. 11. */ -@Service @Slf4j +@Service @RequiredArgsConstructor public class ReviewServiceImpl implements ReviewService { private final ReviewRepository reviewRepository; @@ -41,6 +42,8 @@ public class ReviewServiceImpl implements ReviewService { private final ObjectStorageService objectStorageService; private final FileRepository fileRepository; + private static final String REVIEW_IMAGE_CATEGORY = "review"; + /** * 리뷰 업로드를 구현하는 메소드 입니다. * @@ -50,34 +53,31 @@ public class ReviewServiceImpl implements ReviewService { @Override @Transactional public void postReview(ReviewCreateRequestDto createRequestDto, List imageList) { - Optional member = memberRepository.findById(createRequestDto.getMemberId()); + Member member = memberRepository.findById(createRequestDto.getMemberId()) + .orElseThrow(() -> new MemberNotFoundException(createRequestDto.getMemberId())); - if (member.isEmpty()) { - throw new MemberNotFoundException(createRequestDto.getMemberId()); - } + Book book = bookRepository.findByBookId(createRequestDto.getBookId()) + .orElseThrow(() -> new BookNotFoundException(createRequestDto.getBookId())); - Optional book = bookRepository.findByBookId(createRequestDto.getBookId()); + book.updateBookReviewRate(createRequestDto.getReviewRate()); - if (book.isEmpty()) { - throw new BookNotFoundException(createRequestDto.getBookId()); - } - book.get().setBookReviewRate(createRequestDto.getReviewRate()); Review review = reviewRepository.save(Review.builder() - .member(member.get()) - .book(book.get()) + .member(member) + .book(book) .reviewRate(createRequestDto.getReviewRate()) .reviewComment(createRequestDto.getReviewComment()) .build()); + if (Objects.nonNull(imageList)) { try { for (MultipartFile file : imageList) { - File reviewFile = objectStorageService.saveFile(file, "review"); + File reviewFile = objectStorageService.saveFile(file, REVIEW_IMAGE_CATEGORY); fileRepository.save(reviewFile.toBuilder() .review(review) .build()); } - } catch (Exception e) { - throw new RuntimeException(); + } catch (IOException e) { + throw new SaveFileException(); } } } @@ -92,13 +92,16 @@ public void postReview(ReviewCreateRequestDto createRequestDto, List getReviewPageList(Pageable pageable, Long bookId) { + if (!bookRepository.existsById(bookId)) { throw new BookNotFoundException(bookId); } + Page reviewPage = reviewRepository.getReviewPageList(pageable, bookId); - reviewPage.stream().forEach(reviewResponseDto -> { - reviewResponseDto.setFilePath(fileRepository.findFilePathByReviewId(reviewResponseDto.getReviewId())); - }); + + reviewPage.stream() + .forEach(reviewResponseDto -> reviewResponseDto.setFilePath( + fileRepository.findFilePathByReviewId(reviewResponseDto.getReviewId()))); return reviewPage; } } diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index f75b082b..d6fcc4f3 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -46,6 +46,8 @@ public class SaleController { @PostMapping public ResponseEntity createSale(@Valid @RequestBody SaleCreateRequestDto requestDto) { String saleNumber = saleFacade.createSale(requestDto); + saleFacade.createRewardPointHistory(requestDto.getMemberId(), requestDto.getTotalPrice()); + return ResponseEntity.status(HttpStatus.CREATED).body(saleNumber); } diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 3975b376..e07e54dd 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -15,6 +15,8 @@ import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.service.PaymentService; +import store.ckin.api.pointhistory.dto.request.PointHistoryCreateRequestDto; +import store.ckin.api.pointhistory.service.PointHistoryService; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; @@ -44,6 +46,8 @@ public class SaleFacade { private final PaymentService paymentService; + private final PointHistoryService pointHistoryService; + /** * 주문을 생성하는 메서드입니다. * @@ -57,7 +61,16 @@ public String createSale(SaleCreateRequestDto requestDto) { bookSaleService.createBookSale(sale.getSaleId(), requestDto.getBookSaleList()); if (requestDto.getMemberId() != null && requestDto.getPointUsage() > 0) { - memberService.updatePoint(requestDto.getMemberId(), requestDto.getPointUsage()); + memberService.updatePoint(requestDto.getMemberId(), -requestDto.getPointUsage()); + + PointHistoryCreateRequestDto pointHistoryCreateRequestDto = PointHistoryCreateRequestDto.builder() + .memberId(requestDto.getMemberId()) + .pointHistoryPoint(-requestDto.getPointUsage()) + .pointHistoryReason("주문 사용") + .pointHistoryTime(sale.getSaleDate().toLocalDate()) + .build(); + + pointHistoryService.createPointHistory(pointHistoryCreateRequestDto); } return sale.getSaleNumber(); @@ -214,4 +227,14 @@ public PagedResponse> getSalesByMemberId(Long memberId } + /** + * 회원 등급의 적립률에 따라 적립 포인트를 업데이트하는 메서드입니다. + * + * @param memberId 회원 ID + * @param totalPrice 주문 금액 + */ + @Transactional + public void createRewardPointHistory(Long memberId, Integer totalPrice) { + memberService.updateRewardPoint(memberId, totalPrice); + } } diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index 7469aec1..bb0d5ec8 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -82,6 +82,9 @@ public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) { Sale savedSale = saleRepository.save(sale); + + + return SaleResponseDto.toDto(savedSale); } From 8c064fb83b0c0d86d95ea2e4206abd58901dfeb3 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Sat, 16 Mar 2024 01:41:01 +0900 Subject: [PATCH 045/161] =?UTF-8?q?[REFACTOR]=20=ED=8F=AC=EC=9D=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=81=EB=A6=BD,=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/store/ckin/api/review/controller/ReviewController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index 154f8aea..efd6a33c 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -58,7 +58,7 @@ public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto creat */ @GetMapping("{bookId}") public ResponseEntity> getReviewPageList( - @PageableDefault(page = 0, size = 5) Pageable pageable, + @PageableDefault(size = 5) Pageable pageable, @PathVariable("bookId") Long bookId) { Page content = reviewFacade.getReviewPageList(pageable, bookId); From 6711c2cae918d8de57c35b05604bc0fc84954c78 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Sat, 16 Mar 2024 18:09:01 +0900 Subject: [PATCH 046/161] =?UTF-8?q?[REFACTOR]=20=EC=A3=BC=EB=AC=B8?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=81=EB=A6=BD=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/repository/MemberRepository.java | 9 ++++++ .../api/member/service/MemberService.java | 7 ++-- .../service/impl/MemberServiceImpl.java | 32 ++++++++++++------- .../payment/controller/PaymentController.java | 7 +++- .../api/payment/facade/PaymentFacade.java | 14 +++++++- .../PointHistoryRepositoryImpl.java | 1 + .../ckin/api/review/facade/ReviewFacade.java | 4 +++ .../api/sale/controller/SaleController.java | 14 +++++--- .../ckin/api/sale/facade/SaleFacade.java | 12 ------- .../sale/service/impl/SaleServiceImpl.java | 4 +-- 10 files changed, 69 insertions(+), 35 deletions(-) diff --git a/src/main/java/store/ckin/api/member/repository/MemberRepository.java b/src/main/java/store/ckin/api/member/repository/MemberRepository.java index 598daa78..8b90608d 100644 --- a/src/main/java/store/ckin/api/member/repository/MemberRepository.java +++ b/src/main/java/store/ckin/api/member/repository/MemberRepository.java @@ -1,5 +1,6 @@ package store.ckin.api.member.repository; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.member.entity.Member; @@ -11,4 +12,12 @@ */ public interface MemberRepository extends JpaRepository, MemberRepositoryCustom { boolean existsByEmail(String email); + + /** + * 이메일로 Member 를 조회하는 메서드 입니다. + * + * @param email 이메일 + * @return Member + */ + Optional findByEmail(String email); } diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 85a8ae5d..8419c1e4 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -41,10 +41,11 @@ public interface MemberService { void updatePoint(Long memberId, Integer pointUsage); /** - * 회원 등급의 적립률에 따라 적립 포인트를 업데이트하는 메서드입니다. + * [회원 등급의 적립률 * 주문금액]만큼 적립 포인트를 업데이트하는 메서드입니다. * - * @param memberId 회원 ID + * @param email 회원 이메일 * @param totalPrice 총 가격 */ - void updateRewardPoint(Long memberId, Integer totalPrice); + void updateRewardPoint(String email, Integer totalPrice); + } diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 35ae855d..b410e37e 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -125,25 +125,33 @@ public void updatePoint(Long memberId, Integer pointUsage) { Member member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberNotFoundException(memberId)); member.updatePoint(pointUsage); - - pointHistoryRepository.save(PointHistory.builder() - .member(member) - .pointHistoryPoint(-pointUsage) - .pointHistoryReason("주문 사용") - .pointHistoryTime(LocalDate.now()) - .build()); } + /** + * {@inheritDoc} + * + * @param email 회원 이메일 + * @param totalPrice 총 가격 + */ @Override - public void updateRewardPoint(Long memberId, Integer totalPrice) { + public void updateRewardPoint(String email, Integer totalPrice) { - Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberNotFoundException(memberId)); + Member member = memberRepository.findByEmail(email) + .orElseThrow(() -> new MemberNotFoundException(email)); Grade grade = gradeRepository.findById(member.getGrade().getGradeId()) .orElseThrow(GradeNotFoundException::new); - long reward = Math.round(((double) grade.getPointRatio() / 100) * totalPrice); - member.updatePoint((int) reward); + int reward = (int) Math.round(((double) grade.getPointRatio() / 100) * totalPrice); + member.updatePoint(reward); + + PointHistory pointHistory = PointHistory.builder() + .member(member) + .pointHistoryPoint(reward) + .pointHistoryReason("주문 적립") + .pointHistoryTime(LocalDate.now()) + .build(); + + pointHistoryRepository.save(pointHistory); } } diff --git a/src/main/java/store/ckin/api/payment/controller/PaymentController.java b/src/main/java/store/ckin/api/payment/controller/PaymentController.java index 0c8a0ab8..eab8c38a 100644 --- a/src/main/java/store/ckin/api/payment/controller/PaymentController.java +++ b/src/main/java/store/ckin/api/payment/controller/PaymentController.java @@ -35,6 +35,11 @@ public class PaymentController { */ @PostMapping public ResponseEntity createPayment(@RequestBody PaymentRequestDto requestDto) { - return ResponseEntity.status(HttpStatus.CREATED).body(paymentFacade.createPayment(requestDto)); + // 결제 SAVE + PaymentSuccessResponseDto payment = paymentFacade.createPayment(requestDto); + + // 포인트 적립 + 포인트 기록 + paymentFacade.createRewardPoint(payment.getSaleNumber()); + return ResponseEntity.status(HttpStatus.CREATED).body(payment); } } diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index 8129c85b..fdb284df 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.request.PaymentRequestDto; import store.ckin.api.payment.dto.response.PaymentSuccessResponseDto; import store.ckin.api.payment.exception.PaymentAmountNotCorrectException; @@ -20,7 +21,6 @@ * @version 2024. 03. 09. */ -@Slf4j @Service @RequiredArgsConstructor public class PaymentFacade { @@ -29,6 +29,8 @@ public class PaymentFacade { private final SaleService saleService; + private final MemberService memberService; + @Transactional public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { @@ -55,4 +57,14 @@ public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { .receiptUrl(requestDto.getReceiptUrl()) .build(); } + + + @Transactional + public void createRewardPoint(String saleNumber) { + SaleResponseDto sale = saleService.getSaleBySaleNumber(saleNumber); + + if (Objects.nonNull(sale.getMemberEmail())) { + memberService.updateRewardPoint(sale.getMemberEmail(), sale.getSaleTotalPrice()); + } + } } diff --git a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java index b7bd48ff..1e8713ff 100644 --- a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java +++ b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryImpl.java @@ -38,6 +38,7 @@ public Page getPointHistoryList(Long memberId, Pageable pointHistory.pointHistoryTime)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) + .orderBy(pointHistory.pointHistoryId.desc()) .fetch(); JPQLQuery count = from(pointHistory) diff --git a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java index 50688a88..04b07ad4 100644 --- a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java +++ b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Objects; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -24,6 +25,7 @@ * @author 정승조 * @version 2024. 03. 15. */ +@Slf4j @Service @RequiredArgsConstructor public class ReviewFacade { @@ -55,6 +57,8 @@ public void postReview(ReviewCreateRequestDto createRequestDto, List createSale(@Valid @RequestBody SaleCreateRequestDto requestDto) { String saleNumber = saleFacade.createSale(requestDto); - saleFacade.createRewardPointHistory(requestDto.getMemberId(), requestDto.getTotalPrice()); return ResponseEntity.status(HttpStatus.CREATED).body(saleNumber); } @@ -54,7 +53,7 @@ public ResponseEntity createSale(@Valid @RequestBody SaleCreateRequestDt /** * 모든 주문 목록을 조회하는 메서드입니다. * - * @return 주문 DTO 리스트 + * @return 200(OK), 주문 DTO 리스트 */ @GetMapping public ResponseEntity>> getSales(@PageableDefault Pageable pageable) { @@ -66,7 +65,7 @@ public ResponseEntity>> getSales(@PageableDe * 주문 상세 정보를 조회하는 메서드입니다. * * @param saleId 주문 ID - * @return 주문 상세 정보 DTO + * @return 200(OK), 주문 상세 정보 DTO */ @GetMapping("/{saleId}") public ResponseEntity getSaleDetail(@PathVariable("saleId") Long saleId) { @@ -123,6 +122,13 @@ public ResponseEntity getGuestSaleDetailBySaleNumber( return ResponseEntity.ok(saleFacade.getGuestSaleDetailBySaleNumber(saleNumber, ordererContact)); } + /** + * 회원의 주문 상세 정보를 조회하는 메서드입니다. + * + * @param saleNumber 주문 번호 + * @param memberId 회원 ID + * @return 200 (OK), 주문 상세 정보 + */ @GetMapping("/member") public ResponseEntity getMemberSaleDetailBySaleNumber( @RequestParam("saleNumber") String saleNumber, diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index e07e54dd..dea850fe 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -225,16 +225,4 @@ public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, Long m public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { return saleService.getSalesByMemberId(memberId, pageable); } - - - /** - * 회원 등급의 적립률에 따라 적립 포인트를 업데이트하는 메서드입니다. - * - * @param memberId 회원 ID - * @param totalPrice 주문 금액 - */ - @Transactional - public void createRewardPointHistory(Long memberId, Integer totalPrice) { - memberService.updateRewardPoint(memberId, totalPrice); - } } diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index bb0d5ec8..c6b9c477 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -84,7 +84,6 @@ public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) { Sale savedSale = saleRepository.save(sale); - return SaleResponseDto.toDto(savedSale); } @@ -137,7 +136,8 @@ public SaleResponseDto getSaleDetail(Long saleId) { @Override @Transactional public void updateSalePaymentPaidStatus(Long saleId) { - Sale sale = saleRepository.findById(saleId).orElseThrow(() -> new SaleNotFoundException(saleId)); + Sale sale = saleRepository.findById(saleId) + .orElseThrow(() -> new SaleNotFoundException(saleId)); sale.updatePaymentStatus(Sale.PaymentStatus.PAID); } From 1f010c2fa318224ffee683dcba90ff94e8da633d Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Sat, 16 Mar 2024 18:09:16 +0900 Subject: [PATCH 047/161] =?UTF-8?q?[REFACTOR]=20=EC=A3=BC=EB=AC=B8?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=81=EB=A6=BD=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/payment/facade/PaymentFacade.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index fdb284df..87140c57 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -2,7 +2,6 @@ import java.util.Objects; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import store.ckin.api.member.service.MemberService; From 6eb5049e4a614ba17d86e2c8c4f79e6b19808b3a Mon Sep 17 00:00:00 2001 From: gaeun Date: Sat, 16 Mar 2024 18:33:28 +0900 Subject: [PATCH 048/161] =?UTF-8?q?[REFACTOR]=20=EC=BF=A0=ED=8F=B0=20?= =?UTF-8?q?=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EB=94=94=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api.iml | 9 ++--- .../controller/CategoryController.java | 14 ++++++++ .../repository/CategoryRepository.java | 2 +- .../repository/CategoryRepositoryCustom.java | 21 ++++++++++++ .../impl/CategoryRepositoryImpl.java | 33 +++++++++++++++++++ .../api/category/service/CategoryService.java | 8 +++++ .../service/impl/CategoryServiceImpl.java | 10 ++++++ 7 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 src/main/java/store/ckin/api/category/repository/CategoryRepositoryCustom.java create mode 100644 src/main/java/store/ckin/api/category/repository/impl/CategoryRepositoryImpl.java diff --git a/api.iml b/api.iml index ec0dd8b8..648c3cc5 100644 --- a/api.iml +++ b/api.iml @@ -2,13 +2,11 @@ - + - + @@ -22,9 +20,6 @@ - - diff --git a/src/main/java/store/ckin/api/category/controller/CategoryController.java b/src/main/java/store/ckin/api/category/controller/CategoryController.java index afd1f088..cdc9b70d 100644 --- a/src/main/java/store/ckin/api/category/controller/CategoryController.java +++ b/src/main/java/store/ckin/api/category/controller/CategoryController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; @@ -108,4 +109,17 @@ public ResponseEntity getCategoryName(@PathVariable("categoryId") Long c return ResponseEntity.ok().body(categoryName); } + + /** + * 카테고리 아이디에 해당하는 부모 카테고리 아이디를 포함하여 반환합니다. + * + * @param bookIds 도서 아이디 목록 + * @return 부모 카테고리 아이디 목록 + */ + @GetMapping("/parentIds") + public ResponseEntity> getParentIds(@RequestParam List bookIds) { + List content = categoryService.getParentIds(bookIds); + + return ResponseEntity.ok().body(content); + } } diff --git a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java index 87f29d5a..9cf009ef 100644 --- a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java +++ b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java @@ -11,7 +11,7 @@ * @author 나국로 * @version 2024. 02. 15. */ -public interface CategoryRepository extends JpaRepository { +public interface CategoryRepository extends JpaRepository, CategoryRepositoryCustom { /** * 주어진 카테고리 ID에 해당하는 카테고리를 조회합니다. diff --git a/src/main/java/store/ckin/api/category/repository/CategoryRepositoryCustom.java b/src/main/java/store/ckin/api/category/repository/CategoryRepositoryCustom.java new file mode 100644 index 00000000..cf9c8049 --- /dev/null +++ b/src/main/java/store/ckin/api/category/repository/CategoryRepositoryCustom.java @@ -0,0 +1,21 @@ +package store.ckin.api.category.repository; + +import java.util.List; +import org.springframework.data.repository.NoRepositoryBean; + +/** + * description: + * + * @author : gaeun + * @version : 2024. 03. 16 + */ +@NoRepositoryBean +public interface CategoryRepositoryCustom { + /** + * 카테고리 아이디에 해당하는 부모 카테고리 아이디를 포함하여 반환합니다. + * + * @param categoryIds 카테고리 아이디 목록 + * @return 부모 카테고리 아이디 목록 + */ + List getParentIds(List categoryIds); +} diff --git a/src/main/java/store/ckin/api/category/repository/impl/CategoryRepositoryImpl.java b/src/main/java/store/ckin/api/category/repository/impl/CategoryRepositoryImpl.java new file mode 100644 index 00000000..e55a0230 --- /dev/null +++ b/src/main/java/store/ckin/api/category/repository/impl/CategoryRepositoryImpl.java @@ -0,0 +1,33 @@ +package store.ckin.api.category.repository.impl; + +import java.util.List; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; +import store.ckin.api.book.relationship.bookcategory.entity.QBookCategory; +import store.ckin.api.category.entity.Category; +import store.ckin.api.category.repository.CategoryRepositoryCustom; + +/** + * CategoryRepositoryImpl + * + * @author : 이가은 + * @version : 2024. 03. 16 + */ +public class CategoryRepositoryImpl extends QuerydslRepositorySupport implements CategoryRepositoryCustom { + public CategoryRepositoryImpl() { + super(Category.class); + } + + QBookCategory bookCategory = QBookCategory.bookCategory; + + /** + * {@inheritDoc} + */ + @Override + public List getParentIds(List bookIds) { + return from(bookCategory) + .select(bookCategory.category.categoryId) + .where(bookCategory.book.bookId.in(bookIds)) + .distinct() + .fetch(); + } +} diff --git a/src/main/java/store/ckin/api/category/service/CategoryService.java b/src/main/java/store/ckin/api/category/service/CategoryService.java index d7968a84..35e21cb3 100644 --- a/src/main/java/store/ckin/api/category/service/CategoryService.java +++ b/src/main/java/store/ckin/api/category/service/CategoryService.java @@ -61,4 +61,12 @@ public interface CategoryService { * @return 카테고리 이름 */ String getCategoryName(Long categoryId); + + /** + * 카테고리 아이디에 해당하는 부모 카테고리 아이디를 포함하여 반환합니다. + * + * @param categoryIds 카테고리 아이디 목록 + * @return 부모 카테고리 아이디 목록 + */ + List getParentIds(List categoryIds); } diff --git a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java index 88801ced..8801fcab 100644 --- a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java +++ b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java @@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import store.ckin.api.book.repository.BookRepository; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; import store.ckin.api.category.dto.response.CategoryResponseDto; @@ -25,6 +26,7 @@ public class CategoryServiceImpl implements CategoryService { private final CategoryRepository categoryRepository; + private final BookRepository bookRepository; private static final int DEFAULT_CATEGORY_PRIORITY = 1; /** @@ -121,6 +123,14 @@ public String getCategoryName(Long categoryId) { } + /** + * {@inheritDoc} + */ + @Override + public List getParentIds(List bookIds) { + return categoryRepository.getParentIds(bookIds); + } + } From fb36f75d05fed22d2e971928c8c3962a3d722d0c Mon Sep 17 00:00:00 2001 From: gaeun Date: Sat, 16 Mar 2024 18:33:58 +0900 Subject: [PATCH 049/161] =?UTF-8?q?[REFACTOR]=20import=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/repository/impl/BookRepositoryImpl.java | 1 + .../ckin/api/book/service/impl/BookServiceImpl.java | 5 +++-- .../controller/DeliveryPolicyController.java | 13 +++++++++---- .../repository/DeliveryPolicyRepositoryCustom.java | 5 ++--- .../repository/DeliveryPolicyRepositoryImpl.java | 5 ++--- .../service/DeliveryPolicyService.java | 3 +-- 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index b51b0f28..b0b70e4e 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -360,6 +360,7 @@ private BookListResponseDto convertToBookListResponseDto(Book book) { .thumbnail(thumbnailUrl) // 썸네일 URL 추가 .build(); } + private BookMainPageResponseDto convertToBookMainPageResponseDto(Book book) { List authorNames = book.getAuthors().stream() .map(bookAuthorElement -> bookAuthorElement.getAuthor().getAuthorName()) diff --git a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java index 96a37347..47aecaec 100644 --- a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java +++ b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java @@ -232,10 +232,11 @@ public List getExtractBookListByBookIds(List bo @Override public List getMainPageBookListByCategoryId(Long categoryId, Integer limit) { - return bookRepository.getMainPageResponseDtoByCategoryId(categoryId,limit); + return bookRepository.getMainPageResponseDtoByCategoryId(categoryId, limit); } + @Override - public List getMainPageBookListOrderByBookPublicationDate( Integer limit) { + public List getMainPageBookListOrderByBookPublicationDate(Integer limit) { return bookRepository.getMainPageResponseDtoOrderByBookPublicationDate(limit); } diff --git a/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java b/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java index b255d934..1fe14899 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java +++ b/src/main/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyController.java @@ -1,17 +1,22 @@ package store.ckin.api.deliverypolicy.controller; +import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyCreateRequestDto; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyUpdateRequestDto; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.service.DeliveryPolicyService; -import javax.validation.Valid; -import java.util.List; - /** * 배송비 정책 Controller. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java index 460495ba..0dec229d 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java +++ b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryCustom.java @@ -1,12 +1,11 @@ package store.ckin.api.deliverypolicy.repository; +import java.util.List; +import java.util.Optional; import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.entity.DeliveryPolicy; -import java.util.List; -import java.util.Optional; - /** * 배송비 정책 Repository Querydsl 사용할 메서드가 있는 인터페이스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java index 254bfa8e..9731fc74 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java +++ b/src/main/java/store/ckin/api/deliverypolicy/repository/DeliveryPolicyRepositoryImpl.java @@ -1,14 +1,13 @@ package store.ckin.api.deliverypolicy.repository; import com.querydsl.core.types.Projections; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; import store.ckin.api.deliverypolicy.entity.DeliveryPolicy; import store.ckin.api.deliverypolicy.entity.QDeliveryPolicy; -import java.util.List; -import java.util.Optional; - /** * 배송비 정책 Repository Querydsl 사용을 위한 구현 클래스입니다. * diff --git a/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java b/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java index 74bde112..68e198de 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java +++ b/src/main/java/store/ckin/api/deliverypolicy/service/DeliveryPolicyService.java @@ -1,11 +1,10 @@ package store.ckin.api.deliverypolicy.service; +import java.util.List; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyCreateRequestDto; import store.ckin.api.deliverypolicy.dto.request.DeliveryPolicyUpdateRequestDto; import store.ckin.api.deliverypolicy.dto.response.DeliveryPolicyResponseDto; -import java.util.List; - /** * 배송비 정책을 관리하는 서비스 인터페이스입니다. * From d1b56de9297824aeb3b0d995ebba193914b9e943 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Sat, 16 Mar 2024 20:15:17 +0900 Subject: [PATCH 050/161] =?UTF-8?q?[REFACTOR]=20`@Transactional`=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/member/service/impl/MemberServiceImpl.java | 11 ++++++----- .../api/payment/service/impl/PaymentServiceImpl.java | 1 + .../ckin/api/sale/service/impl/SaleServiceImpl.java | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index b410e37e..d644741b 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -43,8 +43,8 @@ public class MemberServiceImpl implements MemberService { private static final Long REGISTER_POINT_POLICY_ID = 100L; - @Transactional @Override + @Transactional public void createMember(MemberCreateRequestDto memberCreateRequestDto) { if (memberRepository.existsByEmail(memberCreateRequestDto.getEmail())) { throw new MemberAlreadyExistsException(memberCreateRequestDto.getEmail()); @@ -83,8 +83,8 @@ public void createMember(MemberCreateRequestDto memberCreateRequestDto) { pointHistoryRepository.save(pointHistory); } - @Transactional(readOnly = true) @Override + @Transactional(readOnly = true) public MemberAuthResponseDto getLoginMemberInfo(MemberAuthRequestDto memberAuthRequestDto) { if (!memberRepository.existsByEmail(memberAuthRequestDto.getEmail())) { throw new MemberNotFoundException(memberAuthRequestDto.getEmail()); @@ -93,8 +93,8 @@ public MemberAuthResponseDto getLoginMemberInfo(MemberAuthRequestDto memberAuthR return memberRepository.getLoginInfo(memberAuthRequestDto.getEmail()); } - @Transactional(readOnly = true) @Override + @Transactional(readOnly = true) public MemberInfoDetailResponseDto getMemberInfoDetail(Long id) { if (!memberRepository.existsById(id)) { throw new MemberNotFoundException(id); @@ -103,8 +103,8 @@ public MemberInfoDetailResponseDto getMemberInfoDetail(Long id) { return memberRepository.getMemberInfoDetail(id); } - @Transactional(readOnly = true) @Override + @Transactional(readOnly = true) public MemberMyPageResponseDto getMyPageInfo(Long id) { if (!memberRepository.existsById(id)) { throw new MemberNotFoundException(id); @@ -119,8 +119,8 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { * @param memberId 회원 ID * @param pointUsage 사용한 포인트 */ - @Transactional @Override + @Transactional public void updatePoint(Long memberId, Integer pointUsage) { Member member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberNotFoundException(memberId)); @@ -134,6 +134,7 @@ public void updatePoint(Long memberId, Integer pointUsage) { * @param totalPrice 총 가격 */ @Override + @Transactional public void updateRewardPoint(String email, Integer totalPrice) { Member member = memberRepository.findByEmail(email) diff --git a/src/main/java/store/ckin/api/payment/service/impl/PaymentServiceImpl.java b/src/main/java/store/ckin/api/payment/service/impl/PaymentServiceImpl.java index 1ddf4465..01f789a1 100644 --- a/src/main/java/store/ckin/api/payment/service/impl/PaymentServiceImpl.java +++ b/src/main/java/store/ckin/api/payment/service/impl/PaymentServiceImpl.java @@ -49,6 +49,7 @@ public void createPayment(Long saleId, PaymentRequestDto requestDto) { } @Override + @Transactional(readOnly = true) public PaymentResponseDto getPayment(Long saleId) { if (!saleRepository.existsById(saleId)) { diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index c6b9c477..fcf046a0 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -184,8 +184,8 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) { * @param saleNumber * @return 주문 조회 응답 DTO */ - @Transactional(readOnly = true) @Override + @Transactional(readOnly = true) public SaleResponseDto getSaleBySaleNumber(String saleNumber) { if (!saleRepository.existsBySaleNumber(saleNumber)) { @@ -205,8 +205,8 @@ public SaleResponseDto getSaleBySaleNumber(String saleNumber) { * @param pageable 페이지 정보 * @return 페이징 처리된 주문 응답 DTO 리스트 */ - @Transactional(readOnly = true) @Override + @Transactional(readOnly = true) public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { return saleRepository.findAllByMemberId(memberId, pageable); } From d5ceb65b4e21039acd4a4b61da2eccfccc9df463 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Sat, 16 Mar 2024 22:41:55 +0900 Subject: [PATCH 051/161] =?UTF-8?q?[REFACTOR]=20DTO=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=B0=8F=20=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DeliveryPolicyCreateRequestDto.java | 2 ++ .../DeliveryPolicyUpdateRequestDto.java | 2 ++ .../service/impl/MemberServiceImpl.java | 4 ++- .../request/PackagingCreateRequestDto.java | 2 ++ .../request/PackagingUpdateRequestDto.java | 2 ++ .../dto/request/PaymentRequestDto.java | 4 +-- .../api/payment/facade/PaymentFacade.java | 11 ++++++++ .../request/PointHistoryCreateRequestDto.java | 4 +-- .../request/PointPolicyCreateRequestDto.java | 2 ++ .../request/PointPolicyUpdateRequestDto.java | 2 ++ .../ckin/api/review/facade/ReviewFacade.java | 2 -- .../dto/request/SaleCreateRequestDto.java | 4 +-- .../dto/response/SaleWithBookResponseDto.java | 26 +++---------------- 13 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java index ff774cea..b372a224 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyCreateRequestDto.java @@ -3,6 +3,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 배송비 정책 생성 요청 DTO. @@ -12,6 +13,7 @@ */ @Getter +@NoArgsConstructor public class DeliveryPolicyCreateRequestDto { @NotNull(message = "배송비를 입력해주세요.") diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java index 4ce706e7..898e5639 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/request/DeliveryPolicyUpdateRequestDto.java @@ -3,6 +3,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 배송비 정책 수정 요청 DTO. @@ -12,6 +13,7 @@ */ @Getter +@NoArgsConstructor public class DeliveryPolicyUpdateRequestDto { @NotNull(message = "배송비를 입력해주세요.") diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index d644741b..0d5df9c7 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -43,6 +43,8 @@ public class MemberServiceImpl implements MemberService { private static final Long REGISTER_POINT_POLICY_ID = 100L; + private static final Long NORMAL_GRADE_ID = 1L; + @Override @Transactional public void createMember(MemberCreateRequestDto memberCreateRequestDto) { @@ -50,7 +52,7 @@ public void createMember(MemberCreateRequestDto memberCreateRequestDto) { throw new MemberAlreadyExistsException(memberCreateRequestDto.getEmail()); } - Grade grade = gradeRepository.findById(1L) + Grade grade = gradeRepository.findById(NORMAL_GRADE_ID) .orElseThrow(GradeNotFoundException::new); // 회원가입 포인트 정책 조회 diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java index 4db75d38..8d321e9c 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingCreateRequestDto.java @@ -5,6 +5,7 @@ import javax.validation.constraints.Positive; import javax.validation.constraints.Size; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 포장 정책 생성 요청 DTO. @@ -14,6 +15,7 @@ */ @Getter +@NoArgsConstructor public class PackagingCreateRequestDto { @NotBlank(message = "포장지 종류를 입력해주세요.") diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java index 1f8f485c..004bd377 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java @@ -5,6 +5,7 @@ import javax.validation.constraints.Positive; import javax.validation.constraints.Size; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 포장 정책 수정 요청 DTO. @@ -14,6 +15,7 @@ */ @Getter +@NoArgsConstructor public class PackagingUpdateRequestDto { @NotNull(message = "포장 정책가 없습니다.") diff --git a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java index 59c0f5e6..607d61f7 100644 --- a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java +++ b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java @@ -1,8 +1,8 @@ package store.ckin.api.payment.dto.request; import java.time.LocalDateTime; -import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 결제 요청 DTO 클래스입니다. @@ -12,7 +12,7 @@ */ @Getter -@AllArgsConstructor +@NoArgsConstructor public class PaymentRequestDto { private String paymentKey; diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index 87140c57..81a3a47b 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -30,6 +30,12 @@ public class PaymentFacade { private final MemberService memberService; + /** + * 결제 정보를 DB에 저장 후 성공 응답 DTO를 반환하는 메서드입니다. + * + * @param requestDto 결제 요청 DTO + * @return 결제 성공 응답 DTO + */ @Transactional public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { @@ -58,6 +64,11 @@ public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { } + /** + * 주문 결제 완료 시 회원일 경우 포인트를 적립하는 메서드입니다. + * + * @param saleNumber 주문 번호 (UUID) + */ @Transactional public void createRewardPoint(String saleNumber) { SaleResponseDto sale = saleService.getSaleBySaleNumber(saleNumber); diff --git a/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java b/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java index dcec93be..dbe4c0a4 100644 --- a/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java +++ b/src/main/java/store/ckin/api/pointhistory/dto/request/PointHistoryCreateRequestDto.java @@ -7,7 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; /** * 포인트 내역 생성 요청 DTO. @@ -19,7 +19,7 @@ @Getter @Builder @AllArgsConstructor -@ToString +@NoArgsConstructor public class PointHistoryCreateRequestDto { @NotNull(message = "회원 아이디는 필수입니다.") diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java index 73a5f438..387af7e0 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyCreateRequestDto.java @@ -6,6 +6,7 @@ import javax.validation.constraints.PositiveOrZero; import javax.validation.constraints.Size; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 포인트 정책 생성 요청 DTO. @@ -15,6 +16,7 @@ */ @Getter +@NoArgsConstructor public class PointPolicyCreateRequestDto { @Positive(message = "포인트 정책 ID는 1 이상의 숫자로 입력해주세요.") diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java index 990fe8ea..981a6348 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/request/PointPolicyUpdateRequestDto.java @@ -5,6 +5,7 @@ import javax.validation.constraints.PositiveOrZero; import javax.validation.constraints.Size; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 포인트 정책 수정 요청 DTO. @@ -14,6 +15,7 @@ */ @Getter +@NoArgsConstructor public class PointPolicyUpdateRequestDto { @Size(min = 1, max = 15, message = "포인트 정책 이름은 1자 이상 15자 이하로 입력해주세요.") diff --git a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java index 04b07ad4..efed913c 100644 --- a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java +++ b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java @@ -57,8 +57,6 @@ public void postReview(ReviewCreateRequestDto createRequestDto, List bookSaleList = new ArrayList<>(); diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java index 4012b0ee..a7944c19 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleWithBookResponseDto.java @@ -4,6 +4,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import store.ckin.api.booksale.dto.response.BookSaleResponseDto; @@ -16,6 +17,8 @@ */ @Getter +@Builder +@AllArgsConstructor public class SaleWithBookResponseDto { @@ -51,29 +54,6 @@ public class SaleWithBookResponseDto { private Integer totalPrice; - @Builder - public SaleWithBookResponseDto(String saleTitle, Long saleId, String saleNumber, String memberEmail, - String saleOrderName, String saleOrderContact, String saleReceiverName, - String saleReceiverContact, Integer deliveryFee, LocalDate saleDeliveryDate, - LocalDateTime saleDate, String postcode, String address, Integer pointUsage, - Integer totalPrice) { - this.saleTitle = saleTitle; - this.saleId = saleId; - this.saleNumber = saleNumber; - this.memberEmail = memberEmail; - this.saleOrdererName = saleOrderName; - this.saleOrdererContact = saleOrderContact; - this.saleReceiverName = saleReceiverName; - this.saleReceiverContact = saleReceiverContact; - this.deliveryFee = deliveryFee; - this.saleDeliveryDate = saleDeliveryDate; - this.saleDate = saleDate; - this.postcode = postcode; - this.address = address; - this.pointUsage = pointUsage; - this.totalPrice = totalPrice; - } - public void addBookSale(BookSaleResponseDto bookSale) { this.bookSaleList.add(bookSale); } From f898014a0cbe27a38d07282cecb2c41b86a4ac35 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Sat, 16 Mar 2024 23:52:26 +0900 Subject: [PATCH 052/161] =?UTF-8?q?[TEST]=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/MemberServiceImplTest.java | 21 +++ .../controller/PaymentControllerTest.java | 18 +-- .../api/payment/facade/PaymentFacadeTest.java | 116 ++++++++++++--- .../service/impl/PaymentServiceImplTest.java | 36 ++--- .../PointHistoryControllerTest.java | 105 ++++++++++++++ .../PointHistoryRepositoryTest.java | 135 ++++++++++++++++++ .../impl/PointHistoryServiceImplTest.java | 107 ++++++++++++++ .../controller/ReviewControllerTest.java | 43 +++--- .../api/review/facade/ReviewFacadeTest.java | 116 +++++++++++++++ .../sale/controller/SaleControllerTest.java | 129 +++++++++++++++-- .../ckin/api/sale/facade/SaleFacadeTest.java | 41 +++--- 11 files changed, 768 insertions(+), 99 deletions(-) create mode 100644 src/test/java/store/ckin/api/pointhistory/controller/PointHistoryControllerTest.java create mode 100644 src/test/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryTest.java create mode 100644 src/test/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImplTest.java create mode 100644 src/test/java/store/ckin/api/review/facade/ReviewFacadeTest.java diff --git a/src/test/java/store/ckin/api/member/service/impl/MemberServiceImplTest.java b/src/test/java/store/ckin/api/member/service/impl/MemberServiceImplTest.java index 62c0e710..42c53e5d 100644 --- a/src/test/java/store/ckin/api/member/service/impl/MemberServiceImplTest.java +++ b/src/test/java/store/ckin/api/member/service/impl/MemberServiceImplTest.java @@ -22,6 +22,9 @@ import store.ckin.api.member.entity.Member; import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.repository.MemberRepository; +import store.ckin.api.pointhistory.repository.PointHistoryRepository; +import store.ckin.api.pointpolicy.entity.PointPolicy; +import store.ckin.api.pointpolicy.repository.PointPolicyRepository; /** * MemberService 에 대한 Test 입니다. @@ -37,6 +40,15 @@ class MemberServiceImplTest { @Mock private GradeRepository gradeRepository; + @Mock + private PointHistoryRepository pointHistoryRepository; + + @Mock + private PointPolicyRepository pointPolicyRepository; + + private static final Long REGISTER_POINT_POLICY_ID = 100L; + + @InjectMocks private MemberServiceImpl memberService; @@ -59,6 +71,15 @@ void testCreateMemberSuccess() { ReflectionTestUtils.setField(dto, "contact", "0101111234"); ReflectionTestUtils.setField(dto, "birth", LocalDate.now()); + PointPolicy pointPolicy = PointPolicy.builder() + .pointPolicyId(100L) + .pointPolicyName("회원가입") + .pointPolicyReserve(5000) + .build(); + + when(pointPolicyRepository.findById(REGISTER_POINT_POLICY_ID)) + .thenReturn(Optional.of(pointPolicy)); + memberService.createMember(dto); verify(memberRepository).existsByEmail(testEmail); diff --git a/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java b/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java index 9ceca6e3..2d2f1111 100644 --- a/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java +++ b/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java @@ -21,6 +21,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import store.ckin.api.payment.dto.request.PaymentRequestDto; import store.ckin.api.payment.dto.response.PaymentSuccessResponseDto; @@ -49,15 +50,14 @@ class PaymentControllerTest { @DisplayName("결제 생성 테스트") void testCreatePayment() throws Exception { - PaymentRequestDto paymentRequestDto = new PaymentRequestDto( - "12341234", - "423421432", - "DONE", - LocalDateTime.now().minusMinutes(10), - LocalDateTime.now(), - 15000, - "https://test.com" - ); + PaymentRequestDto paymentRequestDto = new PaymentRequestDto(); + ReflectionTestUtils.setField(paymentRequestDto, "paymentKey", "12341234"); + ReflectionTestUtils.setField(paymentRequestDto, "saleNumber", "423421432"); + ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", "DONE"); + ReflectionTestUtils.setField(paymentRequestDto, "requestedAt", LocalDateTime.now().minusMinutes(10)); + ReflectionTestUtils.setField(paymentRequestDto, "approvedAt", LocalDateTime.now()); + ReflectionTestUtils.setField(paymentRequestDto, "amount", 15000); + ReflectionTestUtils.setField(paymentRequestDto, "receiptUrl", "https://test.com"); String json = objectMapper.writeValueAsString(paymentRequestDto); diff --git a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java index 399c31c1..b22c8af7 100644 --- a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java +++ b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java @@ -1,6 +1,7 @@ package store.ckin.api.payment.facade; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.anyString; @@ -17,6 +18,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; +import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.request.PaymentRequestDto; import store.ckin.api.payment.exception.PaymentAmountNotCorrectException; import store.ckin.api.payment.exception.PaymentNotCompleteException; @@ -44,6 +47,9 @@ class PaymentFacadeTest { @Mock SaleService saleService; + @Mock + MemberService memberService; + PaymentRequestDto failPayment; PaymentRequestDto successPayment; @@ -51,26 +57,23 @@ class PaymentFacadeTest { @BeforeEach void setUp() { - failPayment = new PaymentRequestDto( - "12341234", - "423421432", - "FAIL", - LocalDateTime.now().minusMinutes(10), - LocalDateTime.now(), - 15000, - "https://test.com" - ); - - successPayment = new PaymentRequestDto( - "12341234", - "423421432", - "DONE", - LocalDateTime.now().minusMinutes(10), - LocalDateTime.now(), - 15000, - "https://test.com" - ); - + failPayment = new PaymentRequestDto(); + ReflectionTestUtils.setField(failPayment, "paymentKey", "12341234"); + ReflectionTestUtils.setField(failPayment, "saleNumber", "423421432"); + ReflectionTestUtils.setField(failPayment, "paymentStatus", "FAIL"); + ReflectionTestUtils.setField(failPayment, "requestedAt", LocalDateTime.now().minusMinutes(10)); + ReflectionTestUtils.setField(failPayment, "approvedAt", LocalDateTime.now()); + ReflectionTestUtils.setField(failPayment, "amount", 15000); + ReflectionTestUtils.setField(failPayment, "receiptUrl", "https://test.com"); + + successPayment = new PaymentRequestDto(); + ReflectionTestUtils.setField(successPayment, "paymentKey", "12341234"); + ReflectionTestUtils.setField(successPayment, "saleNumber", "423421432"); + ReflectionTestUtils.setField(successPayment, "paymentStatus", "DONE"); + ReflectionTestUtils.setField(successPayment, "requestedAt", LocalDateTime.now().minusMinutes(10)); + ReflectionTestUtils.setField(successPayment, "approvedAt", LocalDateTime.now()); + ReflectionTestUtils.setField(successPayment, "amount", 15000); + ReflectionTestUtils.setField(successPayment, "receiptUrl", "https://test.com"); } @@ -93,6 +96,7 @@ void testCreatePayment_AmountNotCorrectException() { SaleResponseDto saleResponseDto = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", @@ -131,6 +135,7 @@ void testCreatePayment() { SaleResponseDto saleResponseDto = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", @@ -159,4 +164,75 @@ void testCreatePayment() { verify(saleService, times(1)).getSaleBySaleNumber(anyString()); verify(paymentService, times(1)).createPayment(anyLong(), any()); } + + @Test + @DisplayName("포인트 적립 테스트 - 회원일 경우") + void testCreateRewardPoint_Member() { + SaleResponseDto saleResponseDto = + new SaleResponseDto( + 1L, + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.now(), + LocalDateTime.now().plusDays(1), + LocalDate.now().plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 15000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleBySaleNumber(anyString())) + .willReturn(saleResponseDto); + + paymentFacade.createRewardPoint("123456"); + + verify(saleService, times(1)).getSaleBySaleNumber(anyString()); + verify(memberService, times(1)).updateRewardPoint(anyString(), anyInt()); + } + + @Test + @DisplayName("포인트 적립 테스트 - 비회원일 경우") + void testCreateRewardPoint_Anonymous() { + SaleResponseDto saleResponseDto = + new SaleResponseDto( + 1L, + 1L, + "테스트 제목", + null, + "123456", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.now(), + LocalDateTime.now().plusDays(1), + LocalDate.now().plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 15000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + + given(saleService.getSaleBySaleNumber(anyString())) + .willReturn(saleResponseDto); + + paymentFacade.createRewardPoint("123456"); + + verify(saleService, times(1)).getSaleBySaleNumber(anyString()); + verify(memberService, times(0)).updateRewardPoint(anyString(), anyInt()); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/payment/service/impl/PaymentServiceImplTest.java b/src/test/java/store/ckin/api/payment/service/impl/PaymentServiceImplTest.java index b7b43f8d..ef5328aa 100644 --- a/src/test/java/store/ckin/api/payment/service/impl/PaymentServiceImplTest.java +++ b/src/test/java/store/ckin/api/payment/service/impl/PaymentServiceImplTest.java @@ -15,6 +15,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; import store.ckin.api.payment.dto.request.PaymentRequestDto; import store.ckin.api.payment.repository.PaymentRepository; import store.ckin.api.sale.entity.Sale; @@ -43,15 +44,14 @@ class PaymentServiceImplTest { @Test @DisplayName("결제 생성 테스트 - 실패(saleId가 존재하지 않을 경우)") void testCreatePayment() { - PaymentRequestDto paymentRequestDto = new PaymentRequestDto( - "12341234", - "423421432", - "DONE", - LocalDateTime.now().minusMinutes(10), - LocalDateTime.now(), - 15000, - "https://test.com" - ); + PaymentRequestDto paymentRequestDto = new PaymentRequestDto(); + ReflectionTestUtils.setField(paymentRequestDto, "paymentKey", "12341234"); + ReflectionTestUtils.setField(paymentRequestDto, "saleNumber", "423421432"); + ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", "DONE"); + ReflectionTestUtils.setField(paymentRequestDto, "requestedAt", LocalDateTime.now().minusMinutes(10)); + ReflectionTestUtils.setField(paymentRequestDto, "approvedAt", LocalDateTime.now()); + ReflectionTestUtils.setField(paymentRequestDto, "amount", 15000); + ReflectionTestUtils.setField(paymentRequestDto, "receiptUrl", "https://test.com"); given(saleRepository.findById(anyLong())) .willReturn(Optional.empty()); @@ -67,15 +67,15 @@ void testCreatePayment() { @Test @DisplayName("결제 생성 테스트 - 성공") void testCreatePaymentSuccess() { - PaymentRequestDto paymentRequestDto = new PaymentRequestDto( - "12341234", - "423421432", - "DONE", - LocalDateTime.now().minusMinutes(10), - LocalDateTime.now(), - 15000, - "https://test.com" - ); + PaymentRequestDto paymentRequestDto = new PaymentRequestDto(); + ReflectionTestUtils.setField(paymentRequestDto, "paymentKey", "12341234"); + ReflectionTestUtils.setField(paymentRequestDto, "saleNumber", "423421432"); + ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", "DONE"); + ReflectionTestUtils.setField(paymentRequestDto, "requestedAt", LocalDateTime.now().minusMinutes(10)); + ReflectionTestUtils.setField(paymentRequestDto, "approvedAt", LocalDateTime.now()); + ReflectionTestUtils.setField(paymentRequestDto, "amount", 15000); + ReflectionTestUtils.setField(paymentRequestDto, "receiptUrl", "https://test.com"); + given(saleRepository.findById(anyLong())) diff --git a/src/test/java/store/ckin/api/pointhistory/controller/PointHistoryControllerTest.java b/src/test/java/store/ckin/api/pointhistory/controller/PointHistoryControllerTest.java new file mode 100644 index 00000000..2b761db6 --- /dev/null +++ b/src/test/java/store/ckin/api/pointhistory/controller/PointHistoryControllerTest.java @@ -0,0 +1,105 @@ +package store.ckin.api.pointhistory.controller; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.time.LocalDate; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import store.ckin.api.common.domain.PageInfo; +import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.pointhistory.dto.request.PointHistoryCreateRequestDto; +import store.ckin.api.pointhistory.dto.response.PointHistoryResponseDto; +import store.ckin.api.pointhistory.service.PointHistoryService; + +/** + * 포인트 내역 컨트롤러 테스트. + * + * @author 정승조 + * @version 2024. 03. 16. + */ + +@WebMvcTest(PointHistoryController.class) +class PointHistoryControllerTest { + + @Autowired + MockMvc mockMvc; + + @MockBean + PointHistoryService pointHistoryService; + + ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + + @Test + @DisplayName("포인트 내역 생성 테스트") + void testCreatePointHistory() throws Exception { + + PointHistoryCreateRequestDto pointHistory = PointHistoryCreateRequestDto.builder() + .memberId(1L) + .pointHistoryReason("회원가입") + .pointHistoryPoint(5000) + .pointHistoryTime(LocalDate.now()) + .build(); + + String json = objectMapper.writeValueAsString(pointHistory); + + mockMvc.perform(post("/api/point-history") + .contentType(MediaType.APPLICATION_JSON) + .content(json)) + .andExpect(status().isCreated()) + .andDo(print()); + } + + @Test + @DisplayName("포인트 내역 조회 테스트") + void testGetPointHistoryList() throws Exception { + PointHistoryResponseDto pointHistory + = new PointHistoryResponseDto(1L, 1L, "회원가입", 5000, LocalDate.now()); + + List pointHistoryList = List.of(pointHistory); + + PageInfo pageInfo = PageInfo.builder() + .page(0) + .size(10) + .totalPages(1) + .totalElements(1) + .build(); + + PagedResponse> pagedResponse + = new PagedResponse<>(pointHistoryList, pageInfo); + + given(pointHistoryService.getPointHistoryList(anyLong(), any())) + .willReturn(pagedResponse); + + + mockMvc.perform(get("/api/point-history") + .param("memberId", "1") + .param("page", "0") + .param("size", "10")) + .andExpectAll( + jsonPath("$.data[0].id").value(pointHistory.getId()), + jsonPath("$.data[0].memberId").value(pointHistory.getMemberId()), + jsonPath("$.data[0].pointHistoryReason").value(pointHistory.getPointHistoryReason()), + jsonPath("$.data[0].pointHistoryPoint").value(pointHistory.getPointHistoryPoint()), + jsonPath("$.data[0].pointHistoryTime").value(pointHistory.getPointHistoryTime().toString()), + jsonPath("$.pageInfo.page").value(pageInfo.getPage()), + jsonPath("$.pageInfo.size").value(pageInfo.getSize()), + jsonPath("$.pageInfo.totalPages").value(pageInfo.getTotalPages()), + jsonPath("$.pageInfo.totalElements").value(pageInfo.getTotalElements())) + .andDo(print()); + } +} \ No newline at end of file diff --git a/src/test/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryTest.java b/src/test/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryTest.java new file mode 100644 index 00000000..24f7fab4 --- /dev/null +++ b/src/test/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryTest.java @@ -0,0 +1,135 @@ +package store.ckin.api.pointhistory.repository; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.time.LocalDate; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import store.ckin.api.grade.entity.Grade; +import store.ckin.api.member.entity.Member; +import store.ckin.api.pointhistory.dto.response.PointHistoryResponseDto; +import store.ckin.api.pointhistory.entity.PointHistory; + +/** + * 포인트 내역 레포지토리 테스트. + * + * @author 정승조 + * @version 2024. 03. 16. + */ + +@DataJpaTest +class PointHistoryRepositoryTest { + + @Autowired + PointHistoryRepository pointHistoryRepository; + + @Autowired + TestEntityManager entityManager; + + Member member; + + Grade grade; + + + @BeforeEach + void setUp() { + + grade = Grade.builder() + .name("Member") + .pointRatio(10) + .build(); + + entityManager.persist(grade); + + member = Member.builder() + .email("test@test.com") + .contact("01012341234") + .name("테스터") + .point(0) + .state(Member.State.ACTIVE) + .birth(LocalDate.of(1999, 5, 13)) + .grade(grade) + .build(); + + entityManager.persist(member); + + entityManager.flush(); + } + + @Test + @DisplayName("포인트 내역 저장 테스트") + void testSave() { + PointHistory pointHistory = PointHistory.builder() + .member(member) + .pointHistoryPoint(5000) + .pointHistoryReason("회원가입") + .pointHistoryTime(LocalDate.now()) + .build(); + + + PointHistory actual = pointHistoryRepository.save(pointHistory); + + assertAll( + () -> assertNotNull(actual.getPointHistoryId()), + () -> assertEquals(pointHistory.getMember(), actual.getMember()), + () -> assertEquals(pointHistory.getPointHistoryPoint(), actual.getPointHistoryPoint()), + () -> assertEquals(pointHistory.getPointHistoryReason(), actual.getPointHistoryReason()), + () -> assertEquals(pointHistory.getPointHistoryTime(), actual.getPointHistoryTime()) + ); + } + + @Test + @DisplayName("포인트 내역 리스트 조회 테스트") + void testGetPointHistoryList() { + PointHistory pointHistory = PointHistory.builder() + .member(member) + .pointHistoryPoint(5000) + .pointHistoryReason("회원가입") + .pointHistoryTime(LocalDate.now()) + .build(); + + pointHistoryRepository.save(pointHistory); + + PointHistory pointHistory2 = + PointHistory.builder().member(member).pointHistoryPoint(5000).pointHistoryReason("회원가입") + .pointHistoryTime(LocalDate.now()).build(); + + pointHistoryRepository.save(pointHistory2); + + Pageable pageable = Pageable.ofSize(10); + + Page acutal = + pointHistoryRepository.getPointHistoryList(member.getId(), pageable); + + List content = acutal.getContent(); + + assertAll( + () -> assertEquals(2, acutal.getTotalElements()), + () -> assertEquals(0, acutal.getNumber()), + () -> assertEquals(1, acutal.getTotalPages()), + () -> assertEquals(10, acutal.getSize()), + () -> assertEquals(2, content.size()), + + // order by desc + () -> assertEquals(pointHistory.getPointHistoryId(), content.get(1).getId()), + () -> assertEquals(pointHistory.getMember().getId(), content.get(1).getMemberId()), + () -> assertEquals(pointHistory.getPointHistoryReason(), content.get(1).getPointHistoryReason()), + () -> assertEquals(pointHistory.getPointHistoryPoint(), content.get(1).getPointHistoryPoint()), + () -> assertEquals(pointHistory.getPointHistoryTime(), content.get(1).getPointHistoryTime()), + () -> assertEquals(pointHistory2.getPointHistoryId(), content.get(0).getId()), + () -> assertEquals(pointHistory2.getMember().getId(), content.get(0).getMemberId()), + () -> assertEquals(pointHistory2.getPointHistoryReason(), content.get(0).getPointHistoryReason()), + () -> assertEquals(pointHistory2.getPointHistoryPoint(), content.get(0).getPointHistoryPoint()), + () -> assertEquals(pointHistory2.getPointHistoryTime(), content.get(0).getPointHistoryTime()) + ); + } +} \ No newline at end of file diff --git a/src/test/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImplTest.java b/src/test/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImplTest.java new file mode 100644 index 00000000..10adecf4 --- /dev/null +++ b/src/test/java/store/ckin/api/pointhistory/service/impl/PointHistoryServiceImplTest.java @@ -0,0 +1,107 @@ +package store.ckin.api.pointhistory.service.impl; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import store.ckin.api.common.domain.PageInfo; +import store.ckin.api.common.dto.PagedResponse; +import store.ckin.api.member.entity.Member; +import store.ckin.api.member.exception.MemberNotFoundException; +import store.ckin.api.member.repository.MemberRepository; +import store.ckin.api.pointhistory.dto.request.PointHistoryCreateRequestDto; +import store.ckin.api.pointhistory.dto.response.PointHistoryResponseDto; +import store.ckin.api.pointhistory.repository.PointHistoryRepository; + +/** + * 포인트 내역 서비스 테스트. + * + * @author 정승조 + * @version 2024. 03. 16. + */ + +@ExtendWith(MockitoExtension.class) +class PointHistoryServiceImplTest { + + @InjectMocks + PointHistoryServiceImpl pointHistoryService; + + @Mock + PointHistoryRepository pointHistoryRepository; + + @Mock + MemberRepository memberRepository; + + @Test + @DisplayName("포인트 내역 생성 테스트") + void testCreatePointHistory_Success() { + PointHistoryCreateRequestDto pointHistory = new PointHistoryCreateRequestDto(1L, "회원가입", 5000, LocalDate.now()); + + Member member = Member.builder().id(1L).build(); + + given(memberRepository.findById(anyLong())) + .willReturn(Optional.of(member)); + + pointHistoryService.createPointHistory(pointHistory); + + verify(memberRepository, times(1)).findById(anyLong()); + verify(pointHistoryRepository, times(1)).save(any()); + } + + @Test + @DisplayName("포인트 내역 생성 테스트 - 실패 (회원이 존재하지 않는 경우)") + void testCreatePointHistory_Fail() { + PointHistoryCreateRequestDto pointHistory = new PointHistoryCreateRequestDto(1L, "회원가입", 5000, LocalDate.now()); + + given(memberRepository.findById(anyLong())) + .willReturn(Optional.empty()); + + Assertions.assertThrows(MemberNotFoundException.class, + () -> pointHistoryService.createPointHistory(pointHistory)); + + verify(memberRepository, times(1)).findById(anyLong()); + verify(pointHistoryRepository, times(0)).save(any()); + } + + @Test + @DisplayName("포인트 내역 리스트 조회 테스트") + void testGetPointHistoryList() { + + PointHistoryResponseDto pointHistory + = new PointHistoryResponseDto(1L, 1L, "회원가입", 5000, LocalDate.now()); + + Page pointHistoryList = new PageImpl<>(List.of(pointHistory)); + + given(pointHistoryRepository.getPointHistoryList(anyLong(), any())) + .willReturn(pointHistoryList); + + Pageable pageable = Pageable.ofSize(10); + + PagedResponse> actual = + pointHistoryService.getPointHistoryList(1L, pageable); + + Assertions.assertAll( + () -> Assertions.assertEquals(pointHistoryList.getContent(), actual.getData()), + () -> Assertions.assertEquals(pointHistoryList.getNumber(), actual.getPageInfo().getPage()), + () -> Assertions.assertEquals(pointHistoryList.getTotalPages(), actual.getPageInfo().getTotalPages()), + () -> Assertions.assertEquals((int) pointHistoryList.getTotalElements(), actual.getPageInfo().getTotalElements()), + () -> Assertions.assertEquals(pointHistoryList.getSize(), actual.getPageInfo().getSize()) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/store/ckin/api/review/controller/ReviewControllerTest.java b/src/test/java/store/ckin/api/review/controller/ReviewControllerTest.java index 24ef286e..a43609e3 100644 --- a/src/test/java/store/ckin/api/review/controller/ReviewControllerTest.java +++ b/src/test/java/store/ckin/api/review/controller/ReviewControllerTest.java @@ -1,6 +1,19 @@ package store.ckin.api.review.controller; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; +import java.nio.charset.StandardCharsets; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,21 +27,7 @@ import org.springframework.test.web.servlet.MockMvc; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; import store.ckin.api.review.dto.response.ReviewResponseDto; -import store.ckin.api.review.service.ReviewService; - -import java.nio.charset.StandardCharsets; -import java.util.List; - -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import store.ckin.api.review.facade.ReviewFacade; /** * ReviewControllerTest @@ -46,7 +45,7 @@ class ReviewControllerTest { private ObjectMapper objectMapper; @MockBean - private ReviewService reviewService; + private ReviewFacade reviewFacade; private ReviewCreateRequestDto reviewCreateRequestDto; private ReviewResponseDto reviewResponseDto; @@ -71,10 +70,14 @@ void setUp() { @DisplayName("리뷰 업로드 구현 테스트") void testPostReview() throws Exception { - MockMultipartFile multipartFile1 = new MockMultipartFile("file", "test.txt", "text/plain", "test file".getBytes(StandardCharsets.UTF_8)); - MockMultipartFile multipartFile2 = new MockMultipartFile("file", "test2.txt", "text/plain", "test file2".getBytes(StandardCharsets.UTF_8)); + MockMultipartFile multipartFile1 = + new MockMultipartFile("file", "test.txt", "text/plain", "test file".getBytes(StandardCharsets.UTF_8)); + MockMultipartFile multipartFile2 = + new MockMultipartFile("file", "test2.txt", "text/plain", "test file2".getBytes(StandardCharsets.UTF_8)); String json = objectMapper.writeValueAsString(reviewCreateRequestDto); - MockMultipartFile createRequestDto = new MockMultipartFile("createRequestDto", "createRequestDto", "application/json", json.getBytes(StandardCharsets.UTF_8)); + MockMultipartFile createRequestDto = + new MockMultipartFile("createRequestDto", "createRequestDto", "application/json", + json.getBytes(StandardCharsets.UTF_8)); mockMvc.perform(multipart("/api/review") .file(multipartFile1) @@ -90,7 +93,7 @@ void testPostReview() throws Exception { void testGetReviewPageList() throws Exception { Page page = new PageImpl<>(List.of(reviewResponseDto)); - when(reviewService.getReviewPageList(any(), anyLong())).thenReturn(page); + when(reviewFacade.getReviewPageList(any(), anyLong())).thenReturn(page); mockMvc.perform(get("/api/review/{bookId}", 1L) .param("page", "0") diff --git a/src/test/java/store/ckin/api/review/facade/ReviewFacadeTest.java b/src/test/java/store/ckin/api/review/facade/ReviewFacadeTest.java new file mode 100644 index 00000000..033dba83 --- /dev/null +++ b/src/test/java/store/ckin/api/review/facade/ReviewFacadeTest.java @@ -0,0 +1,116 @@ +package store.ckin.api.review.facade; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.multipart.MultipartFile; +import store.ckin.api.member.service.MemberService; +import store.ckin.api.pointhistory.service.PointHistoryService; +import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; +import store.ckin.api.pointpolicy.service.PointPolicyService; +import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.response.ReviewResponseDto; +import store.ckin.api.review.service.ReviewService; + +/** + * 리뷰 퍼사드 테스트입니다. + * + * @author 정승조 + * @version 2024. 03. 16. + */ +@ExtendWith(MockitoExtension.class) +class ReviewFacadeTest { + + @InjectMocks + ReviewFacade reviewFacade; + + @Mock + ReviewService reviewService; + + @Mock + PointPolicyService pointPolicyService; + + @Mock + PointHistoryService pointHistoryService; + + @Mock + MemberService memberService; + + + ReviewCreateRequestDto reviewCreateRequestDto; + + List imageList; + + @BeforeEach + void setUp() { + + + reviewCreateRequestDto = new ReviewCreateRequestDto(); + ReflectionTestUtils.setField(reviewCreateRequestDto, "memberId", 1L); + ReflectionTestUtils.setField(reviewCreateRequestDto, "bookId", 1L); + ReflectionTestUtils.setField(reviewCreateRequestDto, "reviewRate", 5); + ReflectionTestUtils.setField(reviewCreateRequestDto, "reviewComment", "인상 깊게 읽었습니다."); + + imageList = new ArrayList<>(); + } + + @Test + @DisplayName("리뷰 생성 테스트") + void testPostReview() { + + PointPolicyResponseDto pointPolicy = new PointPolicyResponseDto(1L, "리뷰 작성", 200); + + given(pointPolicyService.getPointPolicy(anyLong())) + .willReturn(pointPolicy); + + reviewFacade.postReview(reviewCreateRequestDto, imageList); + + verify(reviewService, times(1)).postReview(any(), any()); + } + + @Test + @DisplayName("리뷰 페이지 리스트 조회 테스트") + void testGetReviewPageList() { + + ReviewResponseDto reviewResponseDto = new ReviewResponseDto(1L, "***un0000@email.com", "good", 5, "2023-03-12"); + + PageImpl reviewPage = new PageImpl<>(List.of(reviewResponseDto)); + + given(reviewService.getReviewPageList(any(), anyLong())) + .willReturn(reviewPage); + + Page reviewPageList = + reviewService.getReviewPageList(Pageable.ofSize(10), 1L); + + List content = reviewPage.getContent(); + assertAll( + () -> assertEquals(0, reviewPageList.getNumber()), + () -> assertEquals(1, reviewPageList.getSize()), + () -> assertEquals(1, reviewPageList.getTotalElements()), + () -> assertEquals(1, reviewPageList.getTotalPages()), + () -> assertEquals(1, content.size()), + () -> assertEquals(reviewResponseDto, content.get(0)) + ); + + verify(reviewService, times(1)).getReviewPageList(any(), anyLong()); + } + +} \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index a6951a8f..754dc74d 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -25,6 +25,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; import store.ckin.api.common.domain.PageInfo; @@ -63,21 +64,20 @@ void testCreateSale() throws Exception { given(saleFacade.createSale(any(SaleCreateRequestDto.class))) .willReturn("12314"); - SaleCreateRequestDto requestDto = new SaleCreateRequestDto( - 1L, - "테스트 책", - "정승조", - "01012345678", - "정승조", - "01012345678", - 3000, - LocalDate.of(2024, 3, 7), - "123456", - "광주광역시 동구 조선대 5길 ", - "IT 융합대학", - 0, - 10000 - ); + SaleCreateRequestDto requestDto = new SaleCreateRequestDto(); + ReflectionTestUtils.setField(requestDto, "memberId", 1L); + ReflectionTestUtils.setField(requestDto, "saleTitle", "테스트 책"); + ReflectionTestUtils.setField(requestDto, "saleOrdererName", "정승조"); + ReflectionTestUtils.setField(requestDto, "saleOrdererContact", "01012345678"); + ReflectionTestUtils.setField(requestDto, "saleReceiverName", "정승조"); + ReflectionTestUtils.setField(requestDto, "saleReceiverContact", "01012345678"); + ReflectionTestUtils.setField(requestDto, "deliveryFee", 3000); + ReflectionTestUtils.setField(requestDto, "saleDeliveryDate", LocalDate.of(2024, 3, 7)); + ReflectionTestUtils.setField(requestDto, "postcode", "123456"); + ReflectionTestUtils.setField(requestDto, "address", "광주광역시 동구 조선대 5길 "); + ReflectionTestUtils.setField(requestDto, "detailAddress", "1층 NHN"); + ReflectionTestUtils.setField(requestDto, "pointUsage", 0); + ReflectionTestUtils.setField(requestDto, "totalPrice", 10000); String json = objectMapper.writeValueAsString(requestDto); @@ -96,6 +96,7 @@ void testCreateSale() throws Exception { void testGetSales() throws Exception { SaleResponseDto responseDto = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", @@ -156,6 +157,7 @@ void testGetSales() throws Exception { void testGetSaleDetail() throws Exception { SaleResponseDto sale = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", @@ -354,6 +356,7 @@ void testGetSaleDetailBySaleNumber() throws Exception { SaleResponseDto sale = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", @@ -432,6 +435,102 @@ void testGetSaleDetailBySaleNumber() throws Exception { ); } + @Test + @DisplayName("회원의 ID와 주분 번호를 통해 주문 상세 정보 조회") + void testGetMemberSaleDetailBySaleNumber() throws Exception { + + BookAndBookSaleResponseDto bookSale = + new BookAndBookSaleResponseDto( + 1L, + "testimg.com", + "홍길동전", + 5, + 3L, + "A 포장", + 1000, + 50000); + + SaleResponseDto responseDto = + new SaleResponseDto( + 1L, + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.of(2024, 3, 7, 12, 0, 0), + LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), + LocalDate.of(2024, 3, 7).plusDays(3), + Sale.DeliveryStatus.READY, + 3000, + 0, + 10000, + Sale.PaymentStatus.WAITING, + "123456" + ); + + PaymentResponseDto payment = new PaymentResponseDto( + 1L, + 1L, + "1232321", + "1234", + LocalDateTime.now(), + LocalDateTime.now().plusHours(1), + "test.com"); + + + SaleDetailResponseDto sale = new SaleDetailResponseDto(List.of(bookSale), responseDto, payment); + + given(saleFacade.getMemberSaleDetailBySaleNumber(anyString(), anyLong())) + .willReturn(sale); + + mockMvc.perform(get("/api/sales/member") + .param("saleNumber", "1234") + .param("memberId", "1")) + .andExpectAll( + jsonPath("$.bookSaleList[0].bookId").value(bookSale.getBookId()), + jsonPath("$.bookSaleList[0].fileUrl").value(bookSale.getFileUrl()), + jsonPath("$.bookSaleList[0].bookTitle").value(bookSale.getBookTitle()), + jsonPath("$.bookSaleList[0].quantity").value(bookSale.getQuantity()), + jsonPath("$.bookSaleList[0].couponId").value(bookSale.getCouponId()), + jsonPath("$.bookSaleList[0].packagingType").value(bookSale.getPackagingType()), + jsonPath("$.bookSaleList[0].packagingPrice").value(bookSale.getPackagingPrice()), + jsonPath("$.bookSaleList[0].paymentAmount").value(bookSale.getPaymentAmount()), + jsonPath("$.saleResponseDto.saleId").value(responseDto.getSaleId()), + jsonPath("$.saleResponseDto.title").value(responseDto.getTitle()), + jsonPath("$.saleResponseDto.memberEmail").value(responseDto.getMemberEmail()), + jsonPath("$.saleResponseDto.saleNumber").value(responseDto.getSaleNumber()), + jsonPath("$.saleResponseDto.saleOrdererName").value(responseDto.getSaleOrdererName()), + jsonPath("$.saleResponseDto.saleOrdererContact").value(responseDto.getSaleOrdererContact()), + jsonPath("$.saleResponseDto.saleReceiverName").value(responseDto.getSaleReceiverName()), + jsonPath("$.saleResponseDto.saleReceiverContact").value(responseDto.getSaleReceiverContact()), + jsonPath("$.saleResponseDto.saleReceiverAddress").value(responseDto.getSaleReceiverAddress()), + jsonPath("$.saleResponseDto.saleDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleShippingDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleDeliveryDate").isNotEmpty(), + jsonPath("$.saleResponseDto.saleDeliveryStatus").value( + responseDto.getSaleDeliveryStatus().name()), + jsonPath("$.saleResponseDto.saleDeliveryFee").value(responseDto.getSaleDeliveryFee()), + jsonPath("$.saleResponseDto.salePointUsage").value(responseDto.getSalePointUsage()), + jsonPath("$.saleResponseDto.saleTotalPrice").value(responseDto.getSaleTotalPrice()), + jsonPath("$.saleResponseDto.salePaymentStatus").value( + responseDto.getSalePaymentStatus().name()), + jsonPath("$.saleResponseDto.saleShippingPostCode").value(responseDto.getSaleShippingPostCode()), + jsonPath("$.paymentResponseDto.paymentId").value(payment.getPaymentId()), + jsonPath("$.paymentResponseDto.saleId").value(payment.getSaleId()), + jsonPath("$.paymentResponseDto.paymentKey").value(payment.getPaymentKey()), + jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus()), + jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(), + jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), + jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) + ) + .andDo(print()); + } + @Test @DisplayName("회원 ID로 회원의 모든 주문 리스트 조회") void testGetSalesByMemberId() throws Exception { diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index dce9f9ec..04dc2c9d 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -29,6 +29,7 @@ import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.service.PaymentService; +import store.ckin.api.pointhistory.service.PointHistoryService; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; @@ -62,6 +63,9 @@ class SaleFacadeTest { @Mock PaymentService paymentService; + @Mock + PointHistoryService pointHistoryService; + @BeforeEach void setUp() { @@ -87,26 +91,25 @@ void testCreateSale() { List bookSaleList = List.of(firstDto, secondDto); - SaleCreateRequestDto requestDto = new SaleCreateRequestDto( - 1L, - "테스트 책", - "정승조", - "01012345678", - "정승조", - "01012345678", - 3000, - LocalDate.of(2024, 3, 7), - "123456", - "광주광역시 동구 조선대 5길 ", - "IT 융합대학", - 300, - 10000 - ); - + SaleCreateRequestDto requestDto = new SaleCreateRequestDto(); + ReflectionTestUtils.setField(requestDto, "memberId", 1L); + ReflectionTestUtils.setField(requestDto, "saleTitle", "테스트 제목"); + ReflectionTestUtils.setField(requestDto, "saleOrdererName", "정승조"); + ReflectionTestUtils.setField(requestDto, "saleOrdererContact", "01012345678"); + ReflectionTestUtils.setField(requestDto, "saleReceiverName", "정승조"); + ReflectionTestUtils.setField(requestDto, "saleReceiverContact", "01012345678"); + ReflectionTestUtils.setField(requestDto, "deliveryFee", 3000); + ReflectionTestUtils.setField(requestDto, "saleDeliveryDate", LocalDate.of(2024, 3, 7)); + ReflectionTestUtils.setField(requestDto, "postcode", "123456"); + ReflectionTestUtils.setField(requestDto, "address", "광주광역시 동구 조선대 5길 "); + ReflectionTestUtils.setField(requestDto, "detailAddress", "IT 융합대학"); + ReflectionTestUtils.setField(requestDto, "pointUsage", 300); + ReflectionTestUtils.setField(requestDto, "totalPrice", 10000); ReflectionTestUtils.setField(requestDto, "bookSaleList", bookSaleList); SaleResponseDto sale = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", @@ -131,9 +134,10 @@ void testCreateSale() { .willReturn(sale); // when - saleFacade.createSale(requestDto); + String saleNumber = saleFacade.createSale(requestDto); // then + assertEquals(sale.getSaleNumber(), saleNumber); verify(saleService, times(1)).createSale(any()); verify(bookSaleService, times(1)).createBookSale(anyLong(), any()); verify(memberService, times(1)).updatePoint(anyLong(), any()); @@ -169,6 +173,7 @@ void testGetSaleDetail() { SaleResponseDto sale = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", @@ -275,6 +280,7 @@ void testGetSaleDetailBySaleNumber_Fail_Contact_Different() { SaleResponseDto sale = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", @@ -307,6 +313,7 @@ void testGetSaleDetailBySaleNumber_Fail_Contact_Different() { void testGetSaleDetailBySaleNumber_Success() { SaleResponseDto sale = new SaleResponseDto( + 1L, 1L, "테스트 제목", "test@test.com", From fe94327debddb945161679c5f8804960ea7cf158 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Sat, 16 Mar 2024 23:52:40 +0900 Subject: [PATCH 053/161] =?UTF-8?q?[REFACTOR]=20=EC=BD=94=EB=93=9C=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 --- .../api/pointhistory/controller/PointHistoryController.java | 5 ++--- src/main/java/store/ckin/api/review/facade/ReviewFacade.java | 2 -- .../store/ckin/api/sale/dto/response/SaleResponseDto.java | 4 +++- src/main/java/store/ckin/api/sale/facade/SaleFacade.java | 4 +--- .../store/ckin/api/sale/repository/SaleRepositoryImpl.java | 2 ++ 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/store/ckin/api/pointhistory/controller/PointHistoryController.java b/src/main/java/store/ckin/api/pointhistory/controller/PointHistoryController.java index 6cd618ba..acf6ee87 100644 --- a/src/main/java/store/ckin/api/pointhistory/controller/PointHistoryController.java +++ b/src/main/java/store/ckin/api/pointhistory/controller/PointHistoryController.java @@ -43,8 +43,7 @@ public ResponseEntity createPointHistory(@Valid @RequestBody PointHistoryC public ResponseEntity>> getPointHistoryList( @RequestParam("memberId") Long memberId, @PageableDefault Pageable pageable) { - PagedResponse> responseDto = - pointHistoryService.getPointHistoryList(memberId, pageable); - return ResponseEntity.ok().body(responseDto); + + return ResponseEntity.ok().body(pointHistoryService.getPointHistoryList(memberId, pageable)); } } diff --git a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java index efed913c..50688a88 100644 --- a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java +++ b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Objects; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -25,7 +24,6 @@ * @author 정승조 * @version 2024. 03. 15. */ -@Slf4j @Service @RequiredArgsConstructor public class ReviewFacade { diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java index c6e815c7..8c65f4aa 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java @@ -15,13 +15,14 @@ * @version 2024. 03. 03. */ -@ToString @Getter @AllArgsConstructor public class SaleResponseDto { private Long saleId; + private Long memberId; + private String title; private String memberEmail; @@ -60,6 +61,7 @@ public static SaleResponseDto toDto(Sale sale) { return new SaleResponseDto( sale.getSaleId(), + Objects.nonNull(sale.getMember()) ? sale.getMember().getId() : null, sale.getSaleTitle(), Objects.nonNull(sale.getMember()) ? sale.getMember().getEmail() : "비회원", sale.getSaleNumber(), diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index dea850fe..3c056a41 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -11,7 +11,6 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.service.BookSaleService; import store.ckin.api.common.dto.PagedResponse; -import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.service.PaymentService; @@ -173,9 +172,8 @@ public SaleDetailResponseDto getGuestSaleDetailBySaleNumber(String saleNumber, S public SaleDetailResponseDto getMemberSaleDetailBySaleNumber(String saleNumber, Long memberId) { SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); - MemberInfoDetailResponseDto memberInfo = memberService.getMemberInfoDetail(memberId); - if (!Objects.equals(memberInfo.getEmail(), saleDetail.getMemberEmail())) { + if (!Objects.equals(memberId, saleDetail.getMemberId())) { throw new SaleMemberNotMatchException(saleNumber); } diff --git a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java index ca7b174f..47b86a98 100644 --- a/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java +++ b/src/main/java/store/ckin/api/sale/repository/SaleRepositoryImpl.java @@ -46,6 +46,7 @@ public SaleResponseDto findBySaleId(Long saleId) { .on(sale.member.eq(member)) .select(Projections.constructor(SaleResponseDto.class, sale.saleId, + sale.member.id, sale.saleTitle, sale.member.email, sale.saleNumber, @@ -143,6 +144,7 @@ public SaleResponseDto findBySaleNumber(String saleNumber) { .on(sale.member.eq(member)) .select(Projections.constructor(SaleResponseDto.class, sale.saleId, + sale.member.id, sale.saleTitle, sale.member.email, sale.saleNumber, From eb40beed71966ad0d92cca69b359576f287d8983 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:01:55 +0900 Subject: [PATCH 054/161] =?UTF-8?q?[REMOVE]=20getMemberDetailInfo=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api.iml | 4 +--- .../member/controller/MemberController.java | 15 ------------ .../response/MemberInfoDetailResponseDto.java | 24 ------------------- .../repository/MemberRepositoryCustom.java | 3 --- .../repository/impl/MemberRepositoryImpl.java | 13 ---------- .../api/member/service/MemberService.java | 3 --- .../service/impl/MemberServiceImpl.java | 11 --------- .../ckin/api/sale/facade/SaleFacade.java | 6 ----- 8 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 src/main/java/store/ckin/api/member/domain/response/MemberInfoDetailResponseDto.java diff --git a/api.iml b/api.iml index ec0dd8b8..a2faea40 100644 --- a/api.iml +++ b/api.iml @@ -3,6 +3,7 @@ + @@ -22,9 +23,6 @@ - - diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 3719ad24..dd8b89cb 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -15,7 +15,6 @@ import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; -import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.exception.MemberNotFoundException; @@ -61,20 +60,6 @@ public ResponseEntity getMemberInfo( return ResponseEntity.status(HttpStatus.OK).body(responseDto); } - /** - * SecurityContextHolder 에 담을 멤버 정보 요청을 처리하는 Method 입니다. - * - * @param id Member ID - * @return MemberInfoDetail - */ - @PostMapping("/login/{id}") - public ResponseEntity getMemberInfoDetail( - @PathVariable("id") Long id) { - MemberInfoDetailResponseDto responseDto = memberService.getMemberInfoDetail(id); - - return ResponseEntity.status(HttpStatus.OK).body(responseDto); - } - /** * 마이 페이지 정보를 조회하는 Method 입니다. * diff --git a/src/main/java/store/ckin/api/member/domain/response/MemberInfoDetailResponseDto.java b/src/main/java/store/ckin/api/member/domain/response/MemberInfoDetailResponseDto.java deleted file mode 100644 index 748320b3..00000000 --- a/src/main/java/store/ckin/api/member/domain/response/MemberInfoDetailResponseDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package store.ckin.api.member.domain.response; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import store.ckin.api.member.entity.Member; - -/** - * SecurityContextHolder 에 담을 멤버 정보 요청에 대한 응답 DTO 입니다. - * - * @author : jinwoolee - * @version : 2024. 03. 04. - */ -@Getter -@NoArgsConstructor -public class MemberInfoDetailResponseDto { - private String email; - - private String role; - - public MemberInfoDetailResponseDto(String email, Member.Role role) { - this.email = email; - this.role = role.name(); - } -} diff --git a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java index 005ca9ea..4bdf4974 100644 --- a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java +++ b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java @@ -2,7 +2,6 @@ import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.member.domain.response.MemberAuthResponseDto; -import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; /** @@ -15,8 +14,6 @@ public interface MemberRepositoryCustom { MemberAuthResponseDto getLoginInfo(String email); - MemberInfoDetailResponseDto getMemberInfoDetail(Long id); - MemberMyPageResponseDto getMyPageInfo(Long id); } diff --git a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java index 393ca38c..0b71164d 100644 --- a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java +++ b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java @@ -4,7 +4,6 @@ import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.grade.entity.QGrade; import store.ckin.api.member.domain.response.MemberAuthResponseDto; -import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.entity.QMember; @@ -38,18 +37,6 @@ public MemberAuthResponseDto getLoginInfo(String email) { .fetchOne(); } - @Override - public MemberInfoDetailResponseDto getMemberInfoDetail(Long id) { - QMember member = QMember.member; - - return from(member) - .select(Projections.constructor(MemberInfoDetailResponseDto.class, - member.email, - member.role)) - .where(member.id.eq(id)) - .fetchOne(); - } - @Override public MemberMyPageResponseDto getMyPageInfo(Long id) { QMember member = QMember.member; diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 481a104c..1539e821 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -3,7 +3,6 @@ import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; -import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; /** @@ -28,8 +27,6 @@ public interface MemberService { */ MemberAuthResponseDto getLoginMemberInfo(MemberAuthRequestDto memberAuthRequestDto); - MemberInfoDetailResponseDto getMemberInfoDetail(Long id); - MemberMyPageResponseDto getMyPageInfo(Long id); /** diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 6572bcfc..f946945a 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -10,7 +10,6 @@ import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; -import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.exception.MemberAlreadyExistsException; @@ -67,16 +66,6 @@ public MemberAuthResponseDto getLoginMemberInfo(MemberAuthRequestDto memberAuthR return memberRepository.getLoginInfo(memberAuthRequestDto.getEmail()); } - @Transactional(readOnly = true) - @Override - public MemberInfoDetailResponseDto getMemberInfoDetail(Long id) { - if (!memberRepository.existsById(id)) { - throw new MemberNotFoundException(id); - } - - return memberRepository.getMemberInfoDetail(id); - } - @Transactional(readOnly = true) @Override public MemberMyPageResponseDto getMyPageInfo(Long id) { diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 3975b376..0b853a48 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -11,7 +11,6 @@ import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.service.BookSaleService; import store.ckin.api.common.dto.PagedResponse; -import store.ckin.api.member.domain.response.MemberInfoDetailResponseDto; import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.service.PaymentService; @@ -160,11 +159,6 @@ public SaleDetailResponseDto getGuestSaleDetailBySaleNumber(String saleNumber, S public SaleDetailResponseDto getMemberSaleDetailBySaleNumber(String saleNumber, Long memberId) { SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); - MemberInfoDetailResponseDto memberInfo = memberService.getMemberInfoDetail(memberId); - - if (!Objects.equals(memberInfo.getEmail(), saleDetail.getMemberEmail())) { - throw new SaleMemberNotMatchException(saleNumber); - } List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); From 31469d267c4511405bd3dec9588efe16189a8599 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:16:48 +0900 Subject: [PATCH 055/161] [FEAT] Member Entity : member_oauth_id --- src/main/java/store/ckin/api/member/entity/Member.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index 319bdf5b..c52dc261 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -103,6 +103,8 @@ public enum Role { @ColumnDefault("0") private Integer accumulateAmount; + @Column(name = "member_oauth_id") + private String oauthId; public void updatePoint(Integer pointUsage) { this.point -= pointUsage; From bc537d67e9d26c6dfe665ed33c989d3f401808c5 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:18:32 +0900 Subject: [PATCH 056/161] [FEAT] MemberRepository : existsByOauthId --- .../java/store/ckin/api/member/repository/MemberRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/store/ckin/api/member/repository/MemberRepository.java b/src/main/java/store/ckin/api/member/repository/MemberRepository.java index 598daa78..b13f2b25 100644 --- a/src/main/java/store/ckin/api/member/repository/MemberRepository.java +++ b/src/main/java/store/ckin/api/member/repository/MemberRepository.java @@ -11,4 +11,6 @@ */ public interface MemberRepository extends JpaRepository, MemberRepositoryCustom { boolean existsByEmail(String email); + + boolean existsByOauthId(String oauthId); } From ccecc02f97a6219a442e171f05aa547dd657a5de Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:32:03 +0900 Subject: [PATCH 057/161] [FEAT] MemberOAuthIdOnlyRequestDto --- .../request/MemberOauthIdOnlyRequestDto.java | 18 ++++++++++++++++++ .../ckin/api/member/service/MemberService.java | 6 +++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/java/store/ckin/api/member/domain/request/MemberOauthIdOnlyRequestDto.java diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberOauthIdOnlyRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberOauthIdOnlyRequestDto.java new file mode 100644 index 00000000..65660b91 --- /dev/null +++ b/src/main/java/store/ckin/api/member/domain/request/MemberOauthIdOnlyRequestDto.java @@ -0,0 +1,18 @@ +package store.ckin.api.member.domain.request; + +import javax.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * OAuth ID 만으로 요청하는 DTO 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 17. + */ +@Getter +@NoArgsConstructor +public class MemberOauthIdOnlyRequestDto { + @NotBlank + private String oauthId; +} diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 1539e821..2fa3ba72 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -23,10 +23,14 @@ public interface MemberService { * 로그인하는 Member 의 정보를 조회하는 메서드 입니다. * * @param memberAuthRequestDto 로그인 정보 요청 DTO - * @return LoginResponseDto 로그인 응답 DTO */ MemberAuthResponseDto getLoginMemberInfo(MemberAuthRequestDto memberAuthRequestDto); + /** + * 마이페이지 헤더에 들어갈 계정 정보를 조회하는 메서드 입니다. + * + * @param id Member ID + */ MemberMyPageResponseDto getMyPageInfo(Long id); /** From 73f9ced84d5030c74bfbf68c62449e2391a5b8b7 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:34:51 +0900 Subject: [PATCH 058/161] [FEAT] MemberOAuthLoginResponseDTO --- .../response/MemberOauthLoginResponseDto.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/store/ckin/api/member/domain/response/MemberOauthLoginResponseDto.java diff --git a/src/main/java/store/ckin/api/member/domain/response/MemberOauthLoginResponseDto.java b/src/main/java/store/ckin/api/member/domain/response/MemberOauthLoginResponseDto.java new file mode 100644 index 00000000..3041264f --- /dev/null +++ b/src/main/java/store/ckin/api/member/domain/response/MemberOauthLoginResponseDto.java @@ -0,0 +1,18 @@ +package store.ckin.api.member.domain.response; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * OAuth Login 요청에 응답하는 DTO 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 17. + */ +@Getter +@NoArgsConstructor +public class MemberOauthLoginResponseDto { + private Long id; + + private String role; +} From 4457e9cab1ccd475b9e65738c48c7b3ac939b0b7 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:40:10 +0900 Subject: [PATCH 059/161] [FEAT] MemberRepository : getOAuthMemberinfo --- .../domain/response/MemberOauthLoginResponseDto.java | 6 ++++++ .../member/repository/MemberRepositoryCustom.java | 2 ++ .../member/repository/impl/MemberRepositoryImpl.java | 12 ++++++++++++ 3 files changed, 20 insertions(+) diff --git a/src/main/java/store/ckin/api/member/domain/response/MemberOauthLoginResponseDto.java b/src/main/java/store/ckin/api/member/domain/response/MemberOauthLoginResponseDto.java index 3041264f..967d53e5 100644 --- a/src/main/java/store/ckin/api/member/domain/response/MemberOauthLoginResponseDto.java +++ b/src/main/java/store/ckin/api/member/domain/response/MemberOauthLoginResponseDto.java @@ -2,6 +2,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import store.ckin.api.member.entity.Member; /** * OAuth Login 요청에 응답하는 DTO 클래스 입니다. @@ -15,4 +16,9 @@ public class MemberOauthLoginResponseDto { private Long id; private String role; + + public MemberOauthLoginResponseDto(Long id, Member.Role role) { + this.id = id; + this.role = role.name(); + } } diff --git a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java index 4bdf4974..5a1778b7 100644 --- a/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java +++ b/src/main/java/store/ckin/api/member/repository/MemberRepositoryCustom.java @@ -3,6 +3,7 @@ import org.springframework.data.repository.NoRepositoryBean; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; +import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; /** * Member Entity 에 Query dsl 을 적용할 메서드를 기술한 interface 입니다. @@ -16,4 +17,5 @@ public interface MemberRepositoryCustom { MemberMyPageResponseDto getMyPageInfo(Long id); + MemberOauthLoginResponseDto getOauthMemberInfo(String oauthId); } diff --git a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java index 0b71164d..8b0f4d2d 100644 --- a/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java +++ b/src/main/java/store/ckin/api/member/repository/impl/MemberRepositoryImpl.java @@ -5,6 +5,7 @@ import store.ckin.api.grade.entity.QGrade; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; +import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.entity.QMember; import store.ckin.api.member.repository.MemberRepositoryCustom; @@ -57,4 +58,15 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { .fetchOne(); } + @Override + public MemberOauthLoginResponseDto getOauthMemberInfo(String oauthId) { + QMember member = QMember.member; + + return from(member) + .select(Projections.constructor(MemberOauthLoginResponseDto.class, + member.id, + member.role)) + .where(member.oauthId.eq(oauthId)) + .fetchOne(); + } } From 31e2af90210aac97d37c6a6e411d2e145bba884c Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:44:30 +0900 Subject: [PATCH 060/161] [FEAT] MemberService : getOAuthMemberInfo --- .../member/exception/MemberNotFoundException.java | 3 +++ .../ckin/api/member/service/MemberService.java | 4 ++++ .../api/member/service/impl/MemberServiceImpl.java | 14 ++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java b/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java index febb53ec..68c884e4 100644 --- a/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java +++ b/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java @@ -14,4 +14,7 @@ public MemberNotFoundException(Long id) { public MemberNotFoundException(String email) { super(String.format("Member not found for this email [%s]", email)); } + + public MemberNotFoundException() { + } } diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 2fa3ba72..5063810a 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -2,8 +2,10 @@ import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; +import store.ckin.api.member.domain.request.MemberOauthIdOnlyRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; +import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; /** * Member 의 관한 로직을 처리하는 서비스 인터페이스 입니다. @@ -40,4 +42,6 @@ public interface MemberService { * @param pointUsage 사용한 포인트 */ void updatePoint(Long memberId, Integer pointUsage); + + MemberOauthLoginResponseDto getOauthMemberInfo(MemberOauthIdOnlyRequestDto memberOauthIdOnlyRequestDto); } diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index f946945a..ae789001 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -9,8 +9,10 @@ import store.ckin.api.grade.repository.GradeRepository; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; +import store.ckin.api.member.domain.request.MemberOauthIdOnlyRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; +import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.exception.MemberNotFoundException; @@ -91,4 +93,16 @@ public void updatePoint(Long memberId, Integer pointUsage) { // TODO : PointHistory - 사용한 포인트 기록 남기기 (추후 구현) member.updatePoint(pointUsage); } + + @Transactional(readOnly = true) + @Override + public MemberOauthLoginResponseDto getOauthMemberInfo(MemberOauthIdOnlyRequestDto memberOauthIdOnlyRequestDto) { + String oauthId = memberOauthIdOnlyRequestDto.getOauthId(); + + if (!memberRepository.existsByOauthId(oauthId)) { + throw new MemberNotFoundException(); + } + + return memberRepository.getOauthMemberInfo(oauthId); + } } From db5ba53b527df70efac66ae1953107f80f44be0f Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:52:14 +0900 Subject: [PATCH 061/161] [FEAT] MemberController : getOauthMemberInfo --- .../api/member/controller/MemberController.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index dd8b89cb..3bb73193 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -14,8 +14,10 @@ import org.springframework.web.bind.annotation.RestController; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; +import store.ckin.api.member.domain.request.MemberOauthIdOnlyRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; +import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.service.MemberService; @@ -80,6 +82,20 @@ public ResponseEntity getMyPageInfo( return ResponseEntity.status(HttpStatus.OK).body(responseDto); } + /** + * OAuth 로그인 시 필요한 정보를 요청하는 API Method 입니다. + * + * @param memberOauthIdOnlyRequestDto Member OAuth ID + * @return MemberOauthLoginResponseDto (200 OK) + */ + @GetMapping("/login/oauth") + public ResponseEntity getOauthMemberInfo( + @Valid @RequestBody MemberOauthIdOnlyRequestDto memberOauthIdOnlyRequestDto) { + MemberOauthLoginResponseDto responseDto = memberService.getOauthMemberInfo(memberOauthIdOnlyRequestDto); + + return ResponseEntity.status(HttpStatus.OK).body(responseDto); + } + /** * MemberController 에서 MemberAlreadyExistsException 이 발생 시 처리하는 Method 입니다. * From 5bef0cffb94f89607e1c949b20b4c58c39db84eb Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 00:52:43 +0900 Subject: [PATCH 062/161] =?UTF-8?q?[REMOVE]=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/member/controller/MemberController.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 3bb73193..06f86c63 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -71,14 +71,8 @@ public ResponseEntity getMemberInfo( @GetMapping("/members/mypage/{memberId}") public ResponseEntity getMyPageInfo( @PathVariable("memberId") Long id) { - log.info("API memberId: {}", id.toString()); - MemberMyPageResponseDto responseDto = memberService.getMyPageInfo(id); - log.info("API dto : {}", responseDto); - log.info("API dto name : {}", responseDto.getName()); - log.info("API dto grade name : {}", responseDto.getGradeName()); - return ResponseEntity.status(HttpStatus.OK).body(responseDto); } From 894fc3dcab122f6531882c175cea2f9debc797de Mon Sep 17 00:00:00 2001 From: nayoseb Date: Sun, 17 Mar 2024 15:14:57 +0900 Subject: [PATCH 063/161] =?UTF-8?q?[FIX]=20=EB=8F=84=EC=84=9C=20LazyInitia?= =?UTF-8?q?lizationException=20=ED=83=9C=EA=B7=B8=20=ED=8E=98=EC=B9=98?= =?UTF-8?q?=EC=A1=B0=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/book/repository/impl/BookRepositoryImpl.java | 4 ++++ .../ckin/api/book/service/impl/BookServiceImpl.java | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index b51b0f28..221d0dbc 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -295,6 +295,8 @@ public List getMainPageResponseDtoByCategoryId(Long cat .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.categories, bookCategory).fetchJoin() .leftJoin(bookCategory.category, category).fetchJoin() + .leftJoin(book.tags,bookTag).fetchJoin() + .leftJoin(bookTag.tag, tag).fetchJoin() .leftJoin(book.thumbnail, file).fetchJoin() .where(book.bookId.in(bookIds)) .distinct() @@ -323,6 +325,8 @@ public List getMainPageResponseDtoOrderByBookPublicatio .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.categories, bookCategory).fetchJoin() .leftJoin(bookCategory.category, category).fetchJoin() + .leftJoin(book.tags, bookTag).fetchJoin() + .leftJoin(bookTag.tag, tag).fetchJoin() .leftJoin(book.thumbnail, file).fetchJoin() .where(book.bookId.in(bookIds)) .distinct() diff --git a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java index 96a37347..41c0f9b1 100644 --- a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java +++ b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java @@ -210,8 +210,8 @@ public void updateBookThumbnail(Long bookId, MultipartFile file) throws IOExcept /** * {@inheritDoc} */ - @Transactional(readOnly = true) @Override + @Transactional(readOnly = true) public BookResponseDto findBookById(Long bookId) { Book book = bookRepository.findByBookId(bookId) .orElseThrow(() -> new BookNotFoundException(bookId)); @@ -231,11 +231,14 @@ public List getExtractBookListByBookIds(List bo } @Override + @Transactional(readOnly = true) public List getMainPageBookListByCategoryId(Long categoryId, Integer limit) { - return bookRepository.getMainPageResponseDtoByCategoryId(categoryId,limit); + return bookRepository.getMainPageResponseDtoByCategoryId(categoryId, limit); } + @Override - public List getMainPageBookListOrderByBookPublicationDate( Integer limit) { + @Transactional(readOnly = true) + public List getMainPageBookListOrderByBookPublicationDate(Integer limit) { return bookRepository.getMainPageResponseDtoOrderByBookPublicationDate(limit); } From ee930a5eaea49ac7ebe894724574bee9ecb0fc16 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Sun, 17 Mar 2024 15:18:14 +0900 Subject: [PATCH 064/161] =?UTF-8?q?[FIX]=20Open=20Session=20In=20View=20fa?= =?UTF-8?q?lse=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0ebe8ffa..9c30a20c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -34,4 +34,6 @@ storage.password=a6d5144a67624ad5b7e47ad04083045c storage.identity=258ec250904445ff97d196ca34a86fdc # file size option spring.servlet.multipart.max-file-size=500MB -spring.servlet.multipart.max-request-size=500MB \ No newline at end of file +spring.servlet.multipart.max-request-size=500MB +# Open Session In View +spring.jpa.open-in-view= false From 7df4afaca343afee3ab182b04fb624cab37d7571 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Sun, 17 Mar 2024 18:23:35 +0900 Subject: [PATCH 065/161] =?UTF-8?q?[REFACTOR]=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=EC=97=90=EC=84=9C=20=ED=8A=B8?= =?UTF-8?q?=EB=9E=9C=EC=9E=AD=EC=85=98=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=84=A0=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/review/service/ReviewService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/store/ckin/api/review/service/ReviewService.java b/src/main/java/store/ckin/api/review/service/ReviewService.java index 87875927..9d571edc 100644 --- a/src/main/java/store/ckin/api/review/service/ReviewService.java +++ b/src/main/java/store/ckin/api/review/service/ReviewService.java @@ -33,6 +33,5 @@ public interface ReviewService { * @return 리뷰 DTO 페이지 */ Page getReviewPageList(Pageable pageable, Long bookId); - @Transactional(readOnly = true) Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable); } From eb7e9da57b945b99a7c11f3e91c3e00feb885628 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 21:26:32 +0900 Subject: [PATCH 066/161] =?UTF-8?q?[REFACTOR]=20=EC=B6=A9=EB=8F=8C=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20(=EC=9E=84=EC=8B=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/review/controller/ReviewController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index e8bf7215..29736f7a 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -19,6 +19,7 @@ import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.facade.ReviewFacade; +import store.ckin.api.review.service.ReviewService; /** * ReviewController 클래스. @@ -34,6 +35,8 @@ public class ReviewController { private final ReviewFacade reviewFacade; + private final ReviewService reviewService; + /** * 리뷰 업로드를 구현하는 메소드 입니다. * From 90f061323750bbfefe5b3a91aea4fb388a785a7f Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 23:51:24 +0900 Subject: [PATCH 067/161] [FEAT] Address Entity --- .../ckin/api/address/entity/Address.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/main/java/store/ckin/api/address/entity/Address.java diff --git a/src/main/java/store/ckin/api/address/entity/Address.java b/src/main/java/store/ckin/api/address/entity/Address.java new file mode 100644 index 00000000..97af985a --- /dev/null +++ b/src/main/java/store/ckin/api/address/entity/Address.java @@ -0,0 +1,55 @@ +package store.ckin.api.address.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; +import store.ckin.api.member.entity.Member; + +/** + * Address Table 의 Entity Class 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 17. + */ +@Builder +@Getter +@DynamicInsert +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode +@Entity(name = "Address") +public class Address { + @Id + @Column(name = "address_id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @Column("address_base") + private String base; + + @Column("address_detail") + private String detail; + + @Column("address_alias") + private String alias; + + @Column("address_default") + @ColumnDefault("false") + private boolean isDefault; +} From 9fcd110e9f4c42a5711046d854208b89660648a4 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Sun, 17 Mar 2024 23:56:30 +0900 Subject: [PATCH 068/161] [FEAT] AddressRepository --- .../entity/repository/AddressRepository.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/store/ckin/api/address/entity/repository/AddressRepository.java diff --git a/src/main/java/store/ckin/api/address/entity/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/entity/repository/AddressRepository.java new file mode 100644 index 00000000..cdbe4088 --- /dev/null +++ b/src/main/java/store/ckin/api/address/entity/repository/AddressRepository.java @@ -0,0 +1,13 @@ +package store.ckin.api.address.entity.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import store.ckin.api.address.entity.Address; + +/** + * Address 에 관한 쿼리를 관리하는 인터페이스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 17. + */ +public interface AddressRepository extends JpaRepository { +} From 07015c6324921231238c2f312c057bcf680f3770 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 00:00:55 +0900 Subject: [PATCH 069/161] [FEAT] MemberAddressResponseDto --- .../response/MemberAddressResponseDto.java | 22 +++++++++++++++++++ .../repository/AddressRepository.java | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java rename src/main/java/store/ckin/api/address/{entity => }/repository/AddressRepository.java (86%) diff --git a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java new file mode 100644 index 00000000..1b5c7459 --- /dev/null +++ b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java @@ -0,0 +1,22 @@ +package store.ckin.api.address.domain.response; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 특정 멤버의 주소 정보를 응답하는 DTO 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 17. + */ +@Getter +@NoArgsConstructor +public class MemberAddressResponseDto { + private String base; + + private String detail; + + private String alias; + + private boolean isDefault; +} diff --git a/src/main/java/store/ckin/api/address/entity/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/repository/AddressRepository.java similarity index 86% rename from src/main/java/store/ckin/api/address/entity/repository/AddressRepository.java rename to src/main/java/store/ckin/api/address/repository/AddressRepository.java index cdbe4088..b0ce0087 100644 --- a/src/main/java/store/ckin/api/address/entity/repository/AddressRepository.java +++ b/src/main/java/store/ckin/api/address/repository/AddressRepository.java @@ -1,4 +1,4 @@ -package store.ckin.api.address.entity.repository; +package store.ckin.api.address.repository; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.address.entity.Address; From 2303966fa8586eb349b41684ea5de3f5b3821c9d Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 00:07:34 +0900 Subject: [PATCH 070/161] [FEAT] AddressRepository : getMemberAddressList --- .../ckin/api/address/entity/Address.java | 8 ++-- .../repository/AddressRepositoryCustom.java | 16 ++++++++ .../impl/AddressRepositoryImpl.java | 40 +++++++++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 src/main/java/store/ckin/api/address/repository/AddressRepositoryCustom.java create mode 100644 src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java diff --git a/src/main/java/store/ckin/api/address/entity/Address.java b/src/main/java/store/ckin/api/address/entity/Address.java index 97af985a..6bfe26bc 100644 --- a/src/main/java/store/ckin/api/address/entity/Address.java +++ b/src/main/java/store/ckin/api/address/entity/Address.java @@ -40,16 +40,16 @@ public class Address { @JoinColumn(name = "member_id") private Member member; - @Column("address_base") + @Column(name = "address_base") private String base; - @Column("address_detail") + @Column(name = "address_detail") private String detail; - @Column("address_alias") + @Column(name = "address_alias") private String alias; - @Column("address_default") + @Column(name = "address_default") @ColumnDefault("false") private boolean isDefault; } diff --git a/src/main/java/store/ckin/api/address/repository/AddressRepositoryCustom.java b/src/main/java/store/ckin/api/address/repository/AddressRepositoryCustom.java new file mode 100644 index 00000000..bc52b31d --- /dev/null +++ b/src/main/java/store/ckin/api/address/repository/AddressRepositoryCustom.java @@ -0,0 +1,16 @@ +package store.ckin.api.address.repository; + +import java.util.List; +import org.springframework.data.repository.NoRepositoryBean; +import store.ckin.api.address.domain.response.MemberAddressResponseDto; + +/** + * Address Entity 에 Query dsl 을 적용할 메서드를 기술한 interface 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +@NoRepositoryBean +public interface AddressRepositoryCustom { + List getMemberAddressList(Long memberId); +} diff --git a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java new file mode 100644 index 00000000..46550301 --- /dev/null +++ b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java @@ -0,0 +1,40 @@ +package store.ckin.api.address.repository.impl; + +import java.util.List; + +import com.querydsl.core.types.Projections; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; +import store.ckin.api.address.domain.response.MemberAddressResponseDto; +import store.ckin.api.address.entity.Address; +import store.ckin.api.address.entity.QAddress; +import store.ckin.api.address.repository.AddressRepositoryCustom; +import store.ckin.api.member.entity.QMember; + +/** + * MemberRepositoryCustom 의 구현체 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +public class AddressRepositoryImpl extends QuerydslRepositorySupport + implements AddressRepositoryCustom { + public AddressRepositoryImpl() { + super(Address.class); + } + + @Override + public List getMemberAddressList(Long memberId) { + QAddress address = QAddress.address; + QMember member = QMember.member; + + return from(address) + .select(Projections.constructor(MemberAddressResponseDto.class, + address.base, + address.detail, + address.alias, + address.isDefault + )) + .where(member.id.eq(memberId)) + .fetch(); + } +} From 86e10224b6f1339941af00953fec6a6eba67d520 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 00:22:01 +0900 Subject: [PATCH 071/161] [FEAT] AddressService --- .../domain/request/AddressAddRequestDto.java | 20 ++++++++++++++ .../request/AddressUpdateRequestDto.java | 24 +++++++++++++++++ .../address/repository/AddressRepository.java | 2 +- .../impl/AddressRepositoryImpl.java | 3 +-- .../api/address/service/AddressService.java | 26 +++++++++++++++++++ 5 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java create mode 100644 src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java create mode 100644 src/main/java/store/ckin/api/address/service/AddressService.java diff --git a/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java b/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java new file mode 100644 index 00000000..e5cbd7d7 --- /dev/null +++ b/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java @@ -0,0 +1,20 @@ +package store.ckin.api.address.domain.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 주소 추가를 요청하는 DTO 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +@Getter +@NoArgsConstructor +public class AddressAddRequestDto { + private String base; + + private String detail; + + private String alias; +} diff --git a/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java b/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java new file mode 100644 index 00000000..2734e0fe --- /dev/null +++ b/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java @@ -0,0 +1,24 @@ +package store.ckin.api.address.domain.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 주소 수정을 요청하는 DTO 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +@Getter +@NoArgsConstructor +public class AddressUpdateRequestDto { + private Long addressId; + + private String base; + + private String detail; + + private String alias; + + private boolean isDefault; +} diff --git a/src/main/java/store/ckin/api/address/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/repository/AddressRepository.java index b0ce0087..8652838c 100644 --- a/src/main/java/store/ckin/api/address/repository/AddressRepository.java +++ b/src/main/java/store/ckin/api/address/repository/AddressRepository.java @@ -9,5 +9,5 @@ * @author : jinwoolee * @version : 2024. 03. 17. */ -public interface AddressRepository extends JpaRepository { +public interface AddressRepository extends JpaRepository, AddressRepositoryCustom { } diff --git a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java index 46550301..aa0dc0e9 100644 --- a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java +++ b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java @@ -1,8 +1,7 @@ package store.ckin.api.address.repository.impl; -import java.util.List; - import com.querydsl.core.types.Projections; +import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import store.ckin.api.address.domain.response.MemberAddressResponseDto; import store.ckin.api.address.entity.Address; diff --git a/src/main/java/store/ckin/api/address/service/AddressService.java b/src/main/java/store/ckin/api/address/service/AddressService.java new file mode 100644 index 00000000..4c2653b8 --- /dev/null +++ b/src/main/java/store/ckin/api/address/service/AddressService.java @@ -0,0 +1,26 @@ +package store.ckin.api.address.service; + +import java.util.List; +import store.ckin.api.address.domain.request.AddressAddRequestDto; +import store.ckin.api.address.domain.request.AddressUpdateRequestDto; +import store.ckin.api.address.domain.response.MemberAddressResponseDto; + +/** + * Address 에 관한 로직을 처리하는 서비스 인터페이스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +public interface AddressService { + boolean isDefaultAddress(Long addressId); + + void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto); + + List getMemberAddressList(Long memberId); + + void updateAddress(Long memberId, AddressUpdateRequestDto addressUpdateRequestDto); + + void setDefaultAddress(Long addressId); + + void deleteAddress(Long addressId); +} From 377ad283d797f53716b1da58011039a308f1be90 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 00:23:59 +0900 Subject: [PATCH 072/161] [FEAT] AddressServiceImpl --- .../service/impl/AddressServiceImpl.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java new file mode 100644 index 00000000..4c533947 --- /dev/null +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -0,0 +1,52 @@ +package store.ckin.api.address.service.impl; + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import store.ckin.api.address.domain.request.AddressAddRequestDto; +import store.ckin.api.address.domain.request.AddressUpdateRequestDto; +import store.ckin.api.address.domain.response.MemberAddressResponseDto; +import store.ckin.api.address.repository.AddressRepository; +import store.ckin.api.address.service.AddressService; + +/** + * AddressService 의 구현체 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +@Service +@RequiredArgsConstructor +public class AddressServiceImpl implements AddressService { + private final AddressRepository addressRepository; + + @Override + public boolean isDefaultAddress(Long addressId) { + return false; + } + + @Override + public void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto) { + + } + + @Override + public List getMemberAddressList(Long memberId) { + return null; + } + + @Override + public void updateAddress(Long memberId, AddressUpdateRequestDto addressUpdateRequestDto) { + + } + + @Override + public void setDefaultAddress(Long addressId) { + + } + + @Override + public void deleteAddress(Long addressId) { + + } +} From d9e004ec993acac5484afea03f5c3c3933f55fbe Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 00:38:09 +0900 Subject: [PATCH 073/161] [FEAT] AddressServiceImpl : isDefaultAddress --- .../domain/exception/AddressNotFoundException.java | 10 ++++++++++ .../domain/request/AddressUpdateRequestDto.java | 2 +- .../domain/response/MemberAddressResponseDto.java | 2 +- .../java/store/ckin/api/address/entity/Address.java | 2 +- .../ckin/api/address/repository/AddressRepository.java | 3 +++ .../api/address/service/impl/AddressServiceImpl.java | 9 ++++++++- 6 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/main/java/store/ckin/api/address/domain/exception/AddressNotFoundException.java diff --git a/src/main/java/store/ckin/api/address/domain/exception/AddressNotFoundException.java b/src/main/java/store/ckin/api/address/domain/exception/AddressNotFoundException.java new file mode 100644 index 00000000..a00d54c0 --- /dev/null +++ b/src/main/java/store/ckin/api/address/domain/exception/AddressNotFoundException.java @@ -0,0 +1,10 @@ +package store.ckin.api.address.domain.exception; + +/** + * 조회한 주소가 없을 때 호출되는 Exception 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +public class AddressNotFoundException extends RuntimeException{ +} diff --git a/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java b/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java index 2734e0fe..5820c1c6 100644 --- a/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java @@ -20,5 +20,5 @@ public class AddressUpdateRequestDto { private String alias; - private boolean isDefault; + private Boolean isDefault; } diff --git a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java index 1b5c7459..f64134d2 100644 --- a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java +++ b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java @@ -18,5 +18,5 @@ public class MemberAddressResponseDto { private String alias; - private boolean isDefault; + private Boolean isDefault; } diff --git a/src/main/java/store/ckin/api/address/entity/Address.java b/src/main/java/store/ckin/api/address/entity/Address.java index 6bfe26bc..b9292eba 100644 --- a/src/main/java/store/ckin/api/address/entity/Address.java +++ b/src/main/java/store/ckin/api/address/entity/Address.java @@ -51,5 +51,5 @@ public class Address { @Column(name = "address_default") @ColumnDefault("false") - private boolean isDefault; + private Boolean isDefault; } diff --git a/src/main/java/store/ckin/api/address/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/repository/AddressRepository.java index 8652838c..dced36a7 100644 --- a/src/main/java/store/ckin/api/address/repository/AddressRepository.java +++ b/src/main/java/store/ckin/api/address/repository/AddressRepository.java @@ -1,6 +1,7 @@ package store.ckin.api.address.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import store.ckin.api.address.entity.Address; /** @@ -10,4 +11,6 @@ * @version : 2024. 03. 17. */ public interface AddressRepository extends JpaRepository, AddressRepositoryCustom { + @Query(value = "SELECT a.isDefault FROM Address AS a WHERE a.id = :addressId") + Boolean isDefaultAddress(Long addressId); } diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index 4c533947..67f5cd53 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -3,6 +3,8 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import store.ckin.api.address.domain.exception.AddressNotFoundException; import store.ckin.api.address.domain.request.AddressAddRequestDto; import store.ckin.api.address.domain.request.AddressUpdateRequestDto; import store.ckin.api.address.domain.response.MemberAddressResponseDto; @@ -20,9 +22,14 @@ public class AddressServiceImpl implements AddressService { private final AddressRepository addressRepository; + @Transactional(readOnly = true) @Override public boolean isDefaultAddress(Long addressId) { - return false; + if (!addressRepository.existsById(addressId)) { + throw new AddressNotFoundException(); + } + + return addressRepository.isDefaultAddress(addressId); } @Override From 2f0f136cd4272f46cda0fe3643b87fa4b3da29c2 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 00:49:43 +0900 Subject: [PATCH 074/161] [FEAT] AddressServiceImpl : addAddress --- .../AddressAlreadyExistsException.java | 10 ++++++++ .../domain/request/AddressAddRequestDto.java | 4 +++ .../address/repository/AddressRepository.java | 2 ++ .../service/impl/AddressServiceImpl.java | 25 +++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 src/main/java/store/ckin/api/address/domain/exception/AddressAlreadyExistsException.java diff --git a/src/main/java/store/ckin/api/address/domain/exception/AddressAlreadyExistsException.java b/src/main/java/store/ckin/api/address/domain/exception/AddressAlreadyExistsException.java new file mode 100644 index 00000000..18e8bdcd --- /dev/null +++ b/src/main/java/store/ckin/api/address/domain/exception/AddressAlreadyExistsException.java @@ -0,0 +1,10 @@ +package store.ckin.api.address.domain.exception; + +/** + * 이미 등록된 주소일 때 호출되는 Exception 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +public class AddressAlreadyExistsException extends RuntimeException{ +} diff --git a/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java b/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java index e5cbd7d7..b71fc7d9 100644 --- a/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java +++ b/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java @@ -1,5 +1,6 @@ package store.ckin.api.address.domain.request; +import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,9 +13,12 @@ @Getter @NoArgsConstructor public class AddressAddRequestDto { + @NotBlank private String base; + @NotBlank private String detail; + @NotBlank private String alias; } diff --git a/src/main/java/store/ckin/api/address/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/repository/AddressRepository.java index dced36a7..bc6fb354 100644 --- a/src/main/java/store/ckin/api/address/repository/AddressRepository.java +++ b/src/main/java/store/ckin/api/address/repository/AddressRepository.java @@ -13,4 +13,6 @@ public interface AddressRepository extends JpaRepository, AddressRepositoryCustom { @Query(value = "SELECT a.isDefault FROM Address AS a WHERE a.id = :addressId") Boolean isDefaultAddress(Long addressId); + + boolean existsByMemberIdAndBaseAndDetail(Long memberId, String base, String detail); } diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index 67f5cd53..8d664ec8 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -4,12 +4,17 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import store.ckin.api.address.domain.exception.AddressAlreadyExistsException; import store.ckin.api.address.domain.exception.AddressNotFoundException; import store.ckin.api.address.domain.request.AddressAddRequestDto; import store.ckin.api.address.domain.request.AddressUpdateRequestDto; import store.ckin.api.address.domain.response.MemberAddressResponseDto; +import store.ckin.api.address.entity.Address; import store.ckin.api.address.repository.AddressRepository; import store.ckin.api.address.service.AddressService; +import store.ckin.api.member.entity.Member; +import store.ckin.api.member.exception.MemberNotFoundException; +import store.ckin.api.member.repository.MemberRepository; /** * AddressService 의 구현체 입니다. @@ -22,6 +27,8 @@ public class AddressServiceImpl implements AddressService { private final AddressRepository addressRepository; + private final MemberRepository memberRepository; + @Transactional(readOnly = true) @Override public boolean isDefaultAddress(Long addressId) { @@ -32,9 +39,27 @@ public boolean isDefaultAddress(Long addressId) { return addressRepository.isDefaultAddress(addressId); } + @Transactional @Override public void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto) { + Member member = memberRepository.findById(memberId) + .orElseThrow(MemberNotFoundException::new); + + if (addressRepository.existsByMemberIdAndBaseAndDetail( + memberId, + addressAddRequestDto.getBase(), + addressAddRequestDto.getDetail())) { + throw new AddressAlreadyExistsException(); + } + + Address address = Address.builder() + .member(member) + .base(addressAddRequestDto.getBase()) + .base(addressAddRequestDto.getDetail()) + .base(addressAddRequestDto.getAlias()) + .build(); + addressRepository.save(address); } @Override From dabbd69180cad1331243173c2034f5c6c5514223 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 00:54:07 +0900 Subject: [PATCH 075/161] [FEAT] AddressServiceImpl : getMemberAddressList --- .../ckin/api/address/service/impl/AddressServiceImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index 8d664ec8..c0d9727c 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -62,9 +62,14 @@ public void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto) addressRepository.save(address); } + @Transactional(readOnly = true) @Override public List getMemberAddressList(Long memberId) { - return null; + if (!memberRepository.existsById(memberId)) { + throw new MemberNotFoundException(); + } + + return addressRepository.getMemberAddressList(memberId); } @Override From 895d1646f3e459fb6c6915fe90f670cb923d1d78 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:05:32 +0900 Subject: [PATCH 076/161] [FEAT] AddressServiceImpl : updateAddress --- .../domain/request/AddressUpdateRequestDto.java | 8 ++++---- .../java/store/ckin/api/address/entity/Address.java | 12 ++++++++++++ .../ckin/api/address/service/AddressService.java | 2 +- .../api/address/service/impl/AddressServiceImpl.java | 10 +++++++++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java b/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java index 5820c1c6..b0965b25 100644 --- a/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java @@ -1,5 +1,6 @@ package store.ckin.api.address.domain.request; +import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,13 +13,12 @@ @Getter @NoArgsConstructor public class AddressUpdateRequestDto { - private Long addressId; - + @NotBlank private String base; + @NotBlank private String detail; + @NotBlank private String alias; - - private Boolean isDefault; } diff --git a/src/main/java/store/ckin/api/address/entity/Address.java b/src/main/java/store/ckin/api/address/entity/Address.java index b9292eba..1d058640 100644 --- a/src/main/java/store/ckin/api/address/entity/Address.java +++ b/src/main/java/store/ckin/api/address/entity/Address.java @@ -15,6 +15,7 @@ import lombok.NoArgsConstructor; import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; +import store.ckin.api.address.domain.request.AddressUpdateRequestDto; import store.ckin.api.member.entity.Member; /** @@ -52,4 +53,15 @@ public class Address { @Column(name = "address_default") @ColumnDefault("false") private Boolean isDefault; + + /** + * 주소를 수정하는 메서드 입니다. + * + * @param addressUpdateRequestDto 기본주소, 상세주소, 별칭 + */ + public void update(AddressUpdateRequestDto addressUpdateRequestDto) { + this.base = addressUpdateRequestDto.getBase(); + this.detail = addressUpdateRequestDto.getDetail(); + this.alias = addressUpdateRequestDto.getAlias(); + } } diff --git a/src/main/java/store/ckin/api/address/service/AddressService.java b/src/main/java/store/ckin/api/address/service/AddressService.java index 4c2653b8..318614fe 100644 --- a/src/main/java/store/ckin/api/address/service/AddressService.java +++ b/src/main/java/store/ckin/api/address/service/AddressService.java @@ -18,7 +18,7 @@ public interface AddressService { List getMemberAddressList(Long memberId); - void updateAddress(Long memberId, AddressUpdateRequestDto addressUpdateRequestDto); + void updateAddress(Long memberId, Long addressId, AddressUpdateRequestDto addressUpdateRequestDto); void setDefaultAddress(Long addressId); diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index c0d9727c..1e89bf6a 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -72,9 +72,17 @@ public List getMemberAddressList(Long memberId) { return addressRepository.getMemberAddressList(memberId); } + @Transactional @Override - public void updateAddress(Long memberId, AddressUpdateRequestDto addressUpdateRequestDto) { + public void updateAddress(Long memberId, Long addressId, AddressUpdateRequestDto addressUpdateRequestDto) { + if (!memberRepository.existsById(memberId)) { + throw new MemberNotFoundException(); + } + + Address address = addressRepository.findById(addressId) + .orElseThrow(AddressNotFoundException::new); + address.update(addressUpdateRequestDto); } @Override From 2d21530aa908ed4aa14fcccec7d4aab013b0760d Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:21:21 +0900 Subject: [PATCH 077/161] [FEAT] AddressServiceImpl : setDefaultAddress --- .../store/ckin/api/address/entity/Address.java | 4 ++++ .../api/address/repository/AddressRepository.java | 5 +++++ .../ckin/api/address/service/AddressService.java | 2 +- .../address/service/impl/AddressServiceImpl.java | 15 ++++++++++++++- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/address/entity/Address.java b/src/main/java/store/ckin/api/address/entity/Address.java index 1d058640..a9c3e064 100644 --- a/src/main/java/store/ckin/api/address/entity/Address.java +++ b/src/main/java/store/ckin/api/address/entity/Address.java @@ -64,4 +64,8 @@ public void update(AddressUpdateRequestDto addressUpdateRequestDto) { this.detail = addressUpdateRequestDto.getDetail(); this.alias = addressUpdateRequestDto.getAlias(); } + + public void toggleDefault() { + this.isDefault = !this.isDefault; + } } diff --git a/src/main/java/store/ckin/api/address/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/repository/AddressRepository.java index bc6fb354..ed4d83ec 100644 --- a/src/main/java/store/ckin/api/address/repository/AddressRepository.java +++ b/src/main/java/store/ckin/api/address/repository/AddressRepository.java @@ -4,6 +4,8 @@ import org.springframework.data.jpa.repository.Query; import store.ckin.api.address.entity.Address; +import java.util.Optional; + /** * Address 에 관한 쿼리를 관리하는 인터페이스 입니다. * @@ -15,4 +17,7 @@ public interface AddressRepository extends JpaRepository, Address Boolean isDefaultAddress(Long addressId); boolean existsByMemberIdAndBaseAndDetail(Long memberId, String base, String detail); + + @Query(value = "SELECT a FROM Address AS a WHERE a.member.id = :memberId AND a.isDefault = true") + Optional
findDefaultAddressByMemberId(Long memberId); } diff --git a/src/main/java/store/ckin/api/address/service/AddressService.java b/src/main/java/store/ckin/api/address/service/AddressService.java index 318614fe..a54799f7 100644 --- a/src/main/java/store/ckin/api/address/service/AddressService.java +++ b/src/main/java/store/ckin/api/address/service/AddressService.java @@ -20,7 +20,7 @@ public interface AddressService { void updateAddress(Long memberId, Long addressId, AddressUpdateRequestDto addressUpdateRequestDto); - void setDefaultAddress(Long addressId); + void setDefaultAddress(Long memberId, Long addressId); void deleteAddress(Long addressId); } diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index 1e89bf6a..aac39031 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -85,9 +85,22 @@ public void updateAddress(Long memberId, Long addressId, AddressUpdateRequestDto address.update(addressUpdateRequestDto); } + @Transactional @Override - public void setDefaultAddress(Long addressId) { + public void setDefaultAddress(Long memberId, Long addressId) { + if (!memberRepository.existsById(memberId)) { + throw new MemberNotFoundException(); + } + Address address = addressRepository.findById(addressId) + .orElseThrow(AddressNotFoundException::new); + + if (!address.getIsDefault()) { + addressRepository.findDefaultAddressByMemberId(memberId) + .ifPresent(Address::toggleDefault); + + address.toggleDefault(); + } } @Override From 96a3c39cc4aa2078f53ccaefbe21e4abd144bac8 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:23:14 +0900 Subject: [PATCH 078/161] [FEAT] AddressServiceImpl : deleteAddress --- .../store/ckin/api/address/repository/AddressRepository.java | 3 +-- .../ckin/api/address/service/impl/AddressServiceImpl.java | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/address/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/repository/AddressRepository.java index ed4d83ec..27c68f30 100644 --- a/src/main/java/store/ckin/api/address/repository/AddressRepository.java +++ b/src/main/java/store/ckin/api/address/repository/AddressRepository.java @@ -1,11 +1,10 @@ package store.ckin.api.address.repository; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import store.ckin.api.address.entity.Address; -import java.util.Optional; - /** * Address 에 관한 쿼리를 관리하는 인터페이스 입니다. * diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index aac39031..cf7ea5a6 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -103,8 +103,13 @@ public void setDefaultAddress(Long memberId, Long addressId) { } } + @Transactional @Override public void deleteAddress(Long addressId) { + if (!addressRepository.existsById(addressId)) { + throw new AddressNotFoundException(); + } + addressRepository.deleteById(addressId); } } From 8c44873702fc524fbb2cc43ce066b70589b366d1 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:26:50 +0900 Subject: [PATCH 079/161] [FEAT] AddressController --- .../address/controller/AddressController.java | 19 +++++++++++++++++++ .../AddressAlreadyExistsException.java | 2 +- .../exception/AddressNotFoundException.java | 2 +- .../service/impl/AddressServiceImpl.java | 4 ++-- 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/main/java/store/ckin/api/address/controller/AddressController.java rename src/main/java/store/ckin/api/address/{domain => }/exception/AddressAlreadyExistsException.java (81%) rename src/main/java/store/ckin/api/address/{domain => }/exception/AddressNotFoundException.java (80%) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java new file mode 100644 index 00000000..bca4a523 --- /dev/null +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -0,0 +1,19 @@ +package store.ckin.api.address.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import store.ckin.api.address.service.AddressService; + +/** + * Address 에 관한 REST Controller 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 18. + */ +@RestController +@RequestMapping("/api") +@RequiredArgsConstructor +public class AddressController { + private final AddressService addressService; +} diff --git a/src/main/java/store/ckin/api/address/domain/exception/AddressAlreadyExistsException.java b/src/main/java/store/ckin/api/address/exception/AddressAlreadyExistsException.java similarity index 81% rename from src/main/java/store/ckin/api/address/domain/exception/AddressAlreadyExistsException.java rename to src/main/java/store/ckin/api/address/exception/AddressAlreadyExistsException.java index 18e8bdcd..fe173c31 100644 --- a/src/main/java/store/ckin/api/address/domain/exception/AddressAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/address/exception/AddressAlreadyExistsException.java @@ -1,4 +1,4 @@ -package store.ckin.api.address.domain.exception; +package store.ckin.api.address.exception; /** * 이미 등록된 주소일 때 호출되는 Exception 클래스 입니다. diff --git a/src/main/java/store/ckin/api/address/domain/exception/AddressNotFoundException.java b/src/main/java/store/ckin/api/address/exception/AddressNotFoundException.java similarity index 80% rename from src/main/java/store/ckin/api/address/domain/exception/AddressNotFoundException.java rename to src/main/java/store/ckin/api/address/exception/AddressNotFoundException.java index a00d54c0..611f3a1e 100644 --- a/src/main/java/store/ckin/api/address/domain/exception/AddressNotFoundException.java +++ b/src/main/java/store/ckin/api/address/exception/AddressNotFoundException.java @@ -1,4 +1,4 @@ -package store.ckin.api.address.domain.exception; +package store.ckin.api.address.exception; /** * 조회한 주소가 없을 때 호출되는 Exception 클래스 입니다. diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index cf7ea5a6..a3a88e19 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -4,12 +4,12 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import store.ckin.api.address.domain.exception.AddressAlreadyExistsException; -import store.ckin.api.address.domain.exception.AddressNotFoundException; import store.ckin.api.address.domain.request.AddressAddRequestDto; import store.ckin.api.address.domain.request.AddressUpdateRequestDto; import store.ckin.api.address.domain.response.MemberAddressResponseDto; import store.ckin.api.address.entity.Address; +import store.ckin.api.address.exception.AddressAlreadyExistsException; +import store.ckin.api.address.exception.AddressNotFoundException; import store.ckin.api.address.repository.AddressRepository; import store.ckin.api.address.service.AddressService; import store.ckin.api.member.entity.Member; From 80b240a97cce08f9c5e32d66f196497f5099fbfe Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:31:00 +0900 Subject: [PATCH 080/161] [FEAT] AddressController : addAddress --- .../api/address/controller/AddressController.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index bca4a523..fec9abdc 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -1,8 +1,13 @@ package store.ckin.api.address.controller; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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.RestController; +import store.ckin.api.address.domain.request.AddressAddRequestDto; import store.ckin.api.address.service.AddressService; /** @@ -16,4 +21,12 @@ @RequiredArgsConstructor public class AddressController { private final AddressService addressService; + + @PostMapping("/members/{memberId}/address") + ResponseEntity addAddress(@PathVariable("memberId") Long memberId, + AddressAddRequestDto addressAddRequestDto) { + addressService.addAddress(memberId, addressAddRequestDto); + + return ResponseEntity.status(HttpStatus.CREATED).build(); + } } From 3fb0bc0da14a6fb2e5fc08dcad7968f22a33e712 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:34:28 +0900 Subject: [PATCH 081/161] [FEAT] AddressController : getMemberAddressList --- .../ckin/api/address/controller/AddressController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index fec9abdc..9408c3d2 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -1,13 +1,16 @@ package store.ckin.api.address.controller; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; 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.RestController; import store.ckin.api.address.domain.request.AddressAddRequestDto; +import store.ckin.api.address.domain.response.MemberAddressResponseDto; import store.ckin.api.address.service.AddressService; /** @@ -29,4 +32,11 @@ ResponseEntity addAddress(@PathVariable("memberId") Long memberId, return ResponseEntity.status(HttpStatus.CREATED).build(); } + + @GetMapping("/members/{memberId}/address") + ResponseEntity> getMemberAddressList(@PathVariable("memberId") Long memberId) { + List addressList = addressService.getMemberAddressList(memberId); + + return ResponseEntity.status(HttpStatus.OK).body(addressList); + } } From e52c57bbefdd7e5a9b546c165fed4298baad6763 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:37:17 +0900 Subject: [PATCH 082/161] [FEAT] AddressController : updateAddress --- .../ckin/api/address/controller/AddressController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index 9408c3d2..de9e8a18 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import store.ckin.api.address.domain.request.AddressAddRequestDto; +import store.ckin.api.address.domain.request.AddressUpdateRequestDto; import store.ckin.api.address.domain.response.MemberAddressResponseDto; import store.ckin.api.address.service.AddressService; @@ -39,4 +40,13 @@ ResponseEntity> getMemberAddressList(@PathVariabl return ResponseEntity.status(HttpStatus.OK).body(addressList); } + + @PostMapping("/members/{memberId}/addresses/{addressId}") + ResponseEntity updateAddress(@PathVariable("memberId") Long memberId, + @PathVariable("addressId") Long addressId, + AddressUpdateRequestDto addressUpdateRequestDto) { + addressService.updateAddress(memberId, addressId, addressUpdateRequestDto); + + return ResponseEntity.status(HttpStatus.OK).build(); + } } From 2d09904fbd835588e5d395dcf7cb6973fe6e032c Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:39:09 +0900 Subject: [PATCH 083/161] [FEAT] setDefaultAddress --- .../address/controller/AddressController.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index de9e8a18..34aa2804 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -4,11 +4,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -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.RestController; +import org.springframework.web.bind.annotation.*; import store.ckin.api.address.domain.request.AddressAddRequestDto; import store.ckin.api.address.domain.request.AddressUpdateRequestDto; import store.ckin.api.address.domain.response.MemberAddressResponseDto; @@ -41,7 +37,7 @@ ResponseEntity> getMemberAddressList(@PathVariabl return ResponseEntity.status(HttpStatus.OK).body(addressList); } - @PostMapping("/members/{memberId}/addresses/{addressId}") + @PutMapping("/members/{memberId}/addresses/{addressId}") ResponseEntity updateAddress(@PathVariable("memberId") Long memberId, @PathVariable("addressId") Long addressId, AddressUpdateRequestDto addressUpdateRequestDto) { @@ -49,4 +45,12 @@ ResponseEntity updateAddress(@PathVariable("memberId") Long memberId, return ResponseEntity.status(HttpStatus.OK).build(); } + + @PutMapping("/members/{memberId}/addresses/{addressId}/default") + ResponseEntity setDefaultAddress(@PathVariable("memberId") Long memberId, + @PathVariable("addressId") Long addressId) { + addressService.setDefaultAddress(memberId, addressId); + + return ResponseEntity.status(HttpStatus.OK).build(); + } } From cc294c3cc080484586e06ec6d969ab52db4d21bc Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:41:38 +0900 Subject: [PATCH 084/161] [FEAT] AddressContorller : deleteAddress --- .../ckin/api/address/controller/AddressController.java | 8 ++++++++ .../store/ckin/api/address/service/AddressService.java | 2 +- .../ckin/api/address/service/impl/AddressServiceImpl.java | 6 +++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index 34aa2804..64748ca3 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -53,4 +53,12 @@ ResponseEntity setDefaultAddress(@PathVariable("memberId") Long memberId, return ResponseEntity.status(HttpStatus.OK).build(); } + + @DeleteMapping("/members/{memberId}/addresses/{addressId}") + ResponseEntity deleteAddress(@PathVariable("memberId") Long memberId, + @PathVariable("addressId") Long addressId) { + addressService.deleteAddress(memberId, addressId); + + return ResponseEntity.status(HttpStatus.OK).build(); + } } diff --git a/src/main/java/store/ckin/api/address/service/AddressService.java b/src/main/java/store/ckin/api/address/service/AddressService.java index a54799f7..073382a9 100644 --- a/src/main/java/store/ckin/api/address/service/AddressService.java +++ b/src/main/java/store/ckin/api/address/service/AddressService.java @@ -22,5 +22,5 @@ public interface AddressService { void setDefaultAddress(Long memberId, Long addressId); - void deleteAddress(Long addressId); + void deleteAddress(Long memberId, Long addressId); } diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index a3a88e19..350cce7d 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -105,7 +105,11 @@ public void setDefaultAddress(Long memberId, Long addressId) { @Transactional @Override - public void deleteAddress(Long addressId) { + public void deleteAddress(Long memberId, Long addressId) { + if (!memberRepository.existsById(memberId)) { + throw new MemberNotFoundException(); + } + if (!addressRepository.existsById(addressId)) { throw new AddressNotFoundException(); } From 091076c2a74f2fcca427a9d716fd8ea41860a55f Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:46:24 +0900 Subject: [PATCH 085/161] [FEAT] AddressController : ExceptionHandler --- .../api/address/controller/AddressController.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index 64748ca3..41f6ebbd 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -8,7 +8,10 @@ import store.ckin.api.address.domain.request.AddressAddRequestDto; import store.ckin.api.address.domain.request.AddressUpdateRequestDto; import store.ckin.api.address.domain.response.MemberAddressResponseDto; +import store.ckin.api.address.exception.AddressAlreadyExistsException; +import store.ckin.api.address.exception.AddressNotFoundException; import store.ckin.api.address.service.AddressService; +import store.ckin.api.member.exception.MemberNotFoundException; /** * Address 에 관한 REST Controller 입니다. @@ -61,4 +64,14 @@ ResponseEntity deleteAddress(@PathVariable("memberId") Long memberId, return ResponseEntity.status(HttpStatus.OK).build(); } + + @ExceptionHandler({ MemberNotFoundException.class, AddressNotFoundException.class }) + public ResponseEntity handleNotFoundException() { + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + } + + @ExceptionHandler(AddressAlreadyExistsException.class) + public ResponseEntity handleAlreadyExistsException() { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + } } From 50a1e12ec4e045bd594d61bf8649879f126f0f60 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Mon, 18 Mar 2024 01:48:20 +0900 Subject: [PATCH 086/161] [REMOVE] isDefaultAddress method --- .../ckin/api/address/repository/AddressRepository.java | 3 --- .../store/ckin/api/address/service/AddressService.java | 2 -- .../api/address/service/impl/AddressServiceImpl.java | 10 ---------- 3 files changed, 15 deletions(-) diff --git a/src/main/java/store/ckin/api/address/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/repository/AddressRepository.java index 27c68f30..76c2ed4e 100644 --- a/src/main/java/store/ckin/api/address/repository/AddressRepository.java +++ b/src/main/java/store/ckin/api/address/repository/AddressRepository.java @@ -12,9 +12,6 @@ * @version : 2024. 03. 17. */ public interface AddressRepository extends JpaRepository, AddressRepositoryCustom { - @Query(value = "SELECT a.isDefault FROM Address AS a WHERE a.id = :addressId") - Boolean isDefaultAddress(Long addressId); - boolean existsByMemberIdAndBaseAndDetail(Long memberId, String base, String detail); @Query(value = "SELECT a FROM Address AS a WHERE a.member.id = :memberId AND a.isDefault = true") diff --git a/src/main/java/store/ckin/api/address/service/AddressService.java b/src/main/java/store/ckin/api/address/service/AddressService.java index 073382a9..9ef43711 100644 --- a/src/main/java/store/ckin/api/address/service/AddressService.java +++ b/src/main/java/store/ckin/api/address/service/AddressService.java @@ -12,8 +12,6 @@ * @version : 2024. 03. 18. */ public interface AddressService { - boolean isDefaultAddress(Long addressId); - void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto); List getMemberAddressList(Long memberId); diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index 350cce7d..c4c1d1ff 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -29,16 +29,6 @@ public class AddressServiceImpl implements AddressService { private final MemberRepository memberRepository; - @Transactional(readOnly = true) - @Override - public boolean isDefaultAddress(Long addressId) { - if (!addressRepository.existsById(addressId)) { - throw new AddressNotFoundException(); - } - - return addressRepository.isDefaultAddress(addressId); - } - @Transactional @Override public void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto) { From 04b30abb7e3f3d4a24842f92d572cde4c2e1b171 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Mon, 18 Mar 2024 21:33:30 +0900 Subject: [PATCH 087/161] =?UTF-8?q?[FIX]=20=EB=A6=AC=EB=B7=B0=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EA=B4=80=EB=A0=A8=20=EC=B6=A9=EB=8F=8C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/review/controller/ReviewController.java | 2 +- src/main/java/store/ckin/api/review/facade/ReviewFacade.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index e8bf7215..11317e3c 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -77,7 +77,7 @@ public ResponseEntity> getReviewPageList( public ResponseEntity> getReviewPageListByMemberId( @PageableDefault(page = 0, size = 5) Pageable pageable, @PathVariable("memberId") Long memberId) { - Page content = reviewService.findReviewsByMemberWithPagination(memberId, pageable); + Page content = reviewFacade.findReviewsByMemberWithPagination(memberId, pageable); return ResponseEntity.ok().body(content); } diff --git a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java index 50688a88..5dc3c15e 100644 --- a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java +++ b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java @@ -15,6 +15,7 @@ import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; import store.ckin.api.pointpolicy.service.PointPolicyService; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.service.ReviewService; @@ -63,4 +64,8 @@ public void postReview(ReviewCreateRequestDto createRequestDto, List getReviewPageList(Pageable pageable, Long bookId) { return reviewService.getReviewPageList(pageable, bookId); } + + public Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable) { + return reviewService.findReviewsByMemberWithPagination(memberId, pageable); + } } From 915e7f462d398e6f069979e58b564e77ed540c59 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Tue, 19 Mar 2024 10:41:15 +0900 Subject: [PATCH 088/161] =?UTF-8?q?[REFACTOR]=20=EC=98=A4=EB=A5=98=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 --- .../address/controller/AddressController.java | 5 ++-- .../response/MemberAddressResponseDto.java | 4 ++-- .../address/repository/AddressRepository.java | 4 ++++ .../impl/AddressRepositoryImpl.java | 2 +- .../service/impl/AddressServiceImpl.java | 24 +++++++++++++------ 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index 41f6ebbd..c1f6e4e3 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -1,6 +1,7 @@ package store.ckin.api.address.controller; import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -27,7 +28,7 @@ public class AddressController { @PostMapping("/members/{memberId}/address") ResponseEntity addAddress(@PathVariable("memberId") Long memberId, - AddressAddRequestDto addressAddRequestDto) { + @Valid @RequestBody AddressAddRequestDto addressAddRequestDto) { addressService.addAddress(memberId, addressAddRequestDto); return ResponseEntity.status(HttpStatus.CREATED).build(); @@ -43,7 +44,7 @@ ResponseEntity> getMemberAddressList(@PathVariabl @PutMapping("/members/{memberId}/addresses/{addressId}") ResponseEntity updateAddress(@PathVariable("memberId") Long memberId, @PathVariable("addressId") Long addressId, - AddressUpdateRequestDto addressUpdateRequestDto) { + @Valid @RequestBody AddressUpdateRequestDto addressUpdateRequestDto) { addressService.updateAddress(memberId, addressId, addressUpdateRequestDto); return ResponseEntity.status(HttpStatus.OK).build(); diff --git a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java index f64134d2..f43a548c 100644 --- a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java +++ b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java @@ -1,7 +1,7 @@ package store.ckin.api.address.domain.response; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.NoArgsConstructor; /** * 특정 멤버의 주소 정보를 응답하는 DTO 클래스 입니다. @@ -10,7 +10,7 @@ * @version : 2024. 03. 17. */ @Getter -@NoArgsConstructor +@AllArgsConstructor public class MemberAddressResponseDto { private String base; diff --git a/src/main/java/store/ckin/api/address/repository/AddressRepository.java b/src/main/java/store/ckin/api/address/repository/AddressRepository.java index 76c2ed4e..16e473f0 100644 --- a/src/main/java/store/ckin/api/address/repository/AddressRepository.java +++ b/src/main/java/store/ckin/api/address/repository/AddressRepository.java @@ -16,4 +16,8 @@ public interface AddressRepository extends JpaRepository, Address @Query(value = "SELECT a FROM Address AS a WHERE a.member.id = :memberId AND a.isDefault = true") Optional
findDefaultAddressByMemberId(Long memberId); + + Optional
findByIdAndMember_Id(Long addressId, Long memberId); + + boolean existsByIdAndMember_Id(Long addressId, Long memberId); } diff --git a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java index aa0dc0e9..145ee12e 100644 --- a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java +++ b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java @@ -33,7 +33,7 @@ public List getMemberAddressList(Long memberId) { address.alias, address.isDefault )) - .where(member.id.eq(memberId)) + .where(address.member.id.eq(memberId)) .fetch(); } } diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index c4c1d1ff..07e8e771 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -31,7 +31,8 @@ public class AddressServiceImpl implements AddressService { @Transactional @Override - public void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto) { + public void addAddress(Long memberId, + AddressAddRequestDto addressAddRequestDto) { Member member = memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); @@ -45,8 +46,8 @@ public void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto) Address address = Address.builder() .member(member) .base(addressAddRequestDto.getBase()) - .base(addressAddRequestDto.getDetail()) - .base(addressAddRequestDto.getAlias()) + .detail(addressAddRequestDto.getDetail()) + .alias(addressAddRequestDto.getAlias()) .build(); addressRepository.save(address); @@ -64,12 +65,21 @@ public List getMemberAddressList(Long memberId) { @Transactional @Override - public void updateAddress(Long memberId, Long addressId, AddressUpdateRequestDto addressUpdateRequestDto) { + public void updateAddress(Long memberId, + Long addressId, + AddressUpdateRequestDto addressUpdateRequestDto) { if (!memberRepository.existsById(memberId)) { throw new MemberNotFoundException(); } - Address address = addressRepository.findById(addressId) + if (addressRepository.existsByMemberIdAndBaseAndDetail( + memberId, + addressUpdateRequestDto.getBase(), + addressUpdateRequestDto.getDetail())) { + throw new AddressAlreadyExistsException(); + } + + Address address = addressRepository.findByIdAndMember_Id(addressId, memberId) .orElseThrow(AddressNotFoundException::new); address.update(addressUpdateRequestDto); @@ -82,7 +92,7 @@ public void setDefaultAddress(Long memberId, Long addressId) { throw new MemberNotFoundException(); } - Address address = addressRepository.findById(addressId) + Address address = addressRepository.findByIdAndMember_Id(addressId, memberId) .orElseThrow(AddressNotFoundException::new); if (!address.getIsDefault()) { @@ -100,7 +110,7 @@ public void deleteAddress(Long memberId, Long addressId) { throw new MemberNotFoundException(); } - if (!addressRepository.existsById(addressId)) { + if (!addressRepository.existsByIdAndMember_Id(addressId, memberId)) { throw new AddressNotFoundException(); } From 20a42227efa32342b4b8df7a6f7cf3628d5e752b Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Tue, 19 Mar 2024 10:43:20 +0900 Subject: [PATCH 089/161] =?UTF-8?q?[REFACOTR]=20PR=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/address/controller/AddressController.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index c1f6e4e3..c711908e 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -21,12 +21,12 @@ * @version : 2024. 03. 18. */ @RestController -@RequestMapping("/api") +@RequestMapping("/api/members/{memberId}") @RequiredArgsConstructor public class AddressController { private final AddressService addressService; - @PostMapping("/members/{memberId}/address") + @PostMapping("/address") ResponseEntity addAddress(@PathVariable("memberId") Long memberId, @Valid @RequestBody AddressAddRequestDto addressAddRequestDto) { addressService.addAddress(memberId, addressAddRequestDto); @@ -34,14 +34,14 @@ ResponseEntity addAddress(@PathVariable("memberId") Long memberId, return ResponseEntity.status(HttpStatus.CREATED).build(); } - @GetMapping("/members/{memberId}/address") + @GetMapping("/address") ResponseEntity> getMemberAddressList(@PathVariable("memberId") Long memberId) { List addressList = addressService.getMemberAddressList(memberId); return ResponseEntity.status(HttpStatus.OK).body(addressList); } - @PutMapping("/members/{memberId}/addresses/{addressId}") + @PutMapping("/addresses/{addressId}") ResponseEntity updateAddress(@PathVariable("memberId") Long memberId, @PathVariable("addressId") Long addressId, @Valid @RequestBody AddressUpdateRequestDto addressUpdateRequestDto) { @@ -50,7 +50,7 @@ ResponseEntity updateAddress(@PathVariable("memberId") Long memberId, return ResponseEntity.status(HttpStatus.OK).build(); } - @PutMapping("/members/{memberId}/addresses/{addressId}/default") + @PutMapping("/addresses/{addressId}/default") ResponseEntity setDefaultAddress(@PathVariable("memberId") Long memberId, @PathVariable("addressId") Long addressId) { addressService.setDefaultAddress(memberId, addressId); @@ -58,7 +58,7 @@ ResponseEntity setDefaultAddress(@PathVariable("memberId") Long memberId, return ResponseEntity.status(HttpStatus.OK).build(); } - @DeleteMapping("/members/{memberId}/addresses/{addressId}") + @DeleteMapping("/addresses/{addressId}") ResponseEntity deleteAddress(@PathVariable("memberId") Long memberId, @PathVariable("addressId") Long addressId) { addressService.deleteAddress(memberId, addressId); From b8b63c2f911d4529068dd8110a60c5f59376c8ac Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Tue, 19 Mar 2024 12:24:20 +0900 Subject: [PATCH 090/161] =?UTF-8?q?[REFACTOR]=20Address=20:=20=EC=9A=B0?= =?UTF-8?q?=ED=8E=B8=20=EB=B2=88=ED=98=B8=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/address/domain/request/AddressAddRequestDto.java | 3 +++ .../api/address/domain/request/AddressUpdateRequestDto.java | 3 +++ .../api/address/domain/response/MemberAddressResponseDto.java | 2 ++ src/main/java/store/ckin/api/address/entity/Address.java | 4 ++++ .../api/address/repository/impl/AddressRepositoryImpl.java | 3 +-- .../ckin/api/address/service/impl/AddressServiceImpl.java | 1 + 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java b/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java index b71fc7d9..979a5100 100644 --- a/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java +++ b/src/main/java/store/ckin/api/address/domain/request/AddressAddRequestDto.java @@ -13,6 +13,9 @@ @Getter @NoArgsConstructor public class AddressAddRequestDto { + @NotBlank + private String postCode; + @NotBlank private String base; diff --git a/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java b/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java index b0965b25..039bbe7b 100644 --- a/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/address/domain/request/AddressUpdateRequestDto.java @@ -13,6 +13,9 @@ @Getter @NoArgsConstructor public class AddressUpdateRequestDto { + @NotBlank + private String postCode; + @NotBlank private String base; diff --git a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java index f43a548c..77e5f80e 100644 --- a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java +++ b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java @@ -12,6 +12,8 @@ @Getter @AllArgsConstructor public class MemberAddressResponseDto { + private String postCode; + private String base; private String detail; diff --git a/src/main/java/store/ckin/api/address/entity/Address.java b/src/main/java/store/ckin/api/address/entity/Address.java index a9c3e064..0f2ee6b3 100644 --- a/src/main/java/store/ckin/api/address/entity/Address.java +++ b/src/main/java/store/ckin/api/address/entity/Address.java @@ -41,6 +41,9 @@ public class Address { @JoinColumn(name = "member_id") private Member member; + @Column(name = "address_post_code") + private String postCode; + @Column(name = "address_base") private String base; @@ -60,6 +63,7 @@ public class Address { * @param addressUpdateRequestDto 기본주소, 상세주소, 별칭 */ public void update(AddressUpdateRequestDto addressUpdateRequestDto) { + this.postCode = addressUpdateRequestDto.getPostCode(); this.base = addressUpdateRequestDto.getBase(); this.detail = addressUpdateRequestDto.getDetail(); this.alias = addressUpdateRequestDto.getAlias(); diff --git a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java index 145ee12e..a11ab3c6 100644 --- a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java +++ b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java @@ -7,7 +7,6 @@ import store.ckin.api.address.entity.Address; import store.ckin.api.address.entity.QAddress; import store.ckin.api.address.repository.AddressRepositoryCustom; -import store.ckin.api.member.entity.QMember; /** * MemberRepositoryCustom 의 구현체 입니다. @@ -24,10 +23,10 @@ public AddressRepositoryImpl() { @Override public List getMemberAddressList(Long memberId) { QAddress address = QAddress.address; - QMember member = QMember.member; return from(address) .select(Projections.constructor(MemberAddressResponseDto.class, + address.postCode, address.base, address.detail, address.alias, diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index 07e8e771..07ce6f4f 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -45,6 +45,7 @@ public void addAddress(Long memberId, Address address = Address.builder() .member(member) + .postCode(addressAddRequestDto.getPostCode()) .base(addressAddRequestDto.getBase()) .detail(addressAddRequestDto.getDetail()) .alias(addressAddRequestDto.getAlias()) From 63700a8061559035623133cdb98d4ec3e8995724 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 20:24:27 +0900 Subject: [PATCH 091/161] =?UTF-8?q?[REFACTOR]=20Entity=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/booksale/entity/BookSale.java | 20 ++----- .../ckin/api/payment/entity/Payment.java | 12 ++++- .../api/payment/entity/PaymentStatus.java | 11 ++++ .../api/pointhistory/entity/PointHistory.java | 6 +++ .../ckin/api/sale/entity/DeliveryStatus.java | 11 ++++ .../java/store/ckin/api/sale/entity/Sale.java | 52 +++---------------- .../api/sale/entity/SalePaymentStatus.java | 11 ++++ 7 files changed, 60 insertions(+), 63 deletions(-) create mode 100644 src/main/java/store/ckin/api/payment/entity/PaymentStatus.java create mode 100644 src/main/java/store/ckin/api/sale/entity/DeliveryStatus.java create mode 100644 src/main/java/store/ckin/api/sale/entity/SalePaymentStatus.java diff --git a/src/main/java/store/ckin/api/booksale/entity/BookSale.java b/src/main/java/store/ckin/api/booksale/entity/BookSale.java index 5823154d..f62397da 100644 --- a/src/main/java/store/ckin/api/booksale/entity/BookSale.java +++ b/src/main/java/store/ckin/api/booksale/entity/BookSale.java @@ -33,12 +33,14 @@ @Getter @Entity @Table(name = "BookSale") +@Builder +@AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class BookSale { public enum BookSaleState { - ORDER, RETURN, CANCEL, COMPLETE + ORDER, CANCEL } @EmbeddedId @@ -88,22 +90,6 @@ public static class Pk implements Serializable { private Long bookId; } - @Builder - public BookSale(Pk pk, Sale sale, Book book, Long couponId, Integer bookSaleQuantity, - Integer bookSalePackagingPrice, - String bookSalePackagingType, Integer bookSalePaymentAmount, BookSaleState bookSaleState) { - this.pk = pk; - this.sale = sale; - this.book = book; - this.couponId = couponId; - this.bookSaleQuantity = bookSaleQuantity; - this.bookSalePackagingPrice = bookSalePackagingPrice; - this.bookSalePackagingType = bookSalePackagingType; - this.bookSalePaymentAmount = bookSalePaymentAmount; - this.bookSaleState = bookSaleState; - } - - public void updateBookSaleState(BookSaleState state) { this.bookSaleState = state; } diff --git a/src/main/java/store/ckin/api/payment/entity/Payment.java b/src/main/java/store/ckin/api/payment/entity/Payment.java index 1637caab..e44705c3 100644 --- a/src/main/java/store/ckin/api/payment/entity/Payment.java +++ b/src/main/java/store/ckin/api/payment/entity/Payment.java @@ -3,6 +3,8 @@ import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -42,7 +44,8 @@ public class Payment { private String paymentKey; @Column(name = "payment_status") - private String paymentStatus; + @Enumerated(value = EnumType.STRING) + private PaymentStatus paymentStatus; @Column(name = "payment_requested_at") private LocalDateTime requestedAt; @@ -55,7 +58,8 @@ public class Payment { @Builder - public Payment(Long paymentId, Sale sale, String paymentKey, String paymentStatus, LocalDateTime requestedAt, + public Payment(Long paymentId, Sale sale, String paymentKey, + PaymentStatus paymentStatus, LocalDateTime requestedAt, LocalDateTime approvedAt, String receipt) { this.paymentId = paymentId; this.sale = sale; @@ -65,4 +69,8 @@ public Payment(Long paymentId, Sale sale, String paymentKey, String paymentStatu this.approvedAt = approvedAt; this.receipt = receipt; } + + public void cancelPayment() { + this.paymentStatus = PaymentStatus.CANCEL; + } } diff --git a/src/main/java/store/ckin/api/payment/entity/PaymentStatus.java b/src/main/java/store/ckin/api/payment/entity/PaymentStatus.java new file mode 100644 index 00000000..f4fd9549 --- /dev/null +++ b/src/main/java/store/ckin/api/payment/entity/PaymentStatus.java @@ -0,0 +1,11 @@ +package store.ckin.api.payment.entity; + +/** + * 결제 상태를 나타내는 enum. + * + * @author 정승조 + * @version 2024. 03. 19. + */ +public enum PaymentStatus { + DONE, CANCEL +} diff --git a/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java b/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java index fec2d4f5..1d674792 100644 --- a/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java +++ b/src/main/java/store/ckin/api/pointhistory/entity/PointHistory.java @@ -9,12 +9,14 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.member.entity.Member; +import store.ckin.api.sale.entity.Sale; /** * 포인트 내역 엔티티입니다. @@ -36,6 +38,10 @@ public class PointHistory { @Column(name = "pointhistory_id") private Long pointHistoryId; + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "sale_id") + private Sale sale; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; diff --git a/src/main/java/store/ckin/api/sale/entity/DeliveryStatus.java b/src/main/java/store/ckin/api/sale/entity/DeliveryStatus.java new file mode 100644 index 00000000..9608e0c3 --- /dev/null +++ b/src/main/java/store/ckin/api/sale/entity/DeliveryStatus.java @@ -0,0 +1,11 @@ +package store.ckin.api.sale.entity; + +/** + * 주문의 배송 상태를 나타내는 Enum. + * + * @author 정승조 + * @version 2024. 03. 19. + */ +public enum DeliveryStatus { + READY, IN_PROGRESS, DONE +} \ No newline at end of file diff --git a/src/main/java/store/ckin/api/sale/entity/Sale.java b/src/main/java/store/ckin/api/sale/entity/Sale.java index 5e345e9a..300fd722 100644 --- a/src/main/java/store/ckin/api/sale/entity/Sale.java +++ b/src/main/java/store/ckin/api/sale/entity/Sale.java @@ -16,6 +16,7 @@ import javax.persistence.OneToMany; import javax.persistence.Table; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -32,24 +33,11 @@ @Getter @Entity @Table(name = "Sale") +@Builder +@AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Sale { - - /** - * 주문의 배송 상태를 나타내는 Enum. - */ - public enum DeliveryStatus { - READY, IN_PROGRESS, DONE - } - - /** - * 주문의 결제 상태를 나타내는 Enum. - */ - public enum PaymentStatus { - WAITING, PAID - } - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "sale_id") @@ -107,40 +95,16 @@ public enum PaymentStatus { @Column(name = "sale_payment_status") @Enumerated(EnumType.STRING) - private PaymentStatus salePaymentStatus; + private SalePaymentStatus salePaymentStatus; @Column(name = "sale_shipping_post_code") private String saleShippingPostCode; - @Builder - public Sale(Long saleId, Member member, Set bookSales, String saleTitle, String saleNumber, - String saleOrdererName, String saleOrdererContact, String saleReceiverName, String saleReceiverContact, - String saleReceiverAddress, LocalDateTime saleDate, LocalDateTime saleShippingDate, - LocalDate saleDeliveryDate, DeliveryStatus saleDeliveryStatus, Integer saleDeliveryFee, - Integer salePointUsage, Integer saleTotalPrice, PaymentStatus salePaymentStatus, - String saleShippingPostCode) { - this.saleId = saleId; - this.member = member; - this.bookSales = bookSales; - this.saleTitle = saleTitle; - this.saleNumber = saleNumber; - this.saleOrdererName = saleOrdererName; - this.saleOrdererContact = saleOrdererContact; - this.saleReceiverName = saleReceiverName; - this.saleReceiverContact = saleReceiverContact; - this.saleReceiverAddress = saleReceiverAddress; - this.saleDate = saleDate; - this.saleShippingDate = saleShippingDate; - this.saleDeliveryDate = saleDeliveryDate; - this.saleDeliveryStatus = saleDeliveryStatus; - this.saleDeliveryFee = saleDeliveryFee; - this.salePointUsage = salePointUsage; - this.saleTotalPrice = saleTotalPrice; - this.salePaymentStatus = salePaymentStatus; - this.saleShippingPostCode = saleShippingPostCode; + public void updatePaymentStatus(SalePaymentStatus paymentStatus) { + this.salePaymentStatus = paymentStatus; } - public void updatePaymentStatus(PaymentStatus paymentStatus) { - this.salePaymentStatus = paymentStatus; + public void updateSaleDeliveryStatus(DeliveryStatus deliveryStatus) { + this.saleDeliveryStatus = deliveryStatus; } } diff --git a/src/main/java/store/ckin/api/sale/entity/SalePaymentStatus.java b/src/main/java/store/ckin/api/sale/entity/SalePaymentStatus.java new file mode 100644 index 00000000..690b9cd4 --- /dev/null +++ b/src/main/java/store/ckin/api/sale/entity/SalePaymentStatus.java @@ -0,0 +1,11 @@ +package store.ckin.api.sale.entity; + +/** + * 주문의 결제 상태를 나타내는 Enum. + * + * @author 정승조 + * @version 2024. 03. 19. + */ +public enum SalePaymentStatus { + WAITING, PAID, CANCEL +} \ No newline at end of file From 0195a52e0d2384394601528f5476d9b97895abc1 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 20:26:15 +0900 Subject: [PATCH 092/161] =?UTF-8?q?[FEAT]=20=EC=A3=BC=EB=AC=B8=20=EB=B0=B0?= =?UTF-8?q?=EC=86=A1=20=EC=83=81=ED=83=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/SaleDeliveryUpdateRequestDto.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/store/ckin/api/sale/dto/request/SaleDeliveryUpdateRequestDto.java diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleDeliveryUpdateRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleDeliveryUpdateRequestDto.java new file mode 100644 index 00000000..394d8ac7 --- /dev/null +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleDeliveryUpdateRequestDto.java @@ -0,0 +1,22 @@ +package store.ckin.api.sale.dto.request; + +import javax.validation.constraints.NotNull; +import lombok.Getter; +import lombok.NoArgsConstructor; +import store.ckin.api.sale.entity.DeliveryStatus; + +/** + * 배송 상태 변경 요청 DTO. + * + * @author 정승조 + * @version 2024. 03. 19. + */ + +@Getter +@NoArgsConstructor +public class SaleDeliveryUpdateRequestDto { + + + @NotNull(message = "유효한 배송 상태를 입력해주세요.") + private DeliveryStatus deliveryStatus; +} From 2652456a6a55bde416953bac1ebe79ceef0f45e1 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 20:27:07 +0900 Subject: [PATCH 093/161] =?UTF-8?q?[REFACTOR]=20=ED=8F=AC=EC=9D=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=81=EB=A6=BD=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EB=A1=9C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/payment/facade/PaymentFacade.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index 81a3a47b..b9923d59 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -7,6 +7,7 @@ import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.request.PaymentRequestDto; import store.ckin.api.payment.dto.response.PaymentSuccessResponseDto; +import store.ckin.api.payment.entity.PaymentStatus; import store.ckin.api.payment.exception.PaymentAmountNotCorrectException; import store.ckin.api.payment.exception.PaymentNotCompleteException; import store.ckin.api.payment.service.PaymentService; @@ -39,7 +40,7 @@ public class PaymentFacade { @Transactional public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { - if (!("DONE".equals(requestDto.getPaymentStatus()))) { + if (PaymentStatus.DONE != requestDto.getPaymentStatus()) { throw new PaymentNotCompleteException(); } @@ -52,6 +53,11 @@ public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { paymentService.createPayment(sale.getSaleId(), requestDto); saleService.updateSalePaymentPaidStatus(sale.getSaleId()); + + if (Objects.nonNull(sale.getMemberEmail())) { + memberService.updateRewardPoint(sale.getSaleId(), sale.getMemberEmail(), sale.getSaleTotalPrice()); + } + return PaymentSuccessResponseDto.builder() .saleNumber(sale.getSaleNumber()) .receiverName(sale.getSaleReceiverName()) @@ -63,18 +69,4 @@ public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { .build(); } - - /** - * 주문 결제 완료 시 회원일 경우 포인트를 적립하는 메서드입니다. - * - * @param saleNumber 주문 번호 (UUID) - */ - @Transactional - public void createRewardPoint(String saleNumber) { - SaleResponseDto sale = saleService.getSaleBySaleNumber(saleNumber); - - if (Objects.nonNull(sale.getMemberEmail())) { - memberService.updateRewardPoint(sale.getMemberEmail(), sale.getSaleTotalPrice()); - } - } } From 525ea638d308343de8d6f41edfcb14bfabbe7d9a Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 20:27:10 +0900 Subject: [PATCH 094/161] =?UTF-8?q?[REFACTOR]=20=ED=8F=AC=EC=9D=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=81=EB=A6=BD=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EB=A1=9C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/payment/controller/PaymentController.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/store/ckin/api/payment/controller/PaymentController.java b/src/main/java/store/ckin/api/payment/controller/PaymentController.java index eab8c38a..1c733f5c 100644 --- a/src/main/java/store/ckin/api/payment/controller/PaymentController.java +++ b/src/main/java/store/ckin/api/payment/controller/PaymentController.java @@ -35,11 +35,8 @@ public class PaymentController { */ @PostMapping public ResponseEntity createPayment(@RequestBody PaymentRequestDto requestDto) { - // 결제 SAVE - PaymentSuccessResponseDto payment = paymentFacade.createPayment(requestDto); - // 포인트 적립 + 포인트 기록 - paymentFacade.createRewardPoint(payment.getSaleNumber()); + PaymentSuccessResponseDto payment = paymentFacade.createPayment(requestDto); return ResponseEntity.status(HttpStatus.CREATED).body(payment); } } From c10dd6adb329685986abd6299a72924572da5873 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 20:27:44 +0900 Subject: [PATCH 095/161] =?UTF-8?q?[REFACTOR]=20Enum=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/payment/dto/request/PaymentRequestDto.java | 3 ++- .../store/ckin/api/sale/dto/response/SaleResponseDto.java | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java index 607d61f7..20f71dfc 100644 --- a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java +++ b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java @@ -3,6 +3,7 @@ import java.time.LocalDateTime; import lombok.Getter; import lombok.NoArgsConstructor; +import store.ckin.api.payment.entity.PaymentStatus; /** * 결제 요청 DTO 클래스입니다. @@ -19,7 +20,7 @@ public class PaymentRequestDto { private String saleNumber; - private String paymentStatus; + private PaymentStatus paymentStatus; private LocalDateTime requestedAt; diff --git a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java index 8c65f4aa..4fc9c885 100644 --- a/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java +++ b/src/main/java/store/ckin/api/sale/dto/response/SaleResponseDto.java @@ -5,7 +5,8 @@ import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.ToString; +import store.ckin.api.sale.entity.DeliveryStatus; +import store.ckin.api.sale.entity.SalePaymentStatus; import store.ckin.api.sale.entity.Sale; /** @@ -45,7 +46,7 @@ public class SaleResponseDto { private LocalDate saleDeliveryDate; - private Sale.DeliveryStatus saleDeliveryStatus; + private DeliveryStatus saleDeliveryStatus; private Integer saleDeliveryFee; @@ -53,7 +54,7 @@ public class SaleResponseDto { private Integer saleTotalPrice; - private Sale.PaymentStatus salePaymentStatus; + private SalePaymentStatus salePaymentStatus; private String saleShippingPostCode; From 8043fbdfa182e905ca4df1b6a8c4bd811beff43c Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 22:28:42 +0900 Subject: [PATCH 096/161] =?UTF-8?q?[FEAT]=20=EC=A3=BC=EB=AC=B8=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20=EB=A1=9C=EC=A7=81=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/member/service/MemberService.java | 11 +++- .../service/impl/MemberServiceImpl.java | 60 ++++++++++++++++++- .../dto/response/PaymentResponseDto.java | 3 +- .../payment/repository/PaymentRepository.java | 2 + .../repository/PaymentRepositoryImpl.java | 2 +- .../service/impl/PaymentServiceImpl.java | 3 +- .../PointHistoryNotFoundException.java | 14 +++++ .../repository/PointHistoryRepository.java | 3 + .../api/sale/controller/SaleController.java | 47 ++++++++++----- .../ckin/api/sale/facade/SaleFacade.java | 45 +++++++++----- .../ckin/api/sale/service/SaleService.java | 17 ++++++ .../sale/service/impl/SaleServiceImpl.java | 47 ++++++++++++++- 12 files changed, 216 insertions(+), 38 deletions(-) create mode 100644 src/main/java/store/ckin/api/pointhistory/exception/PointHistoryNotFoundException.java diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 3822ec11..f67e05e1 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -48,8 +48,17 @@ public interface MemberService { /** * [회원 등급의 적립률 * 주문금액]만큼 적립 포인트를 업데이트하는 메서드입니다. * + * @param saleId 주문 ID * @param email 회원 이메일 * @param totalPrice 총 가격 */ - void updateRewardPoint(String email, Integer totalPrice); + void updateRewardPoint(Long saleId, String email, Integer totalPrice); + + /** + * 취소된 주문의 포인트를 업데이트하는 메서드입니다. + * + * @param saleId 주문 ID + * @param memberEmail 회원 이메일 + */ + void updateCancelSalePoint(Long saleId, String memberEmail); } diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 9e6707c1..24807de1 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -20,10 +20,15 @@ import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.member.service.MemberService; import store.ckin.api.pointhistory.entity.PointHistory; +import store.ckin.api.pointhistory.exception.PointHistoryNotFoundException; import store.ckin.api.pointhistory.repository.PointHistoryRepository; import store.ckin.api.pointpolicy.entity.PointPolicy; import store.ckin.api.pointpolicy.exception.PointPolicyNotFoundException; import store.ckin.api.pointpolicy.repository.PointPolicyRepository; +import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.entity.SalePaymentStatus; +import store.ckin.api.sale.exception.SaleNotFoundException; +import store.ckin.api.sale.repository.SaleRepository; /** * MemberService interface 의 구현체 입니다. @@ -34,6 +39,7 @@ @Service @RequiredArgsConstructor public class MemberServiceImpl implements MemberService { + private final MemberRepository memberRepository; private final GradeRepository gradeRepository; @@ -42,6 +48,8 @@ public class MemberServiceImpl implements MemberService { private final PointPolicyRepository pointPolicyRepository; + private final SaleRepository saleRepository; + private static final Long REGISTER_POINT_POLICY_ID = 100L; private static final Long NORMAL_GRADE_ID = 1L; @@ -117,6 +125,7 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) { public void updatePoint(Long memberId, Integer pointUsage) { Member member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberNotFoundException(memberId)); + member.updatePoint(pointUsage); } @@ -131,16 +140,18 @@ public MemberOauthLoginResponseDto getOauthMemberInfo(MemberOauthIdOnlyRequestDt return memberRepository.getOauthMemberInfo(oauthId); } - + /** * {@inheritDoc} * + * @param saleId 주문 ID * @param email 회원 이메일 * @param totalPrice 총 가격 */ @Override @Transactional - public void updateRewardPoint(String email, Integer totalPrice) { + public void updateRewardPoint(Long saleId, String email, Integer totalPrice) { + Member member = memberRepository.findByEmail(email) .orElseThrow(() -> new MemberNotFoundException(email)); @@ -148,11 +159,15 @@ public void updateRewardPoint(String email, Integer totalPrice) { Grade grade = gradeRepository.findById(member.getGrade().getGradeId()) .orElseThrow(GradeNotFoundException::new); + Sale sale = saleRepository.findById(saleId) + .orElseThrow(() -> new SaleNotFoundException(saleId)); + int reward = (int) Math.round(((double) grade.getPointRatio() / 100) * totalPrice); member.updatePoint(reward); PointHistory pointHistory = PointHistory.builder() .member(member) + .sale(sale) .pointHistoryPoint(reward) .pointHistoryReason("주문 적립") .pointHistoryTime(LocalDate.now()) @@ -160,4 +175,45 @@ public void updateRewardPoint(String email, Integer totalPrice) { pointHistoryRepository.save(pointHistory); } + + @Override + public void updateCancelSalePoint(Long saleId, String memberEmail) { + Member member = memberRepository.findByEmail(memberEmail) + .orElseThrow(() -> new MemberNotFoundException(memberEmail)); + + Sale sale = saleRepository.findById(saleId) + .orElseThrow(() -> new SaleNotFoundException(saleId)); + if (sale.getSalePaymentStatus() == SalePaymentStatus.WAITING) { + // 결제를 하지 않은 주문인 경우 + member.updatePoint(sale.getSalePointUsage()); + + PointHistory createPointHistory = PointHistory.builder() + .sale(sale) + .member(member) + .pointHistoryPoint(sale.getSalePointUsage()) + .pointHistoryTime(LocalDate.now()) + .pointHistoryReason("주문 취소") + .build(); + + pointHistoryRepository.save(createPointHistory); + } else { + // 결제를 진행한 주문인 경우 + PointHistory pointHistory = pointHistoryRepository.findBySale_SaleId(sale.getSaleId()) + .orElseThrow(PointHistoryNotFoundException::new); + Integer pointHistoryPoint = pointHistory.getPointHistoryPoint(); + + int totalPoint = (sale.getSaleTotalPrice() + sale.getSalePointUsage()) - pointHistoryPoint; + member.updatePoint(totalPoint); + + PointHistory createPointHistory = PointHistory.builder() + .sale(sale) + .member(member) + .pointHistoryPoint(totalPoint) + .pointHistoryTime(LocalDate.now()) + .pointHistoryReason("주문 취소") + .build(); + + pointHistoryRepository.save(createPointHistory); + } + } } diff --git a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java index 8cfb5260..061bf03e 100644 --- a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java +++ b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; +import store.ckin.api.payment.entity.PaymentStatus; /** * 결제 조회 응답 DTO. @@ -23,7 +24,7 @@ public class PaymentResponseDto { private String paymentKey; - private String paymentStatus; + private PaymentStatus paymentStatus; private LocalDateTime requestedAt; diff --git a/src/main/java/store/ckin/api/payment/repository/PaymentRepository.java b/src/main/java/store/ckin/api/payment/repository/PaymentRepository.java index 94fae3c9..47222f07 100644 --- a/src/main/java/store/ckin/api/payment/repository/PaymentRepository.java +++ b/src/main/java/store/ckin/api/payment/repository/PaymentRepository.java @@ -1,5 +1,6 @@ package store.ckin.api.payment.repository; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.payment.entity.Payment; @@ -11,4 +12,5 @@ */ public interface PaymentRepository extends JpaRepository, PaymentRepositoryCustom { + Optional findBySale_SaleId(Long saleId); } diff --git a/src/main/java/store/ckin/api/payment/repository/PaymentRepositoryImpl.java b/src/main/java/store/ckin/api/payment/repository/PaymentRepositoryImpl.java index ac190eb5..32228572 100644 --- a/src/main/java/store/ckin/api/payment/repository/PaymentRepositoryImpl.java +++ b/src/main/java/store/ckin/api/payment/repository/PaymentRepositoryImpl.java @@ -7,7 +7,7 @@ import store.ckin.api.payment.entity.QPayment; /** - * {class name}. + * 결제 레포지토리 커스텀 구현 클래스. (Querydsl) * * @author 정승조 * @version 2024. 03. 12. diff --git a/src/main/java/store/ckin/api/payment/service/impl/PaymentServiceImpl.java b/src/main/java/store/ckin/api/payment/service/impl/PaymentServiceImpl.java index 01f789a1..3b5a6eef 100644 --- a/src/main/java/store/ckin/api/payment/service/impl/PaymentServiceImpl.java +++ b/src/main/java/store/ckin/api/payment/service/impl/PaymentServiceImpl.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import store.ckin.api.payment.dto.request.PaymentRequestDto; import store.ckin.api.payment.dto.response.PaymentResponseDto; @@ -29,7 +30,7 @@ public class PaymentServiceImpl implements PaymentService { @Override - @Transactional + @Transactional(propagation = Propagation.REQUIRES_NEW) public void createPayment(Long saleId, PaymentRequestDto requestDto) { Sale sale = saleRepository.findById(saleId) diff --git a/src/main/java/store/ckin/api/pointhistory/exception/PointHistoryNotFoundException.java b/src/main/java/store/ckin/api/pointhistory/exception/PointHistoryNotFoundException.java new file mode 100644 index 00000000..935b7622 --- /dev/null +++ b/src/main/java/store/ckin/api/pointhistory/exception/PointHistoryNotFoundException.java @@ -0,0 +1,14 @@ +package store.ckin.api.pointhistory.exception; + +/** + * 포인트 내역을 찾을 수 없을 때 발생하는 예외입니다. + * + * @author 정승조 + * @version 2024. 03. 19. + */ + +public class PointHistoryNotFoundException extends RuntimeException { + public PointHistoryNotFoundException() { + super("포인트 내역을 찾을 수 없습니다."); + } +} diff --git a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepository.java b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepository.java index 82ed4726..941eda8f 100644 --- a/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepository.java +++ b/src/main/java/store/ckin/api/pointhistory/repository/PointHistoryRepository.java @@ -1,5 +1,6 @@ package store.ckin.api.pointhistory.repository; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import store.ckin.api.pointhistory.entity.PointHistory; @@ -10,4 +11,6 @@ * @version 2024. 03. 15. */ public interface PointHistoryRepository extends JpaRepository, PointHistoryRepositoryCustom { + + Optional findBySale_SaleId(Long saleId); } diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index 0ecb2a02..f18df7e9 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -3,6 +3,7 @@ import java.util.List; import javax.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; @@ -17,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; +import store.ckin.api.sale.dto.request.SaleDeliveryUpdateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; @@ -30,6 +32,7 @@ * @version 2024. 03. 02. */ +@Slf4j @RestController @RequestMapping("/api/sales") @RequiredArgsConstructor @@ -73,19 +76,6 @@ public ResponseEntity getSaleDetail(@PathVariable("saleId return ResponseEntity.ok(saleFacade.getSaleDetail(saleId)); } - /** - * 주문 결제 상태를 결제 완료(PAID)로 변경하는 메서드입니다. - * 주문의 상태를 업데이트하고, 책 주문의 상태를 완료(COMPLETE)로 업데이트합니다. - * - * @param saleId 주문 ID - * @return 200 (OK) - */ - @PutMapping("/{saleId}") - public ResponseEntity updateSalePaymentPaidStatus(@PathVariable("saleId") Long saleId) { - saleFacade.updateSalePaymentPaidStatus(saleId); - return ResponseEntity.ok().build(); - } - /** * 주문 번호로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다. * @@ -134,7 +124,6 @@ public ResponseEntity getMemberSaleDetailBySaleNumber( @RequestParam("saleNumber") String saleNumber, @RequestParam("memberId") Long memberId) { - return ResponseEntity.ok(saleFacade.getMemberSaleDetailBySaleNumber(saleNumber, memberId)); } @@ -152,4 +141,34 @@ public ResponseEntity>> getSalesByMember return ResponseEntity.ok(saleFacade.getSalesByMemberId(memberId, pageable)); } + + /** + * 주문 배송 상태를 업데이트하는 메서드입니다. + * + * @param saleId 주문 ID + * @param deliveryStatus 배송 상태 + * @return 200 (OK) + */ + @PutMapping("/{saleId}/delivery/status") + public ResponseEntity updateDeliveryStatus(@PathVariable Long saleId, + @Valid @RequestBody + SaleDeliveryUpdateRequestDto deliveryStatus) { + + log.info("saleId = {}, deliveryStatus = {}", saleId, deliveryStatus); + + saleFacade.updateSaleDeliveryStatus(saleId, deliveryStatus); + return ResponseEntity.ok().build(); + } + + /** + * 주문 상태를 취소로 변경하는 메서드입니다. + * + * @param saleId 주문 ID + * @return 200 (OK) + */ + @PutMapping("/{saleId}/cancel") + public ResponseEntity cancelSale(@PathVariable Long saleId) { + saleFacade.cancelSale(saleId); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 1fbea38a..26c56bca 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -8,7 +8,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; -import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.service.BookSaleService; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.member.service.MemberService; @@ -17,6 +16,7 @@ import store.ckin.api.pointhistory.dto.request.PointHistoryCreateRequestDto; import store.ckin.api.pointhistory.service.PointHistoryService; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; +import store.ckin.api.sale.dto.request.SaleDeliveryUpdateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; @@ -53,7 +53,6 @@ public class SaleFacade { * @param requestDto 주문 생성 요청 DTO * @return 생성된 주문 ID */ - @Transactional public String createSale(SaleCreateRequestDto requestDto) { SaleResponseDto sale = saleService.createSale(requestDto.toCreateSaleWithoutBookRequestDto()); @@ -106,18 +105,6 @@ public SaleDetailResponseDto getSaleDetail(Long saleId) { return new SaleDetailResponseDto(bookSale, saleDetail, payment); } - /** - * 주문의 결제 상태를 결제 완료(PAID)로 업데이트하는 메서드입니다. - * 주문의 상태를 업데이트하고, 책 주문의 상태를 완료(COMPLETE)로 업데이트합니다. - * - * @param saleId 주문 ID - */ - @Transactional - public void updateSalePaymentPaidStatus(Long saleId) { - bookSaleService.updateBookSaleState(saleId, BookSale.BookSaleState.COMPLETE); - saleService.updateSalePaymentPaidStatus(saleId); - } - /** * 주문 번호로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다. * @@ -172,7 +159,7 @@ public SaleDetailResponseDto getGuestSaleDetailBySaleNumber(String saleNumber, S public SaleDetailResponseDto getMemberSaleDetailBySaleNumber(String saleNumber, Long memberId) { SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); - + if (!Objects.equals(memberId, saleDetail.getMemberId())) { throw new SaleMemberNotMatchException(saleNumber); } @@ -223,4 +210,32 @@ public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, Long m public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { return saleService.getSalesByMemberId(memberId, pageable); } + + /** + * 주문 배송 상태를 업데이트하는 메서드입니다. + * + * @param saleId 주문 ID + * @param deliveryStatus 배송 상태 + */ + @Transactional + public void updateSaleDeliveryStatus(Long saleId, SaleDeliveryUpdateRequestDto deliveryStatus) { + saleService.updateSaleDeliveryStatus(saleId, deliveryStatus); + } + + /** + * 주문을 취소하는 메서드입니다. + * + * @param saleId 주문 ID + */ + @Transactional + public void cancelSale(Long saleId) { + // 주문 및 결제 상태 변경 + saleService.cancelSale(saleId); + + // 회원 포인트 변경 및 포인트 이력 생성 + SaleResponseDto saleDetail = saleService.getSaleDetail(saleId); + if (Objects.nonNull(saleDetail.getMemberEmail()) && saleDetail.getSalePointUsage() > 0) { + memberService.updateCancelSalePoint(saleId, saleDetail.getMemberEmail()); + } + } } diff --git a/src/main/java/store/ckin/api/sale/service/SaleService.java b/src/main/java/store/ckin/api/sale/service/SaleService.java index 87db7c65..84258153 100644 --- a/src/main/java/store/ckin/api/sale/service/SaleService.java +++ b/src/main/java/store/ckin/api/sale/service/SaleService.java @@ -4,6 +4,7 @@ import org.springframework.data.domain.Pageable; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.sale.dto.request.SaleCreateNoBookRequestDto; +import store.ckin.api.sale.dto.request.SaleDeliveryUpdateRequestDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; @@ -82,4 +83,20 @@ public interface SaleService { * @return 페이징 처리된 주문 응답 DTO 리스트 */ PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable); + + /** + * 주문 배송 상태를 업데이트합니다. + * + * @param saleId 주문 ID + * @param deliveryStatus 배송 상태 + */ + void updateSaleDeliveryStatus(Long saleId, SaleDeliveryUpdateRequestDto deliveryStatus); + + /** + * 주문을 취소 상태로 변경합니다. + * + * @param saleId 주문 ID + */ + void cancelSale(Long saleId); + } diff --git a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java index fcf046a0..ca5356c4 100644 --- a/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java +++ b/src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java @@ -16,11 +16,16 @@ import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.member.entity.Member; import store.ckin.api.member.repository.MemberRepository; +import store.ckin.api.payment.entity.Payment; +import store.ckin.api.payment.repository.PaymentRepository; import store.ckin.api.sale.dto.request.SaleCreateNoBookRequestDto; +import store.ckin.api.sale.dto.request.SaleDeliveryUpdateRequestDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; +import store.ckin.api.sale.entity.DeliveryStatus; import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.entity.SalePaymentStatus; import store.ckin.api.sale.exception.SaleNotFoundException; import store.ckin.api.sale.exception.SaleNotFoundExceptionBySaleNumber; import store.ckin.api.sale.exception.SaleNumberNotFoundException; @@ -43,6 +48,8 @@ public class SaleServiceImpl implements SaleService { private final MemberRepository memberRepository; + private final PaymentRepository paymentRepository; + /** * {@inheritDoc} * @@ -72,11 +79,11 @@ public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now().plusDays(1)) .saleDeliveryDate(requestDto.getSaleDeliveryDate()) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(requestDto.getDeliveryFee()) .salePointUsage(requestDto.getPointUsage()) .saleTotalPrice(requestDto.getTotalPrice()) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode(requestDto.getPostcode()) .build(); @@ -139,7 +146,7 @@ public void updateSalePaymentPaidStatus(Long saleId) { Sale sale = saleRepository.findById(saleId) .orElseThrow(() -> new SaleNotFoundException(saleId)); - sale.updatePaymentStatus(Sale.PaymentStatus.PAID); + sale.updatePaymentStatus(SalePaymentStatus.PAID); } @@ -210,4 +217,38 @@ public SaleResponseDto getSaleBySaleNumber(String saleNumber) { public PagedResponse> getSalesByMemberId(Long memberId, Pageable pageable) { return saleRepository.findAllByMemberId(memberId, pageable); } + + + /** + * {@inheritDoc} + * + * @param saleId 주문 ID + * @param deliveryStatus 배송 상태 + */ + @Override + @Transactional + public void updateSaleDeliveryStatus(Long saleId, SaleDeliveryUpdateRequestDto deliveryStatus) { + Sale sale = saleRepository.findById(saleId) + .orElseThrow(() -> new SaleNotFoundException(saleId)); + + sale.updateSaleDeliveryStatus(deliveryStatus.getDeliveryStatus()); + } + + /** + * {@inheritDoc} + * + * @param saleId 주문 ID + */ + @Override + @Transactional + public void cancelSale(Long saleId) { + Sale sale = saleRepository.findById(saleId) + .orElseThrow(() -> new SaleNotFoundException(saleId)); + + sale.updatePaymentStatus(SalePaymentStatus.CANCEL); + + paymentRepository.findBySale_SaleId(saleId) + .ifPresent(Payment::cancelPayment); + + } } From 3a4f7e8561308a7c26b1baf70b7472ffe9950d29 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 22:37:23 +0900 Subject: [PATCH 097/161] =?UTF-8?q?[REFACTOR]=20log=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/store/ckin/api/sale/controller/SaleController.java | 2 -- src/main/java/store/ckin/api/sale/facade/SaleFacade.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index f18df7e9..f3f9dbdb 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -154,8 +154,6 @@ public ResponseEntity updateDeliveryStatus(@PathVariable Long saleId, @Valid @RequestBody SaleDeliveryUpdateRequestDto deliveryStatus) { - log.info("saleId = {}, deliveryStatus = {}", saleId, deliveryStatus); - saleFacade.updateSaleDeliveryStatus(saleId, deliveryStatus); return ResponseEntity.ok().build(); } diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 26c56bca..1e693105 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -96,8 +96,6 @@ public SaleDetailResponseDto getSaleDetail(Long saleId) { List bookSale = bookSaleService.getBookSaleDetail(saleId); - log.info("bookSale = {}", bookSale); - SaleResponseDto saleDetail = saleService.getSaleDetail(saleId); PaymentResponseDto payment = paymentService.getPayment(saleId); From 0ed2de42811dbc5303f75b88b20bb488246ce8f1 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 22:37:38 +0900 Subject: [PATCH 098/161] =?UTF-8?q?[TEST]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/BookSaleServiceImplTest.java | 6 +- .../controller/PaymentControllerTest.java | 3 +- .../api/payment/facade/PaymentFacadeTest.java | 88 ++----------------- .../repository/PaymentRepositoryTest.java | 12 ++- .../service/impl/PaymentServiceImplTest.java | 6 +- .../sale/controller/SaleControllerTest.java | 43 ++++----- .../ckin/api/sale/facade/SaleFacadeTest.java | 32 +++---- .../sale/repository/SaleRepositoryTest.java | 30 ++++--- .../service/impl/SaleServiceImplTest.java | 13 +-- 9 files changed, 77 insertions(+), 156 deletions(-) diff --git a/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java b/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java index a3cb72dd..9c63a781 100644 --- a/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/booksale/service/impl/BookSaleServiceImplTest.java @@ -207,12 +207,12 @@ void testUpdateBookSaleState() { given(bookSaleRepository.findAllByPkSaleId(anyLong())) .willReturn(bookSaleList); - bookSaleService.updateBookSaleState(1L, BookSale.BookSaleState.COMPLETE); + bookSaleService.updateBookSaleState(1L, BookSale.BookSaleState.ORDER); verify(bookSaleRepository, times(1)).findAllByPkSaleId(anyLong()); - assertEquals(BookSale.BookSaleState.COMPLETE, firstBookSale.getBookSaleState()); - assertEquals(BookSale.BookSaleState.COMPLETE, secondBookSale.getBookSaleState()); + assertEquals(BookSale.BookSaleState.ORDER, firstBookSale.getBookSaleState()); + assertEquals(BookSale.BookSaleState.ORDER, secondBookSale.getBookSaleState()); } @Test diff --git a/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java b/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java index 2d2f1111..f5ba0461 100644 --- a/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java +++ b/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java @@ -25,6 +25,7 @@ import org.springframework.test.web.servlet.MockMvc; import store.ckin.api.payment.dto.request.PaymentRequestDto; import store.ckin.api.payment.dto.response.PaymentSuccessResponseDto; +import store.ckin.api.payment.entity.PaymentStatus; import store.ckin.api.payment.facade.PaymentFacade; /** @@ -53,7 +54,7 @@ void testCreatePayment() throws Exception { PaymentRequestDto paymentRequestDto = new PaymentRequestDto(); ReflectionTestUtils.setField(paymentRequestDto, "paymentKey", "12341234"); ReflectionTestUtils.setField(paymentRequestDto, "saleNumber", "423421432"); - ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", "DONE"); + ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", PaymentStatus.DONE); ReflectionTestUtils.setField(paymentRequestDto, "requestedAt", LocalDateTime.now().minusMinutes(10)); ReflectionTestUtils.setField(paymentRequestDto, "approvedAt", LocalDateTime.now()); ReflectionTestUtils.setField(paymentRequestDto, "amount", 15000); diff --git a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java index b22c8af7..29f11185 100644 --- a/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java +++ b/src/test/java/store/ckin/api/payment/facade/PaymentFacadeTest.java @@ -1,7 +1,6 @@ package store.ckin.api.payment.facade; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.anyString; @@ -21,11 +20,13 @@ import org.springframework.test.util.ReflectionTestUtils; import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.request.PaymentRequestDto; +import store.ckin.api.payment.entity.PaymentStatus; import store.ckin.api.payment.exception.PaymentAmountNotCorrectException; import store.ckin.api.payment.exception.PaymentNotCompleteException; import store.ckin.api.payment.service.PaymentService; import store.ckin.api.sale.dto.response.SaleResponseDto; -import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.entity.DeliveryStatus; +import store.ckin.api.sale.entity.SalePaymentStatus; import store.ckin.api.sale.service.SaleService; /** @@ -60,7 +61,7 @@ void setUp() { failPayment = new PaymentRequestDto(); ReflectionTestUtils.setField(failPayment, "paymentKey", "12341234"); ReflectionTestUtils.setField(failPayment, "saleNumber", "423421432"); - ReflectionTestUtils.setField(failPayment, "paymentStatus", "FAIL"); + ReflectionTestUtils.setField(failPayment, "paymentStatus", PaymentStatus.CANCEL); ReflectionTestUtils.setField(failPayment, "requestedAt", LocalDateTime.now().minusMinutes(10)); ReflectionTestUtils.setField(failPayment, "approvedAt", LocalDateTime.now()); ReflectionTestUtils.setField(failPayment, "amount", 15000); @@ -69,7 +70,7 @@ void setUp() { successPayment = new PaymentRequestDto(); ReflectionTestUtils.setField(successPayment, "paymentKey", "12341234"); ReflectionTestUtils.setField(successPayment, "saleNumber", "423421432"); - ReflectionTestUtils.setField(successPayment, "paymentStatus", "DONE"); + ReflectionTestUtils.setField(successPayment, "paymentStatus", PaymentStatus.DONE); ReflectionTestUtils.setField(successPayment, "requestedAt", LocalDateTime.now().minusMinutes(10)); ReflectionTestUtils.setField(successPayment, "approvedAt", LocalDateTime.now()); ReflectionTestUtils.setField(successPayment, "amount", 15000); @@ -109,11 +110,11 @@ void testCreatePayment_AmountNotCorrectException() { LocalDateTime.now(), LocalDateTime.now().plusDays(1), LocalDate.now().plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -148,11 +149,11 @@ void testCreatePayment() { LocalDateTime.now(), LocalDateTime.now().plusDays(1), LocalDate.now().plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 15000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -164,75 +165,4 @@ void testCreatePayment() { verify(saleService, times(1)).getSaleBySaleNumber(anyString()); verify(paymentService, times(1)).createPayment(anyLong(), any()); } - - @Test - @DisplayName("포인트 적립 테스트 - 회원일 경우") - void testCreateRewardPoint_Member() { - SaleResponseDto saleResponseDto = - new SaleResponseDto( - 1L, - 1L, - "테스트 제목", - "test@test.com", - "1234", - "정승조", - "01012345678", - "정승조", - "01012345678", - "광주광역시 동구 조선대 5길", - LocalDateTime.now(), - LocalDateTime.now().plusDays(1), - LocalDate.now().plusDays(3), - Sale.DeliveryStatus.READY, - 3000, - 0, - 15000, - Sale.PaymentStatus.WAITING, - "123456" - ); - - given(saleService.getSaleBySaleNumber(anyString())) - .willReturn(saleResponseDto); - - paymentFacade.createRewardPoint("123456"); - - verify(saleService, times(1)).getSaleBySaleNumber(anyString()); - verify(memberService, times(1)).updateRewardPoint(anyString(), anyInt()); - } - - @Test - @DisplayName("포인트 적립 테스트 - 비회원일 경우") - void testCreateRewardPoint_Anonymous() { - SaleResponseDto saleResponseDto = - new SaleResponseDto( - 1L, - 1L, - "테스트 제목", - null, - "123456", - "정승조", - "01012345678", - "정승조", - "01012345678", - "광주광역시 동구 조선대 5길", - LocalDateTime.now(), - LocalDateTime.now().plusDays(1), - LocalDate.now().plusDays(3), - Sale.DeliveryStatus.READY, - 3000, - 0, - 15000, - Sale.PaymentStatus.WAITING, - "123456" - ); - - - given(saleService.getSaleBySaleNumber(anyString())) - .willReturn(saleResponseDto); - - paymentFacade.createRewardPoint("123456"); - - verify(saleService, times(1)).getSaleBySaleNumber(anyString()); - verify(memberService, times(0)).updateRewardPoint(anyString(), anyInt()); - } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java b/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java index 9207126d..83d7e93f 100644 --- a/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java +++ b/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java @@ -18,7 +18,10 @@ import store.ckin.api.member.entity.Member; import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.entity.Payment; +import store.ckin.api.payment.entity.PaymentStatus; +import store.ckin.api.sale.entity.DeliveryStatus; import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.entity.SalePaymentStatus; /** * 결제 레포지토리 테스트입니다. @@ -45,6 +48,7 @@ class PaymentRepositoryTest { Book book; Sale sale; + DeliveryStatus DeliveryStatus; @BeforeEach void setUp() { @@ -102,10 +106,10 @@ void setUp() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); @@ -120,7 +124,7 @@ void testSave() { Payment payment = Payment.builder() .sale(sale) .paymentKey("12343214") - .paymentStatus("DONE") + .paymentStatus(PaymentStatus.DONE) .requestedAt(LocalDateTime.now().minusMinutes(10)) .approvedAt(LocalDateTime.now()) .receipt("https://test.com") @@ -145,7 +149,7 @@ void testGetPaymentBySaleId() { Payment payment = Payment.builder() .sale(sale) .paymentKey("12343214") - .paymentStatus("DONE") + .paymentStatus(PaymentStatus.DONE) .requestedAt(LocalDateTime.now().minusMinutes(10)) .approvedAt(LocalDateTime.now()) .receipt("https://test.com") diff --git a/src/test/java/store/ckin/api/payment/service/impl/PaymentServiceImplTest.java b/src/test/java/store/ckin/api/payment/service/impl/PaymentServiceImplTest.java index ef5328aa..9c346f2f 100644 --- a/src/test/java/store/ckin/api/payment/service/impl/PaymentServiceImplTest.java +++ b/src/test/java/store/ckin/api/payment/service/impl/PaymentServiceImplTest.java @@ -17,6 +17,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; import store.ckin.api.payment.dto.request.PaymentRequestDto; +import store.ckin.api.payment.entity.PaymentStatus; import store.ckin.api.payment.repository.PaymentRepository; import store.ckin.api.sale.entity.Sale; import store.ckin.api.sale.exception.SaleNotFoundException; @@ -47,7 +48,7 @@ void testCreatePayment() { PaymentRequestDto paymentRequestDto = new PaymentRequestDto(); ReflectionTestUtils.setField(paymentRequestDto, "paymentKey", "12341234"); ReflectionTestUtils.setField(paymentRequestDto, "saleNumber", "423421432"); - ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", "DONE"); + ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", PaymentStatus.DONE); ReflectionTestUtils.setField(paymentRequestDto, "requestedAt", LocalDateTime.now().minusMinutes(10)); ReflectionTestUtils.setField(paymentRequestDto, "approvedAt", LocalDateTime.now()); ReflectionTestUtils.setField(paymentRequestDto, "amount", 15000); @@ -70,14 +71,13 @@ void testCreatePaymentSuccess() { PaymentRequestDto paymentRequestDto = new PaymentRequestDto(); ReflectionTestUtils.setField(paymentRequestDto, "paymentKey", "12341234"); ReflectionTestUtils.setField(paymentRequestDto, "saleNumber", "423421432"); - ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", "DONE"); + ReflectionTestUtils.setField(paymentRequestDto, "paymentStatus", PaymentStatus.DONE); ReflectionTestUtils.setField(paymentRequestDto, "requestedAt", LocalDateTime.now().minusMinutes(10)); ReflectionTestUtils.setField(paymentRequestDto, "approvedAt", LocalDateTime.now()); ReflectionTestUtils.setField(paymentRequestDto, "amount", 15000); ReflectionTestUtils.setField(paymentRequestDto, "receiptUrl", "https://test.com"); - given(saleRepository.findById(anyLong())) .willReturn(Optional.of(Sale.builder().build())); diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index 754dc74d..ad6370f2 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -8,7 +8,6 @@ import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -31,12 +30,14 @@ import store.ckin.api.common.domain.PageInfo; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.payment.dto.response.PaymentResponseDto; +import store.ckin.api.payment.entity.PaymentStatus; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; -import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.entity.DeliveryStatus; +import store.ckin.api.sale.entity.SalePaymentStatus; import store.ckin.api.sale.facade.SaleFacade; /** @@ -109,11 +110,11 @@ void testGetSales() throws Exception { LocalDateTime.of(2024, 3, 7, 12, 0, 0), LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), LocalDate.of(2024, 3, 7).plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -170,11 +171,11 @@ void testGetSaleDetail() throws Exception { LocalDateTime.of(2024, 3, 7, 12, 0, 0), LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), LocalDate.of(2024, 3, 7).plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -182,7 +183,7 @@ void testGetSaleDetail() throws Exception { 1L, 1L, "1232321", - "1234", + PaymentStatus.DONE, LocalDateTime.now(), LocalDateTime.now().plusHours(1), "test.com"); @@ -237,7 +238,7 @@ void testGetSaleDetail() throws Exception { jsonPath("$.paymentResponseDto.paymentId").value(payment.getPaymentId()), jsonPath("$.paymentResponseDto.saleId").value(payment.getSaleId()), jsonPath("$.paymentResponseDto.paymentKey").value(payment.getPaymentKey()), - jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus()), + jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus().name()), jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(), jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) @@ -247,16 +248,6 @@ void testGetSaleDetail() throws Exception { verify(saleFacade, times(1)).getSaleDetail(anyLong()); } - @Test - @DisplayName("주문 결제 상태를 완료(PAID)로 변경 테스트") - void testUpdateSalePaymentPaidStatus() throws Exception { - - mockMvc.perform(put("/api/sales/{saleId}", 1L)) - .andExpect(status().isOk()) - .andDo(print()); - - verify(saleFacade, times(1)).updateSalePaymentPaidStatus(1L); - } @Test @DisplayName("주문 ID로 주문 상세 정보와 주문한 책 정보 조회 테스트") @@ -369,11 +360,11 @@ void testGetSaleDetailBySaleNumber() throws Exception { LocalDateTime.of(2024, 3, 7, 12, 0, 0), LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), LocalDate.of(2024, 3, 7).plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -382,7 +373,7 @@ void testGetSaleDetailBySaleNumber() throws Exception { 1L, 1L, "1232321", - "1234", + PaymentStatus.DONE, LocalDateTime.now(), LocalDateTime.now().plusHours(1), "test.com"); @@ -428,7 +419,7 @@ void testGetSaleDetailBySaleNumber() throws Exception { jsonPath("$.paymentResponseDto.paymentId").value(payment.getPaymentId()), jsonPath("$.paymentResponseDto.saleId").value(payment.getSaleId()), jsonPath("$.paymentResponseDto.paymentKey").value(payment.getPaymentKey()), - jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus()), + jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus().name()), jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(), jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) @@ -465,11 +456,11 @@ void testGetMemberSaleDetailBySaleNumber() throws Exception { LocalDateTime.of(2024, 3, 7, 12, 0, 0), LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), LocalDate.of(2024, 3, 7).plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -477,7 +468,7 @@ void testGetMemberSaleDetailBySaleNumber() throws Exception { 1L, 1L, "1232321", - "1234", + PaymentStatus.DONE, LocalDateTime.now(), LocalDateTime.now().plusHours(1), "test.com"); @@ -523,7 +514,7 @@ void testGetMemberSaleDetailBySaleNumber() throws Exception { jsonPath("$.paymentResponseDto.paymentId").value(payment.getPaymentId()), jsonPath("$.paymentResponseDto.saleId").value(payment.getSaleId()), jsonPath("$.paymentResponseDto.paymentKey").value(payment.getPaymentKey()), - jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus()), + jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus().name()), jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(), jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index 04dc2c9d..ea569e00 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -28,13 +28,15 @@ import store.ckin.api.booksale.service.BookSaleService; import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; +import store.ckin.api.payment.entity.PaymentStatus; import store.ckin.api.payment.service.PaymentService; import store.ckin.api.pointhistory.service.PointHistoryService; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; -import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.entity.DeliveryStatus; +import store.ckin.api.sale.entity.SalePaymentStatus; import store.ckin.api.sale.exception.SaleOrdererContactNotMatchException; import store.ckin.api.sale.service.SaleService; @@ -122,11 +124,11 @@ void testCreateSale() { LocalDateTime.now(), LocalDateTime.now().plusDays(1), LocalDate.now().plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -186,11 +188,11 @@ void testGetSaleDetail() { LocalDateTime.now(), LocalDateTime.now().plusDays(1), LocalDate.now().plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -203,7 +205,7 @@ void testGetSaleDetail() { 1L, 3L, "12421312", - "DONE", + PaymentStatus.DONE, LocalDateTime.now(), LocalDateTime.now().plusMinutes(10), "test.com" @@ -222,16 +224,6 @@ void testGetSaleDetail() { verify(saleService, times(1)).getSaleDetail(1L); } - @Test - @DisplayName("주문 결제 상태 완료 변경 테스트") - void testUpdateSalePaymentPaidStatus() { - - saleFacade.updateSalePaymentPaidStatus(1L); - - verify(bookSaleService, times(1)).updateBookSaleState(1L, BookSale.BookSaleState.COMPLETE); - verify(saleService, times(1)).updateSalePaymentPaidStatus(1L); - } - @Test @DisplayName("주문 번호로 주문 상세 정보와 주문한 책 정보 조회 테스트") void testGetSaleWithBookResponse() { @@ -293,11 +285,11 @@ void testGetSaleDetailBySaleNumber_Fail_Contact_Different() { LocalDateTime.of(2024, 3, 7, 12, 0, 0), LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), LocalDate.of(2024, 3, 7).plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); @@ -326,11 +318,11 @@ void testGetSaleDetailBySaleNumber_Success() { LocalDateTime.of(2024, 3, 7, 12, 0, 0), LocalDateTime.of(2024, 3, 7, 12, 0, 0).plusDays(1), LocalDate.of(2024, 3, 7).plusDays(3), - Sale.DeliveryStatus.READY, + DeliveryStatus.READY, 3000, 0, 10000, - Sale.PaymentStatus.WAITING, + SalePaymentStatus.WAITING, "123456" ); diff --git a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java index 3b58ad88..18f6c9c1 100644 --- a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java +++ b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java @@ -25,7 +25,9 @@ import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; +import store.ckin.api.sale.entity.DeliveryStatus; import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.entity.SalePaymentStatus; /** * 주문 레포지토리 테스트. @@ -117,10 +119,10 @@ void testSaveSale() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); @@ -162,10 +164,10 @@ void testFindAllByOrderBySaleIdDesc() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); @@ -184,10 +186,10 @@ void testFindAllByOrderBySaleIdDesc() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); @@ -214,10 +216,10 @@ void testFindBySaleId() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); @@ -259,10 +261,10 @@ void testGetSaleWithBook() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); @@ -320,10 +322,10 @@ void testFindBySaleNumber() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); @@ -366,10 +368,10 @@ void testFindAllByMemberId() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); diff --git a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java index d116fcb8..9fa92d7a 100644 --- a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java @@ -34,7 +34,9 @@ import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; +import store.ckin.api.sale.entity.DeliveryStatus; import store.ckin.api.sale.entity.Sale; +import store.ckin.api.sale.entity.SalePaymentStatus; import store.ckin.api.sale.exception.SaleNotFoundException; import store.ckin.api.sale.exception.SaleNotFoundExceptionBySaleNumber; import store.ckin.api.sale.exception.SaleNumberNotFoundException; @@ -99,11 +101,11 @@ void setUp() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) .saleTotalPrice(10000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); } @@ -160,11 +162,11 @@ void testGetSales() { .saleDate(LocalDateTime.now()) .saleShippingDate(LocalDateTime.now()) .saleDeliveryDate(LocalDate.now().plusDays(2)) - .saleDeliveryStatus(Sale.DeliveryStatus.READY) + .saleDeliveryStatus(DeliveryStatus.READY) .saleDeliveryFee(3000) .salePointUsage(1000) .saleTotalPrice(10000) - .salePaymentStatus(Sale.PaymentStatus.WAITING) + .salePaymentStatus(SalePaymentStatus.WAITING) .saleShippingPostCode("123456") .build(); @@ -232,7 +234,7 @@ void testUpdateSalePaymentPaidStatus_Success() { saleService.updateSalePaymentPaidStatus(1L); - assertEquals(Sale.PaymentStatus.PAID, sale.getSalePaymentStatus()); + assertEquals(SalePaymentStatus.PAID, sale.getSalePaymentStatus()); } @Test @@ -424,7 +426,6 @@ void testGetSalesByMemberId() { saleService.getSalesByMemberId(1L, Pageable.ofSize(10)); - assertAll( () -> assertNotNull(responseDto), () -> assertEquals(responseDto.getData().get(0), saleInfo), From b30ce84432be112c73fd8a730a846aec3d08ac91 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Tue, 19 Mar 2024 22:38:16 +0900 Subject: [PATCH 099/161] =?UTF-8?q?[TEST]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=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 --- .../store/ckin/api/payment/repository/PaymentRepositoryTest.java | 1 - src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java b/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java index 83d7e93f..8e3bc579 100644 --- a/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java +++ b/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java @@ -48,7 +48,6 @@ class PaymentRepositoryTest { Book book; Sale sale; - DeliveryStatus DeliveryStatus; @BeforeEach void setUp() { diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index ea569e00..3f46673e 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -24,7 +24,6 @@ import org.springframework.test.util.ReflectionTestUtils; import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; -import store.ckin.api.booksale.entity.BookSale; import store.ckin.api.booksale.service.BookSaleService; import store.ckin.api.member.service.MemberService; import store.ckin.api.payment.dto.response.PaymentResponseDto; From e09ae2337294b36f74d06803eb6621205cd5277e Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Wed, 20 Mar 2024 00:35:04 +0900 Subject: [PATCH 100/161] =?UTF-8?q?[REFACOTR]=20=EC=98=A4=EB=A5=98=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 --- .../address/domain/response/MemberAddressResponseDto.java | 2 ++ .../api/address/repository/impl/AddressRepositoryImpl.java | 1 + .../ckin/api/address/service/impl/AddressServiceImpl.java | 7 ------- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java index 77e5f80e..20095bda 100644 --- a/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java +++ b/src/main/java/store/ckin/api/address/domain/response/MemberAddressResponseDto.java @@ -12,6 +12,8 @@ @Getter @AllArgsConstructor public class MemberAddressResponseDto { + private Long addressId; + private String postCode; private String base; diff --git a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java index a11ab3c6..ae116979 100644 --- a/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java +++ b/src/main/java/store/ckin/api/address/repository/impl/AddressRepositoryImpl.java @@ -26,6 +26,7 @@ public List getMemberAddressList(Long memberId) { return from(address) .select(Projections.constructor(MemberAddressResponseDto.class, + address.id, address.postCode, address.base, address.detail, diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index 07ce6f4f..e52c6447 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -73,13 +73,6 @@ public void updateAddress(Long memberId, throw new MemberNotFoundException(); } - if (addressRepository.existsByMemberIdAndBaseAndDetail( - memberId, - addressUpdateRequestDto.getBase(), - addressUpdateRequestDto.getDetail())) { - throw new AddressAlreadyExistsException(); - } - Address address = addressRepository.findByIdAndMember_Id(addressId, memberId) .orElseThrow(AddressNotFoundException::new); From 66ffe153dff1cff75b9d80a9e97396558d3925dd Mon Sep 17 00:00:00 2001 From: gaeun Date: Wed, 20 Mar 2024 10:25:04 +0900 Subject: [PATCH 101/161] =?UTF-8?q?[REFACTOR]=20=EC=BF=A0=ED=8F=B0=20Valid?= =?UTF-8?q?ation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/controller/CategoryController.java | 1 + .../dto/response/CategoryNameResponseDto.java | 17 +++++++++++++++++ .../category/repository/CategoryRepository.java | 1 + .../service/impl/CategoryServiceImpl.java | 1 + 4 files changed, 20 insertions(+) create mode 100644 src/main/java/store/ckin/api/category/dto/response/CategoryNameResponseDto.java diff --git a/src/main/java/store/ckin/api/category/controller/CategoryController.java b/src/main/java/store/ckin/api/category/controller/CategoryController.java index cdc9b70d..7d81a77c 100644 --- a/src/main/java/store/ckin/api/category/controller/CategoryController.java +++ b/src/main/java/store/ckin/api/category/controller/CategoryController.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; +import store.ckin.api.category.dto.response.CategoryNameResponseDto; import store.ckin.api.category.dto.response.CategoryResponseDto; import store.ckin.api.category.service.CategoryService; diff --git a/src/main/java/store/ckin/api/category/dto/response/CategoryNameResponseDto.java b/src/main/java/store/ckin/api/category/dto/response/CategoryNameResponseDto.java new file mode 100644 index 00000000..f504e7af --- /dev/null +++ b/src/main/java/store/ckin/api/category/dto/response/CategoryNameResponseDto.java @@ -0,0 +1,17 @@ +package store.ckin.api.category.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * CategoryNameResponseDto + * + * @author : gaeun + * @version : 2024. 03. 19 + */ +@Getter +@NoArgsConstructor +public class CategoryNameResponseDto { + private String name; +} diff --git a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java index 9cf009ef..7c85f348 100644 --- a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java +++ b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import store.ckin.api.category.dto.response.CategoryNameResponseDto; import store.ckin.api.category.entity.Category; /** diff --git a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java index 8801fcab..d73ff206 100644 --- a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java +++ b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java @@ -8,6 +8,7 @@ import store.ckin.api.book.repository.BookRepository; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; +import store.ckin.api.category.dto.response.CategoryNameResponseDto; import store.ckin.api.category.dto.response.CategoryResponseDto; import store.ckin.api.category.entity.Category; import store.ckin.api.category.exception.CategoryNotFoundException; From 3b6ae819aa5c07d2a74c01d203ea14459d2ef7e5 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Wed, 20 Mar 2024 10:32:24 +0900 Subject: [PATCH 102/161] =?UTF-8?q?[FEATURE]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=A6=AC=EB=B7=B0=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/ReviewUpdateRequestDto.java | 17 +++++++++++++++++ .../ckin/api/review/facade/ReviewFacade.java | 5 +++++ .../ckin/api/review/service/ReviewService.java | 3 +++ .../review/service/impl/ReviewServiceImpl.java | 14 ++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 src/main/java/store/ckin/api/review/dto/request/ReviewUpdateRequestDto.java diff --git a/src/main/java/store/ckin/api/review/dto/request/ReviewUpdateRequestDto.java b/src/main/java/store/ckin/api/review/dto/request/ReviewUpdateRequestDto.java new file mode 100644 index 00000000..9ce886c2 --- /dev/null +++ b/src/main/java/store/ckin/api/review/dto/request/ReviewUpdateRequestDto.java @@ -0,0 +1,17 @@ +package store.ckin.api.review.dto.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * ReviewUpdateRequestDto. + * + * @author 나국로 + * @version 2024. 03. 19. + */ +@Getter +@NoArgsConstructor +public class ReviewUpdateRequestDto { + private Integer reviewRate; + private String reviewComment; +} diff --git a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java index 5dc3c15e..3e6d3f5c 100644 --- a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java +++ b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java @@ -15,6 +15,7 @@ import store.ckin.api.pointpolicy.dto.response.PointPolicyResponseDto; import store.ckin.api.pointpolicy.service.PointPolicyService; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.request.ReviewUpdateRequestDto; import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.service.ReviewService; @@ -68,4 +69,8 @@ public Page getReviewPageList(Pageable pageable, Long bookId) public Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable) { return reviewService.findReviewsByMemberWithPagination(memberId, pageable); } + + public void updateReview(Long reviewId, ReviewUpdateRequestDto updateRequestDto) { + reviewService.updateReview(reviewId, updateRequestDto); + } } diff --git a/src/main/java/store/ckin/api/review/service/ReviewService.java b/src/main/java/store/ckin/api/review/service/ReviewService.java index 9d571edc..964a7eac 100644 --- a/src/main/java/store/ckin/api/review/service/ReviewService.java +++ b/src/main/java/store/ckin/api/review/service/ReviewService.java @@ -6,6 +6,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.request.ReviewUpdateRequestDto; import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; @@ -34,4 +35,6 @@ public interface ReviewService { */ Page getReviewPageList(Pageable pageable, Long bookId); Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable); + + void updateReview(Long reviewId, ReviewUpdateRequestDto updateRequestDto); } diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index 17e8ca37..bc5043c2 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -20,9 +20,11 @@ import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.objectstorage.service.ObjectStorageService; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.request.ReviewUpdateRequestDto; import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.entity.Review; +import store.ckin.api.review.exception.ReviewNotFoundException; import store.ckin.api.review.exception.SaveFileException; import store.ckin.api.review.repository.ReviewRepository; import store.ckin.api.review.service.ReviewService; @@ -119,4 +121,16 @@ public Page findReviewsByMemberWithPagination(Long memb return reviewPage; } + @Override + public void updateReview(Long reviewId, ReviewUpdateRequestDto updateRequestDto) { + Review existingReview = reviewRepository.findById(reviewId) + .orElseThrow(()-> new ReviewNotFoundException(reviewId)); + + + + Review updatedReview = existingReview.toBuilder() + .reviewComment(updateRequestDto.getReviewComment()) + .reviewRate(updateRequestDto.getReviewRate()).build(); + reviewRepository.save(updatedReview); + } } From 9992447e11dc14bd9ec8af136aa5d9485085c2ed Mon Sep 17 00:00:00 2001 From: nayoseb Date: Wed, 20 Mar 2024 10:32:39 +0900 Subject: [PATCH 103/161] =?UTF-8?q?[FEATURE]=20=EB=A6=AC=EB=B7=B0=20except?= =?UTF-8?q?ion=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/review/exception/ReviewNotFoundException.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java index 32adc52a..3608e3ae 100644 --- a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java +++ b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java @@ -7,4 +7,7 @@ * @version 2024. 03. 01. */ public class ReviewNotFoundException extends RuntimeException { + public ReviewNotFoundException(Long reviewId) { + super(String.format("Review not found: %s", reviewId)); + } } From 413b05da69e4527daffb807b5386fc065dba638e Mon Sep 17 00:00:00 2001 From: nayoseb Date: Wed, 20 Mar 2024 10:34:41 +0900 Subject: [PATCH 104/161] =?UTF-8?q?[FEATURE]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=97=94=ED=8A=B8?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=88=98=EC=A0=95=20=EB=A9=94=EC=84=9C?= =?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 --- .../review/controller/ReviewController.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index 0f4860b4..a625c243 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -11,11 +11,13 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.request.ReviewUpdateRequestDto; import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.facade.ReviewFacade; @@ -30,12 +32,11 @@ @Slf4j @RestController @RequiredArgsConstructor -@RequestMapping("/api/review") +@RequestMapping("/api") public class ReviewController { private final ReviewFacade reviewFacade; - private final ReviewService reviewService; /** * 리뷰 업로드를 구현하는 메소드 입니다. @@ -43,7 +44,7 @@ public class ReviewController { * @param createRequestDto 도서 아이디, 리뷰 점수, 리뷰 코멘트를 담고 있는 DTO 입니다. * @param imageList 리뷰의 이미지 리스트를 담고 있는 MultipartFile 리스트 입니다. */ - @PostMapping + @PostMapping("/review") public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto createRequestDto, @RequestPart(value = "imageList", required = false) List imageList) { @@ -60,7 +61,7 @@ public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto creat * @param bookId 도서 아이디 * @return 리뷰 DTO 페이지 */ - @GetMapping("{bookId}") + @GetMapping("/review/{bookId}") public ResponseEntity> getReviewPageList( @PageableDefault(size = 5) Pageable pageable, @PathVariable("bookId") Long bookId) { @@ -76,7 +77,7 @@ public ResponseEntity> getReviewPageList( * @param memberId 회원 아이디 * @return 리뷰 DTO 페이지 */ - @GetMapping("/my-page/{memberId}") + @GetMapping("members/review/my-page/{memberId}") public ResponseEntity> getReviewPageListByMemberId( @PageableDefault(page = 0, size = 5) Pageable pageable, @PathVariable("memberId") Long memberId) { @@ -84,4 +85,14 @@ public ResponseEntity> getReviewPageListByMemberId return ResponseEntity.ok().body(content); } + + @PutMapping("/members/review/{reviewId}") + public ResponseEntity updateReview(@RequestPart ReviewUpdateRequestDto updateRequestDto, + @PathVariable Long reviewId) { + + reviewFacade.updateReview(reviewId, updateRequestDto); + + return ResponseEntity.status(HttpStatus.OK).build(); + } + } From 36c3a6240edce4e8f73316a3d8103e884674753b Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 10:51:03 +0900 Subject: [PATCH 105/161] =?UTF-8?q?[REFACTOR]=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/member/service/impl/MemberServiceImpl.java | 1 + .../java/store/ckin/api/sale/controller/SaleController.java | 2 -- src/main/java/store/ckin/api/sale/facade/SaleFacade.java | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 24807de1..1f1a6aab 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -177,6 +177,7 @@ public void updateRewardPoint(Long saleId, String email, Integer totalPrice) { } @Override + @Transactional public void updateCancelSalePoint(Long saleId, String memberEmail) { Member member = memberRepository.findByEmail(memberEmail) .orElseThrow(() -> new MemberNotFoundException(memberEmail)); diff --git a/src/main/java/store/ckin/api/sale/controller/SaleController.java b/src/main/java/store/ckin/api/sale/controller/SaleController.java index f3f9dbdb..f6c456a7 100644 --- a/src/main/java/store/ckin/api/sale/controller/SaleController.java +++ b/src/main/java/store/ckin/api/sale/controller/SaleController.java @@ -3,7 +3,6 @@ import java.util.List; import javax.validation.Valid; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; @@ -32,7 +31,6 @@ * @version 2024. 03. 02. */ -@Slf4j @RestController @RequestMapping("/api/sales") @RequiredArgsConstructor diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 1e693105..b5b933ac 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -53,6 +53,7 @@ public class SaleFacade { * @param requestDto 주문 생성 요청 DTO * @return 생성된 주문 ID */ + @Transactional public String createSale(SaleCreateRequestDto requestDto) { SaleResponseDto sale = saleService.createSale(requestDto.toCreateSaleWithoutBookRequestDto()); From 8a67e810253efda4a52c0029fba012a2e7e62ff5 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Wed, 20 Mar 2024 11:14:21 +0900 Subject: [PATCH 106/161] =?UTF-8?q?[REFACTOR]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/review/controller/ReviewController.java | 2 +- .../ckin/api/review/exception/ReviewNotFoundException.java | 2 +- .../ckin/api/review/service/impl/ReviewServiceImpl.java | 7 +++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index a625c243..87370ff6 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -77,7 +77,7 @@ public ResponseEntity> getReviewPageList( * @param memberId 회원 아이디 * @return 리뷰 DTO 페이지 */ - @GetMapping("members/review/my-page/{memberId}") + @GetMapping("/members/review/my-page/{memberId}") public ResponseEntity> getReviewPageListByMemberId( @PageableDefault(page = 0, size = 5) Pageable pageable, @PathVariable("memberId") Long memberId) { diff --git a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java index 3608e3ae..c90c4e59 100644 --- a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java +++ b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java @@ -8,6 +8,6 @@ */ public class ReviewNotFoundException extends RuntimeException { public ReviewNotFoundException(Long reviewId) { - super(String.format("Review not found: %s", reviewId)); + super(String.format("Review not found: %d", reviewId)); } } diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index bc5043c2..11e53981 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -122,15 +122,14 @@ public Page findReviewsByMemberWithPagination(Long memb } @Override + @Transactional public void updateReview(Long reviewId, ReviewUpdateRequestDto updateRequestDto) { Review existingReview = reviewRepository.findById(reviewId) - .orElseThrow(()-> new ReviewNotFoundException(reviewId)); - + .orElseThrow(() -> new ReviewNotFoundException(reviewId)); - Review updatedReview = existingReview.toBuilder() + existingReview.toBuilder() .reviewComment(updateRequestDto.getReviewComment()) .reviewRate(updateRequestDto.getReviewRate()).build(); - reviewRepository.save(updatedReview); } } From 51dda6ad648e8a6f0f6b2136c43b5a15ba73f96e Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Wed, 20 Mar 2024 12:14:16 +0900 Subject: [PATCH 107/161] =?UTF-8?q?[FEAT]=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=8B=9C=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=ED=99=95=EC=9D=B8=EC=9D=84=20=EC=9C=84=ED=95=9C=20API?= =?UTF-8?q?=20Method(checkDuplicateEmail)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 13 ++++++++++++ .../request/MemberEmailOnlyRequestDto.java | 20 +++++++++++++++++++ .../api/member/service/MemberService.java | 3 +++ .../service/impl/MemberServiceImpl.java | 6 ++++++ 4 files changed, 42 insertions(+) create mode 100644 src/main/java/store/ckin/api/member/domain/request/MemberEmailOnlyRequestDto.java diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 06f86c63..5cfe4561 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; +import store.ckin.api.member.domain.request.MemberEmailOnlyRequestDto; import store.ckin.api.member.domain.request.MemberOauthIdOnlyRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; @@ -35,6 +36,18 @@ public class MemberController { private final MemberService memberService; + /** + * 존재하는 Email 인지 확인하는 API Method 입니다. + */ + @PostMapping("/checkEmail") + public ResponseEntity checkDuplicateEmail( + @Valid @RequestBody MemberEmailOnlyRequestDto memberEmailOnlyRequestDto) { + log.info("Start"); + + return ResponseEntity.status(HttpStatus.OK) + .body(memberService.alreadyExistsEmail(memberEmailOnlyRequestDto)); + } + /** * Member 생성을 하는 API Method 입니다. * diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberEmailOnlyRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberEmailOnlyRequestDto.java new file mode 100644 index 00000000..1ede5e56 --- /dev/null +++ b/src/main/java/store/ckin/api/member/domain/request/MemberEmailOnlyRequestDto.java @@ -0,0 +1,20 @@ +package store.ckin.api.member.domain.request; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * Member Email 만으로 요청하는 DTO 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 20. + */ +@Getter +@NoArgsConstructor +public class MemberEmailOnlyRequestDto { + @Email + @NotBlank + private String email; +} diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 3822ec11..a99fc0e8 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -2,6 +2,7 @@ import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; +import store.ckin.api.member.domain.request.MemberEmailOnlyRequestDto; import store.ckin.api.member.domain.request.MemberOauthIdOnlyRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; @@ -14,6 +15,8 @@ * @version : 2024. 02. 16. */ public interface MemberService { + boolean alreadyExistsEmail(MemberEmailOnlyRequestDto memberEmailOnlyRequestDto); + /** * Member 를 생성하는 메서드 입니다. * diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 9e6707c1..9ee85b53 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -10,6 +10,7 @@ import store.ckin.api.grade.repository.GradeRepository; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; +import store.ckin.api.member.domain.request.MemberEmailOnlyRequestDto; import store.ckin.api.member.domain.request.MemberOauthIdOnlyRequestDto; import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; @@ -46,6 +47,11 @@ public class MemberServiceImpl implements MemberService { private static final Long NORMAL_GRADE_ID = 1L; + @Override + public boolean alreadyExistsEmail(MemberEmailOnlyRequestDto memberEmailOnlyRequestDto) { + return memberRepository.existsByEmail(memberEmailOnlyRequestDto.getEmail()); + } + @Override @Transactional public void createMember(MemberCreateRequestDto memberCreateRequestDto) { From bd68f9411c68474b975b022fc1d6126685d72da6 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 13:50:49 +0900 Subject: [PATCH 108/161] =?UTF-8?q?[REFACTOR]=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=95=88=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/sale/facade/SaleFacade.java | 31 +------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index b5b933ac..368ff5ba 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -148,7 +148,7 @@ public SaleDetailResponseDto getGuestSaleDetailBySaleNumber(String saleNumber, S } /** - * 회원의 주문 번호를 통해 주문 상세 정보를 조회하는 메서드입니다. + * 회원 ID와 주문 번호를 통해 주문 상세 정보를 조회하는 메서드입니다. * * @param saleNumber 주문 번호 * @param memberId 회원 ID @@ -169,35 +169,6 @@ public SaleDetailResponseDto getMemberSaleDetailBySaleNumber(String saleNumber, return new SaleDetailResponseDto(bookSale, saleDetail, payment); } - /** - * 주문 번호로 주문 상세 정보를 조회하는 메서드입니다. - * - * @param saleNumber 주문 번호 - * @param memberId 회원 ID - * @param ordererContact 주문자 연락처 - * @return 주문 상세 정보 응답 DTO - */ - @Transactional(readOnly = true) - public SaleDetailResponseDto getSaleDetailBySaleNumber(String saleNumber, Long memberId, String ordererContact) { - SaleResponseDto saleDetail = saleService.getSaleBySaleNumber(saleNumber); - - if (memberId != null) { // 회원인 경우 - if (!Objects.equals(memberId, saleDetail.getSaleId())) { - throw new SaleMemberNotMatchException(saleNumber); - } - } else { // 비회원인 경우 - if (!ordererContact.equals(saleDetail.getSaleOrdererContact())) { - throw new SaleOrdererContactNotMatchException(saleNumber, ordererContact); - } - } - - List bookSale = bookSaleService.getBookSaleDetail(saleDetail.getSaleId()); - PaymentResponseDto payment = paymentService.getPayment(saleDetail.getSaleId()); - - return new SaleDetailResponseDto(bookSale, saleDetail, payment); - } - - /** * 회원 ID를 통해 해당 회원의 모든 주문 내역을 조회하는 메서드입니다. * From 33d531b2fc9b9ad8642ea18fd65efd93f8a6841b Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 13:50:59 +0900 Subject: [PATCH 109/161] =?UTF-8?q?[TEST]=20=EC=A3=BC=EB=AC=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=BD=94=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 --- .../sale/controller/SaleControllerTest.java | 29 +++ .../ckin/api/sale/facade/SaleFacadeTest.java | 192 +++++++++++++++++- .../service/impl/SaleServiceImplTest.java | 58 ++++++ 3 files changed, 274 insertions(+), 5 deletions(-) diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index ad6370f2..3f746f17 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -8,6 +8,7 @@ import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -32,6 +33,7 @@ import store.ckin.api.payment.dto.response.PaymentResponseDto; import store.ckin.api.payment.entity.PaymentStatus; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; +import store.ckin.api.sale.dto.request.SaleDeliveryUpdateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; @@ -559,4 +561,31 @@ void testGetSalesByMemberId() throws Exception { jsonPath("$.pageInfo.size").value(pageInfo.getSize()) ); } + + @Test + @DisplayName("주문 배송 상태 업데이트 테스트") + void testUpdateDeliveryStatus() throws Exception { + SaleDeliveryUpdateRequestDto deliveryStatus = new SaleDeliveryUpdateRequestDto(); + ReflectionTestUtils.setField(deliveryStatus, "deliveryStatus", DeliveryStatus.IN_PROGRESS); + + String json = objectMapper.writeValueAsString(deliveryStatus); + + mockMvc.perform(put("/api/sales/{saleId}/delivery/status", 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(json)) + .andExpect(status().isOk()) + .andDo(print()); + + verify(saleFacade, times(1)).updateSaleDeliveryStatus(anyLong(), any()); + } + + @Test + @DisplayName("주문 상태를 취소로 변경하는 테스트") + void testCancelSale() throws Exception { + mockMvc.perform(put("/api/sales/{saleId}/cancel", 1L)) + .andExpect(status().isOk()) + .andDo(print()); + + verify(saleFacade, times(1)).cancelSale(anyLong()); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index 3f46673e..1e9bfc9d 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -31,11 +31,13 @@ import store.ckin.api.payment.service.PaymentService; import store.ckin.api.pointhistory.service.PointHistoryService; import store.ckin.api.sale.dto.request.SaleCreateRequestDto; +import store.ckin.api.sale.dto.request.SaleDeliveryUpdateRequestDto; import store.ckin.api.sale.dto.response.SaleDetailResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; import store.ckin.api.sale.entity.DeliveryStatus; import store.ckin.api.sale.entity.SalePaymentStatus; +import store.ckin.api.sale.exception.SaleMemberNotMatchException; import store.ckin.api.sale.exception.SaleOrdererContactNotMatchException; import store.ckin.api.sale.service.SaleService; @@ -67,11 +69,6 @@ class SaleFacadeTest { @Mock PointHistoryService pointHistoryService; - @BeforeEach - void setUp() { - - } - @Test @DisplayName("주문 생성 테스트") void testCreateSale() { @@ -142,6 +139,7 @@ void testCreateSale() { verify(saleService, times(1)).createSale(any()); verify(bookSaleService, times(1)).createBookSale(anyLong(), any()); verify(memberService, times(1)).updatePoint(anyLong(), any()); + verify(pointHistoryService, times(1)).createPointHistory(any()); } @Test @@ -339,4 +337,188 @@ void testGetSalesByMemberId() { saleFacade.getSalesByMemberId(1L, Pageable.ofSize(10)); verify(saleService, times(1)).getSalesByMemberId(1L, Pageable.ofSize(10)); } + + @Test + @DisplayName("회원 ID와 주문 번호를 통해 주문 상세 정보 조회 - 실패 (회원 정보가 다른 경우)") + void testGetMemberSaleDetailBySaleNumber_Fail_NotMatchException() { + SaleResponseDto saleResponseDto = + new SaleResponseDto( + 1L, + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.now(), + LocalDateTime.now().plusDays(1), + LocalDate.now().plusDays(3), + DeliveryStatus.READY, + 3000, + 0, + 15000, + SalePaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleBySaleNumber(anyString())) + .willReturn(saleResponseDto); + + assertThrows(SaleMemberNotMatchException.class, + () -> saleFacade.getMemberSaleDetailBySaleNumber("1234", 5L)); + + verify(saleService, times(1)).getSaleBySaleNumber(anyString()); + verify(bookSaleService, times(0)).getBookSaleDetail(anyLong()); + verify(paymentService, times(0)).getPayment(anyLong()); + } + + @Test + @DisplayName("회원 ID와 주문 번호를 통해 주문 상세 정보 조회 - 성공") + void testGetMemberSaleDetailBySaleNumber_Success() { + SaleResponseDto sale = + new SaleResponseDto( + 1L, + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.now(), + LocalDateTime.now().plusDays(1), + LocalDate.now().plusDays(3), + DeliveryStatus.READY, + 3000, + 0, + 15000, + SalePaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleBySaleNumber(anyString())) + .willReturn(sale); + + BookAndBookSaleResponseDto bookSale = + new BookAndBookSaleResponseDto( + 1L, + "testimg.com", + "홍길동전", + 5, + 3L, + "A 포장", + 1000, + 50000); + + given(bookSaleService.getBookSaleDetail(anyLong())) + .willReturn(List.of(bookSale)); + + PaymentResponseDto payment = new PaymentResponseDto( + 1L, + 1L, + "1232321", + PaymentStatus.DONE, + LocalDateTime.now(), + LocalDateTime.now().plusHours(1), + "test.com"); + + given(paymentService.getPayment(anyLong())) + .willReturn(payment); + + + SaleDetailResponseDto actual = saleFacade.getMemberSaleDetailBySaleNumber("1234", 1L); + + assertAll( + () -> assertEquals(sale, actual.getSaleResponseDto()), + () -> assertEquals(bookSale, actual.getBookSaleList().get(0)), + () -> assertEquals(payment, actual.getPaymentResponseDto()) + ); + } + + @Test + @DisplayName("주문 배송 상태 변경 테스트") + void testUpdateSaleDeliveryStatus() { + SaleDeliveryUpdateRequestDto delivery = new SaleDeliveryUpdateRequestDto(); + ReflectionTestUtils.setField(delivery, "deliveryStatus", DeliveryStatus.IN_PROGRESS); + + saleFacade.updateSaleDeliveryStatus(1L, delivery); + verify(saleService, times(1)).updateSaleDeliveryStatus(anyLong(), any()); + } + + @Test + @DisplayName("주문 취소 테스트 - 비회원") + void testCancelSale_Anonymous() { + SaleResponseDto sale = + new SaleResponseDto( + 1L, + null, + "테스트 제목", + null, + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.now(), + LocalDateTime.now().plusDays(1), + LocalDate.now().plusDays(3), + DeliveryStatus.READY, + 3000, + 0, + 15000, + SalePaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleDetail(1L)) + .willReturn(sale); + + saleFacade.cancelSale(1L); + + verify(saleService, times(1)).cancelSale(anyLong()); + verify(saleService, times(1)).getSaleDetail(anyLong()); + verify(memberService, times(0)).updateCancelSalePoint(anyLong(), anyString()); + } + + @Test + @DisplayName("주문 취소 테스트 - 포인트를 사용한 회원") + void testCancelSale_Member_UsePoint() { + SaleResponseDto sale = + new SaleResponseDto( + 1L, + 1L, + "테스트 제목", + "test@test.com", + "1234", + "정승조", + "01012345678", + "정승조", + "01012345678", + "광주광역시 동구 조선대 5길", + LocalDateTime.now(), + LocalDateTime.now().plusDays(1), + LocalDate.now().plusDays(3), + DeliveryStatus.READY, + 3000, + 3000, + 15000, + SalePaymentStatus.WAITING, + "123456" + ); + + given(saleService.getSaleDetail(anyLong())) + .willReturn(sale); + + saleFacade.cancelSale(1L); + + verify(saleService, times(1)).cancelSale(anyLong()); + verify(saleService, times(1)).getSaleDetail(anyLong()); + verify(memberService, times(1)).updateCancelSalePoint(anyLong(), anyString()); + } } \ No newline at end of file diff --git a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java index 9fa92d7a..1446aa4b 100644 --- a/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java +++ b/src/test/java/store/ckin/api/sale/service/impl/SaleServiceImplTest.java @@ -25,12 +25,15 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.test.util.ReflectionTestUtils; import store.ckin.api.common.domain.PageInfo; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.grade.entity.Grade; import store.ckin.api.member.entity.Member; import store.ckin.api.member.repository.MemberRepository; +import store.ckin.api.payment.repository.PaymentRepository; import store.ckin.api.sale.dto.request.SaleCreateNoBookRequestDto; +import store.ckin.api.sale.dto.request.SaleDeliveryUpdateRequestDto; import store.ckin.api.sale.dto.response.SaleInfoResponseDto; import store.ckin.api.sale.dto.response.SaleResponseDto; import store.ckin.api.sale.dto.response.SaleWithBookResponseDto; @@ -61,6 +64,9 @@ class SaleServiceImplTest { @Mock MemberRepository memberRepository; + @Mock + PaymentRepository paymentRepository; + Grade grade; Member member; @@ -434,4 +440,56 @@ void testGetSalesByMemberId() { verify(saleRepository, times(1)).findAllByMemberId(anyLong(), any()); } + + @Test + @DisplayName("주문 배송 상태 업데이트 - 실패") + void testUpdateSaleDeliveryStatus_Fail() { + given(saleRepository.findById(anyLong())) + .willReturn(Optional.empty()); + + SaleDeliveryUpdateRequestDto delivery = new SaleDeliveryUpdateRequestDto(); + ReflectionTestUtils.setField(delivery, "deliveryStatus", DeliveryStatus.IN_PROGRESS); + + assertThrows(SaleNotFoundException.class, + () -> saleService.updateSaleDeliveryStatus(1L, delivery)); + } + + @Test + @DisplayName("주문 배송 상태 업데이트 - 성공") + void testUpdateSaleDeliveryStatus_Success() { + given(saleRepository.findById(anyLong())) + .willReturn(Optional.of(sale)); + + SaleDeliveryUpdateRequestDto delivery = new SaleDeliveryUpdateRequestDto(); + ReflectionTestUtils.setField(delivery, "deliveryStatus", DeliveryStatus.IN_PROGRESS); + + saleService.updateSaleDeliveryStatus(1L, delivery); + + assertEquals(DeliveryStatus.IN_PROGRESS, sale.getSaleDeliveryStatus()); + } + + @Test + @DisplayName("주문 취소 테스트 - 실패 (존재하지 않는 주문)") + void testCancelSale_Fail() { + given(saleRepository.findById(anyLong())) + .willReturn(Optional.empty()); + + assertThrows(SaleNotFoundException.class, () -> saleService.cancelSale(1L)); + + verify(saleRepository, times(1)).findById(anyLong()); + verify(paymentRepository, times(0)).findBySale_SaleId(anyLong()); + } + + @Test + @DisplayName("주문 취소 테스트 - 성공") + void testCancelSale_Success() { + given(saleRepository.findById(anyLong())) + .willReturn(Optional.of(sale)); + + saleService.cancelSale(1L); + assertEquals(SalePaymentStatus.CANCEL, sale.getSalePaymentStatus()); + + verify(saleRepository, times(1)).findById(anyLong()); + verify(paymentRepository, times(1)).findBySale_SaleId(anyLong()); + } } \ No newline at end of file From f26aaa917e2abd8028167cf1498a84972715d340 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 13:51:10 +0900 Subject: [PATCH 110/161] =?UTF-8?q?[TEST]=20=EC=A3=BC=EB=AC=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=BD=94=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 --- src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java index 1e9bfc9d..1bc3a0e4 100644 --- a/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java +++ b/src/test/java/store/ckin/api/sale/facade/SaleFacadeTest.java @@ -13,7 +13,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; From bb90d77478d0a02cb527086051c724b9724f565a Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 15:35:08 +0900 Subject: [PATCH 111/161] =?UTF-8?q?[TEST]=20=EB=B0=B0=EC=86=A1=EB=B9=84=20?= =?UTF-8?q?=EC=A0=95=EC=B1=85=20RestDocs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/delivery-policy.adoc | 69 +++++++++++++++++ src/docs/asciidoc/index.adoc | 4 +- .../DeliveryPolicyControllerTest.java | 76 +++++++++++++++++-- 3 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 src/docs/asciidoc/delivery-policy.adoc diff --git a/src/docs/asciidoc/delivery-policy.adoc b/src/docs/asciidoc/delivery-policy.adoc new file mode 100644 index 00000000..bd0df932 --- /dev/null +++ b/src/docs/asciidoc/delivery-policy.adoc @@ -0,0 +1,69 @@ +== 배송비 정책 + +=== 배송비 정책 생성 - 성공 + +==== Request + +include::{snippets}/delivery-policy/createDeliveryPolicy/success/http-request.adoc[] + +==== Response + +include::{snippets}/delivery-policy/createDeliveryPolicy/success/http-response.adoc[] + +==== Request Parameters + +include::{snippets}/delivery-policy/createDeliveryPolicy/success/request-fields.adoc[] + +=== 배송비 정책 생성 - 실패 (Validation Error) + +==== Request + +include::{snippets}/delivery-policy/createDeliveryPolicy/validation-fail/http-request.adoc[] + +==== Response + +include::{snippets}/delivery-policy/createDeliveryPolicy/validation-fail/http-response.adoc[] + +=== 배송비 정책 전체 조회 + +==== Request + +include::{snippets}/delivery-policy/getDeliveryPolicyList/success/http-request.adoc[] + +==== Response + +include::{snippets}/delivery-policy/getDeliveryPolicyList/success/http-response.adoc[] + +=== 배송비 정책 상세 조회 + +==== Request + +include::{snippets}/delivery-policy/getDeliveryPolicy/success/http-request.adoc[] + +==== Response + +include::{snippets}/delivery-policy/getDeliveryPolicy/success/http-response.adoc[] + +=== 배송비 정책 수정 - 성공 + +==== Request + +include::{snippets}/delivery-policy/updateDeliveryPolicy/success/http-request.adoc[] + +==== Response + +include::{snippets}/delivery-policy/updateDeliveryPolicy/success/http-response.adoc[] + +==== Request Parameters + +include::{snippets}/delivery-policy/updateDeliveryPolicy/success/request-fields.adoc[] + +=== 배송비 정책 수정 - 실패 (Validation Error) + +==== Request + +include::{snippets}/delivery-policy/updateDeliveryPolicy/validation-fail/http-request.adoc[] + +==== Response + +include::{snippets}/delivery-policy/updateDeliveryPolicy/validation-fail/http-response.adoc[] \ No newline at end of file diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index ee25b8c4..70641db2 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -50,4 +50,6 @@ ckin.store = 2. API -include::tag.adoc[] \ No newline at end of file +include::tag.adoc[] + +include::delivery-policy.adoc[] \ No newline at end of file diff --git a/src/test/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyControllerTest.java b/src/test/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyControllerTest.java index e077fc97..44e4a8f6 100644 --- a/src/test/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyControllerTest.java +++ b/src/test/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyControllerTest.java @@ -6,6 +6,13 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; @@ -19,6 +26,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; @@ -36,6 +44,7 @@ * @version 2024. 02. 16. */ +@AutoConfigureRestDocs @WebMvcTest(DeliveryPolicyController.class) class DeliveryPolicyControllerTest { @@ -63,11 +72,21 @@ void testGetDeliveryPolicy_Success() throws Exception { jsonPath("$.deliveryPolicyFee", equalTo(deliveryPolicy.getDeliveryPolicyFee())), jsonPath("$.deliveryPolicyCondition", equalTo(deliveryPolicy.getDeliveryPolicyCondition())), jsonPath("$.deliveryPolicyState", equalTo(deliveryPolicy.getDeliveryPolicyState()))) - .andDo(print()); + .andDo(document("delivery-policy/getDeliveryPolicy/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("deliveryPolicyId").description("배송비 정책 ID"), + fieldWithPath("deliveryPolicyFee").description("배송비"), + fieldWithPath("deliveryPolicyCondition").description("무료 배송 최소 금액"), + fieldWithPath("deliveryPolicyState").description("배송비 정책 활성화 여부") + )) + ); verify(deliveryPolicyService, times(1)).getDeliveryPolicy(anyLong()); } + @Test @DisplayName("배송비 정책 리스트 조회") void testGetDeliveryPolicies() throws Exception { @@ -89,8 +108,17 @@ void testGetDeliveryPolicies() throws Exception { jsonPath("$[0].deliveryPolicyFee", equalTo(5000)), jsonPath("$[1].deliveryPolicyCondition", equalTo(3000)), jsonPath("$[0].deliveryPolicyState", equalTo(true)), - jsonPath("$[1].deliveryPolicyState", equalTo(false)) - ); + jsonPath("$[1].deliveryPolicyState", equalTo(false))) + .andDo(document("delivery-policy/getDeliveryPolicyList/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("[].deliveryPolicyId").description("배송비 정책 ID"), + fieldWithPath("[].deliveryPolicyFee").description("배송비"), + fieldWithPath("[].deliveryPolicyCondition").description("무료 배송 최소 금액"), + fieldWithPath("[].deliveryPolicyState").description("배송비 정책 활성화 여부") + ) + )); verify(deliveryPolicyService, times(1)).getDeliveryPolicies(); } @@ -110,7 +138,15 @@ void testCreateDeliveryPolicy_Success() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isCreated()) - .andDo(print()); + .andDo(document("delivery-policy/createDeliveryPolicy/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("deliveryPolicyFee").description("배송비"), + fieldWithPath("deliveryPolicyCondition").description("무료 배송 최소 금액"), + fieldWithPath("deliveryPolicyState").description("배송비 정책 활성화 여부") + ) + )); verify(deliveryPolicyService, times(1)).createDeliveryPolicy(any()); } @@ -130,7 +166,11 @@ void testCreateDeliveryPolicy_Fail() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isBadRequest()) - .andDo(print()); + .andDo(document("delivery-policy/createDeliveryPolicy/validation-fail", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + verify(deliveryPolicyService, times(0)).createDeliveryPolicy(any()); } @@ -151,7 +191,15 @@ void testUpdateDeliveryPolicy_Success() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isOk()) - .andDo(print()); + .andDo(document("delivery-policy/updateDeliveryPolicy/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("deliveryPolicyFee").description("배송비"), + fieldWithPath("deliveryPolicyCondition").description("무료 배송 최소 금액"), + fieldWithPath("deliveryPolicyState").description("배송비 정책 활성화 여부") + ) + )); verify(deliveryPolicyService, times(1)) .updateDeliveryPolicy(anyLong(), any()); @@ -172,7 +220,10 @@ void testUpdateDeliveryPolicy_Fail() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isBadRequest()) - .andDo(print()); + .andDo(document("delivery-policy/updateDeliveryPolicy/validation-fail", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); verify(deliveryPolicyService, times(0)) .updateDeliveryPolicy(anyLong(), any()); @@ -202,7 +253,16 @@ void testGetActiveDeliveryPolicy() throws Exception { jsonPath("$.deliveryPolicyCondition").value(deliveryPolicy.getDeliveryPolicyCondition()), jsonPath("$.deliveryPolicyState").value(deliveryPolicy.getDeliveryPolicyState()) ) - .andDo(print()); + .andDo(document("delivery-policy/getActiveDeliveryPolicy/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("deliveryPolicyId").description("배송비 정책 ID"), + fieldWithPath("deliveryPolicyFee").description("배송비"), + fieldWithPath("deliveryPolicyCondition").description("무료 배송 최소 금액"), + fieldWithPath("deliveryPolicyState").description("배송비 정책 활성화 여부") + ) + )); verify(deliveryPolicyService, times(1)).getActiveDeliveryPolicy(); } From c5f2ecc16e61cc37788336a137124041812205c4 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 16:05:14 +0900 Subject: [PATCH 112/161] =?UTF-8?q?[TEST]=20=ED=8F=AC=EC=9E=A5=20=EC=A0=95?= =?UTF-8?q?=EC=B1=85=20RestDocs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 4 +- src/docs/asciidoc/packaging.adoc | 87 +++++++++++++++++++ .../request/PackagingUpdateRequestDto.java | 2 +- .../controller/PackagingControllerTest.java | 64 ++++++++++++-- 4 files changed, 148 insertions(+), 9 deletions(-) create mode 100644 src/docs/asciidoc/packaging.adoc diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 70641db2..6b646f9c 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -52,4 +52,6 @@ ckin.store include::tag.adoc[] -include::delivery-policy.adoc[] \ No newline at end of file +include::delivery-policy.adoc[] + +include::packaging.adoc[] \ No newline at end of file diff --git a/src/docs/asciidoc/packaging.adoc b/src/docs/asciidoc/packaging.adoc new file mode 100644 index 00000000..df4d8270 --- /dev/null +++ b/src/docs/asciidoc/packaging.adoc @@ -0,0 +1,87 @@ +== 포장 정책 + +=== 포장 정책 생성 - 성공 + +==== Request + +include::{snippets}/packaging/createPackaging/success/http-request.adoc[] + +==== Response + +include::{snippets}/packaging/createPackaging/success/http-response.adoc[] + +==== Request Parameters + +include::{snippets}/packaging/createPackaging/success/request-fields.adoc[] + +=== 포장 정책 생성 - 실패 (Validation Error) + +==== Request + +include::{snippets}/packaging/createPackaging/validation-fail/http-request.adoc[] + +==== Response + +include::{snippets}/packaging/createPackaging/validation-fail/http-response.adoc[] + +=== 포장 정책 전체 조회 + +==== Request + +include::{snippets}/packaging/getPackagingList/success/http-request.adoc[] + +==== Response + +include::{snippets}/packaging/getPackagingList/success/http-response.adoc[] + +==== Response Parameters + +include::{snippets}/packaging/getPackagingList/success/response-fields.adoc[] + +=== 포장 정책 조회 + +==== Request + +include::{snippets}/packaging/getPackaging/success/http-request.adoc[] + +==== Response + +include::{snippets}/packaging/getPackaging/success/http-response.adoc[] + +==== Response Parameters + +include::{snippets}/packaging/getPackaging/success/response-fields.adoc[] + +=== 포장 정책 수정 - 성공 + +==== Request + +include::{snippets}/packaging/updatePackaging/success/http-request.adoc[] + +==== Response + +include::{snippets}/packaging/updatePackaging/success/http-response.adoc[] + +=== 포장 정책 수정 - 실패 (Validation Error) + +==== Request + +include::{snippets}/packaging/updatePackaging/validation-fail/http-request.adoc[] + +==== Response + +include::{snippets}/packaging/updatePackaging/validation-fail/http-response.adoc[] + +=== 포장 정책 삭제 + +==== Request + +include::{snippets}/packaging/deletePackaging/success/http-request.adoc[] + +==== Response + +include::{snippets}/packaging/deletePackaging/success/http-response.adoc[] + + + + diff --git a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java index 004bd377..ccc0afcf 100644 --- a/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/packaging/dto/request/PackagingUpdateRequestDto.java @@ -18,7 +18,7 @@ @NoArgsConstructor public class PackagingUpdateRequestDto { - @NotNull(message = "포장 정책가 없습니다.") + @NotNull(message = "포장 정책 ID를 입력해주세요.") private Long packagingId; @NotBlank(message = "포장지 종류를 입력해주세요.") diff --git a/src/test/java/store/ckin/api/packaging/controller/PackagingControllerTest.java b/src/test/java/store/ckin/api/packaging/controller/PackagingControllerTest.java index 6e0d89e3..87ebd110 100644 --- a/src/test/java/store/ckin/api/packaging/controller/PackagingControllerTest.java +++ b/src/test/java/store/ckin/api/packaging/controller/PackagingControllerTest.java @@ -5,6 +5,13 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -19,6 +26,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; @@ -35,6 +43,8 @@ * @author 정승조 * @version 2024. 02. 20. */ + +@AutoConfigureRestDocs @WebMvcTest(PackagingController.class) class PackagingControllerTest { @@ -65,7 +75,13 @@ void testCreatePackagingPolicy_Success() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isCreated()) - .andDo(print()); + .andDo(document("packaging/createPackaging/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("packagingType").description("포장지 종류"), + fieldWithPath("packagingPrice").description("포장지 가격")) + )); verify(packagingService, times(1)).createPackagingPolicy(any()); } @@ -84,7 +100,10 @@ void testCreatePackagingPolicy_Fail() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isBadRequest()) - .andDo(print()); + .andDo(document("packaging/createPackaging/validation-fail", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); verify(packagingService, times(0)).createPackagingPolicy(any()); } @@ -104,7 +123,14 @@ void testGetPackagingPolicy() throws Exception { .andExpect(jsonPath("$.packagingType").value(responseDto.getPackagingType())) .andExpect(jsonPath("$.packagingPrice").value(responseDto.getPackagingPrice())) .andExpect(status().isOk()) - .andDo(print()); + .andDo(document("packaging/getPackaging/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("packagingId").description("포장지 ID"), + fieldWithPath("packagingType").description("포장지 종류"), + fieldWithPath("packagingPrice").description("포장지 가격")) + )); verify(packagingService, times(1)).getPackagingPolicy(anyLong()); } @@ -129,7 +155,14 @@ void testGetPackagingPolicies() throws Exception { .andExpect(jsonPath("$[1].packagingId").value(responseDto.get(1).getPackagingId())) .andExpect(jsonPath("$[1].packagingType").value(responseDto.get(1).getPackagingType())) .andExpect(jsonPath("$[1].packagingPrice").value(responseDto.get(1).getPackagingPrice())) - .andDo(print()); + .andDo(document("packaging/getPackagingList/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("[].packagingId").description("포장지 ID"), + fieldWithPath("[].packagingType").description("포장지 종류"), + fieldWithPath("[].packagingPrice").description("포장지 가격")) + )); verify(packagingService, times(1)).getPackagingPolicies(); } @@ -149,7 +182,14 @@ void testUpdatePackagingPolicy_Success() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isOk()) - .andDo(print()); + .andDo(document("packaging/updatePackaging/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("packagingId").description("포장지 ID"), + fieldWithPath("packagingType").description("포장지 종류"), + fieldWithPath("packagingPrice").description("포장지 가격")) + )); verify(packagingService, times(1)).updatePackagingPolicy(any()); } @@ -169,7 +209,14 @@ void testUpdatePackagingPolicy_Fail() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isBadRequest()) - .andDo(print()); + .andDo(document("packaging/updatePackaging/validation-fail", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("packagingId").description("잘못된 포장지 ID"), + fieldWithPath("packagingType").description("잘못된 포장지 종류"), + fieldWithPath("packagingPrice").description("잘못된 포장지 가격")) + )); verify(packagingService, times(0)).updatePackagingPolicy(any()); } @@ -180,7 +227,10 @@ void testDeletePackagingPolicy() throws Exception { mockMvc.perform(delete("/api/packaging/{id}", 1L)) .andExpect(status().isOk()) - .andDo(print()); + .andDo(document("packaging/deletePackaging/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); verify(packagingService, times(1)).deletePackagingPolicy(anyLong()); } From 8450e2e896cf417c12b59265fe1e49afdc2c80bd Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Wed, 20 Mar 2024 16:20:01 +0900 Subject: [PATCH 113/161] =?UTF-8?q?[FIX]=20getOauthMemberInfo=20method=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 --- .../java/store/ckin/api/member/controller/MemberController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 5cfe4561..503b0e92 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -95,7 +95,7 @@ public ResponseEntity getMyPageInfo( * @param memberOauthIdOnlyRequestDto Member OAuth ID * @return MemberOauthLoginResponseDto (200 OK) */ - @GetMapping("/login/oauth") + @PostMapping("/login/oauth") public ResponseEntity getOauthMemberInfo( @Valid @RequestBody MemberOauthIdOnlyRequestDto memberOauthIdOnlyRequestDto) { MemberOauthLoginResponseDto responseDto = memberService.getOauthMemberInfo(memberOauthIdOnlyRequestDto); From 2bad0e68f124f9937bb829ffba0409f4a7420e2b Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 16:22:21 +0900 Subject: [PATCH 114/161] =?UTF-8?q?[TEST]=20`@AutoConfigureRestDocs`=20uri?= =?UTF-8?q?=20Host=20&=20Port=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DeliveryPolicyControllerTest.java | 3 +- .../controller/PackagingControllerTest.java | 2 +- .../api/tag/controller/TagControllerTest.java | 28 ++++++++++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/test/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyControllerTest.java b/src/test/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyControllerTest.java index 44e4a8f6..3c5930c4 100644 --- a/src/test/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyControllerTest.java +++ b/src/test/java/store/ckin/api/deliverypolicy/controller/DeliveryPolicyControllerTest.java @@ -16,7 +16,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -44,7 +43,7 @@ * @version 2024. 02. 16. */ -@AutoConfigureRestDocs +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) @WebMvcTest(DeliveryPolicyController.class) class DeliveryPolicyControllerTest { diff --git a/src/test/java/store/ckin/api/packaging/controller/PackagingControllerTest.java b/src/test/java/store/ckin/api/packaging/controller/PackagingControllerTest.java index 87ebd110..c8c4aa77 100644 --- a/src/test/java/store/ckin/api/packaging/controller/PackagingControllerTest.java +++ b/src/test/java/store/ckin/api/packaging/controller/PackagingControllerTest.java @@ -44,7 +44,7 @@ * @version 2024. 02. 20. */ -@AutoConfigureRestDocs +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) @WebMvcTest(PackagingController.class) class PackagingControllerTest { diff --git a/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java b/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java index c57c6476..94714369 100644 --- a/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java +++ b/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java @@ -53,7 +53,7 @@ * @author 김준현 * @version 2024. 02. 17 */ -@AutoConfigureRestDocs +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) @WebMvcTest(TagController.class) class TagControllerTest { @Autowired @@ -65,7 +65,7 @@ class TagControllerTest { @Test @DisplayName("태그 목록 가져오기 - 성공") - void getAllTagListTest() throws Exception{ + void getAllTagListTest() throws Exception { // given List allElements = List.of( new TagResponseDto(1L, "태그1"), @@ -112,7 +112,7 @@ void getAllTagListTest() throws Exception{ @Test @DisplayName("태그 저장 - 실패(Validation Error)") - void saveTagTest_Failed_Validation() throws Exception{ + void saveTagTest_Failed_Validation() throws Exception { // given TagCreateRequestDto tagCreateRequestDto = new TagCreateRequestDto(); ReflectionTestUtils.setField(tagCreateRequestDto, "tagName", "12345678910"); @@ -133,7 +133,8 @@ void saveTagTest_Failed_AlreadyExist() throws Exception { // given TagCreateRequestDto tagCreateRequestDto = new TagCreateRequestDto(); ReflectionTestUtils.setField(tagCreateRequestDto, "tagName", "태그1"); - TagNameAlreadyExistException expectedException = new TagNameAlreadyExistException(tagCreateRequestDto.getTagName()); + TagNameAlreadyExistException expectedException = + new TagNameAlreadyExistException(tagCreateRequestDto.getTagName()); willThrow(expectedException).given(tagService).createTag(any()); // when @@ -159,8 +160,8 @@ void saveTagTest_Success() throws Exception { // when mockMvc.perform(post("/api/tags") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(tagCreateRequestDto))) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(tagCreateRequestDto))) .andExpect(status().isCreated()) .andDo(document("tag/saveTag/success", preprocessRequest(prettyPrint()), @@ -172,7 +173,7 @@ void saveTagTest_Success() throws Exception { @Test @DisplayName("태그 수정 - 실패(Validation Error)") - void updateTagTest_Failed() throws Exception{ + void updateTagTest_Failed() throws Exception { // given TagUpdateRequestDto tagUpdateRequestDto = new TagUpdateRequestDto(); ReflectionTestUtils.setField(tagUpdateRequestDto, "tagId", 1L); @@ -209,9 +210,10 @@ void updateTagTest_Success() throws Exception { fieldWithPath("tagName").description("태그 수정을 위한 태그 이름") ))); } + @Test @DisplayName("태그 삭제 - 실패(Validation Error)") - void deleteTagTest_Failed_Validation() throws Exception{ + void deleteTagTest_Failed_Validation() throws Exception { // given TagDeleteRequestDto tagDeleteRequestDto = new TagDeleteRequestDto(); ReflectionTestUtils.setField(tagDeleteRequestDto, "tagId", null); @@ -228,7 +230,7 @@ void deleteTagTest_Failed_Validation() throws Exception{ @Test @DisplayName("태그 삭제 - 실패(존재하지 않는 태그)") - void deleteTagTest_Failed_TagNotFoundException() throws Exception{ + void deleteTagTest_Failed_TagNotFoundException() throws Exception { // given TagDeleteRequestDto tagDeleteRequestDto = new TagDeleteRequestDto(); ReflectionTestUtils.setField(tagDeleteRequestDto, "tagId", 1L); @@ -244,8 +246,8 @@ void deleteTagTest_Failed_TagNotFoundException() throws Exception{ jsonPath("message", equalTo(expectedException.getMessage())), status().isNotFound()) .andDo(document("tag/deleteTag/not-found", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()))); + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()))); } @Test @@ -261,8 +263,8 @@ void deleteTagTest_Success() throws Exception { .content(objectMapper.writeValueAsString(tagDeleteRequestDto))) .andExpect(status().isOk()) .andDo(document("tag/deleteTag/success", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), requestFields( fieldWithPath("tagId").description("삭제를 위한 태그 아이디") ))); From c7023e059322b90966fa5df64857cb19f45991ca Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 16:22:45 +0900 Subject: [PATCH 115/161] =?UTF-8?q?[TEST]=20=EA=B2=B0=EC=A0=9C=20RestDocs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 4 ++- src/docs/asciidoc/payment.adoc | 21 ++++++++++++ .../payment/controller/PaymentController.java | 3 +- .../dto/request/PaymentRequestDto.java | 8 +++++ .../controller/PaymentControllerTest.java | 34 ++++++++++++++++--- 5 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 src/docs/asciidoc/payment.adoc diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 6b646f9c..c0817f2f 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -54,4 +54,6 @@ include::tag.adoc[] include::delivery-policy.adoc[] -include::packaging.adoc[] \ No newline at end of file +include::packaging.adoc[] + +include::payment.adoc[] \ No newline at end of file diff --git a/src/docs/asciidoc/payment.adoc b/src/docs/asciidoc/payment.adoc new file mode 100644 index 00000000..7b9694bf --- /dev/null +++ b/src/docs/asciidoc/payment.adoc @@ -0,0 +1,21 @@ +== 결제 + +=== 결제 생성 + +> 토스 페이먼츠 API를 호출한 후 받아온 정보를 DB에 저장합니다. + +==== Request + +include::{snippets}/payment/create/success/http-request.adoc[] + +==== Response + +include::{snippets}/payment/create/success/http-response.adoc[] + +==== Request Parameters + +include::{snippets}/payment/create/success/request-fields.adoc[] + +==== Response Fields + +include::{snippets}/payment/create/success/response-fields.adoc[] \ No newline at end of file diff --git a/src/main/java/store/ckin/api/payment/controller/PaymentController.java b/src/main/java/store/ckin/api/payment/controller/PaymentController.java index 1c733f5c..8c06ed26 100644 --- a/src/main/java/store/ckin/api/payment/controller/PaymentController.java +++ b/src/main/java/store/ckin/api/payment/controller/PaymentController.java @@ -1,5 +1,6 @@ package store.ckin.api.payment.controller; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -34,7 +35,7 @@ public class PaymentController { * @return 201 (CREATED), 결제 성공 응답 DTO */ @PostMapping - public ResponseEntity createPayment(@RequestBody PaymentRequestDto requestDto) { + public ResponseEntity createPayment(@Valid @RequestBody PaymentRequestDto requestDto) { PaymentSuccessResponseDto payment = paymentFacade.createPayment(requestDto); return ResponseEntity.status(HttpStatus.CREATED).body(payment); diff --git a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java index 20f71dfc..66fcaeaa 100644 --- a/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java +++ b/src/main/java/store/ckin/api/payment/dto/request/PaymentRequestDto.java @@ -1,6 +1,8 @@ package store.ckin.api.payment.dto.request; import java.time.LocalDateTime; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import store.ckin.api.payment.entity.PaymentStatus; @@ -16,17 +18,23 @@ @NoArgsConstructor public class PaymentRequestDto { + @NotBlank(message = "결제 키는 필수입니다.") private String paymentKey; + @NotBlank(message = "결제 번호는 필수입니다.") private String saleNumber; + @NotNull(message = "결제 상태는 필수입니다.") private PaymentStatus paymentStatus; + @NotNull(message = "결제 요청 시간은 필수입니다.") private LocalDateTime requestedAt; private LocalDateTime approvedAt; + @NotNull(message = "결제 금액은 필수입니다.") private Integer amount; + @NotBlank(message = "영수증 URL은 필수입니다.") private String receiptUrl; } diff --git a/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java b/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java index f5ba0461..e51fb37f 100644 --- a/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java +++ b/src/test/java/store/ckin/api/payment/controller/PaymentControllerTest.java @@ -4,8 +4,14 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -14,10 +20,10 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.time.LocalDate; import java.time.LocalDateTime; -import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; @@ -35,7 +41,7 @@ * @version 2024. 03. 11. */ -@Slf4j +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) @WebMvcTest(PaymentController.class) class PaymentControllerTest { @@ -88,7 +94,27 @@ void testCreatePayment() throws Exception { jsonPath("$.deliveryDate").value(successResponseDto.getDeliveryDate().toString()), jsonPath("$.saleTotalPrice").value(successResponseDto.getSaleTotalPrice()), jsonPath("$.receiptUrl").value(successResponseDto.getReceiptUrl())) - .andDo(print()); + .andDo(document("payment/create/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("paymentKey").description("토스 페이먼츠 결제 키"), + fieldWithPath("saleNumber").description("주문 고유 키 (UUID)"), + fieldWithPath("paymentStatus").description("결제 상태"), + fieldWithPath("requestedAt").description("결제 요청 시간"), + fieldWithPath("approvedAt").description("결제 승인 시간"), + fieldWithPath("amount").description("결제 총 금액"), + fieldWithPath("receiptUrl").description("결제 영수증 URL") + ), + responseFields( + fieldWithPath("saleNumber").description("주문 고유 키 (UUID)"), + fieldWithPath("receiverName").description("수령자 이름"), + fieldWithPath("receiverContact").description("수령자 전화번호"), + fieldWithPath("address").description("배송지 정보"), + fieldWithPath("deliveryDate").description("배송 예정일"), + fieldWithPath("saleTotalPrice").description("주문 총 금액"), + fieldWithPath("receiptUrl").description("결제 영수증 URL") + ))); verify(paymentFacade, times(1)).createPayment(any()); } From 850957219b4ad27ad378da8c32646263c339f347 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 16:57:56 +0900 Subject: [PATCH 116/161] =?UTF-8?q?[TEST]=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EB=82=B4=EC=97=AD=20RestDocs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/point-history.adoc | 44 ++++++++++ .../PointHistoryControllerTest.java | 81 +++++++++++++++++-- 2 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 src/docs/asciidoc/point-history.adoc diff --git a/src/docs/asciidoc/point-history.adoc b/src/docs/asciidoc/point-history.adoc new file mode 100644 index 00000000..b365a29d --- /dev/null +++ b/src/docs/asciidoc/point-history.adoc @@ -0,0 +1,44 @@ +== 포인트 내역 + +=== 포인트 내역 생성 - 성공 + +==== Request + +include::{snippets}/point-history/create/success/http-request.adoc[] + +==== Response + +include::{snippets}/point-history/create/success/http-response.adoc[] + +==== Request Fields + +include::{snippets}/point-history/create/success/request-fields.adoc[] + +{empty} + + + +=== 포인트 내역 생성 - 실패 (Validation Error) + +==== Request + +include::{snippets}/point-history/create/validation-fail/http-request.adoc[] + +==== Response + +include::{snippets}/point-history/create/validation-fail/http-response.adoc[] + +{empty} + + +=== 회원의 포인트 내역 조회 + +==== Request + +include::{snippets}/point-history/get/success/http-request.adoc[] + +==== Response + +include::{snippets}/point-history/get/success/http-response.adoc[] + +==== Response Fields + +include::{snippets}/point-history/get/success/response-fields.adoc[] diff --git a/src/test/java/store/ckin/api/pointhistory/controller/PointHistoryControllerTest.java b/src/test/java/store/ckin/api/pointhistory/controller/PointHistoryControllerTest.java index 2b761db6..27fec7c4 100644 --- a/src/test/java/store/ckin/api/pointhistory/controller/PointHistoryControllerTest.java +++ b/src/test/java/store/ckin/api/pointhistory/controller/PointHistoryControllerTest.java @@ -3,9 +3,19 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.requestParameters; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -16,6 +26,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; @@ -33,6 +44,7 @@ * @version 2024. 03. 16. */ +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) @WebMvcTest(PointHistoryController.class) class PointHistoryControllerTest { @@ -45,8 +57,8 @@ class PointHistoryControllerTest { ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); @Test - @DisplayName("포인트 내역 생성 테스트") - void testCreatePointHistory() throws Exception { + @DisplayName("포인트 내역 생성 테스트 - 성공") + void testCreatePointHistory_Success() throws Exception { PointHistoryCreateRequestDto pointHistory = PointHistoryCreateRequestDto.builder() .memberId(1L) @@ -61,7 +73,47 @@ void testCreatePointHistory() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isCreated()) - .andDo(print()); + .andDo(document("point-history/create/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("memberId").description("회원 ID"), + fieldWithPath("pointHistoryReason").description("포인트 내역 사유"), + fieldWithPath("pointHistoryPoint").description("포인트"), + fieldWithPath("pointHistoryTime").description("포인트 기록 시간") + ))); + + verify(pointHistoryService, times(1)).createPointHistory(any()); + } + + @Test + @DisplayName("포인트 내역 생성 테스트 - 실패 (Validation Error)") + void testCreatePointHistory_Fail_Valid() throws Exception { + + PointHistoryCreateRequestDto invalidPointHistory = PointHistoryCreateRequestDto.builder() + .memberId(null) + .pointHistoryReason("") + .pointHistoryPoint(-5000) + .pointHistoryTime(null) + .build(); + + String json = objectMapper.writeValueAsString(invalidPointHistory); + + mockMvc.perform(post("/api/point-history") + .contentType(MediaType.APPLICATION_JSON) + .content(json)) + .andExpect(status().isBadRequest()) + .andDo(document("point-history/create/validation-fail", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("memberId").description("회원 ID"), + fieldWithPath("pointHistoryReason").description("포인트 내역 사유"), + fieldWithPath("pointHistoryPoint").description("포인트"), + fieldWithPath("pointHistoryTime").description("포인트 기록 시간") + ))); + + verify(pointHistoryService, times(0)).createPointHistory(any()); } @Test @@ -100,6 +152,25 @@ void testGetPointHistoryList() throws Exception { jsonPath("$.pageInfo.size").value(pageInfo.getSize()), jsonPath("$.pageInfo.totalPages").value(pageInfo.getTotalPages()), jsonPath("$.pageInfo.totalElements").value(pageInfo.getTotalElements())) - .andDo(print()); + .andDo(document("point-history/get/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestParameters( + parameterWithName("memberId").description("회원 ID"), + parameterWithName("page").description("페이지 번호"), + parameterWithName("size").description("페이지 크기")), + responseFields( + fieldWithPath("data[].id").description("포인트 내역 ID"), + fieldWithPath("data[].memberId").description("회원 ID"), + fieldWithPath("data[].pointHistoryReason").description("포인트 내역 사유"), + fieldWithPath("data[].pointHistoryPoint").description("포인트"), + fieldWithPath("data[].pointHistoryTime").description("포인트 기록 시간"), + fieldWithPath("pageInfo.page").description("페이지 번호"), + fieldWithPath("pageInfo.size").description("페이지 크기"), + fieldWithPath("pageInfo.totalPages").description("총 페이지 수"), + fieldWithPath("pageInfo.totalElements").description("총 요소 수") + ))); + + verify(pointHistoryService, times(1)).getPointHistoryList(anyLong(), any()); } } \ No newline at end of file From 14585d09a30fbefccbbf0c72374b0478868567ba Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 16:58:11 +0900 Subject: [PATCH 117/161] =?UTF-8?q?[TEST]=20Restdocs=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/delivery-policy.adoc | 11 +++++++++++ src/docs/asciidoc/packaging.adoc | 18 +++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/docs/asciidoc/delivery-policy.adoc b/src/docs/asciidoc/delivery-policy.adoc index bd0df932..103d05cc 100644 --- a/src/docs/asciidoc/delivery-policy.adoc +++ b/src/docs/asciidoc/delivery-policy.adoc @@ -14,6 +14,8 @@ include::{snippets}/delivery-policy/createDeliveryPolicy/success/http-response.a include::{snippets}/delivery-policy/createDeliveryPolicy/success/request-fields.adoc[] +{empty} + + === 배송비 정책 생성 - 실패 (Validation Error) ==== Request @@ -24,6 +26,8 @@ include::{snippets}/delivery-policy/createDeliveryPolicy/validation-fail/http-re include::{snippets}/delivery-policy/createDeliveryPolicy/validation-fail/http-response.adoc[] +{empty} + + === 배송비 정책 전체 조회 ==== Request @@ -34,6 +38,8 @@ include::{snippets}/delivery-policy/getDeliveryPolicyList/success/http-request.a include::{snippets}/delivery-policy/getDeliveryPolicyList/success/http-response.adoc[] +{empty} + + === 배송비 정책 상세 조회 ==== Request @@ -44,6 +50,8 @@ include::{snippets}/delivery-policy/getDeliveryPolicy/success/http-request.adoc[ include::{snippets}/delivery-policy/getDeliveryPolicy/success/http-response.adoc[] +{empty} + + === 배송비 정책 수정 - 성공 ==== Request @@ -58,6 +66,9 @@ include::{snippets}/delivery-policy/updateDeliveryPolicy/success/http-response.a include::{snippets}/delivery-policy/updateDeliveryPolicy/success/request-fields.adoc[] +{empty} + + + === 배송비 정책 수정 - 실패 (Validation Error) ==== Request diff --git a/src/docs/asciidoc/packaging.adoc b/src/docs/asciidoc/packaging.adoc index df4d8270..fdc44627 100644 --- a/src/docs/asciidoc/packaging.adoc +++ b/src/docs/asciidoc/packaging.adoc @@ -14,6 +14,8 @@ include::{snippets}/packaging/createPackaging/success/http-response.adoc[] include::{snippets}/packaging/createPackaging/success/request-fields.adoc[] +{empty} + + === 포장 정책 생성 - 실패 (Validation Error) ==== Request @@ -24,6 +26,8 @@ include::{snippets}/packaging/createPackaging/validation-fail/http-request.adoc[ include::{snippets}/packaging/createPackaging/validation-fail/http-response.adoc[] +{empty} + + === 포장 정책 전체 조회 ==== Request @@ -38,6 +42,8 @@ include::{snippets}/packaging/getPackagingList/success/http-response.adoc[] include::{snippets}/packaging/getPackagingList/success/response-fields.adoc[] +{empty} + + === 포장 정책 조회 ==== Request @@ -52,6 +58,8 @@ include::{snippets}/packaging/getPackaging/success/http-response.adoc[] include::{snippets}/packaging/getPackaging/success/response-fields.adoc[] +{empty} + + === 포장 정책 수정 - 성공 ==== Request @@ -62,6 +70,8 @@ include::{snippets}/packaging/updatePackaging/success/http-request.adoc[] include::{snippets}/packaging/updatePackaging/success/http-response.adoc[] +{empty} + + === 포장 정책 수정 - 실패 (Validation Error) ==== Request @@ -72,6 +82,8 @@ include::{snippets}/packaging/updatePackaging/validation-fail/http-request.adoc[ include::{snippets}/packaging/updatePackaging/validation-fail/http-response.adoc[] +{empty} + + === 포장 정책 삭제 ==== Request @@ -80,8 +92,4 @@ include::{snippets}/packaging/deletePackaging/success/http-request.adoc[] ==== Response -include::{snippets}/packaging/deletePackaging/success/http-response.adoc[] - - - - +include::{snippets}/packaging/deletePackaging/success/http-response.adoc[] \ No newline at end of file From 7b5d63b3a0df9f2a146482cc3b58b3250523de6c Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 17:20:36 +0900 Subject: [PATCH 118/161] =?UTF-8?q?[TEST]=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=95=EC=B1=85=20Restdocs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 5 +- src/docs/asciidoc/point-policy.adoc | 92 ++++++++++++++++ .../controller/PointPolicyControllerTest.java | 100 ++++++++++++++---- 3 files changed, 178 insertions(+), 19 deletions(-) create mode 100644 src/docs/asciidoc/point-policy.adoc diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index c0817f2f..b04b86b8 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -56,4 +56,7 @@ include::delivery-policy.adoc[] include::packaging.adoc[] -include::payment.adoc[] \ No newline at end of file +include::payment.adoc[] + +include::point-policy.adoc[] + diff --git a/src/docs/asciidoc/point-policy.adoc b/src/docs/asciidoc/point-policy.adoc new file mode 100644 index 00000000..c628f40f --- /dev/null +++ b/src/docs/asciidoc/point-policy.adoc @@ -0,0 +1,92 @@ +== 포인트 정책 + +=== 포인트 정책 생성 - 성공 + +==== Request + +include::{snippets}/point-policy/createPointPolicy/success/http-request.adoc[] + +==== Response + +include::{snippets}/point-policy/createPointPolicy/success/http-response.adoc[] + +==== Request Fields + +include::{snippets}/point-policy/createPointPolicy/success/request-fields.adoc[] + + +{empty} + + +=== 포인트 정책 생성 - 실패 (Validation Error) + +==== Request + +include::{snippets}/point-policy/createPointPolicy/validation-fail/http-request.adoc[] + +==== Response + +include::{snippets}/point-policy/createPointPolicy/validation-fail/http-response.adoc[] + +{empty} + + +=== 포인트 정책 리스트 조회 + +==== Request + +include::{snippets}/point-policy/getPointPolicyList/success/http-request.adoc[] + +==== Response + +include::{snippets}/point-policy/getPointPolicyList/success/http-response.adoc[] + +{empty} + + +=== 포인트 정책 개별 조회 + +==== Request + +include::{snippets}/point-policy/getPointPolicy/success/http-request.adoc[] + +==== Response + +include::{snippets}/point-policy/getPointPolicy/success/http-response.adoc[] + +{empty} + + +=== 포인트 정책 수정 - 성공 + +==== Request + +include::{snippets}/point-policy/updatePointPolicy/success/http-request.adoc[] + +==== Response + +include::{snippets}/point-policy/updatePointPolicy/success/http-response.adoc[] + +==== Request Fields + +include::{snippets}/point-policy/updatePointPolicy/success/request-fields.adoc[] + +{empty} + + +=== 포인트 정책 수정 - 실패 (Validation Error) + +==== Request + +include::{snippets}/point-policy/updatePointPolicy/validation-fail/http-request.adoc[] + +==== Response + +include::{snippets}/point-policy/updatePointPolicy/validation-fail/http-response.adoc[] + +{empty} + + +=== 포인트 정책 삭제 + +==== Request + +include::{snippets}/point-policy/deletePointPolicy/success/http-request.adoc[] + +==== Response + +include::{snippets}/point-policy/deletePointPolicy/success/http-response.adoc[] diff --git a/src/test/java/store/ckin/api/pointpolicy/controller/PointPolicyControllerTest.java b/src/test/java/store/ckin/api/pointpolicy/controller/PointPolicyControllerTest.java index fabae9df..84881eec 100644 --- a/src/test/java/store/ckin/api/pointpolicy/controller/PointPolicyControllerTest.java +++ b/src/test/java/store/ckin/api/pointpolicy/controller/PointPolicyControllerTest.java @@ -1,11 +1,17 @@ package store.ckin.api.pointpolicy.controller; -import static org.hamcrest.Matchers.equalTo; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -20,6 +26,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; @@ -37,6 +44,7 @@ * @version 2024. 02. 16. */ +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) @WebMvcTest(PointPolicyController.class) class PointPolicyControllerTest { @@ -52,17 +60,27 @@ class PointPolicyControllerTest { @DisplayName("포인트 정책 개별 조회") void testGetPointPolicy() throws Exception { + PointPolicyResponseDto pointPolicy = new PointPolicyResponseDto(1L, "회원가입", 3000); + given(pointPolicyService.getPointPolicy(anyLong())) - .willReturn(new PointPolicyResponseDto(1L, "정책1", 3000)); + .willReturn(pointPolicy); mockMvc.perform(get("/api/point-policies/{id}", 1L)) .andExpectAll( status().isOk(), content().contentType(MediaType.APPLICATION_JSON), - jsonPath("$.pointPolicyId", equalTo(1)), - jsonPath("$.pointPolicyName", equalTo("정책1")), - jsonPath("$.pointPolicyReserve", equalTo(3000))) - .andDo(print()); + jsonPath("$.pointPolicyId").value(pointPolicy.getPointPolicyId()), + jsonPath("$.pointPolicyName").value(pointPolicy.getPointPolicyName()), + jsonPath("$.pointPolicyReserve").value(pointPolicy.getPointPolicyReserve())) + .andDo(document("point-policy/getPointPolicy/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("pointPolicyId").description("포인트 정책 ID"), + fieldWithPath("pointPolicyName").description("포인트 정책 명"), + fieldWithPath("pointPolicyReserve").description("포인트 정책 적립 금액") + ) + )); verify(pointPolicyService, times(1)).getPointPolicy(anyLong()); } @@ -71,19 +89,31 @@ void testGetPointPolicy() throws Exception { @DisplayName("포인트 정책 리스트 조회") void testGetPointPolicies() throws Exception { + PointPolicyResponseDto firstPointPolicy = new PointPolicyResponseDto(1L, "회원가입", 5000); + PointPolicyResponseDto secondPointPolicy = new PointPolicyResponseDto(2L, "리뷰작성", 300); + given(pointPolicyService.getPointPolicies()) - .willReturn(List.of(new PointPolicyResponseDto(1L, "정책1", 300), - new PointPolicyResponseDto(2L, "정책2", 666))); + .willReturn(List.of(firstPointPolicy, secondPointPolicy)); mockMvc.perform(get("/api/point-policies")) .andExpectAll( status().isOk(), content().contentType(MediaType.APPLICATION_JSON), - jsonPath("$[0].pointPolicyId", equalTo(1)), - jsonPath("$[0].pointPolicyName", equalTo("정책1")), - jsonPath("$[1].pointPolicyId", equalTo(2)), - jsonPath("$[1].pointPolicyReserve", equalTo(666))) - .andDo(print()); + jsonPath("$[0].pointPolicyId").value(firstPointPolicy.getPointPolicyId()), + jsonPath("$[0].pointPolicyName").value(firstPointPolicy.getPointPolicyName()), + jsonPath("$[0].pointPolicyReserve").value(firstPointPolicy.getPointPolicyReserve()), + jsonPath("$[1].pointPolicyId").value(secondPointPolicy.getPointPolicyId()), + jsonPath("$[1].pointPolicyName").value(secondPointPolicy.getPointPolicyName()), + jsonPath("$[1].pointPolicyReserve").value(secondPointPolicy.getPointPolicyReserve())) + .andDo(document("point-policy/getPointPolicyList/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("[].pointPolicyId").description("포인트 정책 ID"), + fieldWithPath("[].pointPolicyName").description("포인트 정책 명"), + fieldWithPath("[].pointPolicyReserve").description("포인트 정책 적립 금액") + ) + )); verify(pointPolicyService, times(1)).getPointPolicies(); @@ -104,7 +134,14 @@ void testCreatePointPolicy_Success() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isCreated()) - .andDo(print()); + .andDo(document("point-policy/createPointPolicy/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("pointPolicyId").description("포인트 정책 ID"), + fieldWithPath("pointPolicyName").description("포인트 정책 명"), + fieldWithPath("pointPolicyReserve").description("포인트 정책 적립 금액") + ))); verify(pointPolicyService, times(1)).createPointPolicy(any()); } @@ -124,7 +161,16 @@ void testCreatePointPolicy_Fail() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isBadRequest()) - .andDo(print()); + .andDo(document("point-policy/createPointPolicy/validation-fail", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("pointPolicyId").description("포인트 정책 ID"), + fieldWithPath("pointPolicyName").description("포인트 정책 명"), + fieldWithPath("pointPolicyReserve").description("포인트 정책 적립 금액") + ))); + + verify(pointPolicyService, times(0)).createPointPolicy(any()); } @Test @@ -141,7 +187,13 @@ void testUpdatePointPolicy_Success() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isOk()) - .andDo(print()); + .andDo(document("point-policy/updatePointPolicy/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("pointPolicyName").description("포인트 정책 명"), + fieldWithPath("pointPolicyReserve").description("포인트 정책 적립 금액") + ))); verify(pointPolicyService, times(1)).updatePointPolicy(anyLong(), any()); } @@ -160,7 +212,16 @@ void testUpdatePointPolicy_Fail() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isBadRequest()) - .andDo(print()); + .andDo(document("point-policy/updatePointPolicy/validation-fail", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("pointPolicyName").description("포인트 정책 명"), + fieldWithPath("pointPolicyReserve").description("포인트 정책 적립 금액") + ) + )); + + verify(pointPolicyService, times(0)).updatePointPolicy(anyLong(), any()); } @Test @@ -169,7 +230,10 @@ void testDeletePointPolicy() throws Exception { mockMvc.perform(delete("/api/point-policies/{id}", 1L)) .andExpect(status().isOk()) - .andDo(print()); + .andDo(document("point-policy/deletePointPolicy/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint())) + ); verify(pointPolicyService, times(1)).deletePointPolicy(anyLong()); } From 0cd7ed4d1f83131e8b6411f71fca70b5a80ab1de Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Wed, 20 Mar 2024 21:10:14 +0900 Subject: [PATCH 119/161] =?UTF-8?q?[TEST]=20=EC=A3=BC=EB=AC=B8=20Restdocs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 1 + src/docs/asciidoc/sale.adoc | 166 +++++++++++ .../dto/request/SaleCreateRequestDto.java | 2 + .../sale/controller/SaleControllerTest.java | 280 ++++++++++++++++-- 4 files changed, 420 insertions(+), 29 deletions(-) create mode 100644 src/docs/asciidoc/sale.adoc diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index b04b86b8..6b58e664 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -60,3 +60,4 @@ include::payment.adoc[] include::point-policy.adoc[] +include::sale.adoc[] \ No newline at end of file diff --git a/src/docs/asciidoc/sale.adoc b/src/docs/asciidoc/sale.adoc new file mode 100644 index 00000000..ab707554 --- /dev/null +++ b/src/docs/asciidoc/sale.adoc @@ -0,0 +1,166 @@ +== 주문 + +=== 주문 생성 - 성공 + +==== Request + +include::{snippets}/sale/createSale/success/http-request.adoc[] + +==== Response + +include::{snippets}/sale/createSale/success/http-response.adoc[] + +- 반환 값은 생성된 주문 번호 (UUID) 입니다. + +{empty} + + +> 주문 조회 응답 정보는 아래와 같습니다. + +include::{snippets}/sale/getSaleDetail_admin/success/response-fields.adoc[] + +{empty} + + +=== 주문 조회 - 관리자 + +==== Request + +include::{snippets}/sale/getSaleDetail_admin/success/http-request.adoc[] + +==== Request Path Parameters + +include::{snippets}/sale/getSaleDetail_admin/success/path-parameters.adoc[] + +==== Response + +include::{snippets}/sale/getSaleDetail_admin/success/http-response.adoc[] + +{empty} + + +=== 주문 조회 - 회원 + +==== Request + +include::{snippets}/sale/getSaleDetail_member/success/http-request.adoc[] + +==== Request Parameters + +include::{snippets}/sale/getSaleDetail_member/success/request-parameters.adoc[] + +==== Response + +include::{snippets}/sale/getSaleDetail_member/success/http-response.adoc[] + +{empty} + + +=== 주문 조회 - 비회원 + +==== Request + +include::{snippets}/sale/getSaleDetail_guest/success/http-request.adoc[] + +==== Request Parameters + +include::{snippets}/sale/getSaleDetail_guest/success/request-parameters.adoc[] + +==== Response + +include::{snippets}/sale/getSaleDetail_guest/success/http-response.adoc[] + +{empty} + + +> 주문 전체 조회 응답 정보는 아래와 같습니다. + +==== Response Fields + +include::{snippets}/sale/getSaleList/success/response-fields.adoc[] + + +=== 주문 전체 조회 (관리자 페이지) + +==== Request + +include::{snippets}/sale/getSaleList/success/http-request.adoc[] + +==== Request Parameters + +include::{snippets}/sale/getSaleList/success/request-parameters.adoc[] + +==== Response + +include::{snippets}/sale/getSaleList/success/http-response.adoc[] + +{empty} + + +=== 회원의 주문 전체 조회 + +==== Request + +include::{snippets}/sale/getSaleListByMemberId/success/http-request.adoc[] + +==== Request Path Parameters + +include::{snippets}/sale/getSaleListByMemberId/success/path-parameters.adoc[] + +==== Response + +include::{snippets}/sale/getSaleListByMemberId/success/http-response.adoc[] + +{empty} + + + +=== 주문의 결제 정보 조회 + +==== Request + +include::{snippets}/sale/getSalePaymentInfoBySaleNumber/success/http-request.adoc[] + +==== Request Path Parameters + +include::{snippets}/sale/getSalePaymentInfoBySaleNumber/success/path-parameters.adoc[] + +==== Response + +include::{snippets}/sale/getSalePaymentInfoBySaleNumber/success/http-response.adoc[] + +==== Response Fields + +include::{snippets}/sale/getSalePaymentInfoBySaleNumber/success/response-fields.adoc[] + +{empty} + + +=== 주문의 배송 상태 변경 + +==== Request + +include::{snippets}/sale/updateSaleDeliveryStatus/success/http-request.adoc[] + +==== Request Path Parameters + +include::{snippets}/sale/updateSaleDeliveryStatus/success/path-parameters.adoc[] + +==== Request Fields + +include::{snippets}/sale/updateSaleDeliveryStatus/success/request-fields.adoc[] + +==== Response + +include::{snippets}/sale/updateSaleDeliveryStatus/success/http-response.adoc[] + +{empty} + + +=== 주문의 상태 취소로 변경 + +==== Request + +include::{snippets}/sale/updateSaleStatus/cancel/http-request.adoc[] + +==== Request Path Parameters + +include::{snippets}/sale/updateSaleStatus/cancel/path-parameters.adoc[] + +==== Response + +include::{snippets}/sale/updateSaleStatus/cancel/http-response.adoc[] + +{empty} + + diff --git a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java index bb574c87..138023f5 100644 --- a/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java +++ b/src/main/java/store/ckin/api/sale/dto/request/SaleCreateRequestDto.java @@ -1,5 +1,6 @@ package store.ckin.api.sale.dto.request; +import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @@ -47,6 +48,7 @@ public class SaleCreateRequestDto { private Integer deliveryFee; @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") @NotNull(message = "배송 날짜를 선택해주세요.") private LocalDate saleDeliveryDate; diff --git a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java index 3f746f17..849b68b4 100644 --- a/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java +++ b/src/test/java/store/ckin/api/sale/controller/SaleControllerTest.java @@ -6,10 +6,19 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.restdocs.request.RequestDocumentation.requestParameters; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -22,12 +31,16 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; +import store.ckin.api.booksale.dto.request.BookSaleCreateRequestDto; import store.ckin.api.booksale.dto.response.BookAndBookSaleResponseDto; +import store.ckin.api.booksale.dto.response.BookSaleResponseDto; import store.ckin.api.common.domain.PageInfo; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.payment.dto.response.PaymentResponseDto; @@ -49,6 +62,7 @@ * @version 2024. 03. 07. */ +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) @WebMvcTest(SaleController.class) class SaleControllerTest { @@ -67,7 +81,16 @@ void testCreateSale() throws Exception { given(saleFacade.createSale(any(SaleCreateRequestDto.class))) .willReturn("12314"); + BookSaleCreateRequestDto bookSale = new BookSaleCreateRequestDto(); + ReflectionTestUtils.setField(bookSale, "bookId", 1L); + ReflectionTestUtils.setField(bookSale, "appliedCouponId", 1L); + ReflectionTestUtils.setField(bookSale, "packagingId", 4L); + ReflectionTestUtils.setField(bookSale, "quantity", 2); + ReflectionTestUtils.setField(bookSale, "paymentAmount", 10000); + + SaleCreateRequestDto requestDto = new SaleCreateRequestDto(); + ReflectionTestUtils.setField(requestDto, "bookSaleList", List.of(bookSale)); ReflectionTestUtils.setField(requestDto, "memberId", 1L); ReflectionTestUtils.setField(requestDto, "saleTitle", "테스트 책"); ReflectionTestUtils.setField(requestDto, "saleOrdererName", "정승조"); @@ -89,7 +112,30 @@ void testCreateSale() throws Exception { .content(json)) .andExpect(status().isCreated()) .andExpect(content().json("12314")) - .andDo(print()); + .andDo(document("sale/createSale/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("bookSaleList[].bookId").description("도서 ID"), + fieldWithPath("bookSaleList[].appliedCouponId").description("적용된 쿠폰 ID"), + fieldWithPath("bookSaleList[].packagingId").description("포장 ID"), + fieldWithPath("bookSaleList[].quantity").description("도서 수량"), + fieldWithPath("bookSaleList[].paymentAmount").description("도서 결제 금액"), + fieldWithPath("memberId").description("주문하는 회원 ID").optional(), + fieldWithPath("saleTitle").description("주문 제목 (책 제목 + 수량)"), + fieldWithPath("saleOrdererName").description("주문자 이름"), + fieldWithPath("saleOrdererContact").description("주문자 연락처"), + fieldWithPath("saleReceiverName").description("수령자 이름"), + fieldWithPath("saleReceiverContact").description("수령자 연락처"), + fieldWithPath("deliveryFee").description("배송비"), + fieldWithPath("saleDeliveryDate").description("배송 날짜"), + fieldWithPath("postcode").description("우편번호"), + fieldWithPath("address").description("주소"), + fieldWithPath("detailAddress").description("상세주소"), + fieldWithPath("pointUsage").description("포인트 사용량"), + fieldWithPath("totalPrice").description("총 주문 금액") + ) + )); verify(saleFacade, times(1)).createSale(any()); } @@ -127,7 +173,9 @@ void testGetSales() throws Exception { given(saleFacade.getSales(any())) .willReturn(pagedResponse); - mockMvc.perform(get("/api/sales")) + mockMvc.perform(get("/api/sales") + .param("page", "0") + .param("size", "10")) .andExpectAll( status().isOk(), content().contentType(MediaType.APPLICATION_JSON), @@ -149,14 +197,46 @@ void testGetSales() throws Exception { jsonPath("$.pageInfo.page").value(pageInfo.getPage()), jsonPath("$.pageInfo.size").value(pageInfo.getSize()), jsonPath("$.pageInfo.totalElements").value(pageInfo.getTotalElements()), - jsonPath("$.pageInfo.totalPages").value(pageInfo.getTotalPages()) - ).andDo(print()); + jsonPath("$.pageInfo.totalPages").value(pageInfo.getTotalPages())) + .andDo(document("sale/getSaleList/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestParameters( + parameterWithName("page").description("페이지 번호"), + parameterWithName("size").description("페이지 크기") + ), + responseFields( + fieldWithPath("data[].saleId").description("주문 ID"), + fieldWithPath("data[].memberId").description("회원 ID"), + fieldWithPath("data[].title").description("주문명"), + fieldWithPath("data[].memberEmail").description("회원 이메일"), + fieldWithPath("data[].saleNumber").description("주문 번호"), + fieldWithPath("data[].saleOrdererName").description("주문자 이름"), + fieldWithPath("data[].saleOrdererContact").description("주문자 연락처"), + fieldWithPath("data[].saleReceiverName").description("수령자 이름"), + fieldWithPath("data[].saleReceiverContact").description("수령자 연락처"), + fieldWithPath("data[].saleReceiverAddress").description("배송지"), + fieldWithPath("data[].saleDate").description("주문 일자"), + fieldWithPath("data[].saleShippingDate").description("출고 일자"), + fieldWithPath("data[].saleDeliveryDate").description("배송 일자"), + fieldWithPath("data[].saleDeliveryStatus").description("배송 상태"), + fieldWithPath("data[].saleDeliveryFee").description("배송비"), + fieldWithPath("data[].salePointUsage").description("포인트 사용량"), + fieldWithPath("data[].saleTotalPrice").description("총 주문 금액"), + fieldWithPath("data[].salePaymentStatus").description("결제 상태"), + fieldWithPath("data[].saleShippingPostCode").description("배송지 우편번호"), + fieldWithPath("pageInfo.page").description("페이지 번호"), + fieldWithPath("pageInfo.size").description("페이지 크기"), + fieldWithPath("pageInfo.totalElements").description("총 주문 수"), + fieldWithPath("pageInfo.totalPages").description("총 페이지 수") + ) + )); verify(saleFacade, times(1)).getSales(any()); } @Test - @DisplayName("주문 상세 조회 테스트") + @DisplayName("주문 ID로 주문 상세 조회 - 관리자 페이지") void testGetSaleDetail() throws Exception { SaleResponseDto sale = new SaleResponseDto( @@ -193,7 +273,7 @@ void testGetSaleDetail() throws Exception { BookAndBookSaleResponseDto bookSale = new BookAndBookSaleResponseDto( 1L, - "testimg.com", + "test-img.com", "홍길동전", 5, 3L, @@ -207,7 +287,7 @@ void testGetSaleDetail() throws Exception { given(saleFacade.getSaleDetail(anyLong())) .willReturn(saleDetailResponseDto); - mockMvc.perform(get("/api/sales/{saleId}", 1L)) + mockMvc.perform(RestDocumentationRequestBuilders.get("/api/sales/{saleId}", 1L)) .andExpectAll( status().isOk(), @@ -243,8 +323,50 @@ void testGetSaleDetail() throws Exception { jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus().name()), jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(), jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), - jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) - ); + jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl())) + .andDo(document("sale/getSaleDetail_admin/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("saleId").description("주문 ID") + ), + responseFields( + fieldWithPath("bookSaleList[].bookId").description("도서 ID"), + fieldWithPath("bookSaleList[].fileUrl").description("도서 이미지 URL"), + fieldWithPath("bookSaleList[].bookTitle").description("도서 제목"), + fieldWithPath("bookSaleList[].quantity").description("도서 수량"), + fieldWithPath("bookSaleList[].couponId").description("적용된 쿠폰 ID"), + fieldWithPath("bookSaleList[].packagingType").description("포장 타입"), + fieldWithPath("bookSaleList[].packagingPrice").description("포장 가격"), + fieldWithPath("bookSaleList[].paymentAmount").description("결제 금액"), + fieldWithPath("saleResponseDto.saleId").description("주문 ID"), + fieldWithPath("saleResponseDto.memberId").description("회원 ID"), + fieldWithPath("saleResponseDto.title").description("주문명"), + fieldWithPath("saleResponseDto.memberEmail").description("회원 이메일"), + fieldWithPath("saleResponseDto.saleNumber").description("주문 번호"), + fieldWithPath("saleResponseDto.saleOrdererName").description("주문자 이름"), + fieldWithPath("saleResponseDto.saleOrdererContact").description("주문자 연락처"), + fieldWithPath("saleResponseDto.saleReceiverName").description("수령자 이름"), + fieldWithPath("saleResponseDto.saleReceiverContact").description("수령자 연락처"), + fieldWithPath("saleResponseDto.saleReceiverAddress").description("배송지"), + fieldWithPath("saleResponseDto.saleDate").description("주문 일자"), + fieldWithPath("saleResponseDto.saleShippingDate").description("출고 일자"), + fieldWithPath("saleResponseDto.saleDeliveryDate").description("배송 일자"), + fieldWithPath("saleResponseDto.saleDeliveryStatus").description("배송 상태"), + fieldWithPath("saleResponseDto.saleDeliveryFee").description("배송비"), + fieldWithPath("saleResponseDto.salePointUsage").description("포인트 사용량"), + fieldWithPath("saleResponseDto.saleTotalPrice").description("총 주문 금액"), + fieldWithPath("saleResponseDto.salePaymentStatus").description("결제 상태"), + fieldWithPath("saleResponseDto.saleShippingPostCode").description("배송지 우편번호"), + fieldWithPath("paymentResponseDto.paymentId").description("결제 ID"), + fieldWithPath("paymentResponseDto.saleId").description("주문 ID"), + fieldWithPath("paymentResponseDto.paymentKey").description("결제 키"), + fieldWithPath("paymentResponseDto.paymentStatus").description("결제 상태"), + fieldWithPath("paymentResponseDto.requestedAt").description("결제 요청 일자"), + fieldWithPath("paymentResponseDto.approvedAt").description("결제 승인 일자"), + fieldWithPath("paymentResponseDto.receiptUrl").description("영수증 URL") + ) + )); verify(saleFacade, times(1)).getSaleDetail(anyLong()); @@ -252,9 +374,19 @@ void testGetSaleDetail() throws Exception { @Test - @DisplayName("주문 ID로 주문 상세 정보와 주문한 책 정보 조회 테스트") + @DisplayName("주문 번호로 주문 상세 정보와 주문한 책 정보 조회 - 회원 페이지") void testGetSaleWithBooks() throws Exception { + BookSaleResponseDto bookSale = + new BookSaleResponseDto( + 1L, + 1L, + null, + "꽃무늬 포장", + 3000, + 3, + 50000); + SaleWithBookResponseDto responseDto = new SaleWithBookResponseDto( "홍길동전", 1L, @@ -273,10 +405,13 @@ void testGetSaleWithBooks() throws Exception { 10000 ); + responseDto.addBookSale(bookSale); + given(saleFacade.getSaleWithBookResponseDto(anyString())) .willReturn(responseDto); - mockMvc.perform(get("/api/sales/{saleNumber}/books", "ABC1234DEF")) + + mockMvc.perform(RestDocumentationRequestBuilders.get("/api/sales/{saleNumber}/books", "ABC1234DEF")) .andExpectAll( status().isOk(), content().contentType(MediaType.APPLICATION_JSON), @@ -293,7 +428,13 @@ void testGetSaleWithBooks() throws Exception { jsonPath("$.address").value(responseDto.getAddress()), jsonPath("$.pointUsage").value(responseDto.getPointUsage()), jsonPath("$.totalPrice").value(responseDto.getTotalPrice()) - ).andDo(print()); + ).andDo(document("sale/getSaleBySaleNumber/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("saleNumber").description("주문 번호") + ) + )); verify(saleFacade, times(1)).getSaleWithBookResponseDto(anyString()); } @@ -316,7 +457,7 @@ void testGetSalePaymentInfo() throws Exception { given(saleFacade.getSalePaymentInfo(anyString())) .willReturn(responseDto); - mockMvc.perform(get("/api/sales/{saleNumber}/paymentInfo", "ABC1234DEF")) + mockMvc.perform(RestDocumentationRequestBuilders.get("/api/sales/{saleNumber}/paymentInfo", "ABC1234DEF")) .andExpectAll( status().isOk(), content().contentType(MediaType.APPLICATION_JSON), @@ -325,14 +466,30 @@ void testGetSalePaymentInfo() throws Exception { jsonPath("$.memberEmail").value(responseDto.getMemberEmail()), jsonPath("$.saleOrdererName").value(responseDto.getSaleOrdererName()), jsonPath("$.saleOrdererContact").value(responseDto.getSaleOrdererContact()), - jsonPath("$.totalPrice").value(responseDto.getTotalPrice()) - ).andDo(print()); + jsonPath("$.totalPrice").value(responseDto.getTotalPrice()), + jsonPath("$.saleDate").isNotEmpty() + ).andDo(document("sale/getSalePaymentInfoBySaleNumber/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("saleNumber").description("주문 번호") + ), + responseFields( + fieldWithPath("saleTitle").description("주문 제목"), + fieldWithPath("saleNumber").description("주문 번호"), + fieldWithPath("memberEmail").description("회원 이메일"), + fieldWithPath("saleOrdererName").description("주문자 이름"), + fieldWithPath("saleOrdererContact").description("주문자 연락처"), + fieldWithPath("totalPrice").description("총 주문 금액"), + fieldWithPath("saleDate").description("주문 일자") + ) + )); verify(saleFacade, times(1)).getSalePaymentInfo(anyString()); } @Test - @DisplayName("비회원 주문 상세 정보를 조회 테스트") + @DisplayName("주문 상세 정보를 조회 테스트 - 비회원") void testGetSaleDetailBySaleNumber() throws Exception { BookAndBookSaleResponseDto bookSale = @@ -424,12 +581,25 @@ void testGetSaleDetailBySaleNumber() throws Exception { jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus().name()), jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(), jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), - jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) - ); + jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl())) + .andDo(document("sale/getSaleDetail_guest/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestParameters( + parameterWithName("saleNumber").description("주문 번호"), + parameterWithName("ordererContact").description("주문자 연락처") + ), + responseFields( + subsectionWithPath("bookSaleList").description("주문한 책 정보"), + subsectionWithPath("saleResponseDto").description("주문 정보"), + subsectionWithPath("paymentResponseDto").description("결제 정보") + ))); + + verify(saleFacade, times(1)).getGuestSaleDetailBySaleNumber(anyString(), anyString()); } @Test - @DisplayName("회원의 ID와 주분 번호를 통해 주문 상세 정보 조회") + @DisplayName("회원의 ID와 주문 번호를 통해 주문 상세 정보 조회 - 회원 조회") void testGetMemberSaleDetailBySaleNumber() throws Exception { BookAndBookSaleResponseDto bookSale = @@ -485,6 +655,8 @@ void testGetMemberSaleDetailBySaleNumber() throws Exception { .param("saleNumber", "1234") .param("memberId", "1")) .andExpectAll( + status().isOk(), + content().contentType(MediaType.APPLICATION_JSON), jsonPath("$.bookSaleList[0].bookId").value(bookSale.getBookId()), jsonPath("$.bookSaleList[0].fileUrl").value(bookSale.getFileUrl()), jsonPath("$.bookSaleList[0].bookTitle").value(bookSale.getBookTitle()), @@ -521,7 +693,21 @@ void testGetMemberSaleDetailBySaleNumber() throws Exception { jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(), jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl()) ) - .andDo(print()); + .andDo(document("sale/getSaleDetail_member/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestParameters( + parameterWithName("saleNumber").description("주문 번호"), + parameterWithName("memberId").description("회원 ID") + ), + responseFields( + subsectionWithPath("bookSaleList").description("주문한 책 정보"), + subsectionWithPath("saleResponseDto").description("주문 정보"), + subsectionWithPath("paymentResponseDto").description("결제 정보") + ) + )); + + verify(saleFacade, times(1)).getMemberSaleDetailBySaleNumber(anyString(), anyLong()); } @Test @@ -546,7 +732,7 @@ void testGetSalesByMemberId() throws Exception { given(saleFacade.getSalesByMemberId(anyLong(), any())) .willReturn(pagedResponse); - mockMvc.perform(get("/api/sales/member/{memberId}", 1L)) + mockMvc.perform(RestDocumentationRequestBuilders.get("/api/sales/member/{memberId}", 1L)) .andExpectAll( status().isOk(), content().contentType(MediaType.APPLICATION_JSON), @@ -558,8 +744,29 @@ void testGetSalesByMemberId() throws Exception { jsonPath("$.data[0].totalPrice").value(saleInfo.getTotalPrice()), jsonPath("$.data[0].saleDate").isNotEmpty(), jsonPath("$.pageInfo.page").value(pageInfo.getPage()), - jsonPath("$.pageInfo.size").value(pageInfo.getSize()) - ); + jsonPath("$.pageInfo.size").value(pageInfo.getSize())) + .andDo(document("sale/getSaleListByMemberId/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("memberId").description("회원 ID") + ), + responseFields( + fieldWithPath("data[].saleTitle").description("주문 제목"), + fieldWithPath("data[].saleNumber").description("주문 번호"), + fieldWithPath("data[].memberEmail").description("회원 이메일"), + fieldWithPath("data[].saleOrdererName").description("주문자 이름"), + fieldWithPath("data[].saleOrdererContact").description("주문자 연락처"), + fieldWithPath("data[].totalPrice").description("총 주문 금액"), + fieldWithPath("data[].saleDate").description("주문 일자"), + fieldWithPath("pageInfo.page").description("페이지 번호"), + fieldWithPath("pageInfo.size").description("페이지 크기"), + fieldWithPath("pageInfo.totalElements").description("총 주문 수"), + fieldWithPath("pageInfo.totalPages").description("총 페이지 수") + ) + )); + + verify(saleFacade, times(1)).getSalesByMemberId(anyLong(), any()); } @Test @@ -570,11 +777,20 @@ void testUpdateDeliveryStatus() throws Exception { String json = objectMapper.writeValueAsString(deliveryStatus); - mockMvc.perform(put("/api/sales/{saleId}/delivery/status", 1L) + mockMvc.perform(RestDocumentationRequestBuilders.put("/api/sales/{saleId}/delivery/status", 1L) .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isOk()) - .andDo(print()); + .andDo(document("sale/updateSaleDeliveryStatus/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("saleId").description("주문 ID") + ), + requestFields( + fieldWithPath("deliveryStatus").description("배송 상태").type(Enum.class) + )) + ); verify(saleFacade, times(1)).updateSaleDeliveryStatus(anyLong(), any()); } @@ -582,9 +798,15 @@ void testUpdateDeliveryStatus() throws Exception { @Test @DisplayName("주문 상태를 취소로 변경하는 테스트") void testCancelSale() throws Exception { - mockMvc.perform(put("/api/sales/{saleId}/cancel", 1L)) + mockMvc.perform(RestDocumentationRequestBuilders.put("/api/sales/{saleId}/cancel", 1L)) .andExpect(status().isOk()) - .andDo(print()); + .andDo(document("sale/updateSaleStatus/cancel", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("saleId").description("주문 ID") + ) + )); verify(saleFacade, times(1)).cancelSale(anyLong()); } From b9d0bf3863816046a9cd334cc432281da74a7869 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 00:30:05 +0900 Subject: [PATCH 120/161] =?UTF-8?q?[FIX]=20MemberCreateRequestDto=EC=97=90?= =?UTF-8?q?=20oauthId=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/member/domain/request/MemberCreateRequestDto.java | 5 +++++ src/main/java/store/ckin/api/member/entity/Member.java | 8 +++----- .../ckin/api/member/service/impl/MemberServiceImpl.java | 6 ++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java index 7b7aee7b..ec9e2445 100644 --- a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java +++ b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java @@ -5,6 +5,8 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; + +import io.micrometer.core.lang.Nullable; import lombok.Getter; import lombok.NoArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; @@ -36,4 +38,7 @@ public class MemberCreateRequestDto { @NotNull @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate birth; + + @Nullable + private String oauthId; } diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index e381b391..1e388417 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -12,11 +12,8 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; + +import lombok.*; import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; import store.ckin.api.grade.entity.Grade; @@ -103,6 +100,7 @@ public enum Role { @ColumnDefault("0") private Integer accumulateAmount; + @Setter @Column(name = "member_oauth_id") private String oauthId; diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 7b1b07c7..24b1739d 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -2,6 +2,8 @@ import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Objects; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -88,6 +90,10 @@ public void createMember(MemberCreateRequestDto memberCreateRequestDto) { .point(registerPolicy.getPointPolicyReserve()) .build(); + if (Objects.nonNull(memberCreateRequestDto.getOauthId())) { + member.setOauthId(memberCreateRequestDto.getOauthId()); + } + Member savedMember = memberRepository.save(member); PointHistory pointHistory = PointHistory.builder() From aa19594ba9329081ca11a255eee2ea3752f056ef Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 00:59:36 +0900 Subject: [PATCH 121/161] =?UTF-8?q?[FEAT]=20=EB=93=B1=EA=B8=89=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94=EA=B0=80=20&=20Grade?= =?UTF-8?q?Service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../grade/domain/request/GradeRequestDto.java | 20 ++++++++++++++++++ .../store/ckin/api/grade/entity/Grade.java | 3 +++ .../ckin/api/grade/service/GradeService.java | 21 +++++++++++++++++++ .../request/MemberCreateRequestDto.java | 3 +-- .../service/impl/MemberServiceImpl.java | 1 - 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java create mode 100644 src/main/java/store/ckin/api/grade/service/GradeService.java diff --git a/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java b/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java new file mode 100644 index 00000000..228435f4 --- /dev/null +++ b/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java @@ -0,0 +1,20 @@ +package store.ckin.api.grade.domain.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 등급 관련 요청 시 필요한 DTO 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 20. + */ +@Getter +@NoArgsConstructor +public class GradeRequestDto { + private String name; + + private Integer pointRatio; + + private Integer condition; +} diff --git a/src/main/java/store/ckin/api/grade/entity/Grade.java b/src/main/java/store/ckin/api/grade/entity/Grade.java index 8f745675..e6de382e 100644 --- a/src/main/java/store/ckin/api/grade/entity/Grade.java +++ b/src/main/java/store/ckin/api/grade/entity/Grade.java @@ -34,4 +34,7 @@ public class Grade { @Column(name = "grade_point_ratio") private Integer pointRatio; + + @Column(name = "grade_condition") + private Integer condition; } \ No newline at end of file diff --git a/src/main/java/store/ckin/api/grade/service/GradeService.java b/src/main/java/store/ckin/api/grade/service/GradeService.java new file mode 100644 index 00000000..f37d4bc5 --- /dev/null +++ b/src/main/java/store/ckin/api/grade/service/GradeService.java @@ -0,0 +1,21 @@ +package store.ckin.api.grade.service; + +import java.util.List; +import store.ckin.api.grade.domain.request.GradeRequestDto; +import store.ckin.api.grade.entity.Grade; + +/** + * Grade 의 관한 로직을 처리하는 서비스 인터페이스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 20. + */ +public interface GradeService { + void createGrade(GradeRequestDto gradeRequestDto); + + List getGradeList(); + + void updateGrade(GradeRequestDto gradeRequestDto); + + void deleteGrade(Long gradeId); +} diff --git a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java index ec9e2445..5670ea52 100644 --- a/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java +++ b/src/main/java/store/ckin/api/member/domain/request/MemberCreateRequestDto.java @@ -5,11 +5,10 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; - -import io.micrometer.core.lang.Nullable; import lombok.Getter; import lombok.NoArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.lang.Nullable; /** * Member 생성을 할 때 필요한 정보를 가져오는 DTO 입니다. diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 24b1739d..7e46ce82 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -3,7 +3,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Objects; - import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From fc3a54c6c47cb1f7d120d05e02fbd2191df26919 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 01:08:54 +0900 Subject: [PATCH 122/161] =?UTF-8?q?[FEAT]=20Grade=20ID=20auto=20increment?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0=20&=20DTO=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../grade/domain/request/GradeRequestDto.java | 2 + .../store/ckin/api/grade/entity/Grade.java | 1 - .../grade/service/impl/GradeServiceImpl.java | 41 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java diff --git a/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java b/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java index 228435f4..df33d54e 100644 --- a/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java +++ b/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java @@ -12,6 +12,8 @@ @Getter @NoArgsConstructor public class GradeRequestDto { + private Long id; + private String name; private Integer pointRatio; diff --git a/src/main/java/store/ckin/api/grade/entity/Grade.java b/src/main/java/store/ckin/api/grade/entity/Grade.java index e6de382e..829bf254 100644 --- a/src/main/java/store/ckin/api/grade/entity/Grade.java +++ b/src/main/java/store/ckin/api/grade/entity/Grade.java @@ -26,7 +26,6 @@ public class Grade { @Id @Column(name = "grade_id") - @GeneratedValue(strategy = GenerationType.AUTO) private Long gradeId; @Column(name = "grade_name", unique = true) diff --git a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java new file mode 100644 index 00000000..88e345a9 --- /dev/null +++ b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java @@ -0,0 +1,41 @@ +package store.ckin.api.grade.service.impl; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import store.ckin.api.grade.domain.request.GradeRequestDto; +import store.ckin.api.grade.entity.Grade; +import store.ckin.api.grade.service.GradeService; + +import java.util.List; + +/** + * GradeService 에 대한 구현체 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@Service +@RequiredArgsConstructor +public class GradeServiceImpl implements GradeService { + private final GradeService gradeService; + + @Override + public void createGrade(GradeRequestDto gradeRequestDto) { + + } + + @Override + public List getGradeList() { + return null; + } + + @Override + public void updateGrade(GradeRequestDto gradeRequestDto) { + + } + + @Override + public void deleteGrade(Long gradeId) { + + } +} From 13e383b5091e86e74d92eddfd0ad62fd4f2cbb04 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 01:51:33 +0900 Subject: [PATCH 123/161] [FEAT} GradeServiceImpl --- .../store/ckin/api/grade/entity/Grade.java | 15 ++++-- .../ckin/api/grade/entity/GradePolicy.java | 53 +++++++++++++++++++ .../GradeAlreadyExistsException.java | 10 ++++ .../grade/service/impl/GradeServiceImpl.java | 33 ++++++++++-- 4 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 src/main/java/store/ckin/api/grade/entity/GradePolicy.java create mode 100644 src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java diff --git a/src/main/java/store/ckin/api/grade/entity/Grade.java b/src/main/java/store/ckin/api/grade/entity/Grade.java index 829bf254..29db1f9d 100644 --- a/src/main/java/store/ckin/api/grade/entity/Grade.java +++ b/src/main/java/store/ckin/api/grade/entity/Grade.java @@ -2,14 +2,13 @@ import javax.persistence.Column; import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; import javax.persistence.Id; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import store.ckin.api.grade.domain.request.GradeRequestDto; /** * Grade 테이블에 대한 Entity 입니다. @@ -26,7 +25,7 @@ public class Grade { @Id @Column(name = "grade_id") - private Long gradeId; + private Long id; @Column(name = "grade_name", unique = true) private String name; @@ -36,4 +35,14 @@ public class Grade { @Column(name = "grade_condition") private Integer condition; + + /** + * 등급 수정하는 메서드 입니다. + */ + public void update(GradeRequestDto gradeRequestDto) { + this.id = gradeRequestDto.getId(); + this.name = gradeRequestDto.getName(); + this.pointRatio = gradeRequestDto.getPointRatio(); + this.condition = gradeRequestDto.getCondition(); + } } \ No newline at end of file diff --git a/src/main/java/store/ckin/api/grade/entity/GradePolicy.java b/src/main/java/store/ckin/api/grade/entity/GradePolicy.java new file mode 100644 index 00000000..94c6e0ed --- /dev/null +++ b/src/main/java/store/ckin/api/grade/entity/GradePolicy.java @@ -0,0 +1,53 @@ +package store.ckin.api.grade.entity; + +import lombok.Getter; + +/** + * 등급 ID와 이름에 연관된 정책을 Enum 으로 구성한 클래스 입니다. + * 1** : 일반 + * 2** : 로얄 + * ... + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@Getter +public enum GradePolicy { + NORMAL(1, "노말"), + ROYAL(2, "로얄"), + GOLD(3, "골드"), + PLATINUM(4, "플래티넘"); + + private final int code; + + private final String name; + + GradePolicy(int code, String name) { + this.code = code; + this.name = name; + } + + /** + * 연관 번호로 등급 이름을 조회하는 메서드 입니다. + */ + public static String getNameByCode(int code) { + for (GradePolicy grade : GradePolicy.values()) { + if (grade.getCode() == code) { + return grade.getName(); + } + } + return null; + } + + /** + * 등급 이름으로 연관번호를 조회하는 메서드 입니다. + */ + public static int getCodeByName(String name) { + for (GradePolicy grade : GradePolicy.values()) { + if (grade.getName().equals(name)) { + return grade.getCode(); + } + } + return -1; + } +} diff --git a/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java b/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java new file mode 100644 index 00000000..bb5cc508 --- /dev/null +++ b/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java @@ -0,0 +1,10 @@ +package store.ckin.api.grade.exception; + +/** + * 이미 존재하는 ID의 등급이 있을 때 호출되는 메서드 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +public class GradeAlreadyExistsException extends RuntimeException{ +} diff --git a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java index 88e345a9..2e12c526 100644 --- a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java +++ b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java @@ -1,13 +1,16 @@ package store.ckin.api.grade.service.impl; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import store.ckin.api.grade.domain.request.GradeRequestDto; import store.ckin.api.grade.entity.Grade; +import store.ckin.api.grade.exception.GradeAlreadyExistsException; +import store.ckin.api.grade.exception.GradeNotFoundException; +import store.ckin.api.grade.repository.GradeRepository; import store.ckin.api.grade.service.GradeService; -import java.util.List; - /** * GradeService 에 대한 구현체 입니다. * @@ -17,25 +20,47 @@ @Service @RequiredArgsConstructor public class GradeServiceImpl implements GradeService { - private final GradeService gradeService; + private final GradeRepository gradeRepository; + @Transactional @Override public void createGrade(GradeRequestDto gradeRequestDto) { + if (gradeRepository.existsById(gradeRequestDto.getId())) { + throw new GradeAlreadyExistsException(); + } + + Grade grade = Grade.builder() + .id(gradeRequestDto.getId()) + .name(gradeRequestDto.getName()) + .pointRatio(gradeRequestDto.getPointRatio()) + .condition(gradeRequestDto.getCondition()) + .build(); + gradeRepository.save(grade); } + @Transactional(readOnly = true) @Override public List getGradeList() { - return null; + return gradeRepository.findAll(); } + @Transactional @Override public void updateGrade(GradeRequestDto gradeRequestDto) { + Grade grade = gradeRepository.findById(gradeRequestDto.getId()) + .orElseThrow(GradeNotFoundException::new); + grade.update(gradeRequestDto); } + @Transactional @Override public void deleteGrade(Long gradeId) { + if (gradeRepository.existsById(gradeId)) { + throw new GradeAlreadyExistsException(); + } + gradeRepository.deleteById(gradeId); } } From 1a3412ac9bd0e715edfdbd2a2f77ac468a4dc2f6 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 01:54:02 +0900 Subject: [PATCH 124/161] =?UTF-8?q?[REFACTOR]=20=EC=98=A4=EB=A5=98=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 --- .../store/ckin/api/member/service/impl/MemberServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 7e46ce82..f79cb8ca 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -167,7 +167,7 @@ public void updateRewardPoint(Long saleId, String email, Integer totalPrice) { Member member = memberRepository.findByEmail(email) .orElseThrow(() -> new MemberNotFoundException(email)); - Grade grade = gradeRepository.findById(member.getGrade().getGradeId()) + Grade grade = gradeRepository.findById(member.getGrade().getId()) .orElseThrow(GradeNotFoundException::new); Sale sale = saleRepository.findById(saleId) From be5eff3f0488776d7158b3e286f0b0b22000a7b4 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 02:24:03 +0900 Subject: [PATCH 125/161] [FEAT] GradeController --- .../api/grade/controller/GradeController.java | 89 +++++++++++++++++++ ...estDto.java => GradeCreateRequestDto.java} | 2 +- .../domain/request/GradeUpdateRequestDto.java | 20 +++++ .../store/ckin/api/grade/entity/Grade.java | 12 +-- .../ckin/api/grade/service/GradeService.java | 7 +- .../grade/service/impl/GradeServiceImpl.java | 21 ++--- .../member/controller/MemberController.java | 2 - 7 files changed, 131 insertions(+), 22 deletions(-) create mode 100644 src/main/java/store/ckin/api/grade/controller/GradeController.java rename src/main/java/store/ckin/api/grade/domain/request/{GradeRequestDto.java => GradeCreateRequestDto.java} (90%) create mode 100644 src/main/java/store/ckin/api/grade/domain/request/GradeUpdateRequestDto.java diff --git a/src/main/java/store/ckin/api/grade/controller/GradeController.java b/src/main/java/store/ckin/api/grade/controller/GradeController.java new file mode 100644 index 00000000..bb701086 --- /dev/null +++ b/src/main/java/store/ckin/api/grade/controller/GradeController.java @@ -0,0 +1,89 @@ +package store.ckin.api.grade.controller; + +import java.util.List; +import javax.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import store.ckin.api.grade.domain.request.GradeCreateRequestDto; +import store.ckin.api.grade.domain.request.GradeUpdateRequestDto; +import store.ckin.api.grade.entity.Grade; +import store.ckin.api.grade.exception.GradeAlreadyExistsException; +import store.ckin.api.grade.exception.GradeNotFoundException; +import store.ckin.api.grade.service.GradeService; + +/** + * Grade 에 관한 REST Controller 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/admin/grades") +public class GradeController { + private final GradeService gradeService; + + /** + * 등급을 생성하는 메서드. + * + * @param gradeCreateRequestDto the grade request dto + * @return CREATED (Code 201) + */ + @PostMapping + public ResponseEntity createGrade(@Valid @RequestBody GradeCreateRequestDto gradeCreateRequestDto) { + gradeService.createGrade(gradeCreateRequestDto); + + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + @GetMapping + public ResponseEntity> getGradeList() { + return ResponseEntity.status(HttpStatus.OK) + .body(gradeService.getGradeList()); + } + + /** + * 등급을 수정하는 메서드. + * + * @return OK (Code 200) + */ + @PutMapping("/{gradeId}") + public ResponseEntity updateGrade(@PathVariable("gradeId") Long gradeId, + @Valid @RequestBody GradeUpdateRequestDto gradeUpdateRequestDto) { + gradeService.updateGrade(gradeId, gradeUpdateRequestDto); + + return ResponseEntity.status(HttpStatus.OK).build(); + } + + /** + * 등급을 삭제하는 메서드. + * + * @return OK (Code 200) + */ + @DeleteMapping("/{gradeId}") + public ResponseEntity deleteGrade(@PathVariable("gradeId") Long gradeId) { + gradeService.deleteGrade(gradeId); + + return ResponseEntity.status(HttpStatus.OK).build(); + } + + @ExceptionHandler({GradeAlreadyExistsException.class}) + public ResponseEntity gradeAlreadyExistsExceptionHandler() { + return ResponseEntity.status(HttpStatus.CONFLICT).build(); + } + + @ExceptionHandler({GradeNotFoundException.class}) + public ResponseEntity gradeNotFoundExceptionHandler() { + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + } +} diff --git a/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java b/src/main/java/store/ckin/api/grade/domain/request/GradeCreateRequestDto.java similarity index 90% rename from src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java rename to src/main/java/store/ckin/api/grade/domain/request/GradeCreateRequestDto.java index df33d54e..35ab28d4 100644 --- a/src/main/java/store/ckin/api/grade/domain/request/GradeRequestDto.java +++ b/src/main/java/store/ckin/api/grade/domain/request/GradeCreateRequestDto.java @@ -11,7 +11,7 @@ */ @Getter @NoArgsConstructor -public class GradeRequestDto { +public class GradeCreateRequestDto { private Long id; private String name; diff --git a/src/main/java/store/ckin/api/grade/domain/request/GradeUpdateRequestDto.java b/src/main/java/store/ckin/api/grade/domain/request/GradeUpdateRequestDto.java new file mode 100644 index 00000000..ef7c2be3 --- /dev/null +++ b/src/main/java/store/ckin/api/grade/domain/request/GradeUpdateRequestDto.java @@ -0,0 +1,20 @@ +package store.ckin.api.grade.domain.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 등급을 수정 요청 시 필요한 DTO 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@Getter +@NoArgsConstructor +public class GradeUpdateRequestDto { + private String name; + + private Integer pointRatio; + + private Integer condition; +} diff --git a/src/main/java/store/ckin/api/grade/entity/Grade.java b/src/main/java/store/ckin/api/grade/entity/Grade.java index 29db1f9d..c689d46c 100644 --- a/src/main/java/store/ckin/api/grade/entity/Grade.java +++ b/src/main/java/store/ckin/api/grade/entity/Grade.java @@ -8,7 +8,8 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import store.ckin.api.grade.domain.request.GradeRequestDto; +import store.ckin.api.grade.domain.request.GradeCreateRequestDto; +import store.ckin.api.grade.domain.request.GradeUpdateRequestDto; /** * Grade 테이블에 대한 Entity 입니다. @@ -39,10 +40,9 @@ public class Grade { /** * 등급 수정하는 메서드 입니다. */ - public void update(GradeRequestDto gradeRequestDto) { - this.id = gradeRequestDto.getId(); - this.name = gradeRequestDto.getName(); - this.pointRatio = gradeRequestDto.getPointRatio(); - this.condition = gradeRequestDto.getCondition(); + public void update(GradeUpdateRequestDto gradeUpdateRequestDto) { + this.name = gradeUpdateRequestDto.getName(); + this.pointRatio = gradeUpdateRequestDto.getPointRatio(); + this.condition = gradeUpdateRequestDto.getCondition(); } } \ No newline at end of file diff --git a/src/main/java/store/ckin/api/grade/service/GradeService.java b/src/main/java/store/ckin/api/grade/service/GradeService.java index f37d4bc5..19437a1e 100644 --- a/src/main/java/store/ckin/api/grade/service/GradeService.java +++ b/src/main/java/store/ckin/api/grade/service/GradeService.java @@ -1,7 +1,8 @@ package store.ckin.api.grade.service; import java.util.List; -import store.ckin.api.grade.domain.request.GradeRequestDto; +import store.ckin.api.grade.domain.request.GradeCreateRequestDto; +import store.ckin.api.grade.domain.request.GradeUpdateRequestDto; import store.ckin.api.grade.entity.Grade; /** @@ -11,11 +12,11 @@ * @version : 2024. 03. 20. */ public interface GradeService { - void createGrade(GradeRequestDto gradeRequestDto); + void createGrade(GradeCreateRequestDto gradeCreateRequestDto); List getGradeList(); - void updateGrade(GradeRequestDto gradeRequestDto); + void updateGrade(Long gradeId, GradeUpdateRequestDto gradeUpdateRequestDto); void deleteGrade(Long gradeId); } diff --git a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java index 2e12c526..cee46897 100644 --- a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java +++ b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java @@ -4,7 +4,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import store.ckin.api.grade.domain.request.GradeRequestDto; +import store.ckin.api.grade.domain.request.GradeCreateRequestDto; +import store.ckin.api.grade.domain.request.GradeUpdateRequestDto; import store.ckin.api.grade.entity.Grade; import store.ckin.api.grade.exception.GradeAlreadyExistsException; import store.ckin.api.grade.exception.GradeNotFoundException; @@ -24,16 +25,16 @@ public class GradeServiceImpl implements GradeService { @Transactional @Override - public void createGrade(GradeRequestDto gradeRequestDto) { - if (gradeRepository.existsById(gradeRequestDto.getId())) { + public void createGrade(GradeCreateRequestDto gradeCreateRequestDto) { + if (gradeRepository.existsById(gradeCreateRequestDto.getId())) { throw new GradeAlreadyExistsException(); } Grade grade = Grade.builder() - .id(gradeRequestDto.getId()) - .name(gradeRequestDto.getName()) - .pointRatio(gradeRequestDto.getPointRatio()) - .condition(gradeRequestDto.getCondition()) + .id(gradeCreateRequestDto.getId()) + .name(gradeCreateRequestDto.getName()) + .pointRatio(gradeCreateRequestDto.getPointRatio()) + .condition(gradeCreateRequestDto.getCondition()) .build(); gradeRepository.save(grade); @@ -47,11 +48,11 @@ public List getGradeList() { @Transactional @Override - public void updateGrade(GradeRequestDto gradeRequestDto) { - Grade grade = gradeRepository.findById(gradeRequestDto.getId()) + public void updateGrade(Long gradeId, GradeUpdateRequestDto gradeUpdateRequestDto) { + Grade grade = gradeRepository.findById(gradeId) .orElseThrow(GradeNotFoundException::new); - grade.update(gradeRequestDto); + grade.update(gradeUpdateRequestDto); } @Transactional diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 503b0e92..0b291fae 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -42,8 +42,6 @@ public class MemberController { @PostMapping("/checkEmail") public ResponseEntity checkDuplicateEmail( @Valid @RequestBody MemberEmailOnlyRequestDto memberEmailOnlyRequestDto) { - log.info("Start"); - return ResponseEntity.status(HttpStatus.OK) .body(memberService.alreadyExistsEmail(memberEmailOnlyRequestDto)); } From 820348fe7d7cb01e39ac42539e11f0661c3af36c Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 09:49:00 +0900 Subject: [PATCH 126/161] =?UTF-8?q?[REMOVE]=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/grade/entity/Grade.java | 1 - .../ckin/api/grade/entity/GradePolicy.java | 53 ------------------- 2 files changed, 54 deletions(-) delete mode 100644 src/main/java/store/ckin/api/grade/entity/GradePolicy.java diff --git a/src/main/java/store/ckin/api/grade/entity/Grade.java b/src/main/java/store/ckin/api/grade/entity/Grade.java index c689d46c..c4b83503 100644 --- a/src/main/java/store/ckin/api/grade/entity/Grade.java +++ b/src/main/java/store/ckin/api/grade/entity/Grade.java @@ -8,7 +8,6 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import store.ckin.api.grade.domain.request.GradeCreateRequestDto; import store.ckin.api.grade.domain.request.GradeUpdateRequestDto; /** diff --git a/src/main/java/store/ckin/api/grade/entity/GradePolicy.java b/src/main/java/store/ckin/api/grade/entity/GradePolicy.java deleted file mode 100644 index 94c6e0ed..00000000 --- a/src/main/java/store/ckin/api/grade/entity/GradePolicy.java +++ /dev/null @@ -1,53 +0,0 @@ -package store.ckin.api.grade.entity; - -import lombok.Getter; - -/** - * 등급 ID와 이름에 연관된 정책을 Enum 으로 구성한 클래스 입니다. - * 1** : 일반 - * 2** : 로얄 - * ... - * - * @author : jinwoolee - * @version : 2024. 03. 21. - */ -@Getter -public enum GradePolicy { - NORMAL(1, "노말"), - ROYAL(2, "로얄"), - GOLD(3, "골드"), - PLATINUM(4, "플래티넘"); - - private final int code; - - private final String name; - - GradePolicy(int code, String name) { - this.code = code; - this.name = name; - } - - /** - * 연관 번호로 등급 이름을 조회하는 메서드 입니다. - */ - public static String getNameByCode(int code) { - for (GradePolicy grade : GradePolicy.values()) { - if (grade.getCode() == code) { - return grade.getName(); - } - } - return null; - } - - /** - * 등급 이름으로 연관번호를 조회하는 메서드 입니다. - */ - public static int getCodeByName(String name) { - for (GradePolicy grade : GradePolicy.values()) { - if (grade.getName().equals(name)) { - return grade.getCode(); - } - } - return -1; - } -} From 09d91d8eb786a7e9d9aadfc06b508fd121cfdfca Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 21 Mar 2024 10:25:21 +0900 Subject: [PATCH 127/161] =?UTF-8?q?[REFACTOR]=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=B7=A8=EC=86=8C=20-=20=EB=A1=9C=EC=A7=81=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/sale/facade/SaleFacade.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index b5b933ac..12b77dd1 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -228,13 +228,14 @@ public void updateSaleDeliveryStatus(Long saleId, SaleDeliveryUpdateRequestDto d */ @Transactional public void cancelSale(Long saleId) { - // 주문 및 결제 상태 변경 - saleService.cancelSale(saleId); // 회원 포인트 변경 및 포인트 이력 생성 SaleResponseDto saleDetail = saleService.getSaleDetail(saleId); if (Objects.nonNull(saleDetail.getMemberEmail()) && saleDetail.getSalePointUsage() > 0) { memberService.updateCancelSalePoint(saleId, saleDetail.getMemberEmail()); } + + // 주문 및 결제 상태 변경 + saleService.cancelSale(saleId); } } From 8ab136b7bf5ba45e410960ef942be8f7d674f72b Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 10:53:16 +0900 Subject: [PATCH 128/161] =?UTF-8?q?[FEAT]=20RequestDTO=20Validation=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/grade/domain/request/GradeCreateRequestDto.java | 9 +++++++++ .../api/grade/domain/request/GradeUpdateRequestDto.java | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/store/ckin/api/grade/domain/request/GradeCreateRequestDto.java b/src/main/java/store/ckin/api/grade/domain/request/GradeCreateRequestDto.java index 35ab28d4..320078a4 100644 --- a/src/main/java/store/ckin/api/grade/domain/request/GradeCreateRequestDto.java +++ b/src/main/java/store/ckin/api/grade/domain/request/GradeCreateRequestDto.java @@ -1,5 +1,9 @@ package store.ckin.api.grade.domain.request; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,11 +16,16 @@ @Getter @NoArgsConstructor public class GradeCreateRequestDto { + @NotNull private Long id; + @NotBlank private String name; + @Min(0) + @Max(100) private Integer pointRatio; + @NotNull private Integer condition; } diff --git a/src/main/java/store/ckin/api/grade/domain/request/GradeUpdateRequestDto.java b/src/main/java/store/ckin/api/grade/domain/request/GradeUpdateRequestDto.java index ef7c2be3..c2797acd 100644 --- a/src/main/java/store/ckin/api/grade/domain/request/GradeUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/grade/domain/request/GradeUpdateRequestDto.java @@ -1,5 +1,9 @@ package store.ckin.api.grade.domain.request; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,9 +16,13 @@ @Getter @NoArgsConstructor public class GradeUpdateRequestDto { + @NotBlank private String name; + @Min(0) + @Max(100) private Integer pointRatio; + @NotNull private Integer condition; } From 0449c5fdb3411be835e8a01ae092df70c53c7ffa Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 11:34:12 +0900 Subject: [PATCH 129/161] =?UTF-8?q?[REFACTOR]=20=EB=93=B1=EA=B8=89=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/grade/service/impl/GradeServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java index cee46897..3ead2e26 100644 --- a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java +++ b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java @@ -58,8 +58,8 @@ public void updateGrade(Long gradeId, GradeUpdateRequestDto gradeUpdateRequestDt @Transactional @Override public void deleteGrade(Long gradeId) { - if (gradeRepository.existsById(gradeId)) { - throw new GradeAlreadyExistsException(); + if (!gradeRepository.existsById(gradeId)) { + throw new GradeNotFoundException(); } gradeRepository.deleteById(gradeId); From e8ebcd7e48fe16bd4eecbf45f6075a9bcdae67d3 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 15:37:10 +0900 Subject: [PATCH 130/161] =?UTF-8?q?[REFACTOR]=20updateGrade=20method=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/store/ckin/api/grade/controller/GradeController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/grade/controller/GradeController.java b/src/main/java/store/ckin/api/grade/controller/GradeController.java index bb701086..ecce2802 100644 --- a/src/main/java/store/ckin/api/grade/controller/GradeController.java +++ b/src/main/java/store/ckin/api/grade/controller/GradeController.java @@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -57,7 +56,7 @@ public ResponseEntity> getGradeList() { * * @return OK (Code 200) */ - @PutMapping("/{gradeId}") + @PostMapping("/{gradeId}") public ResponseEntity updateGrade(@PathVariable("gradeId") Long gradeId, @Valid @RequestBody GradeUpdateRequestDto gradeUpdateRequestDto) { gradeService.updateGrade(gradeId, gradeUpdateRequestDto); From c05127873cd11139c001a990afcbceb27c822fcf Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 16:04:15 +0900 Subject: [PATCH 131/161] [FEAT] Wish List Entity --- .../store/ckin/api/member/entity/Member.java | 8 ++- .../ckin/api/wishlist/entity/WishList.java | 59 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/main/java/store/ckin/api/wishlist/entity/WishList.java diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index 1e388417..33be71c2 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -12,8 +12,12 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; - -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; import store.ckin.api.grade.entity.Grade; diff --git a/src/main/java/store/ckin/api/wishlist/entity/WishList.java b/src/main/java/store/ckin/api/wishlist/entity/WishList.java new file mode 100644 index 00000000..60c54928 --- /dev/null +++ b/src/main/java/store/ckin/api/wishlist/entity/WishList.java @@ -0,0 +1,59 @@ +package store.ckin.api.wishlist.entity; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import store.ckin.api.book.entity.Book; +import store.ckin.api.member.entity.Member; + + +/** + * WishList 테이블에 대한 Entity 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@Builder +@Getter +@EqualsAndHashCode +@NoArgsConstructor +@AllArgsConstructor +@Entity(name = "Member") +public class WishList { + @EmbeddedId + private PK pk; + + @MapsId("bookId") + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "book_id") + private Book book; + + @MapsId("memberId") + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @Getter + @Embeddable + @EqualsAndHashCode + @NoArgsConstructor + @AllArgsConstructor + public static class PK implements Serializable { + @Column(name = "book_id") + private Long bookId; + + @Column(name = "member_id") + private Long memberId; + } +} From c7618ebee8c57fab2def11ae27d8df0e219b2262 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 16:36:22 +0900 Subject: [PATCH 132/161] [FEAT] WishListServiceImpl --- .../book/exception/BookNotFoundException.java | 3 + .../domain/request/WishListRequestDto.java | 21 ++++++ .../repository/WishListRepository.java | 14 ++++ .../api/wishlist/service/WishListService.java | 15 ++++ .../service/impl/WishListServiceImpl.java | 68 +++++++++++++++++++ 5 files changed, 121 insertions(+) create mode 100644 src/main/java/store/ckin/api/wishlist/domain/request/WishListRequestDto.java create mode 100644 src/main/java/store/ckin/api/wishlist/repository/WishListRepository.java create mode 100644 src/main/java/store/ckin/api/wishlist/service/WishListService.java create mode 100644 src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java diff --git a/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java b/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java index c20776b6..b5cb7223 100644 --- a/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java +++ b/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java @@ -7,6 +7,9 @@ * @version 2024. 02. 26. */ public class BookNotFoundException extends RuntimeException { + public BookNotFoundException() { + } + public BookNotFoundException(Long bookId) { super(String.format("책(id: %d)을 찾을 수 없습니다", bookId)); diff --git a/src/main/java/store/ckin/api/wishlist/domain/request/WishListRequestDto.java b/src/main/java/store/ckin/api/wishlist/domain/request/WishListRequestDto.java new file mode 100644 index 00000000..8299d60a --- /dev/null +++ b/src/main/java/store/ckin/api/wishlist/domain/request/WishListRequestDto.java @@ -0,0 +1,21 @@ +package store.ckin.api.wishlist.domain.request; + +import javax.validation.constraints.NotNull; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * WishList 요청에 필요한 DTO 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@Getter +@NoArgsConstructor +public class WishListRequestDto { + @NotNull + private Long memberId; + + @NotNull + private Long bookId; +} diff --git a/src/main/java/store/ckin/api/wishlist/repository/WishListRepository.java b/src/main/java/store/ckin/api/wishlist/repository/WishListRepository.java new file mode 100644 index 00000000..943442fe --- /dev/null +++ b/src/main/java/store/ckin/api/wishlist/repository/WishListRepository.java @@ -0,0 +1,14 @@ +package store.ckin.api.wishlist.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import store.ckin.api.wishlist.entity.WishList; + +/** + * WishList 에 관한 쿼리를 관리하는 인터페이스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +public interface WishListRepository extends JpaRepository { + void deleteByPk(WishList.PK pk); +} diff --git a/src/main/java/store/ckin/api/wishlist/service/WishListService.java b/src/main/java/store/ckin/api/wishlist/service/WishListService.java new file mode 100644 index 00000000..613ad542 --- /dev/null +++ b/src/main/java/store/ckin/api/wishlist/service/WishListService.java @@ -0,0 +1,15 @@ +package store.ckin.api.wishlist.service; + +import store.ckin.api.wishlist.domain.request.WishListRequestDto; + +/** + * Wish List 의 관한 로직을 처리하는 서비스 인터페이스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +public interface WishListService { + void createWishList(WishListRequestDto wishListRequestDto); + + void deleteWishList(WishListRequestDto wishListRequestDto); +} diff --git a/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java b/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java new file mode 100644 index 00000000..4a765996 --- /dev/null +++ b/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java @@ -0,0 +1,68 @@ +package store.ckin.api.wishlist.service.impl; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import store.ckin.api.book.entity.Book; +import store.ckin.api.book.exception.BookNotFoundException; +import store.ckin.api.book.repository.BookRepository; +import store.ckin.api.member.entity.Member; +import store.ckin.api.member.exception.MemberNotFoundException; +import store.ckin.api.member.repository.MemberRepository; +import store.ckin.api.wishlist.domain.request.WishListRequestDto; +import store.ckin.api.wishlist.entity.WishList; +import store.ckin.api.wishlist.repository.WishListRepository; +import store.ckin.api.wishlist.service.WishListService; + +/** + * WishListService 의 구현체 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@Service +@RequiredArgsConstructor +public class WishListServiceImpl implements WishListService { + private final MemberRepository memberRepository; + + private final BookRepository bookRepository; + + private final WishListRepository wishListRepository; + + @Transactional + @Override + public void createWishList(WishListRequestDto wishListRequestDto) { + Member member = memberRepository.findById(wishListRequestDto.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + + Book book = bookRepository.findByBookId(wishListRequestDto.getBookId()) + .orElseThrow(BookNotFoundException::new); + + WishList wishList = WishList.builder() + .member(member) + .book(book) + .pk(new WishList.PK( + wishListRequestDto.getBookId(), + wishListRequestDto.getMemberId())) + .build(); + + wishListRepository.save(wishList); + } + + @Transactional + @Override + public void deleteWishList(WishListRequestDto wishListRequestDto) { + if (!memberRepository.existsById(wishListRequestDto.getMemberId())) { + throw new MemberNotFoundException(); + } + + if (!bookRepository.existsById(wishListRequestDto.getBookId())) { + throw new BookNotFoundException(); + } + + wishListRepository.deleteByPk( + new WishList.PK( + wishListRequestDto.getBookId(), + wishListRequestDto.getMemberId())); + } +} From 8a5d7f744712596dc1ef0cea57c0f91d21efc931 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 16:58:30 +0900 Subject: [PATCH 133/161] =?UTF-8?q?[FEAT]=20WishListController=20(?= =?UTF-8?q?=EC=83=9D=EC=84=B1,=20=EC=82=AD=EC=A0=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WishListController.java | 56 +++++++++++++++++++ .../domain/request/WishListRequestDto.java | 21 ------- .../ckin/api/wishlist/entity/WishList.java | 9 ++- .../WishListAlreadyExistsException.java | 10 ++++ .../repository/WishListRepository.java | 4 +- .../api/wishlist/service/WishListService.java | 6 +- .../service/impl/WishListServiceImpl.java | 29 +++++----- 7 files changed, 92 insertions(+), 43 deletions(-) create mode 100644 src/main/java/store/ckin/api/wishlist/controller/WishListController.java delete mode 100644 src/main/java/store/ckin/api/wishlist/domain/request/WishListRequestDto.java create mode 100644 src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java diff --git a/src/main/java/store/ckin/api/wishlist/controller/WishListController.java b/src/main/java/store/ckin/api/wishlist/controller/WishListController.java new file mode 100644 index 00000000..bac70ab3 --- /dev/null +++ b/src/main/java/store/ckin/api/wishlist/controller/WishListController.java @@ -0,0 +1,56 @@ +package store.ckin.api.wishlist.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import store.ckin.api.book.exception.BookNotFoundException; +import store.ckin.api.member.exception.MemberAlreadyExistsException; +import store.ckin.api.member.exception.MemberNotFoundException; +import store.ckin.api.wishlist.exception.WishListAlreadyExistsException; +import store.ckin.api.wishlist.service.WishListService; + +/** + * Wish List 에 관한 REST Controller 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class WishListController { + private final WishListService wishListService; + + /** + * 위시리스트에 추가하는 메서드 입니다. + */ + @PostMapping("/members/{memberId}/wish-list/{bookId}") + public ResponseEntity addWishList(@PathVariable("memberId") Long memberId, + @PathVariable("bookId") Long bookId) { + wishListService.createWishList(memberId, bookId); + + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + /** + * 위시리스트에서 제거하는 메서드 입니다. + */ + @DeleteMapping("/members/{memberId}/wish-list/{bookId}") + public ResponseEntity deleteWishList(@PathVariable("memberId") Long memberId, + @PathVariable("bookId") Long bookId) { + wishListService.deleteWishList(memberId, bookId); + + return ResponseEntity.status(HttpStatus.OK).build(); + } + + @ExceptionHandler({WishListAlreadyExistsException.class}) + public ResponseEntity memberAlreadyExistsExceptionHandler() { + return ResponseEntity.status(HttpStatus.CONFLICT).build(); + } + + @ExceptionHandler({MemberNotFoundException.class, BookNotFoundException.class}) + public ResponseEntity memberNotFoundExceptionHandler() { + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + } +} diff --git a/src/main/java/store/ckin/api/wishlist/domain/request/WishListRequestDto.java b/src/main/java/store/ckin/api/wishlist/domain/request/WishListRequestDto.java deleted file mode 100644 index 8299d60a..00000000 --- a/src/main/java/store/ckin/api/wishlist/domain/request/WishListRequestDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package store.ckin.api.wishlist.domain.request; - -import javax.validation.constraints.NotNull; -import lombok.Getter; -import lombok.NoArgsConstructor; - -/** - * WishList 요청에 필요한 DTO 입니다. - * - * @author : jinwoolee - * @version : 2024. 03. 21. - */ -@Getter -@NoArgsConstructor -public class WishListRequestDto { - @NotNull - private Long memberId; - - @NotNull - private Long bookId; -} diff --git a/src/main/java/store/ckin/api/wishlist/entity/WishList.java b/src/main/java/store/ckin/api/wishlist/entity/WishList.java index 60c54928..6f7c89c2 100644 --- a/src/main/java/store/ckin/api/wishlist/entity/WishList.java +++ b/src/main/java/store/ckin/api/wishlist/entity/WishList.java @@ -29,10 +29,10 @@ @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor -@Entity(name = "Member") +@Entity(name = "Wishlist") public class WishList { @EmbeddedId - private PK pk; + private Pk pk; @MapsId("bookId") @ManyToOne(fetch = FetchType.LAZY) @@ -44,12 +44,15 @@ public class WishList { @JoinColumn(name = "member_id") private Member member; + /** + * The type Pk. + */ @Getter @Embeddable @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor - public static class PK implements Serializable { + public static class Pk implements Serializable { @Column(name = "book_id") private Long bookId; diff --git a/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java b/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java new file mode 100644 index 00000000..7c6521c6 --- /dev/null +++ b/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java @@ -0,0 +1,10 @@ +package store.ckin.api.wishlist.exception; + +/** + * 이미 위시리스트에 추가되었을 때 호출되는 Exception 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +public class WishListAlreadyExistsException extends RuntimeException{ +} diff --git a/src/main/java/store/ckin/api/wishlist/repository/WishListRepository.java b/src/main/java/store/ckin/api/wishlist/repository/WishListRepository.java index 943442fe..7e9ebe0a 100644 --- a/src/main/java/store/ckin/api/wishlist/repository/WishListRepository.java +++ b/src/main/java/store/ckin/api/wishlist/repository/WishListRepository.java @@ -10,5 +10,7 @@ * @version : 2024. 03. 21. */ public interface WishListRepository extends JpaRepository { - void deleteByPk(WishList.PK pk); + void deleteByPk(WishList.Pk pk); + + boolean existsByPk(WishList.Pk pk); } diff --git a/src/main/java/store/ckin/api/wishlist/service/WishListService.java b/src/main/java/store/ckin/api/wishlist/service/WishListService.java index 613ad542..07b2b4e0 100644 --- a/src/main/java/store/ckin/api/wishlist/service/WishListService.java +++ b/src/main/java/store/ckin/api/wishlist/service/WishListService.java @@ -1,7 +1,5 @@ package store.ckin.api.wishlist.service; -import store.ckin.api.wishlist.domain.request.WishListRequestDto; - /** * Wish List 의 관한 로직을 처리하는 서비스 인터페이스 입니다. * @@ -9,7 +7,7 @@ * @version : 2024. 03. 21. */ public interface WishListService { - void createWishList(WishListRequestDto wishListRequestDto); + void createWishList(Long memberId, Long bookId); - void deleteWishList(WishListRequestDto wishListRequestDto); + void deleteWishList(Long memberId, Long bookId); } diff --git a/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java b/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java index 4a765996..70305937 100644 --- a/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java +++ b/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java @@ -9,8 +9,8 @@ import store.ckin.api.member.entity.Member; import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.repository.MemberRepository; -import store.ckin.api.wishlist.domain.request.WishListRequestDto; import store.ckin.api.wishlist.entity.WishList; +import store.ckin.api.wishlist.exception.WishListAlreadyExistsException; import store.ckin.api.wishlist.repository.WishListRepository; import store.ckin.api.wishlist.service.WishListService; @@ -31,19 +31,23 @@ public class WishListServiceImpl implements WishListService { @Transactional @Override - public void createWishList(WishListRequestDto wishListRequestDto) { - Member member = memberRepository.findById(wishListRequestDto.getMemberId()) + public void createWishList(Long memberId, Long bookId) { + Member member = memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); - Book book = bookRepository.findByBookId(wishListRequestDto.getBookId()) + Book book = bookRepository.findByBookId(bookId) .orElseThrow(BookNotFoundException::new); + WishList.Pk pk = new WishList.Pk(bookId, memberId); + + if (wishListRepository.existsByPk(pk)) { + throw new WishListAlreadyExistsException(); + } + WishList wishList = WishList.builder() .member(member) .book(book) - .pk(new WishList.PK( - wishListRequestDto.getBookId(), - wishListRequestDto.getMemberId())) + .pk(pk) .build(); wishListRepository.save(wishList); @@ -51,18 +55,15 @@ public void createWishList(WishListRequestDto wishListRequestDto) { @Transactional @Override - public void deleteWishList(WishListRequestDto wishListRequestDto) { - if (!memberRepository.existsById(wishListRequestDto.getMemberId())) { + public void deleteWishList(Long memberId, Long bookId) { + if (!memberRepository.existsById(memberId)) { throw new MemberNotFoundException(); } - if (!bookRepository.existsById(wishListRequestDto.getBookId())) { + if (!bookRepository.existsById(bookId)) { throw new BookNotFoundException(); } - wishListRepository.deleteByPk( - new WishList.PK( - wishListRequestDto.getBookId(), - wishListRequestDto.getMemberId())); + wishListRepository.deleteByPk(new WishList.Pk(bookId, memberId)); } } From 055b7ad123f7308f8eccea14e49adf8ad3a5b3c4 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 21 Mar 2024 17:23:23 +0900 Subject: [PATCH 134/161] =?UTF-8?q?[FIX]=20Grade=20-=20PK=EA=B0=92=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 --- .../store/ckin/api/member/repository/MemberRepositoryTest.java | 2 ++ .../ckin/api/payment/repository/PaymentRepositoryTest.java | 2 ++ .../pointhistory/repository/PointHistoryRepositoryTest.java | 3 +++ .../store/ckin/api/sale/repository/SaleRepositoryTest.java | 2 ++ 4 files changed, 9 insertions(+) diff --git a/src/test/java/store/ckin/api/member/repository/MemberRepositoryTest.java b/src/test/java/store/ckin/api/member/repository/MemberRepositoryTest.java index 92e8f14e..7c16c13a 100644 --- a/src/test/java/store/ckin/api/member/repository/MemberRepositoryTest.java +++ b/src/test/java/store/ckin/api/member/repository/MemberRepositoryTest.java @@ -32,8 +32,10 @@ class MemberRepositoryTest { @DisplayName("이메일로 계정 존재 여부 테스트") void testExistsByEmail() { Grade grade = Grade.builder() + .id(1L) .name("test") .pointRatio(20) + .condition(0) .build(); Grade mergedGrade = entityManager.merge(grade); diff --git a/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java b/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java index 8e3bc579..9534be31 100644 --- a/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java +++ b/src/test/java/store/ckin/api/payment/repository/PaymentRepositoryTest.java @@ -53,8 +53,10 @@ class PaymentRepositoryTest { void setUp() { grade = Grade.builder() + .id(1L) .name("GOLD") .pointRatio(10) + .condition(0) .build(); entityManager.persist(grade); diff --git a/src/test/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryTest.java b/src/test/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryTest.java index 24f7fab4..ee439acf 100644 --- a/src/test/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryTest.java +++ b/src/test/java/store/ckin/api/pointhistory/repository/PointHistoryRepositoryTest.java @@ -44,10 +44,13 @@ class PointHistoryRepositoryTest { void setUp() { grade = Grade.builder() + .id(1L) .name("Member") .pointRatio(10) + .condition(0) .build(); + System.out.println("grade = " + grade); entityManager.persist(grade); member = Member.builder() diff --git a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java index 18f6c9c1..ad39e99e 100644 --- a/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java +++ b/src/test/java/store/ckin/api/sale/repository/SaleRepositoryTest.java @@ -59,8 +59,10 @@ class SaleRepositoryTest { void setUp() { grade = Grade.builder() + .id(1L) .name("GOLD") .pointRatio(10) + .condition(0) .build(); entityManager.persist(grade); From 1f878cc1093d47c0d39d80c2d8f1f717916970be Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 17:36:37 +0900 Subject: [PATCH 135/161] =?UTF-8?q?[FEAT]=20=EC=B5=9C=EA=B7=BC=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EB=82=A0=EC=A7=9C=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 18 +++++++++++------- .../store/ckin/api/member/entity/Member.java | 4 ++++ .../ckin/api/member/service/MemberService.java | 2 ++ .../member/service/impl/MemberServiceImpl.java | 9 +++++++++ 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 0b291fae..d402c8d7 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -5,13 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -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 org.springframework.web.bind.annotation.*; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.request.MemberEmailOnlyRequestDto; @@ -101,6 +95,16 @@ public ResponseEntity getOauthMemberInfo( return ResponseEntity.status(HttpStatus.OK).body(responseDto); } + /** + * 서비스를 이용할 때마다 최근 로그인 날짜를 갱신해주는 메서드 입니다. + */ + @PutMapping("/members/{memberId}/update") + public ResponseEntity memberUpdateLoginLog(@PathVariable("memberId") Long memberId) { + memberService.updateLatestLoginAt(memberId); + + return ResponseEntity.status(HttpStatus.OK).build(); + } + /** * MemberController 에서 MemberAlreadyExistsException 이 발생 시 처리하는 Method 입니다. * diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index 33be71c2..e9f50383 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -111,4 +111,8 @@ public enum Role { public void updatePoint(Integer pointUsage) { this.point += pointUsage; } + + public void updateLatestLoginAt() { + this.latestLoginAt = LocalDateTime.now(); + } } diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 6fa5bfb8..6cb34043 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -64,4 +64,6 @@ public interface MemberService { * @param memberEmail 회원 이메일 */ void updateCancelSalePoint(Long saleId, String memberEmail); + + void updateLatestLoginAt(Long memberId); } diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index f79cb8ca..27b8d46b 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -228,4 +228,13 @@ public void updateCancelSalePoint(Long saleId, String memberEmail) { pointHistoryRepository.save(createPointHistory); } } + + @Transactional + @Override + public void updateLatestLoginAt(Long memberId) { + Member member = memberRepository.findById(memberId) + .orElseThrow(MemberNotFoundException::new); + + member.updateLatestLoginAt(); + } } From 5f6d1a8d59774673c215ef93a887a0b49dc899a5 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 22:30:17 +0900 Subject: [PATCH 136/161] =?UTF-8?q?[FEAT]=20=EA=B3=84=EC=A0=95=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=A0=84=ED=99=98=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 38 +++++++++++++------ .../store/ckin/api/member/entity/Member.java | 4 ++ .../MemberCannotChangeStateException.java | 10 +++++ .../api/member/service/MemberService.java | 3 ++ .../service/impl/MemberServiceImpl.java | 18 ++++++++- 5 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index d402c8d7..5c4e006e 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -13,7 +13,9 @@ import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; +import store.ckin.api.member.entity.Member; import store.ckin.api.member.exception.MemberAlreadyExistsException; +import store.ckin.api.member.exception.MemberCannotChangeStateException; import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.service.MemberService; @@ -106,26 +108,40 @@ public ResponseEntity memberUpdateLoginLog(@PathVariable("memberId") Long } /** - * MemberController 에서 MemberAlreadyExistsException 이 발생 시 처리하는 Method 입니다. - * - * @param exception MemberAlreadyExistsException - * @return 409 (Conflict) : 예외 발생 시 계정 생성 실패 + * 계정을 활성화하는 메서드 입니다. + */ + @PutMapping("/members/{memberId}/active") + public ResponseEntity setActiveMember(@PathVariable("memberId") Long memberId) { + memberService.changeState(memberId, Member.State.ACTIVE); + + return ResponseEntity.status(HttpStatus.OK).build(); + } + + /** + * 휴면 계정으로 전환하는 메서드 입니다. */ - @ExceptionHandler({MemberAlreadyExistsException.class}) - public ResponseEntity memberAlreadyExistsExceptionHandler(MemberAlreadyExistsException exception) { + @PutMapping("/members/{memberId}/dormant") + public ResponseEntity setDormantMember(@PathVariable("memberId") Long memberId) { + memberService.changeState(memberId, Member.State.DORMANT); + + return ResponseEntity.status(HttpStatus.OK).build(); + } + + /** + * 409 Code 로 응답을 보내는 ExceptionHandler 입니다. + */ + @ExceptionHandler({MemberAlreadyExistsException.class, MemberCannotChangeStateException.class}) + public ResponseEntity conflictExceptionHandler(Exception exception) { log.debug("{} : {}", exception.getClass().getName(), exception.getMessage()); return ResponseEntity.status(HttpStatus.CONFLICT).build(); } /** - * MemberController 에서 LoginFailedException 발생 시 처리하는 Method 입니다. - * - * @param exception LoginFailedException - * @return 403 (Unauthorized) : 로그인 정보 불일치 + * 404 Code 로 응답을 보내는 ExceptionHandler 입니다. */ @ExceptionHandler({MemberNotFoundException.class}) - public ResponseEntity memberNotFoundExceptionHandler(MemberNotFoundException exception) { + public ResponseEntity notFoundExceptionHandler(MemberNotFoundException exception) { log.debug("{} : {}", exception.getClass().getName(), exception.getMessage()); return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); diff --git a/src/main/java/store/ckin/api/member/entity/Member.java b/src/main/java/store/ckin/api/member/entity/Member.java index e9f50383..7e816c28 100644 --- a/src/main/java/store/ckin/api/member/entity/Member.java +++ b/src/main/java/store/ckin/api/member/entity/Member.java @@ -115,4 +115,8 @@ public void updatePoint(Integer pointUsage) { public void updateLatestLoginAt() { this.latestLoginAt = LocalDateTime.now(); } + + public void changeState(State state) { + this.state = state; + } } diff --git a/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java b/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java new file mode 100644 index 00000000..cbc90e20 --- /dev/null +++ b/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java @@ -0,0 +1,10 @@ +package store.ckin.api.member.exception; + +/** + * 계정 상태를 바꿀 수 없을 때 호출 되는 Exception 클래스 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +public class MemberCannotChangeStateException extends RuntimeException{ +} diff --git a/src/main/java/store/ckin/api/member/service/MemberService.java b/src/main/java/store/ckin/api/member/service/MemberService.java index 6cb34043..30d04429 100644 --- a/src/main/java/store/ckin/api/member/service/MemberService.java +++ b/src/main/java/store/ckin/api/member/service/MemberService.java @@ -7,6 +7,7 @@ import store.ckin.api.member.domain.response.MemberAuthResponseDto; import store.ckin.api.member.domain.response.MemberMyPageResponseDto; import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; +import store.ckin.api.member.entity.Member; /** * Member 의 관한 로직을 처리하는 서비스 인터페이스 입니다. @@ -66,4 +67,6 @@ public interface MemberService { void updateCancelSalePoint(Long saleId, String memberEmail); void updateLatestLoginAt(Long memberId); + + void changeState(Long memberId, Member.State state); } diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 27b8d46b..8d49d0ea 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -18,6 +18,7 @@ import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; import store.ckin.api.member.entity.Member; import store.ckin.api.member.exception.MemberAlreadyExistsException; +import store.ckin.api.member.exception.MemberCannotChangeStateException; import store.ckin.api.member.exception.MemberNotFoundException; import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.member.service.MemberService; @@ -57,6 +58,7 @@ public class MemberServiceImpl implements MemberService { private static final Long NORMAL_GRADE_ID = 1L; @Override + @Transactional(readOnly = true) public boolean alreadyExistsEmail(MemberEmailOnlyRequestDto memberEmailOnlyRequestDto) { return memberRepository.existsByEmail(memberEmailOnlyRequestDto.getEmail()); } @@ -229,12 +231,26 @@ public void updateCancelSalePoint(Long saleId, String memberEmail) { } } - @Transactional @Override + @Transactional public void updateLatestLoginAt(Long memberId) { Member member = memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); member.updateLatestLoginAt(); } + + @Override + @Transactional + public void changeState(Long memberId, Member.State state) { + Member member = memberRepository.findById(memberId) + .orElseThrow(MemberNotFoundException::new); + + + if (member.getState().equals(state)) { + throw new MemberCannotChangeStateException(); + } + + member.changeState(state); + } } From 0e236914599088c8113bd12c7b9748031646a44b Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Thu, 21 Mar 2024 22:32:28 +0900 Subject: [PATCH 137/161] =?UTF-8?q?[REFACTOR]=20Dto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/BookExtractionResponseDto.java | 30 ++----------------- .../response/BookAndBookSaleResponseDto.java | 2 -- .../response/DeliveryPolicyResponseDto.java | 15 ++-------- .../dto/response/PaymentResponseDto.java | 2 -- .../dto/response/PointPolicyResponseDto.java | 13 ++------ 5 files changed, 9 insertions(+), 53 deletions(-) diff --git a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java index 37a8f84f..cbfd9e97 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java @@ -1,11 +1,9 @@ package store.ckin.api.book.dto.response; -import java.util.ArrayList; import java.util.List; -import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; /** * 도서 추출 정보 응답 DTO 클래스입니다. @@ -15,7 +13,8 @@ */ @Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder +@AllArgsConstructor public class BookExtractionResponseDto { private Long bookId; @@ -31,27 +30,4 @@ public class BookExtractionResponseDto { private Integer bookStock; private List categoryIds; - - public BookExtractionResponseDto(Long bookId, String bookImageUrl, String bookTitle, Boolean bookPackaging, - Integer bookSalePrice, Integer bookStock) { - this.bookId = bookId; - this.bookImageUrl = bookImageUrl; - this.bookTitle = bookTitle; - this.bookPackaging = bookPackaging; - this.bookSalePrice = bookSalePrice; - this.bookStock = bookStock; - this.categoryIds = new ArrayList<>(); - } - - @Builder - public BookExtractionResponseDto(Long bookId, String bookImageUrl, String bookTitle, Boolean bookPackaging, - Integer bookSalePrice, Integer bookStock, List categoryIds) { - this.bookId = bookId; - this.bookImageUrl = bookImageUrl; - this.bookTitle = bookTitle; - this.bookPackaging = bookPackaging; - this.bookSalePrice = bookSalePrice; - this.bookStock = bookStock; - this.categoryIds = categoryIds; - } } diff --git a/src/main/java/store/ckin/api/booksale/dto/response/BookAndBookSaleResponseDto.java b/src/main/java/store/ckin/api/booksale/dto/response/BookAndBookSaleResponseDto.java index 64f540fd..764831e9 100644 --- a/src/main/java/store/ckin/api/booksale/dto/response/BookAndBookSaleResponseDto.java +++ b/src/main/java/store/ckin/api/booksale/dto/response/BookAndBookSaleResponseDto.java @@ -2,7 +2,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.ToString; /** * 도서 주문 리스트 정보 응답 DTO 입니다. @@ -11,7 +10,6 @@ * @version 2024. 03. 12. */ -@ToString @Getter @AllArgsConstructor public class BookAndBookSaleResponseDto { diff --git a/src/main/java/store/ckin/api/deliverypolicy/dto/response/DeliveryPolicyResponseDto.java b/src/main/java/store/ckin/api/deliverypolicy/dto/response/DeliveryPolicyResponseDto.java index 6761c37f..a1374a14 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/dto/response/DeliveryPolicyResponseDto.java +++ b/src/main/java/store/ckin/api/deliverypolicy/dto/response/DeliveryPolicyResponseDto.java @@ -1,9 +1,8 @@ package store.ckin.api.deliverypolicy.dto.response; -import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; /** * 배송비 정책 응답 DTO. @@ -13,7 +12,8 @@ */ @Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder +@AllArgsConstructor public class DeliveryPolicyResponseDto { private Long deliveryPolicyId; @@ -23,13 +23,4 @@ public class DeliveryPolicyResponseDto { private Integer deliveryPolicyCondition; private Boolean deliveryPolicyState; - - @Builder - public DeliveryPolicyResponseDto(Long deliveryPolicyId, Integer deliveryPolicyFee, Integer deliveryPolicyCondition, - Boolean deliveryPolicyState) { - this.deliveryPolicyId = deliveryPolicyId; - this.deliveryPolicyFee = deliveryPolicyFee; - this.deliveryPolicyCondition = deliveryPolicyCondition; - this.deliveryPolicyState = deliveryPolicyState; - } } diff --git a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java index 061bf03e..9bc618e6 100644 --- a/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java +++ b/src/main/java/store/ckin/api/payment/dto/response/PaymentResponseDto.java @@ -3,7 +3,6 @@ import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.ToString; import store.ckin.api.payment.entity.PaymentStatus; /** @@ -13,7 +12,6 @@ * @version 2024. 03. 12. */ -@ToString @Getter @AllArgsConstructor public class PaymentResponseDto { diff --git a/src/main/java/store/ckin/api/pointpolicy/dto/response/PointPolicyResponseDto.java b/src/main/java/store/ckin/api/pointpolicy/dto/response/PointPolicyResponseDto.java index a05c1e85..3e994d55 100644 --- a/src/main/java/store/ckin/api/pointpolicy/dto/response/PointPolicyResponseDto.java +++ b/src/main/java/store/ckin/api/pointpolicy/dto/response/PointPolicyResponseDto.java @@ -1,9 +1,8 @@ package store.ckin.api.pointpolicy.dto.response; -import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; /** * 포인트 정책 응답 DTO. @@ -13,7 +12,8 @@ */ @Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder +@AllArgsConstructor public class PointPolicyResponseDto { private Long pointPolicyId; @@ -21,11 +21,4 @@ public class PointPolicyResponseDto { private String pointPolicyName; private Integer pointPolicyReserve; - - @Builder - public PointPolicyResponseDto(Long pointPolicyId, String pointPolicyName, Integer pointPolicyReserve) { - this.pointPolicyId = pointPolicyId; - this.pointPolicyName = pointPolicyName; - this.pointPolicyReserve = pointPolicyReserve; - } } From 20dcb40941aeed7df1a0d99d53a4c528527ca7e8 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Thu, 21 Mar 2024 22:33:47 +0900 Subject: [PATCH 138/161] =?UTF-8?q?[REFACTOR]=20Check=20Style=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/member/controller/MemberController.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/member/controller/MemberController.java b/src/main/java/store/ckin/api/member/controller/MemberController.java index 5c4e006e..ff403a13 100644 --- a/src/main/java/store/ckin/api/member/controller/MemberController.java +++ b/src/main/java/store/ckin/api/member/controller/MemberController.java @@ -5,7 +5,14 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.member.domain.request.MemberAuthRequestDto; import store.ckin.api.member.domain.request.MemberCreateRequestDto; import store.ckin.api.member.domain.request.MemberEmailOnlyRequestDto; From 99573aee7fe8e6a8b1fdd6122c0eaf0bd9f27ce4 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Fri, 22 Mar 2024 00:13:49 +0900 Subject: [PATCH 139/161] [TEST] AddressRepositoryTest --- .../repository/AddressRepositoryTest.java | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/test/java/store/ckin/api/address/repository/AddressRepositoryTest.java diff --git a/src/test/java/store/ckin/api/address/repository/AddressRepositoryTest.java b/src/test/java/store/ckin/api/address/repository/AddressRepositoryTest.java new file mode 100644 index 00000000..2f0d9042 --- /dev/null +++ b/src/test/java/store/ckin/api/address/repository/AddressRepositoryTest.java @@ -0,0 +1,155 @@ +package store.ckin.api.address.repository; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import store.ckin.api.address.entity.Address; +import store.ckin.api.grade.entity.Grade; +import store.ckin.api.member.entity.Member; + +/** + * AddressRepository 테스트 코드 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 21. + */ +@DataJpaTest +class AddressRepositoryTest { + @Autowired + private TestEntityManager entityManager; + + @Autowired + private AddressRepository addressRepository; + + private Member member; + + @BeforeEach + void setUp() { + Grade grade = Grade.builder() + .id(1L) + .name("일반") + .pointRatio(10) + .condition(0) + .build(); + + entityManager.persist(grade); + + member = Member.builder() + .grade(grade) + .email("test@nhn.com") + .password("1234") + .name("tester") + .contact("01012341234") + .birth(LocalDate.of(2024, 1, 1)) + .state(Member.State.ACTIVE) + .latestLoginAt(LocalDateTime.now()) + .role(Member.Role.MEMBER) + .point(5000) + .accumulateAmount(0) + .build(); + + entityManager.persist(member); + } + + @Test + @DisplayName("중복된 주소가 있는지 확인") + void testDuplicateAddress() { + Address address = Address.builder() + .member(member) + .postCode("12345") + .base("광주") + .detail("광역시") + .alias("광산구") + .build(); + + addressRepository.save(address); + + assertTrue(addressRepository.existsByMemberIdAndBaseAndDetail( + member.getId(), + "광주", + "광역시" + )); + assertFalse(addressRepository.existsByMemberIdAndBaseAndDetail( + member.getId(), + "광주", + "광산구" + )); + } + + @Test + @DisplayName("특정 멤버 주소 중 기본 주소가 있는지 확인") + void testFindDefaultAddressByMemberId() { + Address address = Address.builder() + .member(member) + .postCode("12345") + .base("광주") + .detail("광역시") + .alias("광산구") + .isDefault(false) + .build(); + + addressRepository.save(address); + + + assertTrue(addressRepository + .findDefaultAddressByMemberId(member.getId()) + .isEmpty()); + + address.toggleDefault(); + entityManager.merge(address); + + assertTrue(addressRepository + .findDefaultAddressByMemberId(member.getId()) + .isPresent()); + } + + @Test + @DisplayName("주소 ID와 멤버 ID로 주소 조회") + void testFindByIdAndMemberId() { + Address address = Address.builder() + .member(member) + .postCode("12345") + .base("광주") + .detail("광역시") + .alias("광산구") + .build(); + + Address savedAddress = addressRepository.save(address); + + assertTrue(addressRepository + .findByIdAndMember_Id(savedAddress.getId(), member.getId()) + .isPresent()); + assertTrue(addressRepository + .findByIdAndMember_Id(savedAddress.getId(), member.getId() + 1L) + .isEmpty()); + } + + @Test + @DisplayName("주소 ID와 멤버 ID로 주소 존재 여부 확인") + void testExistsByIdAndMemberId() { + Address address = Address.builder() + .member(member) + .postCode("12345") + .base("광주") + .detail("광역시") + .alias("광산구") + .build(); + + Address savedAddress = addressRepository.save(address); + + assertTrue(addressRepository + .existsByIdAndMember_Id(savedAddress.getId(), member.getId())); + assertFalse(addressRepository + .existsByIdAndMember_Id(savedAddress.getId(), member.getId() + 1L)); + } +} \ No newline at end of file From e2939f03f25361e274f188bd83ff7ff601149307 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Fri, 22 Mar 2024 03:03:00 +0900 Subject: [PATCH 140/161] [TEST] AddressService --- .../repository/AddressRepositoryTest.java | 2 - .../service/impl/AddressServiceImplTest.java | 381 ++++++++++++++++++ 2 files changed, 381 insertions(+), 2 deletions(-) create mode 100644 src/test/java/store/ckin/api/address/service/impl/AddressServiceImplTest.java diff --git a/src/test/java/store/ckin/api/address/repository/AddressRepositoryTest.java b/src/test/java/store/ckin/api/address/repository/AddressRepositoryTest.java index 2f0d9042..373fa121 100644 --- a/src/test/java/store/ckin/api/address/repository/AddressRepositoryTest.java +++ b/src/test/java/store/ckin/api/address/repository/AddressRepositoryTest.java @@ -5,8 +5,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; - -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/store/ckin/api/address/service/impl/AddressServiceImplTest.java b/src/test/java/store/ckin/api/address/service/impl/AddressServiceImplTest.java new file mode 100644 index 00000000..a635fd3a --- /dev/null +++ b/src/test/java/store/ckin/api/address/service/impl/AddressServiceImplTest.java @@ -0,0 +1,381 @@ +package store.ckin.api.address.service.impl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyLong; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; +import store.ckin.api.address.domain.request.AddressAddRequestDto; +import store.ckin.api.address.domain.request.AddressUpdateRequestDto; +import store.ckin.api.address.domain.response.MemberAddressResponseDto; +import store.ckin.api.address.entity.Address; +import store.ckin.api.address.exception.AddressAlreadyExistsException; +import store.ckin.api.address.exception.AddressNotFoundException; +import store.ckin.api.address.repository.AddressRepository; +import store.ckin.api.grade.entity.Grade; +import store.ckin.api.member.entity.Member; +import store.ckin.api.member.exception.MemberNotFoundException; +import store.ckin.api.member.repository.MemberRepository; + +/** + * AddressService Test 코드 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 22. + */ +@ExtendWith(MockitoExtension.class) +class AddressServiceImplTest { + @InjectMocks + private AddressServiceImpl addressService; + + @Mock + private AddressRepository addressRepository; + + @Mock + private MemberRepository memberRepository; + + private Member member; + + @BeforeEach + void setUp() { + Grade grade = Grade.builder() + .id(1L) + .name("일반") + .pointRatio(10) + .condition(0) + .build(); + + member = Member.builder() + .id(1L) + .grade(grade) + .email("test@nhn.com") + .password("1234") + .name("tester") + .contact("01012341234") + .birth(LocalDate.of(2024, 1, 1)) + .state(Member.State.ACTIVE) + .latestLoginAt(LocalDateTime.now()) + .role(Member.Role.MEMBER) + .point(5000) + .accumulateAmount(0) + .build(); + } + + @Test + @DisplayName("주소 생성 성공") + void testAddAddressSuccess() { + AddressAddRequestDto dto = new AddressAddRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "111111"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + when(memberRepository.findById(member.getId())) + .thenReturn(Optional.of(member)); + when(addressRepository.existsByMemberIdAndBaseAndDetail(member.getId(), dto.getBase(), dto.getDetail())) + .thenReturn(false); + + addressService.addAddress(member.getId(), dto); + + verify(memberRepository).findById(member.getId()); + verify(addressRepository) + .existsByMemberIdAndBaseAndDetail(member.getId(), dto.getBase(), dto.getDetail()); + verify(addressRepository).save(any(Address.class)); + } + + @Test + @DisplayName("존재하지 않는 멤버로 인한 주소 생성 실패") + void testAddAddressFailedNotFoundMember() { + AddressAddRequestDto dto = new AddressAddRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "111111"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + when(memberRepository.findById(member.getId())) + .thenReturn(Optional.empty()); + + assertThrows(MemberNotFoundException.class, + () -> addressService.addAddress(member.getId(), dto)); + + verify(memberRepository).findById(member.getId()); + verify(addressRepository, never()) + .existsByMemberIdAndBaseAndDetail(anyLong(), anyString(), anyString()); + verify(addressRepository, never()).save(any(Address.class)); + } + + @Test + @DisplayName("중복된 내용의 주소 존재로 인한 주소 생성 실패") + void testAddAddressFailedAddressAlreadyExists() { + AddressAddRequestDto dto = new AddressAddRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "111111"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + when(memberRepository.findById(member.getId())) + .thenReturn(Optional.of(member)); + when(addressRepository.existsByMemberIdAndBaseAndDetail(member.getId(), dto.getBase(), dto.getDetail())) + .thenReturn(true); + + assertThrows(AddressAlreadyExistsException.class, + () -> addressService.addAddress(member.getId(), dto)); + + verify(memberRepository).findById(member.getId()); + verify(addressRepository) + .existsByMemberIdAndBaseAndDetail(member.getId(), dto.getBase(), dto.getDetail()); + verify(addressRepository, never()).save(any(Address.class)); + } + + @Test + @DisplayName("멤버 ID로 저장된 주소 리스트 조회") + void testGetMemberAddressListSuccess() { + MemberAddressResponseDto dto = new MemberAddressResponseDto( + 1L, + "111111", + "광주", + "광역시", + "광산구", + false + ); + + when(memberRepository.existsById(member.getId())) + .thenReturn(true); + + when(addressRepository.getMemberAddressList(member.getId())) + .thenReturn(List.of(dto)); + + List result = + addressService.getMemberAddressList(member.getId()); + + assertEquals(1, result.size()); + + verify(memberRepository).existsById(member.getId()); + verify(addressRepository).getMemberAddressList(member.getId()); + } + + @Test + @DisplayName("멤버 ID로 저장된 주소 리스트 조회 실패") + void testGetMemberAddressListFailed() { + when(memberRepository.existsById(member.getId())) + .thenReturn(false); + + assertThrows(MemberNotFoundException.class, + () -> addressService.getMemberAddressList(member.getId())); + + verify(memberRepository).existsById(member.getId()); + verify(addressRepository, never()).getMemberAddressList(member.getId()); + } + + @Test + @DisplayName("주소 업데이트 성공") + void testUpdateAddressSuccess() { + Address address = Address.builder() + .id(1L) + .member(member) + .postCode("12345") + .base("광주") + .detail("광역시") + .alias("광산구") + .isDefault(false) + .build(); + + AddressUpdateRequestDto dto = new AddressUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "111111"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + when(memberRepository.existsById(member.getId())) + .thenReturn(true); + when(addressRepository.findByIdAndMember_Id(1L, member.getId())) + .thenReturn(Optional.of(address)); + + addressService.updateAddress(1L, member.getId(), dto); + + assertEquals("111111", address.getPostCode()); + assertEquals("우리집", address.getAlias()); + + verify(memberRepository).existsById(member.getId()); + verify(addressRepository).findByIdAndMember_Id(1L, member.getId()); + } + + @Test + @DisplayName("존재하지 않는 멤버로 인한 주소 업데이트 실패") + void testUpdateAddressFailedNotFoundMember() { + AddressUpdateRequestDto dto = new AddressUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "111111"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + when(memberRepository.existsById(member.getId())) + .thenReturn(false); + + assertThrows(MemberNotFoundException.class, + () -> addressService.updateAddress(1L, member.getId(), dto)); + + verify(memberRepository).existsById(member.getId()); + verify(addressRepository, never()).findByIdAndMember_Id(1L, member.getId()); + } + + @Test + @DisplayName("주소 ID 와 멤버 ID 일치하는 주소가 없어서 실패") + void testUpdateAddressFailedNotFoundAddress() { + AddressUpdateRequestDto dto = new AddressUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "111111"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + when(memberRepository.existsById(member.getId())) + .thenReturn(true); + when(addressRepository.findByIdAndMember_Id(1L, member.getId())) + .thenReturn(Optional.empty()); + + assertThrows(AddressNotFoundException.class, + () -> addressService.updateAddress(1L, member.getId(), dto)); + + + verify(memberRepository).existsById(member.getId()); + verify(addressRepository).findByIdAndMember_Id(1L, member.getId()); + } + + @Test + @DisplayName("기본 주소로 변경 성공") + void testSetDefaultAddressSuccess() { + Address address = Address.builder() + .id(1L) + .member(member) + .postCode("12345") + .base("광주") + .detail("광역시") + .alias("광산구") + .isDefault(false) + .build(); + + Address address2 = Address.builder() + .id(2L) + .member(member) + .postCode("323232") + .base("테스트") + .detail("광역시") + .alias("광산구") + .isDefault(true) + .build(); + + when(memberRepository.existsById(member.getId())) + .thenReturn(true); + when(addressRepository.findByIdAndMember_Id(1L, member.getId())) + .thenReturn(Optional.of(address)); + when(addressRepository.findDefaultAddressByMemberId(member.getId())) + .thenReturn(Optional.of(address2)); + + addressService.setDefaultAddress(member.getId(), 1L); + + assertEquals(true, address.getIsDefault()); + assertEquals(false, address2.getIsDefault()); + + verify(memberRepository).existsById(member.getId()); + verify(addressRepository).findByIdAndMember_Id(1L, member.getId()); + verify(addressRepository).findDefaultAddressByMemberId(member.getId()); + } + + @Test + @DisplayName("존재하지 않는 멤버로 인한 기본 주소로 변경 실패") + void testSetDefaultAddressFailedNotFoundMember() { + when(memberRepository.existsById(member.getId())) + .thenReturn(false); + + assertThrows(MemberNotFoundException.class, + () -> addressService.setDefaultAddress(member.getId(), 1L)); + + verify(memberRepository).existsById(member.getId()); + verify(addressRepository, never()).findByIdAndMember_Id(anyLong(), anyLong()); + verify(addressRepository, never()).findDefaultAddressByMemberId(anyLong()); + } + + @Test + @DisplayName("존재하지 않는 주소로 인한 기본 주소로 변경 실패") + void testSetDefaultAddressFailedNotFounAddress() { + when(memberRepository.existsById(member.getId())) + .thenReturn(true); + when(addressRepository.findByIdAndMember_Id(1L, member.getId())) + .thenReturn(Optional.empty()); + + assertThrows(AddressNotFoundException.class, + () -> addressService.setDefaultAddress(member.getId(), 1L)); + + verify(memberRepository).existsById(member.getId()); + verify(addressRepository).findByIdAndMember_Id(1L, member.getId()); + verify(addressRepository, never()).findDefaultAddressByMemberId(anyLong()); + } + + @Test + @DisplayName("주소 삭제 성공") + void testDeleteAddressSuccess() { + when(memberRepository.existsById(1L)) + .thenReturn(true); + when(addressRepository.existsByIdAndMember_Id(1L, 1L)) + .thenReturn(true); + + addressService.deleteAddress(1L, 1L); + + verify(memberRepository).existsById(1L); + verify(addressRepository).existsByIdAndMember_Id(1L, 1L); + verify(addressRepository).deleteById(1L); + } + + @Test + @DisplayName("없는 멤버로 인한 주소 삭제 실패") + void testDeleteAddressFailed() { + when(memberRepository.existsById(1L)) + .thenReturn(false); + + assertThrows(MemberNotFoundException.class, + () -> addressService.deleteAddress(1L, 1L)); + + verify(memberRepository).existsById(1L); + verify(addressRepository, never()).existsByIdAndMember_Id(anyLong(), anyLong()); + verify(addressRepository, never()).deleteById(anyLong()); + } + + @Test + @DisplayName("없는 주소로 인한 주소 삭제 실패") + void testDeleteAddressFailedNotFoundAddress() { + when(memberRepository.existsById(1L)) + .thenReturn(true); + when(addressRepository.existsByIdAndMember_Id(1L, 1L)) + .thenReturn(false); + + assertThrows(AddressNotFoundException.class, + () -> addressService.deleteAddress(1L, 1L)); + + verify(memberRepository).existsById(1L); + verify(addressRepository).existsByIdAndMember_Id(1L, 1L); + verify(addressRepository, never()).deleteById(anyLong()); + } + +} \ No newline at end of file From 0364ba7cfefe988ce154591339b03c175fe8b39c Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 22 Mar 2024 10:07:56 +0900 Subject: [PATCH 141/161] =?UTF-8?q?[REFACTOR]=20Dto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/BookExtractionResponseDto.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java index cbfd9e97..6b44f973 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookExtractionResponseDto.java @@ -1,7 +1,7 @@ package store.ckin.api.book.dto.response; +import java.util.ArrayList; import java.util.List; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -14,7 +14,6 @@ @Getter @Builder -@AllArgsConstructor public class BookExtractionResponseDto { private Long bookId; @@ -29,5 +28,15 @@ public class BookExtractionResponseDto { private Integer bookStock; - private List categoryIds; + private final List categoryIds = new ArrayList<>(); + + public BookExtractionResponseDto(Long bookId, String bookImageUrl, String bookTitle, Boolean bookPackaging, + Integer bookSalePrice, Integer bookStock) { + this.bookId = bookId; + this.bookImageUrl = bookImageUrl; + this.bookTitle = bookTitle; + this.bookPackaging = bookPackaging; + this.bookSalePrice = bookSalePrice; + this.bookStock = bookStock; + } } From 35d08d871439571fa4ccd86a648f0709db0cfea6 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 10:23:18 +0900 Subject: [PATCH 142/161] =?UTF-8?q?[REFACTOR]=20BookServiceImpl=20?= =?UTF-8?q?=EC=B6=A9=EB=8F=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/store/ckin/api/book/service/impl/BookServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java index 41c0f9b1..4008ed5c 100644 --- a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java +++ b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java @@ -199,11 +199,10 @@ public void updateBookThumbnail(Long bookId, MultipartFile file) throws IOExcept File thumbnailFile = book.getThumbnail(); File uploadFile = objectStorageService.saveFile(file, FILE_CATEGORY); - File updateThumbnailFile = thumbnailFile.toBuilder() + thumbnailFile.toBuilder() .fileOriginName(uploadFile.getFileOriginName()) .fileUrl(uploadFile.getFileUrl()) .build(); - fileRepository.save(updateThumbnailFile); } From 1ba70d29f62a7d60e47c98a71064882ae1b49d54 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 10:24:47 +0900 Subject: [PATCH 143/161] =?UTF-8?q?[REFACTOR]=20=EC=B6=A9=EB=8F=8C=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 --- .../UnauthorizedReviewAccessException.java | 13 +++ .../impl/ObjectStorageServiceImplTest.java | 81 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 src/main/java/store/ckin/api/review/exception/UnauthorizedReviewAccessException.java create mode 100644 src/test/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImplTest.java diff --git a/src/main/java/store/ckin/api/review/exception/UnauthorizedReviewAccessException.java b/src/main/java/store/ckin/api/review/exception/UnauthorizedReviewAccessException.java new file mode 100644 index 00000000..576c4bf5 --- /dev/null +++ b/src/main/java/store/ckin/api/review/exception/UnauthorizedReviewAccessException.java @@ -0,0 +1,13 @@ +package store.ckin.api.review.exception; + +/** + * {class name}. + * + * @author 나국로 + * @version 2024. 03. 21. + */ +public class UnauthorizedReviewAccessException extends RuntimeException { + public UnauthorizedReviewAccessException(Long memberId) { + super(String.format("수정 권한이 없습니다: %d", memberId)); + } +} diff --git a/src/test/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImplTest.java b/src/test/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImplTest.java new file mode 100644 index 00000000..801d5e8b --- /dev/null +++ b/src/test/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImplTest.java @@ -0,0 +1,81 @@ +package store.ckin.api.objectstorage.service.impl; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.time.LocalDateTime; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.ResponseEntity; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; +import store.ckin.api.config.ObjectStorageProperties; +import store.ckin.api.file.repository.FileRepository; +import store.ckin.api.objectstorage.dto.response.TokenResponse; +import store.ckin.api.skm.util.KeyManager; + +/** + * ObjectStorageServiceImplTest. + * + * @author 나국로 + * @version 2024. 03. 21. + */ +@ExtendWith(MockitoExtension.class) +class ObjectStorageServiceImplTest { + @Mock + private MultipartFile mockMultipartFile; + + @Mock + private RestTemplate restTemplate; + + @Mock + private FileRepository fileRepository; + + @Mock + private KeyManager keyManager; + + @Mock + private ObjectStorageProperties properties; + @Mock + private ResponseEntity responseEntity; + + @InjectMocks + private ObjectStorageServiceImpl objectStorageService; + + @BeforeEach + void setUp() { + ReflectionTestUtils.setField(objectStorageService, "tokenId", "testTokenId"); + ReflectionTestUtils.setField(objectStorageService, "expires", LocalDateTime.now().plusHours(1)); + } + + @Test + @DisplayName("TokenResponse 객체 생성 테스트") + void createTokenResponse() { + // 테스트에 사용할 데이터 + LocalDateTime expires = LocalDateTime.of(2024, 3, 4, 12, 0); + String tokenId = "testTokenId"; + + // TokenResponse 객체 생성 + TokenResponse.Token token = new TokenResponse.Token(); + ReflectionTestUtils.setField(token, "expires", expires); + ReflectionTestUtils.setField(token, "id", tokenId); + + + TokenResponse.Access access = new TokenResponse.Access(); + ReflectionTestUtils.setField(access, "token", token); + + TokenResponse tokenResponse = new TokenResponse(); + ReflectionTestUtils.setField(tokenResponse, "access", access); + + // 생성된 객체의 필드 값 확인 + assertEquals(expires, tokenResponse.getAccess().getToken().getExpires()); + assertEquals(tokenId, tokenResponse.getAccess().getToken().getId()); + } + + +} From e69ee8e2dee3cb7cedde025ffbe1109a3e82856a Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 22 Mar 2024 11:09:18 +0900 Subject: [PATCH 144/161] =?UTF-8?q?[REFACTOR]=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=B7=A8=EC=86=8C=20-=20=ED=9A=8C=EC=9B=90=EC=9D=B4=20?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EC=95=98=EC=9D=84=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/member/service/impl/MemberServiceImpl.java | 10 +++++----- .../exception/PointHistoryNotFoundException.java | 14 -------------- 2 files changed, 5 insertions(+), 19 deletions(-) delete mode 100644 src/main/java/store/ckin/api/pointhistory/exception/PointHistoryNotFoundException.java diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 8d49d0ea..13562e77 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -23,7 +23,6 @@ import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.member.service.MemberService; import store.ckin.api.pointhistory.entity.PointHistory; -import store.ckin.api.pointhistory.exception.PointHistoryNotFoundException; import store.ckin.api.pointhistory.repository.PointHistoryRepository; import store.ckin.api.pointpolicy.entity.PointPolicy; import store.ckin.api.pointpolicy.exception.PointPolicyNotFoundException; @@ -211,10 +210,11 @@ public void updateCancelSalePoint(Long saleId, String memberEmail) { pointHistoryRepository.save(createPointHistory); } else { - // 결제를 진행한 주문인 경우 - PointHistory pointHistory = pointHistoryRepository.findBySale_SaleId(sale.getSaleId()) - .orElseThrow(PointHistoryNotFoundException::new); - Integer pointHistoryPoint = pointHistory.getPointHistoryPoint(); + + // 주문할 떄 포인트를 사용한 경우 포인트를 환불해줘야함 + int pointHistoryPoint = pointHistoryRepository.findBySale_SaleId(sale.getSaleId()) + .map(PointHistory::getPointHistoryPoint) + .orElse(0); int totalPoint = (sale.getSaleTotalPrice() + sale.getSalePointUsage()) - pointHistoryPoint; member.updatePoint(totalPoint); diff --git a/src/main/java/store/ckin/api/pointhistory/exception/PointHistoryNotFoundException.java b/src/main/java/store/ckin/api/pointhistory/exception/PointHistoryNotFoundException.java deleted file mode 100644 index 935b7622..00000000 --- a/src/main/java/store/ckin/api/pointhistory/exception/PointHistoryNotFoundException.java +++ /dev/null @@ -1,14 +0,0 @@ -package store.ckin.api.pointhistory.exception; - -/** - * 포인트 내역을 찾을 수 없을 때 발생하는 예외입니다. - * - * @author 정승조 - * @version 2024. 03. 19. - */ - -public class PointHistoryNotFoundException extends RuntimeException { - public PointHistoryNotFoundException() { - super("포인트 내역을 찾을 수 없습니다."); - } -} From c890832bcb8b5d2be4ad29c3b3bd3aeb3d75e48b Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Fri, 22 Mar 2024 12:58:03 +0900 Subject: [PATCH 145/161] [TEST] AddressControllerTest --- src/docs/asciidoc/address.adoc | 0 .../address/controller/AddressController.java | 10 +- .../controller/AddressControllerTest.java | 412 ++++++++++++++++++ 3 files changed, 421 insertions(+), 1 deletion(-) create mode 100644 src/docs/asciidoc/address.adoc create mode 100644 src/test/java/store/ckin/api/address/controller/AddressControllerTest.java diff --git a/src/docs/asciidoc/address.adoc b/src/docs/asciidoc/address.adoc new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/store/ckin/api/address/controller/AddressController.java b/src/main/java/store/ckin/api/address/controller/AddressController.java index c711908e..b1c97737 100644 --- a/src/main/java/store/ckin/api/address/controller/AddressController.java +++ b/src/main/java/store/ckin/api/address/controller/AddressController.java @@ -5,7 +5,15 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import store.ckin.api.address.domain.request.AddressAddRequestDto; import store.ckin.api.address.domain.request.AddressUpdateRequestDto; import store.ckin.api.address.domain.response.MemberAddressResponseDto; diff --git a/src/test/java/store/ckin/api/address/controller/AddressControllerTest.java b/src/test/java/store/ckin/api/address/controller/AddressControllerTest.java new file mode 100644 index 00000000..90a158f1 --- /dev/null +++ b/src/test/java/store/ckin/api/address/controller/AddressControllerTest.java @@ -0,0 +1,412 @@ +package store.ckin.api.address.controller; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import store.ckin.api.address.domain.request.AddressAddRequestDto; +import store.ckin.api.address.domain.request.AddressUpdateRequestDto; +import store.ckin.api.address.domain.response.MemberAddressResponseDto; +import store.ckin.api.address.exception.AddressAlreadyExistsException; +import store.ckin.api.address.exception.AddressNotFoundException; +import store.ckin.api.address.service.AddressService; +import store.ckin.api.member.exception.MemberNotFoundException; + +/** + * AddressController 테스트 코드 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 22. + */ +@WebMvcTest(AddressController.class) +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) +class AddressControllerTest { + @Autowired + private MockMvc mockMvc; + + @MockBean + private AddressService addressService; + + private final ObjectMapper objectMapper = + new ObjectMapper() + .registerModule(new JavaTimeModule()); + + @Test + @DisplayName("주소 생성") + void testAddAddress() throws Exception { + AddressAddRequestDto dto = new AddressAddRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "123456"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + doNothing().when(addressService).addAddress(1L, dto); + + mockMvc.perform(RestDocumentationRequestBuilders + .post("/api/members/{memberId}/address", 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isCreated()) + .andDo(document("address/addAddress/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters(parameterWithName("memberId").description("멤버 ID")), + requestFields( + fieldWithPath("postCode").description("우편번호"), + fieldWithPath("base").description("기본주소"), + fieldWithPath("detail").description("상세주소"), + fieldWithPath("alias").description("별칭") + ) + )); + + verify(addressService).addAddress(anyLong(), any()); + } + + @Test + @DisplayName("주소 생성 실패 : 이미 등록된 정보의 주소") + void testAddAddressFailedAlreadyExistsAddress() throws Exception { + AddressAddRequestDto dto = new AddressAddRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "123456"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + doThrow(AddressAlreadyExistsException.class) + .when(addressService).addAddress(anyLong(), any(AddressAddRequestDto.class)); + + mockMvc.perform(RestDocumentationRequestBuilders + .post("/api/members/{memberId}/address", 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isBadRequest()) + .andDo(document("address/addAddress/conflict", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).addAddress(anyLong(), any()); + } + + @Test + @DisplayName("멤버별 주소 조회") + void testGetMemberAddressList() throws Exception { + MemberAddressResponseDto address = new MemberAddressResponseDto( + 1L, + "123456", + "광주 광역시", + "광산구 월계로", + "우리집", + false + ); + + MemberAddressResponseDto address2 = new MemberAddressResponseDto( + 1L, + "427891", + "광주 광역시", + "조선대학교", + "학교", + false + ); + + when(addressService.getMemberAddressList(1L)) + .thenReturn(List.of(address, address2)); + + mockMvc.perform(RestDocumentationRequestBuilders + .get("/api/members/{memberId}/address", 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpectAll( + jsonPath("$.[0].addressId").value(address.getAddressId()), + jsonPath("$.[0].postCode").value(address.getPostCode()), + jsonPath("$.[0].base").value(address.getBase()), + jsonPath("$.[0].detail").value(address.getDetail()), + jsonPath("$.[0].alias").value(address.getAlias()), + jsonPath("$.[0].isDefault").value(address.getIsDefault())) + .andDo(document("address/getMemberAddressList/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters(parameterWithName("memberId").description("멤버 ID")), + responseFields( + fieldWithPath("[].addressId").description("주소 ID"), + fieldWithPath("[].postCode").description("우편 번호"), + fieldWithPath("[].base").description("기본 주소"), + fieldWithPath("[].detail").description("상세 주소"), + fieldWithPath("[].alias").description("별칭"), + fieldWithPath("[].isDefault").description("계정 기본 주소 설정 여부") + ) + )); + + verify(addressService).getMemberAddressList(1L); + } + + @Test + @DisplayName("존재하지 않는 멤버 ID로 조회 시, 멤버별 주소 조회 실패") + void testGetMemberAddressListFailedNotFoundMember() throws Exception { + doThrow(MemberNotFoundException.class) + .when(addressService) + .getMemberAddressList(1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .get("/api/members/{memberId}/address", 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andDo(document("address/getMemberAddressList/not-found-member", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).getMemberAddressList(1L); + } + + @Test + @DisplayName("존재하지 않는 주소 ID로 조회 시, 멤버별 주소 조회 실패") + void testGetMemberAddressListFailedNotFoundAddress() throws Exception { + doThrow(AddressNotFoundException.class) + .when(addressService) + .getMemberAddressList(1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .get("/api/members/{memberId}/address", 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andDo(document("address/getMemberAddressList/not-found-address", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).getMemberAddressList(1L); + } + + @Test + @DisplayName("주소 업데이트") + void testUpdateAddress() throws Exception { + AddressUpdateRequestDto dto = new AddressUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "123456"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + doNothing().when(addressService).updateAddress(1L, 1L, dto); + + mockMvc.perform(RestDocumentationRequestBuilders + .put("/api/members/{memberId}/addresses/{addressId}", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isOk()) + .andDo(document("address/updateAddress/not-found", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("memberId").description("멤버 ID"), + parameterWithName("addressId").description("주소 ID")), + requestFields( + fieldWithPath("postCode").description("우편번호"), + fieldWithPath("base").description("기본주소"), + fieldWithPath("detail").description("상세주소"), + fieldWithPath("alias").description("별칭") + ) + )); + + verify(addressService).updateAddress(anyLong(), anyLong(), any()); + } + + @Test + @DisplayName("없는 멤버 ID로 요청 시, 주소 업데이트 실패") + void testUpdateAddressNotFoundMember() throws Exception { + AddressUpdateRequestDto dto = new AddressUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "123456"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + doThrow(MemberNotFoundException.class) + .when(addressService) + .updateAddress(anyLong(), anyLong(), any(AddressUpdateRequestDto.class)); + + mockMvc.perform(RestDocumentationRequestBuilders + .put("/api/members/{memberId}/addresses/{addressId}", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isNotFound()) + .andDo(document("address/updateAddress/not-found-member", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).updateAddress(anyLong(), anyLong(), any()); + } + + @Test + @DisplayName("없는 주소 ID로 요청 시, 주소 업데이트 실패") + void testUpdateAddressNotFoundAddress() throws Exception { + AddressUpdateRequestDto dto = new AddressUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "postCode", "123456"); + ReflectionTestUtils.setField(dto, "base", "광주"); + ReflectionTestUtils.setField(dto, "detail", "광역시"); + ReflectionTestUtils.setField(dto, "alias", "우리집"); + + doThrow(AddressNotFoundException.class) + .when(addressService) + .updateAddress(anyLong(), anyLong(), any(AddressUpdateRequestDto.class)); + + mockMvc.perform(RestDocumentationRequestBuilders + .put("/api/members/{memberId}/addresses/{addressId}", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isNotFound()) + .andDo(document("address/updateAddress/not-found-address", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).updateAddress(anyLong(), anyLong(), any()); + } + + @Test + @DisplayName("기본 주소지로 설정") + void testSetDefaultAddress() throws Exception { + doNothing().when(addressService).setDefaultAddress(1L, 1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .put("/api/members/{memberId}/addresses/{addressId}/default", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(document("address/setDefaultAddress/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("memberId").description("멤버 ID"), + parameterWithName("addressId").description("주소 ID")) + )); + + verify(addressService).setDefaultAddress(anyLong(), anyLong()); + } + + @Test + @DisplayName("없는 멤버 ID로 요청 시, 기본 주소지로 설정 실패") + void testSetDefaultAddressFailedNotFoundMember() throws Exception { + doThrow(MemberNotFoundException.class) + .when(addressService) + .setDefaultAddress(1L, 1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .put("/api/members/{memberId}/addresses/{addressId}/default", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andDo(document("address/setDefaultAddress/not-found-member", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).setDefaultAddress(anyLong(), anyLong()); + } + + @Test + @DisplayName("없는 주소 ID로 요청 시, 기본 주소지로 설정 실패") + void testSetDefaultAddressFailedNotFoundAddress() throws Exception { + doThrow(AddressNotFoundException.class) + .when(addressService) + .setDefaultAddress(1L, 1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .put("/api/members/{memberId}/addresses/{addressId}/default", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andDo(document("address/setDefaultAddress/not-found-member", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).setDefaultAddress(anyLong(), anyLong()); + } + + @Test + @DisplayName("주소 삭제") + void testDeleteAddress() throws Exception { + doNothing().when(addressService).deleteAddress(1L, 1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .delete("/api/members/{memberId}/addresses/{addressId}", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(document("address/deleteAddress/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("memberId").description("멤버 ID"), + parameterWithName("addressId").description("주소 ID")) + )); + + verify(addressService).deleteAddress(anyLong(), anyLong()); + } + + @Test + @DisplayName("없는 멤버 ID 로 요청 시, 주소 삭제 실패") + void testDeleteAddressFailedNotFoundMember() throws Exception { + doThrow(MemberNotFoundException.class) + .when(addressService) + .deleteAddress(1L, 1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .delete("/api/members/{memberId}/addresses/{addressId}", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andDo(document("address/deleteAddress/not-found-member", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).deleteAddress(anyLong(), anyLong()); + } + + @Test + @DisplayName("없는 주소 ID 로 요청 시, 주소 삭제 실패") + void testDeleteAddressFailedNotFoundAddress() throws Exception { + doThrow(MemberNotFoundException.class) + .when(addressService) + .deleteAddress(1L, 1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .delete("/api/members/{memberId}/addresses/{addressId}", 1L, 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andDo(document("address/deleteAddress/not-found-member", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(addressService).deleteAddress(anyLong(), anyLong()); + } +} \ No newline at end of file From c5c46ba109db7944d45360e958781ff179e6dd9f Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Fri, 22 Mar 2024 13:44:16 +0900 Subject: [PATCH 146/161] [FEAT] GradeServiceTest --- .../service/impl/GradeServiceImplTest.java | 174 ++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 src/test/java/store/ckin/api/grade/service/impl/GradeServiceImplTest.java diff --git a/src/test/java/store/ckin/api/grade/service/impl/GradeServiceImplTest.java b/src/test/java/store/ckin/api/grade/service/impl/GradeServiceImplTest.java new file mode 100644 index 00000000..c6292df1 --- /dev/null +++ b/src/test/java/store/ckin/api/grade/service/impl/GradeServiceImplTest.java @@ -0,0 +1,174 @@ +package store.ckin.api.grade.service.impl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; +import store.ckin.api.grade.domain.request.GradeCreateRequestDto; +import store.ckin.api.grade.domain.request.GradeUpdateRequestDto; +import store.ckin.api.grade.entity.Grade; +import store.ckin.api.grade.exception.GradeAlreadyExistsException; +import store.ckin.api.grade.exception.GradeNotFoundException; +import store.ckin.api.grade.repository.GradeRepository; + +/** + * GradeService 테스트 코드 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 22. + */ +@ExtendWith(MockitoExtension.class) +class GradeServiceImplTest { + @Mock + private GradeRepository gradeRepository; + + @InjectMocks + private GradeServiceImpl gradeService; + + @Test + @DisplayName("등급 생성") + void testCreateGrade() { + GradeCreateRequestDto dto = new GradeCreateRequestDto(); + + ReflectionTestUtils.setField(dto, "id", 1L); + ReflectionTestUtils.setField(dto, "name", "일반"); + ReflectionTestUtils.setField(dto, "pointRatio", 5); + ReflectionTestUtils.setField(dto, "condition", 100000); + + when(gradeRepository.existsById(dto.getId())) + .thenReturn(false); + + gradeService.createGrade(dto); + + verify(gradeRepository).existsById(dto.getId()); + verify(gradeRepository).save(any(Grade.class)); + } + + @Test + @DisplayName("등급 생성 실패") + void testCreateGradeFailed() { + GradeCreateRequestDto dto = new GradeCreateRequestDto(); + + ReflectionTestUtils.setField(dto, "id", 1L); + ReflectionTestUtils.setField(dto, "name", "일반"); + ReflectionTestUtils.setField(dto, "pointRatio", 5); + ReflectionTestUtils.setField(dto, "condition", 100000); + + when(gradeRepository.existsById(dto.getId())) + .thenReturn(true); + + assertThrows(GradeAlreadyExistsException.class, + () -> gradeService.createGrade(dto)); + + verify(gradeRepository).existsById(dto.getId()); + verify(gradeRepository, never()).save(any(Grade.class)); + } + + @Test + @DisplayName("모든 등급 조회") + void testGetGradeList() { + Grade normalGrade = Grade.builder() + .id(1L) + .name("일반") + .pointRatio(5) + .condition(0) + .build(); + + Grade royalGrade = Grade.builder() + .id(2L) + .name("로얄") + .pointRatio(10) + .condition(100000) + .build(); + + when(gradeRepository.findAll()) + .thenReturn(List.of(normalGrade, royalGrade)); + + List result = gradeService.getGradeList(); + + assertEquals(2, result.size()); + assertEquals(1L, result.get(0).getId()); + assertEquals(100000, result.get(1).getCondition()); + + verify(gradeRepository).findAll(); + } + + @Test + @DisplayName("등급 변경") + void testUpdateGrade() { + Grade grade = Grade.builder() + .id(1L) + .name("일반") + .pointRatio(5) + .condition(0) + .build(); + + GradeUpdateRequestDto dto = new GradeUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "name", "일반"); + ReflectionTestUtils.setField(dto, "pointRatio", 10); + ReflectionTestUtils.setField(dto, "condition", 100000); + + when(gradeRepository.findById(1L)) + .thenReturn(Optional.of(grade)); + + gradeService.updateGrade(1L, dto); + + assertEquals(10, grade.getPointRatio()); + + verify(gradeRepository).findById(1L); + } + + @Test + @DisplayName("등급 변경 실패") + void testUpdateGradeFailed() { + GradeUpdateRequestDto dto = new GradeUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "name", "일반"); + ReflectionTestUtils.setField(dto, "pointRatio", 10); + ReflectionTestUtils.setField(dto, "condition", 100000); + + when(gradeRepository.findById(1L)) + .thenReturn(Optional.empty()); + + assertThrows(GradeNotFoundException.class, + () -> gradeService.updateGrade(1L, dto)); + + verify(gradeRepository).findById(1L); + } + + @Test + @DisplayName("등급 삭제") + void testDeleteGrade() { + when(gradeRepository.existsById(1L)) + .thenReturn(true); + + gradeService.deleteGrade(1L); + + verify(gradeRepository).deleteById(1L); + } + + @Test + @DisplayName("등급 삭제 실패") + void testDeleteGradeFailed() { + when(gradeRepository.existsById(1L)) + .thenReturn(false); + + assertThrows(GradeNotFoundException.class, + () -> gradeService.deleteGrade(1L)); + + verify(gradeRepository, never()).deleteById(1L); + } +} \ No newline at end of file From eff370beb060a2b60cdd42dd93d1c4c09c7acceb Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 22 Mar 2024 14:18:24 +0900 Subject: [PATCH 147/161] [FEAT] Exception Handling --- .../AddressAlreadyExistsException.java | 8 +- .../exception/AddressNotFoundException.java | 8 +- .../service/impl/AddressServiceImpl.java | 22 ++-- .../ckin/api/advice/WebControllerAdvice.java | 36 ------ .../api/advice/WebRestControllerAdvice.java | 108 ++++++++++++++++++ .../GeneralAlreadyExistsException.java | 14 +++ .../exception/GeneralBadRequestException.java | 14 +++ .../exception/GeneralForbiddenException.java | 14 +++ .../exception/GeneralNotFoundException.java | 14 +++ .../exception/AuthorNotFoundException.java | 4 +- .../book/exception/BookNotFoundException.java | 6 +- .../exception/CategoryNotFoundException.java | 4 +- .../ckin/api/common/dto/ErrorResponse.java | 3 +- .../DeliveryPolicyNotActiveException.java | 4 +- .../DeliveryPolicyNotFoundException.java | 4 +- .../file/exception/FileNotFoundException.java | 2 +- .../GradeAlreadyExistsException.java | 8 +- .../exception/GradeNotFoundException.java | 8 +- .../grade/service/impl/GradeServiceImpl.java | 6 +- .../MemberAlreadyExistsException.java | 4 +- .../MemberCannotChangeStateException.java | 9 +- .../exception/MemberNotFoundException.java | 6 +- .../MemberOauthNotFoundException.java | 15 +++ .../service/impl/MemberServiceImpl.java | 13 ++- .../impl/ObjectStorageServiceImpl.java | 10 +- .../PackagingAlreadyExistsException.java | 4 +- .../exception/PackagingNotFoundException.java | 4 +- .../PaymentAmountNotCorrectException.java | 8 +- .../PaymentNotCompleteException.java | 4 +- .../api/payment/facade/PaymentFacade.java | 2 +- .../PointPolicyAlreadyExistsException.java | 4 +- .../PointPolicyNotFoundException.java | 4 +- .../exception/ReviewNotFoundException.java | 4 +- .../SaleMemberNotMatchException.java | 4 +- .../sale/exception/SaleNotFoundException.java | 4 +- .../SaleNotFoundExceptionBySaleNumber.java | 4 +- .../SaleNumberNotFoundException.java | 4 +- .../SaleOrdererContactNotMatchException.java | 6 +- .../ckin/api/sale/facade/SaleFacade.java | 4 +- .../api/skm/exception/KeyMangerException.java | 2 +- .../api/tag/controller/TagController.java | 35 ------ .../TagNameAlreadyExistException.java | 6 +- .../tag/exception/TagNotFoundException.java | 6 +- .../WishListAlreadyExistsException.java | 8 +- .../service/impl/WishListServiceImpl.java | 10 +- .../api/tag/controller/TagControllerTest.java | 9 +- 46 files changed, 333 insertions(+), 147 deletions(-) delete mode 100644 src/main/java/store/ckin/api/advice/WebControllerAdvice.java create mode 100644 src/main/java/store/ckin/api/advice/WebRestControllerAdvice.java create mode 100644 src/main/java/store/ckin/api/advice/exception/GeneralAlreadyExistsException.java create mode 100644 src/main/java/store/ckin/api/advice/exception/GeneralBadRequestException.java create mode 100644 src/main/java/store/ckin/api/advice/exception/GeneralForbiddenException.java create mode 100644 src/main/java/store/ckin/api/advice/exception/GeneralNotFoundException.java create mode 100644 src/main/java/store/ckin/api/member/exception/MemberOauthNotFoundException.java diff --git a/src/main/java/store/ckin/api/address/exception/AddressAlreadyExistsException.java b/src/main/java/store/ckin/api/address/exception/AddressAlreadyExistsException.java index fe173c31..80523466 100644 --- a/src/main/java/store/ckin/api/address/exception/AddressAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/address/exception/AddressAlreadyExistsException.java @@ -1,10 +1,16 @@ package store.ckin.api.address.exception; +import store.ckin.api.advice.exception.GeneralAlreadyExistsException; + /** * 이미 등록된 주소일 때 호출되는 Exception 클래스 입니다. * * @author : jinwoolee * @version : 2024. 03. 18. */ -public class AddressAlreadyExistsException extends RuntimeException{ +public class AddressAlreadyExistsException extends GeneralAlreadyExistsException { + + public AddressAlreadyExistsException(Long memberId, String base, String detail) { + super(String.format("이미 등록된 주소입니다. [회원 ID = %d, Address = %s %s] ", memberId, base, detail)); + } } diff --git a/src/main/java/store/ckin/api/address/exception/AddressNotFoundException.java b/src/main/java/store/ckin/api/address/exception/AddressNotFoundException.java index 611f3a1e..1897a888 100644 --- a/src/main/java/store/ckin/api/address/exception/AddressNotFoundException.java +++ b/src/main/java/store/ckin/api/address/exception/AddressNotFoundException.java @@ -1,10 +1,16 @@ package store.ckin.api.address.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 조회한 주소가 없을 때 호출되는 Exception 클래스 입니다. * * @author : jinwoolee * @version : 2024. 03. 18. */ -public class AddressNotFoundException extends RuntimeException{ +public class AddressNotFoundException extends GeneralNotFoundException { + + public AddressNotFoundException(Long memberId, Long addressId) { + super(String.format("주소를 찾을 수 없습니다. [회원 ID = %d, 주소 ID = %d]", memberId, addressId)); + } } diff --git a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java index e52c6447..60a41637 100644 --- a/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java +++ b/src/main/java/store/ckin/api/address/service/impl/AddressServiceImpl.java @@ -34,13 +34,14 @@ public class AddressServiceImpl implements AddressService { public void addAddress(Long memberId, AddressAddRequestDto addressAddRequestDto) { Member member = memberRepository.findById(memberId) - .orElseThrow(MemberNotFoundException::new); + .orElseThrow(() -> new MemberNotFoundException(memberId)); if (addressRepository.existsByMemberIdAndBaseAndDetail( memberId, addressAddRequestDto.getBase(), addressAddRequestDto.getDetail())) { - throw new AddressAlreadyExistsException(); + throw new AddressAlreadyExistsException(memberId, addressAddRequestDto.getBase(), + addressAddRequestDto.getDetail()); } Address address = Address.builder() @@ -58,7 +59,7 @@ public void addAddress(Long memberId, @Override public List getMemberAddressList(Long memberId) { if (!memberRepository.existsById(memberId)) { - throw new MemberNotFoundException(); + throw new MemberNotFoundException(memberId); } return addressRepository.getMemberAddressList(memberId); @@ -69,12 +70,13 @@ public List getMemberAddressList(Long memberId) { public void updateAddress(Long memberId, Long addressId, AddressUpdateRequestDto addressUpdateRequestDto) { + if (!memberRepository.existsById(memberId)) { - throw new MemberNotFoundException(); + throw new MemberNotFoundException(memberId); } Address address = addressRepository.findByIdAndMember_Id(addressId, memberId) - .orElseThrow(AddressNotFoundException::new); + .orElseThrow(() -> new AddressNotFoundException(memberId, addressId)); address.update(addressUpdateRequestDto); } @@ -83,15 +85,15 @@ public void updateAddress(Long memberId, @Override public void setDefaultAddress(Long memberId, Long addressId) { if (!memberRepository.existsById(memberId)) { - throw new MemberNotFoundException(); + throw new MemberNotFoundException(memberId); } Address address = addressRepository.findByIdAndMember_Id(addressId, memberId) - .orElseThrow(AddressNotFoundException::new); + .orElseThrow(() -> new AddressNotFoundException(memberId, addressId)); if (!address.getIsDefault()) { addressRepository.findDefaultAddressByMemberId(memberId) - .ifPresent(Address::toggleDefault); + .ifPresent(Address::toggleDefault); address.toggleDefault(); } @@ -101,11 +103,11 @@ public void setDefaultAddress(Long memberId, Long addressId) { @Override public void deleteAddress(Long memberId, Long addressId) { if (!memberRepository.existsById(memberId)) { - throw new MemberNotFoundException(); + throw new MemberNotFoundException(memberId); } if (!addressRepository.existsByIdAndMember_Id(addressId, memberId)) { - throw new AddressNotFoundException(); + throw new AddressNotFoundException(memberId, addressId); } addressRepository.deleteById(addressId); diff --git a/src/main/java/store/ckin/api/advice/WebControllerAdvice.java b/src/main/java/store/ckin/api/advice/WebControllerAdvice.java deleted file mode 100644 index 236ea3d7..00000000 --- a/src/main/java/store/ckin/api/advice/WebControllerAdvice.java +++ /dev/null @@ -1,36 +0,0 @@ -package store.ckin.api.advice; - -import java.util.List; -import java.util.stream.Collectors; -import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import store.ckin.api.deliverypolicy.exception.DeliveryPolicyNotActiveException; - -/** - * Controller Advice 입니다. - * - * @author 정승조 - * @version 2024. 02. 16. - */ - -@RestControllerAdvice -public class WebControllerAdvice { - - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleValidationException(MethodArgumentNotValidException e) { - List errors = e.getAllErrors().stream() - .map(DefaultMessageSourceResolvable::getDefaultMessage) - .collect(Collectors.toList()); - - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors); - } - - @ExceptionHandler({DeliveryPolicyNotActiveException.class}) - public ResponseEntity handleDeliveryPolicyNotActiveException(DeliveryPolicyNotActiveException e) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); - } -} diff --git a/src/main/java/store/ckin/api/advice/WebRestControllerAdvice.java b/src/main/java/store/ckin/api/advice/WebRestControllerAdvice.java new file mode 100644 index 00000000..4b373cb4 --- /dev/null +++ b/src/main/java/store/ckin/api/advice/WebRestControllerAdvice.java @@ -0,0 +1,108 @@ +package store.ckin.api.advice; + +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import store.ckin.api.advice.exception.GeneralAlreadyExistsException; +import store.ckin.api.advice.exception.GeneralBadRequestException; +import store.ckin.api.advice.exception.GeneralForbiddenException; +import store.ckin.api.advice.exception.GeneralNotFoundException; +import store.ckin.api.common.dto.ErrorResponse; + +/** + * Controller Advice 입니다. + * + * @author 정승조 + * @version 2024. 02. 16. + */ + +@RestControllerAdvice +public class WebRestControllerAdvice { + + /** + * Validation 예외 처리 핸들러입니다. + * + * @param e MethodArgumentNotValidException + * @return 400(BAD REQUEST), Error Message + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleValidationException(MethodArgumentNotValidException e) { + List errors = e.getAllErrors().stream() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .collect(Collectors.toList()); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors); + } + + /** + * 전역으로 발생하는 Not Found Exception 처리 핸들러입니다. + * + * @param e xxxNotFoundException + * @return 404(NOT FOUND), Error Message + */ + @ExceptionHandler(GeneralNotFoundException.class) + public ResponseEntity handleNotFoundException(GeneralNotFoundException e) { + + ErrorResponse errorResponse = ErrorResponse.builder() + .code(HttpStatus.NOT_FOUND) + .message(e.getMessage()) + .build(); + + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse); + } + + /** + * 전역으로 발생하는 Already Exists Exception 처리 핸들러입니다. + * + * @param e xxxAlreadyExistsException + * @return 409(CONFLICT), Error Message + */ + @ExceptionHandler(GeneralAlreadyExistsException.class) + public ResponseEntity handleAlreadyExistsException(GeneralAlreadyExistsException e) { + + ErrorResponse errorResponse = ErrorResponse.builder() + .code(HttpStatus.CONFLICT) + .message(e.getMessage()) + .build(); + + return ResponseEntity.status(HttpStatus.CONFLICT).body(errorResponse); + } + + /** + * 전역으로 발생하는 BadRequest Exception 처리 핸들러입니다. + * + * @param e GeneralBadRequestException + * @return 400(BAD REQUEST), Error Message + */ + @ExceptionHandler(GeneralBadRequestException.class) + public ResponseEntity handleBadRequestException(GeneralBadRequestException e) { + ErrorResponse errorResponse = ErrorResponse.builder() + .code(HttpStatus.BAD_REQUEST) + .message(e.getMessage()) + .build(); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse); + } + + /** + * 전역으로 발생하는 Forbidden Exception 처리 핸들러입니다. + * + * @param e GeneralForbiddenException + * @return 403(FORBIDDEN), Error Message + */ + @ExceptionHandler(GeneralForbiddenException.class) + public ResponseEntity handleForbiddenException(GeneralForbiddenException e) { + ErrorResponse errorResponse = ErrorResponse.builder() + .code(HttpStatus.FORBIDDEN) + .message(e.getMessage()) + .build(); + + return ResponseEntity.status(HttpStatus.FORBIDDEN).body(errorResponse); + } + +} diff --git a/src/main/java/store/ckin/api/advice/exception/GeneralAlreadyExistsException.java b/src/main/java/store/ckin/api/advice/exception/GeneralAlreadyExistsException.java new file mode 100644 index 00000000..04443c13 --- /dev/null +++ b/src/main/java/store/ckin/api/advice/exception/GeneralAlreadyExistsException.java @@ -0,0 +1,14 @@ +package store.ckin.api.advice.exception; + +/** + * 이미 존재하는 데이터일 때 발생하는 에러를 전역으로 처리하기 위한 클래스. + * + * @author 정승조 + * @version 2024. 03. 22. + */ +public class GeneralAlreadyExistsException extends RuntimeException { + + public GeneralAlreadyExistsException(String message) { + super(message); + } +} diff --git a/src/main/java/store/ckin/api/advice/exception/GeneralBadRequestException.java b/src/main/java/store/ckin/api/advice/exception/GeneralBadRequestException.java new file mode 100644 index 00000000..d74c4268 --- /dev/null +++ b/src/main/java/store/ckin/api/advice/exception/GeneralBadRequestException.java @@ -0,0 +1,14 @@ +package store.ckin.api.advice.exception; + +/** + * 잘못된 요청이 발생했을 때 발생하는 예외를 전역으로 처리하기 위한 클래스. + * + * @author 정승조 + * @version 2024. 03. 22. + */ +public class GeneralBadRequestException extends RuntimeException { + + public GeneralBadRequestException(String message) { + super(message); + } +} diff --git a/src/main/java/store/ckin/api/advice/exception/GeneralForbiddenException.java b/src/main/java/store/ckin/api/advice/exception/GeneralForbiddenException.java new file mode 100644 index 00000000..ac64e70e --- /dev/null +++ b/src/main/java/store/ckin/api/advice/exception/GeneralForbiddenException.java @@ -0,0 +1,14 @@ +package store.ckin.api.advice.exception; + +/** + * 권한이 없을 때 발생하는 에러를 전역으로 처리하기 위한 클래스. + * + * @author 정승조 + * @version 2024. 03. 22. + */ +public class GeneralForbiddenException extends RuntimeException { + + public GeneralForbiddenException(String message) { + super(message); + } +} diff --git a/src/main/java/store/ckin/api/advice/exception/GeneralNotFoundException.java b/src/main/java/store/ckin/api/advice/exception/GeneralNotFoundException.java new file mode 100644 index 00000000..407e80b6 --- /dev/null +++ b/src/main/java/store/ckin/api/advice/exception/GeneralNotFoundException.java @@ -0,0 +1,14 @@ +package store.ckin.api.advice.exception; + +/** + * 존재하지 않는 데이터일 때 발생하는 에러를 전역으로 처리하기 위한 클래스. + * + * @author 정승조 + * @version 2024. 03. 22. + */ +public class GeneralNotFoundException extends RuntimeException { + + public GeneralNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/store/ckin/api/author/exception/AuthorNotFoundException.java b/src/main/java/store/ckin/api/author/exception/AuthorNotFoundException.java index a477bda7..8f9f36d7 100644 --- a/src/main/java/store/ckin/api/author/exception/AuthorNotFoundException.java +++ b/src/main/java/store/ckin/api/author/exception/AuthorNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.author.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * AuthorNotFoundException 클래스. * * @author 나국로 * @version 2024. 02. 16. */ -public class AuthorNotFoundException extends RuntimeException { +public class AuthorNotFoundException extends GeneralNotFoundException { /** diff --git a/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java b/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java index b5cb7223..527376fe 100644 --- a/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java +++ b/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java @@ -1,14 +1,14 @@ package store.ckin.api.book.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * BookNotFoundException 예외 클래스. * * @author 나국로 * @version 2024. 02. 26. */ -public class BookNotFoundException extends RuntimeException { - public BookNotFoundException() { - } +public class BookNotFoundException extends GeneralNotFoundException { public BookNotFoundException(Long bookId) { super(String.format("책(id: %d)을 찾을 수 없습니다", bookId)); diff --git a/src/main/java/store/ckin/api/category/exception/CategoryNotFoundException.java b/src/main/java/store/ckin/api/category/exception/CategoryNotFoundException.java index cb743ce8..e1123644 100644 --- a/src/main/java/store/ckin/api/category/exception/CategoryNotFoundException.java +++ b/src/main/java/store/ckin/api/category/exception/CategoryNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.category.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * CategoryNotFoundException. * * @author 나국로 * @version 2024. 02. 16. */ -public class CategoryNotFoundException extends RuntimeException { +public class CategoryNotFoundException extends GeneralNotFoundException { public CategoryNotFoundException(Long categoryId) { super(String.format("Category not found: %s", categoryId)); diff --git a/src/main/java/store/ckin/api/common/dto/ErrorResponse.java b/src/main/java/store/ckin/api/common/dto/ErrorResponse.java index c4b3d11a..498d13a9 100644 --- a/src/main/java/store/ckin/api/common/dto/ErrorResponse.java +++ b/src/main/java/store/ckin/api/common/dto/ErrorResponse.java @@ -3,6 +3,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import org.springframework.http.HttpStatus; /** * Exception 발생 시 정보를 담아 JSON 형태로 응답하기 위한 클래스 @@ -14,6 +15,6 @@ @Builder @Getter public class ErrorResponse { - private final String code; + private final HttpStatus code; private final String message; } diff --git a/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotActiveException.java b/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotActiveException.java index 07186f4f..43c5a070 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotActiveException.java +++ b/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotActiveException.java @@ -1,12 +1,14 @@ package store.ckin.api.deliverypolicy.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 배송 정책이 활성화되지 않은 경우 발생하는 예외입니다. * * @author 정승조 * @version 2024. 02. 27. */ -public class DeliveryPolicyNotActiveException extends RuntimeException { +public class DeliveryPolicyNotActiveException extends GeneralNotFoundException { public DeliveryPolicyNotActiveException() { super("Delivery Policy is not active!"); diff --git a/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotFoundException.java b/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotFoundException.java index fd42ae51..4f1d9682 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotFoundException.java +++ b/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.deliverypolicy.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 배송비 정책 Not Found 예외 클래스입니다. * * @author 정승조 * @version 2024. 02. 15. */ -public class DeliveryPolicyNotFoundException extends RuntimeException { +public class DeliveryPolicyNotFoundException extends GeneralNotFoundException { public DeliveryPolicyNotFoundException(Long id) { super(String.format("Delivery Policy Not Found [id = %d]", id)); diff --git a/src/main/java/store/ckin/api/file/exception/FileNotFoundException.java b/src/main/java/store/ckin/api/file/exception/FileNotFoundException.java index 75c97876..345c5415 100644 --- a/src/main/java/store/ckin/api/file/exception/FileNotFoundException.java +++ b/src/main/java/store/ckin/api/file/exception/FileNotFoundException.java @@ -1,7 +1,7 @@ package store.ckin.api.file.exception; /** - * {class name}. + * 파일을 찾을 수 없을 때 호출되는 Exception 입니다. * * @author 나국로 * @version 2024. 03. 03. diff --git a/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java b/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java index bb5cc508..5c3cc7f4 100644 --- a/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java @@ -1,10 +1,16 @@ package store.ckin.api.grade.exception; +import store.ckin.api.advice.exception.GeneralAlreadyExistsException; + /** * 이미 존재하는 ID의 등급이 있을 때 호출되는 메서드 입니다. * * @author : jinwoolee * @version : 2024. 03. 21. */ -public class GradeAlreadyExistsException extends RuntimeException{ +public class GradeAlreadyExistsException extends GeneralAlreadyExistsException { + + public GradeAlreadyExistsException(Long id) { + super(String.format("Grade already Exist for this id [%s]", id)); + } } diff --git a/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java b/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java index 427739e6..d0adc0a8 100644 --- a/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java +++ b/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java @@ -1,10 +1,16 @@ package store.ckin.api.grade.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * Grade 를 찾지 못할 때 호출되는 클래스 입니다. * * @author : jinwoolee * @version : 2024. 02. 26. */ -public class GradeNotFoundException extends RuntimeException { +public class GradeNotFoundException extends GeneralNotFoundException { + + public GradeNotFoundException(Long id) { + super(String.format("Grade not found for this id [%s]", id)); + } } diff --git a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java index 3ead2e26..444c6753 100644 --- a/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java +++ b/src/main/java/store/ckin/api/grade/service/impl/GradeServiceImpl.java @@ -27,7 +27,7 @@ public class GradeServiceImpl implements GradeService { @Override public void createGrade(GradeCreateRequestDto gradeCreateRequestDto) { if (gradeRepository.existsById(gradeCreateRequestDto.getId())) { - throw new GradeAlreadyExistsException(); + throw new GradeAlreadyExistsException(gradeCreateRequestDto.getId()); } Grade grade = Grade.builder() @@ -50,7 +50,7 @@ public List getGradeList() { @Override public void updateGrade(Long gradeId, GradeUpdateRequestDto gradeUpdateRequestDto) { Grade grade = gradeRepository.findById(gradeId) - .orElseThrow(GradeNotFoundException::new); + .orElseThrow(() -> new GradeNotFoundException(gradeId)); grade.update(gradeUpdateRequestDto); } @@ -59,7 +59,7 @@ public void updateGrade(Long gradeId, GradeUpdateRequestDto gradeUpdateRequestDt @Override public void deleteGrade(Long gradeId) { if (!gradeRepository.existsById(gradeId)) { - throw new GradeNotFoundException(); + throw new GradeNotFoundException(gradeId); } gradeRepository.deleteById(gradeId); diff --git a/src/main/java/store/ckin/api/member/exception/MemberAlreadyExistsException.java b/src/main/java/store/ckin/api/member/exception/MemberAlreadyExistsException.java index 3de15d25..20db9587 100644 --- a/src/main/java/store/ckin/api/member/exception/MemberAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/member/exception/MemberAlreadyExistsException.java @@ -1,12 +1,14 @@ package store.ckin.api.member.exception; +import store.ckin.api.advice.exception.GeneralAlreadyExistsException; + /** * 이미 존재하는 계정일 때 발생하는 Exception 입니다. * * @author : jinwoolee * @version : 2024. 02. 16. */ -public class MemberAlreadyExistsException extends RuntimeException { +public class MemberAlreadyExistsException extends GeneralAlreadyExistsException { public MemberAlreadyExistsException(String email) { super(String.format("Member already Exist for this email [%s]", email)); } diff --git a/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java b/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java index cbc90e20..896fc0da 100644 --- a/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java +++ b/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java @@ -1,10 +1,17 @@ package store.ckin.api.member.exception; +import store.ckin.api.advice.exception.GeneralBadRequestException; +import store.ckin.api.member.entity.Member; + /** * 계정 상태를 바꿀 수 없을 때 호출 되는 Exception 클래스 입니다. * * @author : jinwoolee * @version : 2024. 03. 21. */ -public class MemberCannotChangeStateException extends RuntimeException{ +public class MemberCannotChangeStateException extends GeneralBadRequestException { + + public MemberCannotChangeStateException(Long memberId, Member.State state) { + super(String.format("Member cannot change state [memberId: %d, state: %s]", memberId, state)); + } } diff --git a/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java b/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java index 68c884e4..194c9f21 100644 --- a/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java +++ b/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.member.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 정보에 일치하는 Member 정보가 없을 때 호출 되는 Exception 입니다. * * @author : jinwoolee * @version : 2024. 02. 20. */ -public class MemberNotFoundException extends RuntimeException { +public class MemberNotFoundException extends GeneralNotFoundException { public MemberNotFoundException(Long id) { super(String.format("Member not found for this id [%s]", id)); } @@ -15,6 +17,4 @@ public MemberNotFoundException(String email) { super(String.format("Member not found for this email [%s]", email)); } - public MemberNotFoundException() { - } } diff --git a/src/main/java/store/ckin/api/member/exception/MemberOauthNotFoundException.java b/src/main/java/store/ckin/api/member/exception/MemberOauthNotFoundException.java new file mode 100644 index 00000000..c93357ae --- /dev/null +++ b/src/main/java/store/ckin/api/member/exception/MemberOauthNotFoundException.java @@ -0,0 +1,15 @@ +package store.ckin.api.member.exception; + +import store.ckin.api.advice.exception.GeneralNotFoundException; + +/** + * {class name}. + * + * @author 정승조 + * @version 2024. 03. 22. + */ +public class MemberOauthNotFoundException extends GeneralNotFoundException { + public MemberOauthNotFoundException(String oauthId) { + super(String.format("Member Oauth not found for this oauthId [%s]", oauthId)); + } +} diff --git a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java index 13562e77..bf2731bb 100644 --- a/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/store/ckin/api/member/service/impl/MemberServiceImpl.java @@ -20,6 +20,7 @@ import store.ckin.api.member.exception.MemberAlreadyExistsException; import store.ckin.api.member.exception.MemberCannotChangeStateException; import store.ckin.api.member.exception.MemberNotFoundException; +import store.ckin.api.member.exception.MemberOauthNotFoundException; import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.member.service.MemberService; import store.ckin.api.pointhistory.entity.PointHistory; @@ -70,7 +71,7 @@ public void createMember(MemberCreateRequestDto memberCreateRequestDto) { } Grade grade = gradeRepository.findById(NORMAL_GRADE_ID) - .orElseThrow(GradeNotFoundException::new); + .orElseThrow(() -> new GradeNotFoundException(NORMAL_GRADE_ID)); // 회원가입 포인트 정책 조회 PointPolicy registerPolicy = pointPolicyRepository.findById(REGISTER_POINT_POLICY_ID) @@ -147,7 +148,7 @@ public MemberOauthLoginResponseDto getOauthMemberInfo(MemberOauthIdOnlyRequestDt String oauthId = memberOauthIdOnlyRequestDto.getOauthId(); if (!memberRepository.existsByOauthId(oauthId)) { - throw new MemberNotFoundException(); + throw new MemberOauthNotFoundException(oauthId); } return memberRepository.getOauthMemberInfo(oauthId); @@ -169,7 +170,7 @@ public void updateRewardPoint(Long saleId, String email, Integer totalPrice) { .orElseThrow(() -> new MemberNotFoundException(email)); Grade grade = gradeRepository.findById(member.getGrade().getId()) - .orElseThrow(GradeNotFoundException::new); + .orElseThrow(() -> new GradeNotFoundException(member.getGrade().getId())); Sale sale = saleRepository.findById(saleId) .orElseThrow(() -> new SaleNotFoundException(saleId)); @@ -235,7 +236,7 @@ public void updateCancelSalePoint(Long saleId, String memberEmail) { @Transactional public void updateLatestLoginAt(Long memberId) { Member member = memberRepository.findById(memberId) - .orElseThrow(MemberNotFoundException::new); + .orElseThrow(() -> new MemberNotFoundException(memberId)); member.updateLatestLoginAt(); } @@ -244,11 +245,11 @@ public void updateLatestLoginAt(Long memberId) { @Transactional public void changeState(Long memberId, Member.State state) { Member member = memberRepository.findById(memberId) - .orElseThrow(MemberNotFoundException::new); + .orElseThrow(() -> new MemberNotFoundException(memberId)); if (member.getState().equals(state)) { - throw new MemberCannotChangeStateException(); + throw new MemberCannotChangeStateException(memberId, state); } member.changeState(state); diff --git a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java index 40498ce4..4ec0ece0 100644 --- a/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java +++ b/src/main/java/store/ckin/api/objectstorage/service/impl/ObjectStorageServiceImpl.java @@ -7,7 +7,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -153,13 +152,10 @@ public void deleteFile(String url) { // REST API 호출을 통한 파일 삭제 요청 this.restTemplate.exchange(url, HttpMethod.DELETE, requestHttpEntity, String.class); - Optional fileOptional = fileRepository.findByFileUrl(url); + File file = fileRepository.findByFileUrl(url) + .orElseThrow(() -> new FileNotFoundException(url)); - if (fileOptional.isPresent()) { - fileRepository.delete(fileOptional.get()); - } else { - throw new FileNotFoundException("File not found with URL: " + url); - } + fileRepository.delete(file); } diff --git a/src/main/java/store/ckin/api/packaging/exception/PackagingAlreadyExistsException.java b/src/main/java/store/ckin/api/packaging/exception/PackagingAlreadyExistsException.java index abc07d39..6a867f0e 100644 --- a/src/main/java/store/ckin/api/packaging/exception/PackagingAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/packaging/exception/PackagingAlreadyExistsException.java @@ -1,12 +1,14 @@ package store.ckin.api.packaging.exception; +import store.ckin.api.advice.exception.GeneralAlreadyExistsException; + /** * 포장 정책 - 포장지 종류가 중복되는 경우 발생하는 예외입니다. * * @author 정승조 * @version 2024. 02. 21. */ -public class PackagingAlreadyExistsException extends RuntimeException { +public class PackagingAlreadyExistsException extends GeneralAlreadyExistsException { public PackagingAlreadyExistsException(String packagingType) { super(String.format("Packaging already exists [packaging type = %s]", packagingType)); } diff --git a/src/main/java/store/ckin/api/packaging/exception/PackagingNotFoundException.java b/src/main/java/store/ckin/api/packaging/exception/PackagingNotFoundException.java index d89965fd..29cfdf0a 100644 --- a/src/main/java/store/ckin/api/packaging/exception/PackagingNotFoundException.java +++ b/src/main/java/store/ckin/api/packaging/exception/PackagingNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.packaging.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 포장 정책이 존재하지 않는 경우 발생하는 예외입니다. * * @author 정승조 * @version 2024. 02. 12. */ -public class PackagingNotFoundException extends RuntimeException { +public class PackagingNotFoundException extends GeneralNotFoundException { public PackagingNotFoundException(Long id) { super(String.format("Packaging not found [packaging id = %d]", id)); diff --git a/src/main/java/store/ckin/api/payment/exception/PaymentAmountNotCorrectException.java b/src/main/java/store/ckin/api/payment/exception/PaymentAmountNotCorrectException.java index 76988f79..7ba869cb 100644 --- a/src/main/java/store/ckin/api/payment/exception/PaymentAmountNotCorrectException.java +++ b/src/main/java/store/ckin/api/payment/exception/PaymentAmountNotCorrectException.java @@ -1,14 +1,16 @@ package store.ckin.api.payment.exception; +import store.ckin.api.advice.exception.GeneralBadRequestException; + /** * 결제 금액이 올바르지 않을 때 발생하는 예외입니다. * * @author 정승조 * @version 2024. 03. 11. */ -public class PaymentAmountNotCorrectException extends RuntimeException { +public class PaymentAmountNotCorrectException extends GeneralBadRequestException { - public PaymentAmountNotCorrectException() { - super("Payment amount is not correct."); + public PaymentAmountNotCorrectException(Integer saleTotalPrice, Integer amount) { + super(String.format("Payment amount is not correct. [saleTotalPrice: %d, amount: %d]", saleTotalPrice, amount)); } } diff --git a/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java b/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java index 0ae5f51a..3f4a1645 100644 --- a/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java +++ b/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java @@ -1,12 +1,14 @@ package store.ckin.api.payment.exception; +import store.ckin.api.advice.exception.GeneralBadRequestException; + /** * 결제가 완료되지 않은 경우 발생하는 예외입니다. * * @author 정승조 * @version 2024. 03. 11. */ -public class PaymentNotCompleteException extends RuntimeException { +public class PaymentNotCompleteException extends GeneralBadRequestException { public PaymentNotCompleteException() { super("Payment is not complete."); diff --git a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java index b9923d59..b2a5ac20 100644 --- a/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java +++ b/src/main/java/store/ckin/api/payment/facade/PaymentFacade.java @@ -47,7 +47,7 @@ public PaymentSuccessResponseDto createPayment(PaymentRequestDto requestDto) { SaleResponseDto sale = saleService.getSaleBySaleNumber(requestDto.getSaleNumber()); if (!Objects.equals(sale.getSaleTotalPrice(), requestDto.getAmount())) { - throw new PaymentAmountNotCorrectException(); + throw new PaymentAmountNotCorrectException(sale.getSaleTotalPrice(), requestDto.getAmount()); } paymentService.createPayment(sale.getSaleId(), requestDto); diff --git a/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyAlreadyExistsException.java b/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyAlreadyExistsException.java index a929dbcf..77789519 100644 --- a/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyAlreadyExistsException.java @@ -1,12 +1,14 @@ package store.ckin.api.pointpolicy.exception; +import store.ckin.api.advice.exception.GeneralAlreadyExistsException; + /** * 포인트 정책 ID가 중복된 경우 발생하는 예외입니다. * * @author 정승조 * @version 2024. 02. 12. */ -public class PointPolicyAlreadyExistsException extends RuntimeException { +public class PointPolicyAlreadyExistsException extends GeneralAlreadyExistsException { public PointPolicyAlreadyExistsException(Long id, String name) { super(String.format("PointPolicy already exists. [id = %d, name = %s]", id, name)); diff --git a/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyNotFoundException.java b/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyNotFoundException.java index 3d854172..3d0aef95 100644 --- a/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyNotFoundException.java +++ b/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.pointpolicy.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 포인트 정책이 존재하지 않는 경우 발생하는 예외입니다. * * @author 정승조 * @version 2024. 02. 12. */ -public class PointPolicyNotFoundException extends RuntimeException { +public class PointPolicyNotFoundException extends GeneralNotFoundException { public PointPolicyNotFoundException(Long id) { super(String.format("PointPolicy not found [id = %d]", id)); diff --git a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java index c90c4e59..cedcb69a 100644 --- a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java +++ b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.review.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * ReviewNotFoundException 예외 클래스입니다. * * @author 나국로 * @version 2024. 03. 01. */ -public class ReviewNotFoundException extends RuntimeException { +public class ReviewNotFoundException extends GeneralNotFoundException { public ReviewNotFoundException(Long reviewId) { super(String.format("Review not found: %d", reviewId)); } diff --git a/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java b/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java index 4b955625..57a6e3fd 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java @@ -1,12 +1,14 @@ package store.ckin.api.sale.exception; +import store.ckin.api.advice.exception.GeneralForbiddenException; + /** * 주문자 정보와 회원 아이디가 일치하지 않을 때 발생하는 예외입니다. * * @author 정승조 * @version 2024. 03. 15. */ -public class SaleMemberNotMatchException extends RuntimeException { +public class SaleMemberNotMatchException extends GeneralForbiddenException { public SaleMemberNotMatchException(String saleNumber) { super(String.format("주문 번호 (%s)의 주문자 ID와 요청한 회원 ID가 일치하지 않습니다.", saleNumber)); diff --git a/src/main/java/store/ckin/api/sale/exception/SaleNotFoundException.java b/src/main/java/store/ckin/api/sale/exception/SaleNotFoundException.java index eb484c97..aec783f0 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleNotFoundException.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.sale.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 주문 조회 실패 예외 입니다. * * @author 정승조 * @version 2024. 03. 05. */ -public class SaleNotFoundException extends RuntimeException { +public class SaleNotFoundException extends GeneralNotFoundException { public SaleNotFoundException(Long saleId) { super(String.format("주문 ID %d에 해당하는 주문이 없습니다.", saleId)); } diff --git a/src/main/java/store/ckin/api/sale/exception/SaleNotFoundExceptionBySaleNumber.java b/src/main/java/store/ckin/api/sale/exception/SaleNotFoundExceptionBySaleNumber.java index 206aee63..082ac78a 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleNotFoundExceptionBySaleNumber.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleNotFoundExceptionBySaleNumber.java @@ -1,12 +1,14 @@ package store.ckin.api.sale.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 주문 번호로 주문을 조회할 때 주문이 존재하지 않는 경우 발생하는 예외입니다. * * @author 정승조 * @version 2024. 03. 13. */ -public class SaleNotFoundExceptionBySaleNumber extends RuntimeException { +public class SaleNotFoundExceptionBySaleNumber extends GeneralNotFoundException { public SaleNotFoundExceptionBySaleNumber(String number) { super(String.format("주문 번호(%s)에 해당하는 주문이 존재하지 않습니다.", number)); diff --git a/src/main/java/store/ckin/api/sale/exception/SaleNumberNotFoundException.java b/src/main/java/store/ckin/api/sale/exception/SaleNumberNotFoundException.java index 51228b76..a7178546 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleNumberNotFoundException.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleNumberNotFoundException.java @@ -1,5 +1,7 @@ package store.ckin.api.sale.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** * 주문번호로 조회된 주문이 없는 경우에 발생하는 예외입니다. * @@ -7,7 +9,7 @@ * @version 2024. 03. 09. */ -public class SaleNumberNotFoundException extends RuntimeException { +public class SaleNumberNotFoundException extends GeneralNotFoundException { public SaleNumberNotFoundException(String saleNumber) { super(String.format("주문 정보가 존재하지 않습니다. (주문번호 = %s)", saleNumber)); diff --git a/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java b/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java index 722d8af2..75f90b69 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java @@ -1,12 +1,14 @@ package store.ckin.api.sale.exception; +import store.ckin.api.advice.exception.GeneralForbiddenException; + /** - * {class name}. + * 주문 번호와 주문자 연락처가 일치하지 않을 때 발생하는 예외입니다. * * @author 정승조 * @version 2024. 03. 14. */ -public class SaleOrdererContactNotMatchException extends RuntimeException { +public class SaleOrdererContactNotMatchException extends GeneralForbiddenException { public SaleOrdererContactNotMatchException(String saleNumber, String ordererContact) { super(String.format("주문 번호 (%s)의 주문자 연락처 (%s)가 일치하지 않습니다.", saleNumber, ordererContact)); diff --git a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java index 2524f6c6..6f775df4 100644 --- a/src/main/java/store/ckin/api/sale/facade/SaleFacade.java +++ b/src/main/java/store/ckin/api/sale/facade/SaleFacade.java @@ -202,7 +202,9 @@ public void cancelSale(Long saleId) { // 회원 포인트 변경 및 포인트 이력 생성 SaleResponseDto saleDetail = saleService.getSaleDetail(saleId); - if (Objects.nonNull(saleDetail.getMemberEmail()) && saleDetail.getSalePointUsage() > 0) { + + // 회원인 경우 포인트를 적립해줬기 때문에 해당 포인트를 회수해야 함. + if (Objects.nonNull(saleDetail.getMemberEmail())) { memberService.updateCancelSalePoint(saleId, saleDetail.getMemberEmail()); } diff --git a/src/main/java/store/ckin/api/skm/exception/KeyMangerException.java b/src/main/java/store/ckin/api/skm/exception/KeyMangerException.java index 6bf61766..039b56df 100644 --- a/src/main/java/store/ckin/api/skm/exception/KeyMangerException.java +++ b/src/main/java/store/ckin/api/skm/exception/KeyMangerException.java @@ -1,7 +1,7 @@ package store.ckin.api.skm.exception; /** - * description + * KeyManager 에서 발생한 Exception 클래스 입니다. * * @author 김준현 * @version 2024. 02. 19 diff --git a/src/main/java/store/ckin/api/tag/controller/TagController.java b/src/main/java/store/ckin/api/tag/controller/TagController.java index 0c35a9ca..d48b0d6b 100644 --- a/src/main/java/store/ckin/api/tag/controller/TagController.java +++ b/src/main/java/store/ckin/api/tag/controller/TagController.java @@ -8,21 +8,17 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import store.ckin.api.common.dto.ErrorResponse; import store.ckin.api.common.dto.PagedResponse; import store.ckin.api.tag.dto.request.TagCreateRequestDto; import store.ckin.api.tag.dto.request.TagDeleteRequestDto; import store.ckin.api.tag.dto.request.TagUpdateRequestDto; import store.ckin.api.tag.dto.response.TagResponseDto; -import store.ckin.api.tag.exception.TagNameAlreadyExistException; -import store.ckin.api.tag.exception.TagNotFoundException; import store.ckin.api.tag.service.TagService; /** @@ -85,35 +81,4 @@ public ResponseEntity deleteTag(@Valid @RequestBody TagDeleteRequestDto ta return ResponseEntity.ok().build(); } - /** - * 이미 존재하는 태그 이름일 때 발생하는 TagNameAlreadyExistException 핸들링 메서드 - * - * @param e 태그 이름이 이미 존재할 때 발생 - * @return BAD REQUEST 상태와 code, message 를 담은 JSON 응답 - */ - @ExceptionHandler(TagNameAlreadyExistException.class) - public ResponseEntity handleTagAlreadyExistException(TagNameAlreadyExistException e) { - final ErrorResponse errorResponse = ErrorResponse.builder() - .code("TagName Already Exist") - .message(e.getMessage()) - .build(); - - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse); - } - - /** - * 존재하지 않는 태그 아이디일 때 발생하는 TagNotFoundException 핸들링 메서드 - * - * @param e 태그 아이디가 존재하지 않을 때 발생 - * @return NOT_FOUND 상태와 코드, 메세지를 담은 JSON 응답 - */ - @ExceptionHandler(TagNotFoundException.class) - public ResponseEntity handleTagNotFoundException(TagNotFoundException e) { - final ErrorResponse errorResponse = ErrorResponse.builder() - .code("Tag Not Found") - .message(e.getMessage()) - .build(); - - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse); - } } diff --git a/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java b/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java index 93ea05a0..507ebdbb 100644 --- a/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java +++ b/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java @@ -1,12 +1,14 @@ package store.ckin.api.tag.exception; +import store.ckin.api.advice.exception.GeneralAlreadyExistsException; + /** - * description + * 이미 존재하는 태그 이름일 때 발생하는 TagNameAlreadyExistException. * * @author 김준현 * @version 2024. 02. 17 */ -public class TagNameAlreadyExistException extends RuntimeException { +public class TagNameAlreadyExistException extends GeneralAlreadyExistsException { public TagNameAlreadyExistException(String tagName) { super(String.format("태그(name: %s)는 이미 존재하는 태그 이름입니다", tagName)); } diff --git a/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java b/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java index 5f45baea..b7529f67 100644 --- a/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java +++ b/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java @@ -1,12 +1,14 @@ package store.ckin.api.tag.exception; +import store.ckin.api.advice.exception.GeneralNotFoundException; + /** - * description + * 존재하지 않는 태그 아이디일 때 발생하는 TagNotFoundException. * * @author 김준현 * @version 2024. 02. 17 */ -public class TagNotFoundException extends RuntimeException { +public class TagNotFoundException extends GeneralNotFoundException { public TagNotFoundException(Long tagId) { super(String.format("태그(id: %d)를 찾을 수 없습니다", tagId)); } diff --git a/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java b/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java index 7c6521c6..928f108c 100644 --- a/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java @@ -1,10 +1,16 @@ package store.ckin.api.wishlist.exception; +import store.ckin.api.advice.exception.GeneralAlreadyExistsException; + /** * 이미 위시리스트에 추가되었을 때 호출되는 Exception 클래스 입니다. * * @author : jinwoolee * @version : 2024. 03. 21. */ -public class WishListAlreadyExistsException extends RuntimeException{ +public class WishListAlreadyExistsException extends GeneralAlreadyExistsException { + + public WishListAlreadyExistsException(Long memberId, Long bookId) { + super(String.format("이미 위시리스트에 추가된 책입니다. (memberId: %d, bookId: %d)", memberId, bookId)); + } } diff --git a/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java b/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java index 70305937..ced97bda 100644 --- a/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java +++ b/src/main/java/store/ckin/api/wishlist/service/impl/WishListServiceImpl.java @@ -33,15 +33,15 @@ public class WishListServiceImpl implements WishListService { @Override public void createWishList(Long memberId, Long bookId) { Member member = memberRepository.findById(memberId) - .orElseThrow(MemberNotFoundException::new); + .orElseThrow(() -> new MemberNotFoundException(memberId)); Book book = bookRepository.findByBookId(bookId) - .orElseThrow(BookNotFoundException::new); + .orElseThrow(() -> new BookNotFoundException(bookId)); WishList.Pk pk = new WishList.Pk(bookId, memberId); if (wishListRepository.existsByPk(pk)) { - throw new WishListAlreadyExistsException(); + throw new WishListAlreadyExistsException(pk.getMemberId(), pk.getBookId()); } WishList wishList = WishList.builder() @@ -57,11 +57,11 @@ public void createWishList(Long memberId, Long bookId) { @Override public void deleteWishList(Long memberId, Long bookId) { if (!memberRepository.existsById(memberId)) { - throw new MemberNotFoundException(); + throw new MemberNotFoundException(memberId); } if (!bookRepository.existsById(bookId)) { - throw new BookNotFoundException(); + throw new BookNotFoundException(bookId); } wishListRepository.deleteByPk(new WishList.Pk(bookId, memberId)); diff --git a/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java b/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java index 94714369..7d64b74d 100644 --- a/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java +++ b/src/test/java/store/ckin/api/tag/controller/TagControllerTest.java @@ -32,6 +32,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.restdocs.RestDocumentationExtension; import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; @@ -48,7 +49,7 @@ import store.ckin.api.tag.service.impl.TagServiceImpl; /** - * description + * Tag Controller Test. * * @author 김준현 * @version 2024. 02. 17 @@ -142,9 +143,9 @@ void saveTagTest_Failed_AlreadyExist() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagCreateRequestDto))) .andExpectAll( - jsonPath("code", equalTo("TagName Already Exist")), + jsonPath("code", equalTo("CONFLICT")), jsonPath("message", equalTo(expectedException.getMessage())), - status().isBadRequest() + status().isConflict() ).andDo(document("tag/saveTag/already-exist", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()))); @@ -242,7 +243,7 @@ void deleteTagTest_Failed_TagNotFoundException() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagDeleteRequestDto))) .andExpectAll( - jsonPath("code", equalTo("Tag Not Found")), + jsonPath("code", equalTo("NOT_FOUND")), jsonPath("message", equalTo(expectedException.getMessage())), status().isNotFound()) .andDo(document("tag/deleteTag/not-found", From b2ed615fd441d6c0f17563c17cc03b7577d0df96 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 22 Mar 2024 15:11:17 +0900 Subject: [PATCH 148/161] =?UTF-8?q?[REFACTOR]=20Exception=20message=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/author/exception/AuthorNotFoundException.java | 2 +- .../store/ckin/api/book/exception/BookNotFoundException.java | 2 +- .../api/category/exception/CategoryNotFoundException.java | 2 +- .../exception/DeliveryPolicyNotActiveException.java | 2 +- .../exception/DeliveryPolicyNotFoundException.java | 2 +- .../store/ckin/api/file/exception/FileNotFoundException.java | 2 +- .../api/grade/exception/GradeAlreadyExistsException.java | 2 +- .../ckin/api/grade/exception/GradeNotFoundException.java | 2 +- .../api/member/exception/MemberAlreadyExistsException.java | 2 +- .../member/exception/MemberCannotChangeStateException.java | 2 +- .../ckin/api/member/exception/MemberNotFoundException.java | 4 ++-- .../api/member/exception/MemberOauthNotFoundException.java | 4 ++-- .../packaging/exception/PackagingAlreadyExistsException.java | 2 +- .../api/packaging/exception/PackagingNotFoundException.java | 2 +- .../payment/exception/PaymentAmountNotCorrectException.java | 5 +++-- .../api/payment/exception/PaymentNotCompleteException.java | 2 +- .../exception/PointPolicyAlreadyExistsException.java | 2 +- .../pointpolicy/exception/PointPolicyNotFoundException.java | 2 +- .../ckin/api/review/exception/ReviewNotFoundException.java | 2 +- .../store/ckin/api/review/exception/SaveFileException.java | 2 +- .../ckin/api/sale/exception/SaleMemberNotMatchException.java | 2 +- .../store/ckin/api/sale/exception/SaleNotFoundException.java | 2 +- .../sale/exception/SaleNotFoundExceptionBySaleNumber.java | 4 ++-- .../ckin/api/sale/exception/SaleNumberNotFoundException.java | 2 +- .../sale/exception/SaleOrdererContactNotMatchException.java | 3 ++- .../ckin/api/tag/exception/TagNameAlreadyExistException.java | 2 +- .../store/ckin/api/tag/exception/TagNotFoundException.java | 2 +- .../wishlist/exception/WishListAlreadyExistsException.java | 2 +- 28 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/main/java/store/ckin/api/author/exception/AuthorNotFoundException.java b/src/main/java/store/ckin/api/author/exception/AuthorNotFoundException.java index 8f9f36d7..2c464498 100644 --- a/src/main/java/store/ckin/api/author/exception/AuthorNotFoundException.java +++ b/src/main/java/store/ckin/api/author/exception/AuthorNotFoundException.java @@ -17,7 +17,7 @@ public class AuthorNotFoundException extends GeneralNotFoundException { * @param authorId the author id */ public AuthorNotFoundException(Long authorId) { - super(String.format("Author not found: %s", authorId)); + super(String.format("작가를 찾을 수 없습니다 [ID = %d]", authorId)); } } \ No newline at end of file diff --git a/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java b/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java index 527376fe..d61b397e 100644 --- a/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java +++ b/src/main/java/store/ckin/api/book/exception/BookNotFoundException.java @@ -11,7 +11,7 @@ public class BookNotFoundException extends GeneralNotFoundException { public BookNotFoundException(Long bookId) { - super(String.format("책(id: %d)을 찾을 수 없습니다", bookId)); + super(String.format("책을 찾을 수 없습니다 [id = %d]", bookId)); } } diff --git a/src/main/java/store/ckin/api/category/exception/CategoryNotFoundException.java b/src/main/java/store/ckin/api/category/exception/CategoryNotFoundException.java index e1123644..1cd0f959 100644 --- a/src/main/java/store/ckin/api/category/exception/CategoryNotFoundException.java +++ b/src/main/java/store/ckin/api/category/exception/CategoryNotFoundException.java @@ -11,6 +11,6 @@ public class CategoryNotFoundException extends GeneralNotFoundException { public CategoryNotFoundException(Long categoryId) { - super(String.format("Category not found: %s", categoryId)); + super(String.format("카테고리를 찾을 수 없습니다. [id = %d]", categoryId)); } } \ No newline at end of file diff --git a/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotActiveException.java b/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotActiveException.java index 43c5a070..9629f0d5 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotActiveException.java +++ b/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotActiveException.java @@ -11,6 +11,6 @@ public class DeliveryPolicyNotActiveException extends GeneralNotFoundException { public DeliveryPolicyNotActiveException() { - super("Delivery Policy is not active!"); + super("배송 정책이 활성화되지 않았습니다."); } } diff --git a/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotFoundException.java b/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotFoundException.java index 4f1d9682..d1d02dda 100644 --- a/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotFoundException.java +++ b/src/main/java/store/ckin/api/deliverypolicy/exception/DeliveryPolicyNotFoundException.java @@ -11,6 +11,6 @@ public class DeliveryPolicyNotFoundException extends GeneralNotFoundException { public DeliveryPolicyNotFoundException(Long id) { - super(String.format("Delivery Policy Not Found [id = %d]", id)); + super(String.format("배송비 정책이 존재하지 않습니다. [id = %d]", id)); } } diff --git a/src/main/java/store/ckin/api/file/exception/FileNotFoundException.java b/src/main/java/store/ckin/api/file/exception/FileNotFoundException.java index 345c5415..221c7771 100644 --- a/src/main/java/store/ckin/api/file/exception/FileNotFoundException.java +++ b/src/main/java/store/ckin/api/file/exception/FileNotFoundException.java @@ -9,6 +9,6 @@ public class FileNotFoundException extends RuntimeException { public FileNotFoundException(String fileUrl) { - super(String.format("파일을 찾을 수 없습니다: %s", fileUrl)); + super(String.format("파일을 찾을 수 없습니다. [fileUrl = %s]", fileUrl)); } } \ No newline at end of file diff --git a/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java b/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java index 5c3cc7f4..6c28a96e 100644 --- a/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/grade/exception/GradeAlreadyExistsException.java @@ -11,6 +11,6 @@ public class GradeAlreadyExistsException extends GeneralAlreadyExistsException { public GradeAlreadyExistsException(Long id) { - super(String.format("Grade already Exist for this id [%s]", id)); + super(String.format("등급의 ID가 존재합니다. [id = %d]", id)); } } diff --git a/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java b/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java index d0adc0a8..fac2cc72 100644 --- a/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java +++ b/src/main/java/store/ckin/api/grade/exception/GradeNotFoundException.java @@ -11,6 +11,6 @@ public class GradeNotFoundException extends GeneralNotFoundException { public GradeNotFoundException(Long id) { - super(String.format("Grade not found for this id [%s]", id)); + super(String.format("등급을 찾을 수 없습니다. [id = %s]", id)); } } diff --git a/src/main/java/store/ckin/api/member/exception/MemberAlreadyExistsException.java b/src/main/java/store/ckin/api/member/exception/MemberAlreadyExistsException.java index 20db9587..25bc1ebd 100644 --- a/src/main/java/store/ckin/api/member/exception/MemberAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/member/exception/MemberAlreadyExistsException.java @@ -10,6 +10,6 @@ */ public class MemberAlreadyExistsException extends GeneralAlreadyExistsException { public MemberAlreadyExistsException(String email) { - super(String.format("Member already Exist for this email [%s]", email)); + super(String.format("해당 이메일은 이미 사용중입니다. [email = %s]", email)); } } diff --git a/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java b/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java index 896fc0da..05824f48 100644 --- a/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java +++ b/src/main/java/store/ckin/api/member/exception/MemberCannotChangeStateException.java @@ -12,6 +12,6 @@ public class MemberCannotChangeStateException extends GeneralBadRequestException { public MemberCannotChangeStateException(Long memberId, Member.State state) { - super(String.format("Member cannot change state [memberId: %d, state: %s]", memberId, state)); + super(String.format("계정의 상태를 바꿀 수 없습니다. [memberId = %d, state = %s]", memberId, state)); } } diff --git a/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java b/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java index 194c9f21..3b0efe15 100644 --- a/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java +++ b/src/main/java/store/ckin/api/member/exception/MemberNotFoundException.java @@ -10,11 +10,11 @@ */ public class MemberNotFoundException extends GeneralNotFoundException { public MemberNotFoundException(Long id) { - super(String.format("Member not found for this id [%s]", id)); + super(String.format("회원을 찾을 수 없습니다. [id = %d]", id)); } public MemberNotFoundException(String email) { - super(String.format("Member not found for this email [%s]", email)); + super(String.format("회원을 찾을 수 없습니다. [id = %s]", email)); } } diff --git a/src/main/java/store/ckin/api/member/exception/MemberOauthNotFoundException.java b/src/main/java/store/ckin/api/member/exception/MemberOauthNotFoundException.java index c93357ae..b0700b86 100644 --- a/src/main/java/store/ckin/api/member/exception/MemberOauthNotFoundException.java +++ b/src/main/java/store/ckin/api/member/exception/MemberOauthNotFoundException.java @@ -3,13 +3,13 @@ import store.ckin.api.advice.exception.GeneralNotFoundException; /** - * {class name}. + * Member Oauth 를 찾지 못할 때 발생하는 예외입니다. * * @author 정승조 * @version 2024. 03. 22. */ public class MemberOauthNotFoundException extends GeneralNotFoundException { public MemberOauthNotFoundException(String oauthId) { - super(String.format("Member Oauth not found for this oauthId [%s]", oauthId)); + super(String.format("회원 Oauth ID를 찾을 수 없습니다. [oauthId = %s]", oauthId)); } } diff --git a/src/main/java/store/ckin/api/packaging/exception/PackagingAlreadyExistsException.java b/src/main/java/store/ckin/api/packaging/exception/PackagingAlreadyExistsException.java index 6a867f0e..399b2f12 100644 --- a/src/main/java/store/ckin/api/packaging/exception/PackagingAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/packaging/exception/PackagingAlreadyExistsException.java @@ -10,6 +10,6 @@ */ public class PackagingAlreadyExistsException extends GeneralAlreadyExistsException { public PackagingAlreadyExistsException(String packagingType) { - super(String.format("Packaging already exists [packaging type = %s]", packagingType)); + super(String.format("포장지 종류가 이미 존재합니다. [packaging type = %s]", packagingType)); } } diff --git a/src/main/java/store/ckin/api/packaging/exception/PackagingNotFoundException.java b/src/main/java/store/ckin/api/packaging/exception/PackagingNotFoundException.java index 29cfdf0a..90b47f4f 100644 --- a/src/main/java/store/ckin/api/packaging/exception/PackagingNotFoundException.java +++ b/src/main/java/store/ckin/api/packaging/exception/PackagingNotFoundException.java @@ -11,6 +11,6 @@ public class PackagingNotFoundException extends GeneralNotFoundException { public PackagingNotFoundException(Long id) { - super(String.format("Packaging not found [packaging id = %d]", id)); + super(String.format("포장 정책이 존재하지 않습니다. [id = %d]", id)); } } diff --git a/src/main/java/store/ckin/api/payment/exception/PaymentAmountNotCorrectException.java b/src/main/java/store/ckin/api/payment/exception/PaymentAmountNotCorrectException.java index 7ba869cb..6b9f2d76 100644 --- a/src/main/java/store/ckin/api/payment/exception/PaymentAmountNotCorrectException.java +++ b/src/main/java/store/ckin/api/payment/exception/PaymentAmountNotCorrectException.java @@ -10,7 +10,8 @@ */ public class PaymentAmountNotCorrectException extends GeneralBadRequestException { - public PaymentAmountNotCorrectException(Integer saleTotalPrice, Integer amount) { - super(String.format("Payment amount is not correct. [saleTotalPrice: %d, amount: %d]", saleTotalPrice, amount)); + public PaymentAmountNotCorrectException(Integer saleTotalPrice, Integer requestTotalPrice) { + super(String.format("결제 금액이 올바르지 않습니다. [saleTotalPrice = %d, requestTotalPrice = %d]", + saleTotalPrice, requestTotalPrice)); } } diff --git a/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java b/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java index 3f4a1645..66e8223f 100644 --- a/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java +++ b/src/main/java/store/ckin/api/payment/exception/PaymentNotCompleteException.java @@ -11,6 +11,6 @@ public class PaymentNotCompleteException extends GeneralBadRequestException { public PaymentNotCompleteException() { - super("Payment is not complete."); + super("결제가 완료되지 않았습니다."); } } diff --git a/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyAlreadyExistsException.java b/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyAlreadyExistsException.java index 77789519..d98ce4c1 100644 --- a/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyAlreadyExistsException.java @@ -11,6 +11,6 @@ public class PointPolicyAlreadyExistsException extends GeneralAlreadyExistsException { public PointPolicyAlreadyExistsException(Long id, String name) { - super(String.format("PointPolicy already exists. [id = %d, name = %s]", id, name)); + super(String.format("해당 포인트 정책은 이미 존재합니다. [id = %d, name = %s]", id, name)); } } diff --git a/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyNotFoundException.java b/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyNotFoundException.java index 3d0aef95..478bbd4b 100644 --- a/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyNotFoundException.java +++ b/src/main/java/store/ckin/api/pointpolicy/exception/PointPolicyNotFoundException.java @@ -11,6 +11,6 @@ public class PointPolicyNotFoundException extends GeneralNotFoundException { public PointPolicyNotFoundException(Long id) { - super(String.format("PointPolicy not found [id = %d]", id)); + super(String.format("포인트 정책을 찾을 수 없습니다. [id = %d]", id)); } } diff --git a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java index cedcb69a..bbd989dc 100644 --- a/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java +++ b/src/main/java/store/ckin/api/review/exception/ReviewNotFoundException.java @@ -10,6 +10,6 @@ */ public class ReviewNotFoundException extends GeneralNotFoundException { public ReviewNotFoundException(Long reviewId) { - super(String.format("Review not found: %d", reviewId)); + super(String.format("리뷰를 찾을 수 없습니다. [id = %d]", reviewId)); } } diff --git a/src/main/java/store/ckin/api/review/exception/SaveFileException.java b/src/main/java/store/ckin/api/review/exception/SaveFileException.java index cd68e6bd..4060650d 100644 --- a/src/main/java/store/ckin/api/review/exception/SaveFileException.java +++ b/src/main/java/store/ckin/api/review/exception/SaveFileException.java @@ -9,6 +9,6 @@ public class SaveFileException extends RuntimeException { public SaveFileException() { - super("Failed to save image."); + super("이미지 저장에 실패하였습니다."); } } diff --git a/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java b/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java index 57a6e3fd..01384b69 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleMemberNotMatchException.java @@ -11,6 +11,6 @@ public class SaleMemberNotMatchException extends GeneralForbiddenException { public SaleMemberNotMatchException(String saleNumber) { - super(String.format("주문 번호 (%s)의 주문자 ID와 요청한 회원 ID가 일치하지 않습니다.", saleNumber)); + super(String.format("주문 번호의 주문자 ID와 요청한 회원 ID가 일치하지 않습니다. [saleNumber = %s]", saleNumber)); } } diff --git a/src/main/java/store/ckin/api/sale/exception/SaleNotFoundException.java b/src/main/java/store/ckin/api/sale/exception/SaleNotFoundException.java index aec783f0..1f004d2b 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleNotFoundException.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleNotFoundException.java @@ -10,6 +10,6 @@ */ public class SaleNotFoundException extends GeneralNotFoundException { public SaleNotFoundException(Long saleId) { - super(String.format("주문 ID %d에 해당하는 주문이 없습니다.", saleId)); + super(String.format("주문 ID에 해당하는 주문이 없습니다. [id = %d]", saleId)); } } diff --git a/src/main/java/store/ckin/api/sale/exception/SaleNotFoundExceptionBySaleNumber.java b/src/main/java/store/ckin/api/sale/exception/SaleNotFoundExceptionBySaleNumber.java index 082ac78a..c47fb13e 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleNotFoundExceptionBySaleNumber.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleNotFoundExceptionBySaleNumber.java @@ -10,7 +10,7 @@ */ public class SaleNotFoundExceptionBySaleNumber extends GeneralNotFoundException { - public SaleNotFoundExceptionBySaleNumber(String number) { - super(String.format("주문 번호(%s)에 해당하는 주문이 존재하지 않습니다.", number)); + public SaleNotFoundExceptionBySaleNumber(String saleNumber) { + super(String.format("주문 번호에 해당하는 주문이 존재하지 않습니다. [saleNumber = %s]", saleNumber)); } } diff --git a/src/main/java/store/ckin/api/sale/exception/SaleNumberNotFoundException.java b/src/main/java/store/ckin/api/sale/exception/SaleNumberNotFoundException.java index a7178546..24319429 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleNumberNotFoundException.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleNumberNotFoundException.java @@ -12,6 +12,6 @@ public class SaleNumberNotFoundException extends GeneralNotFoundException { public SaleNumberNotFoundException(String saleNumber) { - super(String.format("주문 정보가 존재하지 않습니다. (주문번호 = %s)", saleNumber)); + super(String.format("주문 정보가 존재하지 않습니다. [saleNumber = %s]", saleNumber)); } } diff --git a/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java b/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java index 75f90b69..2e472b1e 100644 --- a/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java +++ b/src/main/java/store/ckin/api/sale/exception/SaleOrdererContactNotMatchException.java @@ -11,6 +11,7 @@ public class SaleOrdererContactNotMatchException extends GeneralForbiddenException { public SaleOrdererContactNotMatchException(String saleNumber, String ordererContact) { - super(String.format("주문 번호 (%s)의 주문자 연락처 (%s)가 일치하지 않습니다.", saleNumber, ordererContact)); + super(String.format("주문 번호의 주문자 연락처 가 일치하지 않습니다. [saleNumber = %s, ordererContact = %s", + saleNumber, ordererContact)); } } diff --git a/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java b/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java index 507ebdbb..4fd92311 100644 --- a/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java +++ b/src/main/java/store/ckin/api/tag/exception/TagNameAlreadyExistException.java @@ -10,6 +10,6 @@ */ public class TagNameAlreadyExistException extends GeneralAlreadyExistsException { public TagNameAlreadyExistException(String tagName) { - super(String.format("태그(name: %s)는 이미 존재하는 태그 이름입니다", tagName)); + super(String.format("이미 존재하는 태그 이름입니다. [tag Name = %s]", tagName)); } } diff --git a/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java b/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java index b7529f67..da4eabfc 100644 --- a/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java +++ b/src/main/java/store/ckin/api/tag/exception/TagNotFoundException.java @@ -10,6 +10,6 @@ */ public class TagNotFoundException extends GeneralNotFoundException { public TagNotFoundException(Long tagId) { - super(String.format("태그(id: %d)를 찾을 수 없습니다", tagId)); + super(String.format("태그를 찾을 수 없습니다. [id: %d]", tagId)); } } diff --git a/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java b/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java index 928f108c..83cab1fe 100644 --- a/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java +++ b/src/main/java/store/ckin/api/wishlist/exception/WishListAlreadyExistsException.java @@ -11,6 +11,6 @@ public class WishListAlreadyExistsException extends GeneralAlreadyExistsException { public WishListAlreadyExistsException(Long memberId, Long bookId) { - super(String.format("이미 위시리스트에 추가된 책입니다. (memberId: %d, bookId: %d)", memberId, bookId)); + super(String.format("이미 위시리스트에 추가된 책입니다. [memberId: %d, bookId: %d]", memberId, bookId)); } } From 3b2392dcfbfdd9727761d2fa8f33c2783d8a8f87 Mon Sep 17 00:00:00 2001 From: f1v3-dev Date: Fri, 22 Mar 2024 15:33:15 +0900 Subject: [PATCH 149/161] =?UTF-8?q?[REFACTOR]=20=EC=A3=BC=EB=AC=B8=20-=20?= =?UTF-8?q?=EB=8F=84=EC=84=9C=20=EC=88=98=EB=9F=89=20=EA=B0=90=EC=86=8C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/book/entity/Book.java | 4 ++++ .../ckin/api/booksale/service/impl/BookSaleServiceImpl.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/store/ckin/api/book/entity/Book.java b/src/main/java/store/ckin/api/book/entity/Book.java index 42abecd9..7111edd9 100644 --- a/src/main/java/store/ckin/api/book/entity/Book.java +++ b/src/main/java/store/ckin/api/book/entity/Book.java @@ -113,4 +113,8 @@ public class Book { public void updateBookReviewRate(Integer reviewRate) { this.bookReviewRate = String.valueOf(Integer.parseInt(this.bookReviewRate) + reviewRate); } + + public void updateBookStock(Integer stock) { + this.bookStock -= stock; + } } diff --git a/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java b/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java index cb1c6e93..ca4cf072 100644 --- a/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java +++ b/src/main/java/store/ckin/api/booksale/service/impl/BookSaleServiceImpl.java @@ -74,6 +74,8 @@ public void createBookSale(Long saleId, List bookSaleL .build(); bookSaleRepository.save(bookSale); + + book.updateBookStock(bookSaleDto.getQuantity()); } } From 75868f85f163c8633caf27d567d0b10170822374 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Fri, 22 Mar 2024 16:01:46 +0900 Subject: [PATCH 150/161] [TEST] GradeControllerTest --- .../grade/controller/GradeControllerTest.java | 256 ++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 src/test/java/store/ckin/api/grade/controller/GradeControllerTest.java diff --git a/src/test/java/store/ckin/api/grade/controller/GradeControllerTest.java b/src/test/java/store/ckin/api/grade/controller/GradeControllerTest.java new file mode 100644 index 00000000..fa962d3a --- /dev/null +++ b/src/test/java/store/ckin/api/grade/controller/GradeControllerTest.java @@ -0,0 +1,256 @@ +package store.ckin.api.grade.controller; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import store.ckin.api.grade.domain.request.GradeCreateRequestDto; +import store.ckin.api.grade.domain.request.GradeUpdateRequestDto; +import store.ckin.api.grade.entity.Grade; +import store.ckin.api.grade.exception.GradeAlreadyExistsException; +import store.ckin.api.grade.exception.GradeNotFoundException; +import store.ckin.api.grade.service.GradeService; + +/** + * GradeController Test Code 입니다. + * + * @author : jinwoolee + * @version : 2024. 03. 22. + */ +@WebMvcTest(GradeController.class) +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) +class GradeControllerTest { + @Autowired + private MockMvc mockMvc; + + @MockBean + private GradeService gradeService; + + private final ObjectMapper objectMapper = + new ObjectMapper() + .registerModule(new JavaTimeModule()); + + @Test + @DisplayName("등급 생성") + void testCreateGrade() throws Exception { + GradeCreateRequestDto dto = new GradeCreateRequestDto(); + + ReflectionTestUtils.setField(dto, "id", 1L); + ReflectionTestUtils.setField(dto, "name", "일반"); + ReflectionTestUtils.setField(dto, "pointRatio", 5); + ReflectionTestUtils.setField(dto, "condition", 100000); + + doNothing().when(gradeService).createGrade(dto); + + mockMvc.perform(RestDocumentationRequestBuilders + .post("/api/admin/grades") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isCreated()) + .andDo(document("grade/createGrade/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("id").description("등급 ID"), + fieldWithPath("name").description("등급 이름"), + fieldWithPath("pointRatio").description("적립률"), + fieldWithPath("condition").description("등급 조건") + ) + )); + + verify(gradeService).createGrade(any(GradeCreateRequestDto.class)); + } + + @Test + @DisplayName("이미 존재하는 등급 ID로 인한 등급 생성 실패") + void testCreateGradeFailed() throws Exception { + GradeCreateRequestDto dto = new GradeCreateRequestDto(); + + ReflectionTestUtils.setField(dto, "id", 1L); + ReflectionTestUtils.setField(dto, "name", "일반"); + ReflectionTestUtils.setField(dto, "pointRatio", 5); + ReflectionTestUtils.setField(dto, "condition", 100000); + + doThrow(GradeAlreadyExistsException.class) + .when(gradeService) + .createGrade(any(GradeCreateRequestDto.class)); + + mockMvc.perform(RestDocumentationRequestBuilders + .post("/api/admin/grades") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isConflict()) + .andDo(document("grade/createGrade/failed", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(gradeService).createGrade(any(GradeCreateRequestDto.class)); + } + + @Test + @DisplayName("모든 등급 조회") + void testGetGradeList() throws Exception { + Grade normalGrade = Grade.builder() + .id(1L) + .name("일반") + .pointRatio(5) + .condition(0) + .build(); + + Grade royalGrade = Grade.builder() + .id(2L) + .name("로얄") + .pointRatio(10) + .condition(100000) + .build(); + + when(gradeService.getGradeList()) + .thenReturn(List.of(normalGrade, royalGrade)); + + mockMvc.perform(RestDocumentationRequestBuilders + .get("/api/admin/grades") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpectAll( + jsonPath("$.[0].id").value(normalGrade.getId()), + jsonPath("$.[0].name").value(normalGrade.getName()), + jsonPath("$.[0].pointRatio").value(normalGrade.getPointRatio()), + jsonPath("$.[0].condition").value(normalGrade.getCondition())) + .andDo(document("grade/getGradeList/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("[].id").description("등급 ID"), + fieldWithPath("[].name").description("등급 이름"), + fieldWithPath("[].pointRatio").description("적립률"), + fieldWithPath("[].condition").description("조건") + ))); + + verify(gradeService).getGradeList(); + } + + @Test + @DisplayName("등급 변경") + void testUpdateGrade() throws Exception { + GradeUpdateRequestDto dto = new GradeUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "name", "일반"); + ReflectionTestUtils.setField(dto, "pointRatio", 20); + ReflectionTestUtils.setField(dto, "condition", 10000); + + doNothing().when(gradeService).updateGrade(anyLong(), any(GradeUpdateRequestDto.class)); + + mockMvc.perform(RestDocumentationRequestBuilders + .post("/api/admin/grades/{gradeId}", 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isOk()) + .andDo(document("grade/updateGrade/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("gradeId").description("등급 ID")), + requestFields( + fieldWithPath("name").description("등급 이름"), + fieldWithPath("pointRatio").description("적립률"), + fieldWithPath("condition").description("조건") + ) + )); + + verify(gradeService).updateGrade(anyLong(), any(GradeUpdateRequestDto.class)); + } + + @Test + @DisplayName("존재하지 않는 등급 ID로 인한 등급 변경 실패") + void testUpdateGradeFailed() throws Exception { + GradeUpdateRequestDto dto = new GradeUpdateRequestDto(); + + ReflectionTestUtils.setField(dto, "name", "일반"); + ReflectionTestUtils.setField(dto, "pointRatio", 20); + ReflectionTestUtils.setField(dto, "condition", 10000); + + doThrow(GradeNotFoundException.class) + .when(gradeService) + .updateGrade(anyLong(), any(GradeUpdateRequestDto.class)); + + mockMvc.perform(RestDocumentationRequestBuilders + .post("/api/admin/grades/{gradeId}", 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dto))) + .andExpect(status().isNotFound()) + .andDo(document("grade/updateGrade/failed", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()) + )); + + verify(gradeService).updateGrade(anyLong(), any(GradeUpdateRequestDto.class)); + } + + @Test + @DisplayName("등급 삭제") + void testDeleteGrade() throws Exception { + doNothing().when(gradeService).deleteGrade(1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .delete("/api/admin/grades/{gradeId}", 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(document("grade/deleteGrade/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("gradeId").description("등급 ID")) + )); + + verify(gradeService).deleteGrade(1L); + } + + @Test + @DisplayName("존재하지 않는 등급 ID로 인한 등급 삭제 실패") + void testDeleteGradeFailed() throws Exception { + doThrow(GradeNotFoundException.class) + .when(gradeService) + .deleteGrade(1L); + + mockMvc.perform(RestDocumentationRequestBuilders + .delete("/api/admin/grades/{gradeId}", 1L) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andDo(document("grade/deleteGrade/failed", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("gradeId").description("등급 ID")) + )); + + verify(gradeService).deleteGrade(1L); + } +} From 80b26f124f999db085d133e286e0c1c891bfa523 Mon Sep 17 00:00:00 2001 From: jinwoo Lee Date: Fri, 22 Mar 2024 16:56:27 +0900 Subject: [PATCH 151/161] [TEST] MemberRepositoryTest --- .../repository/MemberRepositoryTest.java | 137 ++++++++++++++++-- 1 file changed, 128 insertions(+), 9 deletions(-) diff --git a/src/test/java/store/ckin/api/member/repository/MemberRepositoryTest.java b/src/test/java/store/ckin/api/member/repository/MemberRepositoryTest.java index 7c16c13a..62e0ca63 100644 --- a/src/test/java/store/ckin/api/member/repository/MemberRepositoryTest.java +++ b/src/test/java/store/ckin/api/member/repository/MemberRepositoryTest.java @@ -1,17 +1,25 @@ package store.ckin.api.member.repository; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.LocalDate; import java.time.LocalDateTime; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import store.ckin.api.book.entity.Book; import store.ckin.api.grade.entity.Grade; +import store.ckin.api.member.domain.response.MemberAuthResponseDto; +import store.ckin.api.member.domain.response.MemberMyPageResponseDto; +import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto; import store.ckin.api.member.entity.Member; +import store.ckin.api.review.entity.Review; /** * MemberRepository 에 대한 Test 입니다. @@ -28,20 +36,23 @@ class MemberRepositoryTest { @Autowired private MemberRepository memberRepository; - @Test - @DisplayName("이메일로 계정 존재 여부 테스트") - void testExistsByEmail() { - Grade grade = Grade.builder() + private Grade grade; + + private Member member; + + @BeforeEach + void setUp() { + grade = Grade.builder() .id(1L) .name("test") .pointRatio(20) .condition(0) .build(); - Grade mergedGrade = entityManager.merge(grade); + entityManager.persist(grade); - Member member = Member.builder() - .grade(mergedGrade) + member = Member.builder() + .grade(grade) .email("test@test.com") .password("1234") .contact("12312312345") @@ -49,10 +60,118 @@ void testExistsByEmail() { .latestLoginAt(LocalDateTime.now()) .role(Member.Role.MEMBER) .point(5000) + .accumulateAmount(0) + .build(); + + entityManager.persist(member); + } + + @Test + @DisplayName("이메일로 계정 존재 여부 확인") + void testExistsByEmail() { + assertTrue(memberRepository.existsByEmail(member.getEmail())); + assertFalse(memberRepository.existsByEmail("false@test.com")); + } + + @Test + @DisplayName("OAuthID 로 계정 존재 여부 확인") + void testExistsByOauthId() { + Member oauthMember = Member.builder() + .grade(grade) + .email("oauthTest@test.com") + .password("1234") + .contact("12367891234") + .birth(LocalDate.now()) + .latestLoginAt(LocalDateTime.now()) + .role(Member.Role.MEMBER) + .point(5000) + .oauthId("oauthId123") + .build(); + + memberRepository.save(oauthMember); + + assertTrue(memberRepository.existsByOauthId(oauthMember.getOauthId())); + assertFalse(memberRepository.existsByOauthId("oauthId124")); + } + + @Test + @DisplayName("이메일로 계정 조회") + void testFindByEmail() { + assertTrue(memberRepository.findByEmail(member.getEmail()).isPresent()); + assertTrue(memberRepository.findByEmail("false@test.com").isEmpty()); + } + + @Test + @DisplayName("이메일로 로그인에 필요한 정보를 조회") + void testGetLoginInfo() { + MemberAuthResponseDto result = + memberRepository.getLoginInfo(member.getEmail()); + + assertEquals(member.getId(), result.getId()); + assertEquals(member.getEmail(), result.getEmail()); + assertEquals(member.getPassword(), result.getPassword()); + assertEquals(member.getRole().name(), result.getRole()); + } + + @Test + @DisplayName("멤버 ID로 마이페이지에 필요한 정보 조회") + void testMyPageInfo() { + Book book = Book.builder() + .bookIsbn("1234567890123") + .bookDescription("테스트 책입니다.") + .bookTitle("테스트 책") + .bookPublisher("테스트 출판사") + .bookPublicationDate(LocalDate.of(2024, 3, 7)) + .bookStock(10) + .bookRegularPrice(10000) + .bookDiscountRate(0) + .bookSalePrice(10000) + .modifiedAt(LocalDateTime.now()) + .build(); + + entityManager.persist(book); + + Review review = Review.builder() + .reviewRate(5) + .reviewComment("Good") + .member(member) + .book(book) + .build(); + + entityManager.persist(review); + + MemberMyPageResponseDto result = + memberRepository.getMyPageInfo(member.getId()); + + assertEquals(member.getName(), result.getName()); + assertEquals(grade.getName(), result.getGradeName()); + assertEquals(member.getAccumulateAmount(), result.getAccumulateAmount()); + assertEquals(member.getPoint(), result.getPoint()); + assertEquals(1, result.getCountReview()); + } + + @Test + @DisplayName("OAuth ID 로 소셜 로그인에 필요한 정보 조회") + void testGetOauthMemberInfo() { + Member oauthMember = Member.builder() + .grade(grade) + .email("oauthTest@test.com") + .password("1234") + .contact("12367891234") + .birth(LocalDate.now()) + .latestLoginAt(LocalDateTime.now()) + .role(Member.Role.MEMBER) + .point(5000) + .oauthId("oauthId123") .build(); - entityManager.merge(member); + memberRepository.save(oauthMember); + + MemberOauthLoginResponseDto result = + memberRepository.getOauthMemberInfo(oauthMember.getOauthId()); - assertTrue(memberRepository.existsByEmail("test@test.com")); + assertEquals(oauthMember.getId(), result.getId()); + assertEquals(oauthMember.getRole().toString(), result.getRole()); } + } \ No newline at end of file From e416d60d3734716ab6ca5aa649ec2ed0e4c747d5 Mon Sep 17 00:00:00 2001 From: gaeun Date: Fri, 22 Mar 2024 17:20:43 +0900 Subject: [PATCH 152/161] =?UTF-8?q?[REFACTOR]=20=EB=8F=84=EC=84=9C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/book/controller/BookController.java | 34 +++++-- .../book/dto/response/BookResponseDto.java | 30 ++++++ .../book/repository/BookRepositoryCustom.java | 18 ++++ .../repository/impl/BookRepositoryImpl.java | 94 ++++++++++++++++++- .../ckin/api/book/service/BookService.java | 16 ++++ .../book/service/impl/BookServiceImpl.java | 10 ++ .../review/controller/ReviewController.java | 3 +- .../controller/ReviewControllerTest.java | 12 ++- 8 files changed, 204 insertions(+), 13 deletions(-) diff --git a/src/main/java/store/ckin/api/book/controller/BookController.java b/src/main/java/store/ckin/api/book/controller/BookController.java index 8bb69f3d..fbb0f681 100644 --- a/src/main/java/store/ckin/api/book/controller/BookController.java +++ b/src/main/java/store/ckin/api/book/controller/BookController.java @@ -198,27 +198,43 @@ public ResponseEntity updateBookThumbnail(@PathVariable Long bookId, } /** - * 주어진 카테고리 ID에 해당하는 메인 페이지 도서 목록을 반환합니다. + * 주어진 태그를 가지고 있는 메인 페이지 도서 목록을 반환합니다. * - * @param categoryId 카테고리 ID - * @param limit 반환할 도서의 수 - * @return 카테고리에 해당하는 도서 목록 + * @param limit 반환할 도서의 수 + * @param tagName 태그 이름 + * @return 해당하는 도서 목록 */ - @GetMapping("/main-page/category/{categoryId}") + @GetMapping("/main-page/tag") public ResponseEntity> getMainPageBooksByCategoryId( - @PathVariable Long categoryId, - @RequestParam(required = false, defaultValue = "10") Integer limit) { + @RequestParam(required = false, defaultValue = "8") Integer limit, + @RequestParam("tagName") String tagName) { + + List books = bookService.getMainPageBooksByTagName(limit, tagName); - List books = bookService.getMainPageBookListByCategoryId(categoryId, limit); return ResponseEntity.ok(books); } @GetMapping("/main-page") public ResponseEntity> getMainPageBooksOrderByBookPublicationDate( - @RequestParam(required = false, defaultValue = "10") Integer limit) { + @RequestParam(required = false, defaultValue = "8") Integer limit) { + List books = bookService.getMainPageBookListOrderByBookPublicationDate(limit); + return ResponseEntity.ok(books); } + /** + * 신간도서 페이지, 메인 페이지에 들어갈 신간 도서 목록을 페이지로 가져옵니다. + * + * @param pageable 페이지 정보 + * @return 신간 도서 페이지 목록 + */ + @GetMapping("/recent") + public ResponseEntity> getRecentPublishedBook(@PageableDefault(size = 8) Pageable pageable) { + Page recentBookPage = bookService.getRecentPublished(pageable); + + return ResponseEntity.ok().body(recentBookPage); + } + } diff --git a/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java b/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java index bfa4a8f4..0655bfb5 100644 --- a/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java +++ b/src/main/java/store/ckin/api/book/dto/response/BookResponseDto.java @@ -1,5 +1,6 @@ package store.ckin.api.book.dto.response; +import com.querydsl.core.annotations.QueryProjection; import java.time.LocalDate; import java.util.List; import lombok.Builder; @@ -34,6 +35,29 @@ public class BookResponseDto { private List categoryNames; private List tagNames; + + @QueryProjection + public BookResponseDto(Long bookId, String bookIsbn, String bookTitle, String bookDescription, String bookPublisher, + LocalDate bookPublicationDate, String bookIndex, Boolean bookPackaging, Integer bookStock, + Integer bookRegularPrice, Integer bookDiscountRate, String bookState, Integer bookSalePrice, + String bookReviewRate, String thumbnail) { + this.bookId = bookId; + this.bookIsbn = bookIsbn; + this.bookTitle = bookTitle; + this.bookDescription = bookDescription; + this.bookPublisher = bookPublisher; + this.bookPublicationDate = bookPublicationDate; + this.bookIndex = bookIndex; + this.bookPackaging = bookPackaging; + this.bookStock = bookStock; + this.bookRegularPrice = bookRegularPrice; + this.bookDiscountRate = bookDiscountRate; + this.bookState = bookState; + this.bookSalePrice = bookSalePrice; + this.bookReviewRate = bookReviewRate; + this.thumbnail = thumbnail; + } + @Builder public BookResponseDto(Long bookId, String bookIsbn, String bookTitle, String bookDescription, String bookPublisher, LocalDate bookPublicationDate, String bookIndex, Boolean bookPackaging, Integer bookStock, @@ -60,4 +84,10 @@ public BookResponseDto(Long bookId, String bookIsbn, String bookTitle, String bo this.categoryNames = categoryNames; this.tagNames = tagNames; } + + public void updateList(List authorNames, List categoryNames, List tagNames) { + this.authorNames = authorNames; + this.categoryNames = categoryNames; + this.tagNames = tagNames; + } } diff --git a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java index cf14469a..b079f805 100644 --- a/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java +++ b/src/main/java/store/ckin/api/book/repository/BookRepositoryCustom.java @@ -8,6 +8,7 @@ import store.ckin.api.book.dto.response.BookExtractionResponseDto; import store.ckin.api.book.dto.response.BookListResponseDto; import store.ckin.api.book.dto.response.BookMainPageResponseDto; +import store.ckin.api.book.dto.response.BookResponseDto; import store.ckin.api.book.entity.Book; /** @@ -73,4 +74,21 @@ public interface BookRepositoryCustom { List getMainPageResponseDtoByCategoryId(Long categoryId, Integer limit); List getMainPageResponseDtoOrderByBookPublicationDate(Integer limit); + + /** + * 태그 이름을 가진 도서 목록을 가져옵니다. + * + * @param limit 최대로 가져올 도서의 개수 + * @param tagName 태그 이름 + * @return 도서 목록 + */ + List getMainPageBooksByTagName(Integer limit, String tagName); + + /** + * 신간도서 페이지, 메인 페이지에 들어갈 신간 도서 목록을 페이지로 가져옵니다. + * + * @param pageable 페이지 정보 + * @return 신간 도서 페이지 목록 + */ + Page getRecentPublished(Pageable pageable); } diff --git a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java index fcd8983f..5e1f12cb 100644 --- a/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java +++ b/src/main/java/store/ckin/api/book/repository/impl/BookRepositoryImpl.java @@ -2,6 +2,7 @@ import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.Calendar; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -14,6 +15,8 @@ import store.ckin.api.book.dto.response.BookExtractionResponseDto; import store.ckin.api.book.dto.response.BookListResponseDto; import store.ckin.api.book.dto.response.BookMainPageResponseDto; +import store.ckin.api.book.dto.response.BookResponseDto; +import store.ckin.api.book.dto.response.QBookResponseDto; import store.ckin.api.book.entity.Book; import store.ckin.api.book.entity.QBook; import store.ckin.api.book.relationship.bookauthor.entity.QBookAuthor; @@ -295,7 +298,7 @@ public List getMainPageResponseDtoByCategoryId(Long cat .leftJoin(bookAuthor.author, author).fetchJoin() .leftJoin(book.categories, bookCategory).fetchJoin() .leftJoin(bookCategory.category, category).fetchJoin() - .leftJoin(book.tags,bookTag).fetchJoin() + .leftJoin(book.tags, bookTag).fetchJoin() .leftJoin(bookTag.tag, tag).fetchJoin() .leftJoin(book.thumbnail, file).fetchJoin() .where(book.bookId.in(bookIds)) @@ -337,6 +340,95 @@ public List getMainPageResponseDtoOrderByBookPublicatio .collect(Collectors.toList()); } + @Override + public List getMainPageBooksByTagName(Integer limit, String tagName) { + List books = from(book) + .leftJoin(book.authors, bookAuthor).fetchJoin() + .leftJoin(bookAuthor.author, author).fetchJoin() + .leftJoin(book.categories, bookCategory).fetchJoin() + .leftJoin(bookCategory.category, category).fetchJoin() + .leftJoin(book.tags, bookTag).fetchJoin() + .leftJoin(bookTag.tag, tag).fetchJoin() + .leftJoin(book.thumbnail, file).fetchJoin() + .where(tag.tagName.eq(tagName)) + .distinct() + .limit(limit) + .fetch(); + + return books.stream() + .map(this::convertToBookMainPageResponseDto) + .collect(Collectors.toList()); + } + + @Override + public Page getRecentPublished(Pageable pageable) { + List authorNames = from(book) + .leftJoin(bookAuthor) + .on(book.bookId.eq(bookAuthor.book.bookId)) + .select(author.authorName) + .fetch(); + + List categoryNames = from(book) + .leftJoin(bookCategory) + .on(book.bookId.eq(bookCategory.book.bookId)) + .select(category.categoryName) + .fetch(); + + List tagNames = from(book) + .leftJoin(bookTag) + .on(book.bookId.eq(bookTag.book.bookId)) + .select(tag.tagName) + .fetch(); + + List results = from(book) + .leftJoin(book.authors, bookAuthor) + .leftJoin(bookAuthor.author, author) + .leftJoin(book.categories, bookCategory) + .leftJoin(bookCategory.category, category) + .leftJoin(book.tags, bookTag) + .leftJoin(bookTag.tag, tag) + .leftJoin(book.thumbnail, file) + .select(new QBookResponseDto( + book.bookId, + book.bookIsbn, + book.bookTitle, + book.bookDescription, + book.bookPublisher, + book.bookPublicationDate, + book.bookIndex, + book.bookPackaging, + book.bookStock, + book.bookRegularPrice, + book.bookDiscountRate, + book.bookState, + book.bookSalePrice, + book.bookReviewRate, + file.fileUrl + )) + .orderBy(book.bookPublicationDate.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + results.forEach(bookResponseDto -> bookResponseDto.updateList(authorNames, categoryNames, tagNames)); + + long count = from(book) + .leftJoin(book.authors, bookAuthor) + .leftJoin(bookAuthor.author, author) + .leftJoin(book.categories, bookCategory) + .leftJoin(bookCategory.category, category) + .leftJoin(book.tags, bookTag) + .leftJoin(bookTag.tag, tag) + .leftJoin(book.thumbnail, file) + .select(book.count()) + .orderBy(book.bookPublicationDate.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetchOne(); + + return new PageImpl<>(results, pageable, count); + } + private BookListResponseDto convertToBookListResponseDto(Book book) { List authorNames = book.getAuthors().stream() diff --git a/src/main/java/store/ckin/api/book/service/BookService.java b/src/main/java/store/ckin/api/book/service/BookService.java index 5454847e..450acb29 100644 --- a/src/main/java/store/ckin/api/book/service/BookService.java +++ b/src/main/java/store/ckin/api/book/service/BookService.java @@ -110,6 +110,22 @@ public interface BookService { List getMainPageBookListOrderByBookPublicationDate(Integer limit); + /** + * 주어진 태그를 가지고 있는 메인 페이지 도서 목록을 반환합니다. + * + * @param limit 반환할 도서의 수 + * @param tagName 태그 이름 + * @return 해당하는 도서 목록 + */ + List getMainPageBooksByTagName(Integer limit, String tagName); + + /** + * 신간도서 페이지, 메인 페이지에 들어갈 신간 도서 목록을 페이지로 가져옵니다. + * + * @param pageable 페이지 정보 + * @return 신간 도서 페이지 목록 + */ + Page getRecentPublished(Pageable pageable); } diff --git a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java index 96a37347..ef1c572b 100644 --- a/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java +++ b/src/main/java/store/ckin/api/book/service/impl/BookServiceImpl.java @@ -239,6 +239,16 @@ public List getMainPageBookListOrderByBookPublicationDa return bookRepository.getMainPageResponseDtoOrderByBookPublicationDate(limit); } + @Override + public List getMainPageBooksByTagName(Integer limit, String tagName) { + return bookRepository.getMainPageBooksByTagName(limit, tagName); + } + + @Override + public Page getRecentPublished(Pageable pageable) { + return bookRepository.getRecentPublished(pageable); + } + /** * {@inheritDoc} diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index 87370ff6..94e43ed1 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -21,7 +21,6 @@ import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.facade.ReviewFacade; -import store.ckin.api.review.service.ReviewService; /** * ReviewController 클래스. @@ -42,7 +41,7 @@ public class ReviewController { * 리뷰 업로드를 구현하는 메소드 입니다. * * @param createRequestDto 도서 아이디, 리뷰 점수, 리뷰 코멘트를 담고 있는 DTO 입니다. - * @param imageList 리뷰의 이미지 리스트를 담고 있는 MultipartFile 리스트 입니다. + * @param imageList 리뷰의 이미지 리스트를 담고 있는 MultipartFile 리스트 입니다. */ @PostMapping("/review") public ResponseEntity postReview(@RequestPart ReviewCreateRequestDto createRequestDto, diff --git a/src/test/java/store/ckin/api/review/controller/ReviewControllerTest.java b/src/test/java/store/ckin/api/review/controller/ReviewControllerTest.java index a43609e3..2602183f 100644 --- a/src/test/java/store/ckin/api/review/controller/ReviewControllerTest.java +++ b/src/test/java/store/ckin/api/review/controller/ReviewControllerTest.java @@ -5,6 +5,15 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.restdocs.request.RequestDocumentation.requestParameters; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -18,6 +27,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.Page; @@ -85,7 +95,6 @@ void testPostReview() throws Exception { .file(createRequestDto)) .andDo(print()) .andExpect(status().isCreated()); - } @Test @@ -106,4 +115,5 @@ void testGetReviewPageList() throws Exception { .andExpect(jsonPath("$.content[0].reviewDate", equalTo(reviewResponseDto.getReviewDate()))) .andDo(print()); } + } \ No newline at end of file From 3294522c3c2046acba1e2a8934a1401e26c52b28 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:24:36 +0900 Subject: [PATCH 153/161] =?UTF-8?q?[REFACTOR]=20ReviewUpdateRequestDto=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 --- .../ckin/api/review/dto/request/ReviewUpdateRequestDto.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/store/ckin/api/review/dto/request/ReviewUpdateRequestDto.java b/src/main/java/store/ckin/api/review/dto/request/ReviewUpdateRequestDto.java index 9ce886c2..9403571a 100644 --- a/src/main/java/store/ckin/api/review/dto/request/ReviewUpdateRequestDto.java +++ b/src/main/java/store/ckin/api/review/dto/request/ReviewUpdateRequestDto.java @@ -12,6 +12,7 @@ @Getter @NoArgsConstructor public class ReviewUpdateRequestDto { + private Long reviewId; private Integer reviewRate; private String reviewComment; } From 6821a0fb949dbe66636c16d030a6e58f04a20df2 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:25:20 +0900 Subject: [PATCH 154/161] =?UTF-8?q?[REFACTOR]=20File=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=EC=97=90=EC=84=9C=20access=20=3D=20AccessLevel.PROTEC?= =?UTF-8?q?TED=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/file/entity/File.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/store/ckin/api/file/entity/File.java b/src/main/java/store/ckin/api/file/entity/File.java index 9037d97b..ff01185e 100644 --- a/src/main/java/store/ckin/api/file/entity/File.java +++ b/src/main/java/store/ckin/api/file/entity/File.java @@ -8,6 +8,7 @@ import javax.persistence.OneToOne; import javax.persistence.Table; import javax.validation.constraints.NotNull; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -25,7 +26,7 @@ @Entity @Table(name = "File") @Getter -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder(toBuilder = true) public class File extends Auditable { From 6cceabf097229075a2bcabc98ee7721a97c2d9a2 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:25:50 +0900 Subject: [PATCH 155/161] =?UTF-8?q?[TEST]=20FileRepositoryImplTest=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FileRepositoryImplTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/test/java/store/ckin/api/file/repository/FileRepositoryImplTest.java diff --git a/src/test/java/store/ckin/api/file/repository/FileRepositoryImplTest.java b/src/test/java/store/ckin/api/file/repository/FileRepositoryImplTest.java new file mode 100644 index 00000000..4522224b --- /dev/null +++ b/src/test/java/store/ckin/api/file/repository/FileRepositoryImplTest.java @@ -0,0 +1,65 @@ +package store.ckin.api.file.repository; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import store.ckin.api.file.entity.File; +import store.ckin.api.review.entity.Review; + +/** + * FileRepositoryTest. + * + * @author 나국로 + * @version 2024. 03. 22. + */ +@DataJpaTest +class FileRepositoryImplTest { + @Autowired + private FileRepository fileRepository; + + @Autowired + private TestEntityManager entityManager; + + @Test + @DisplayName("리뷰 ID에 해당하는 파일 경로 조회") + void givenReviewId_whenFindFilePathByReviewId_thenReturnFilePaths() { + Review review = new Review(); + entityManager.persist(review); + + File file1 = File.builder() + .fileId("file1") + .fileOriginName("origin1") + .fileUrl("url1") + .fileExtension("ext1") + .fileCategory("category1") + .review(review) + .build(); + entityManager.persist(file1); + + File file2 = File.builder() + .fileId("file2") + .fileOriginName("origin2") + .fileUrl("url2") + .fileExtension("ext2") + .fileCategory("category2") + .review(review) + .build(); + entityManager.persist(file2); + + entityManager.flush(); + entityManager.clear(); + + Long reviewId = review.getReviewId(); + List expectedFilePaths = List.of("url1", "url2"); + + List filePaths = fileRepository.findFilePathByReviewId(reviewId); + + assertEquals(expectedFilePaths, filePaths); + } + +} \ No newline at end of file From 84b44b1f352c695a4f40f21b2aeabc7ca8d21d45 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:26:40 +0900 Subject: [PATCH 156/161] =?UTF-8?q?[REFACTOR]=20Author=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/ckin/api/author/entity/Author.java | 3 +++ .../ckin/api/author/service/impl/AuthorServiceImpl.java | 9 +++------ .../api/author/service/impl/AuthorServiceImplTest.java | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/store/ckin/api/author/entity/Author.java b/src/main/java/store/ckin/api/author/entity/Author.java index 0b884d75..59a6ea73 100644 --- a/src/main/java/store/ckin/api/author/entity/Author.java +++ b/src/main/java/store/ckin/api/author/entity/Author.java @@ -39,5 +39,8 @@ public class Author { @OneToMany(mappedBy = "author") private Set books; + public void updateAuthor(String authorName) { + this.authorName = authorName; + } } diff --git a/src/main/java/store/ckin/api/author/service/impl/AuthorServiceImpl.java b/src/main/java/store/ckin/api/author/service/impl/AuthorServiceImpl.java index c779c87b..a123df7d 100644 --- a/src/main/java/store/ckin/api/author/service/impl/AuthorServiceImpl.java +++ b/src/main/java/store/ckin/api/author/service/impl/AuthorServiceImpl.java @@ -91,14 +91,11 @@ public AuthorResponseDto updateAuthor(Long authorId, AuthorModifyRequestDto auth Author existingAuthor = authorRepository.findById(authorId) .orElseThrow(() -> new AuthorNotFoundException(authorId)); - Author updatedAuthor = existingAuthor.toBuilder() - .authorName(authorModifyRequestDto.getAuthorName()) - .build(); - updatedAuthor = authorRepository.save(updatedAuthor); + existingAuthor.updateAuthor(authorModifyRequestDto.getAuthorName()); return AuthorResponseDto.builder() - .authorId(updatedAuthor.getAuthorId()) - .authorName(updatedAuthor.getAuthorName()) + .authorId(existingAuthor.getAuthorId()) + .authorName(existingAuthor.getAuthorName()) .build(); } diff --git a/src/test/java/store/ckin/api/author/service/impl/AuthorServiceImplTest.java b/src/test/java/store/ckin/api/author/service/impl/AuthorServiceImplTest.java index bd6f7242..ac2de775 100644 --- a/src/test/java/store/ckin/api/author/service/impl/AuthorServiceImplTest.java +++ b/src/test/java/store/ckin/api/author/service/impl/AuthorServiceImplTest.java @@ -16,6 +16,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -99,8 +100,8 @@ void givenAuthorIdAndModifyRequest_whenUpdateAuthor_thenAuthorUpdated() { .build(); AuthorModifyRequestDto authorModifyRequestDto = new AuthorModifyRequestDto(); ReflectionTestUtils.setField(authorModifyRequestDto, "authorName", "업데이트된 이름"); - when(authorRepository.findById(authorId)).thenReturn(Optional.of(existingAuthor)); - when(authorRepository.save(any(Author.class))).thenReturn(Author.builder() + Mockito.lenient().when(authorRepository.findById(authorId)).thenReturn(Optional.of(existingAuthor)); + Mockito.lenient().when(authorRepository.save(any(Author.class))).thenReturn(Author.builder() .authorId(authorId) .authorName("업데이트된 이름") .build()); From d06b5ad6a708c4e638351b7e726097d8cfcf48d1 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:27:07 +0900 Subject: [PATCH 157/161] =?UTF-8?q?[REFACTOR]=20Review=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/ckin/api/review/entity/Review.java | 5 ++ .../api/review/service/ReviewService.java | 2 +- .../service/impl/ReviewServiceImpl.java | 18 ++--- .../api/review/service/ReviewServiceTest.java | 69 +++++++++++++++++++ 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/src/main/java/store/ckin/api/review/entity/Review.java b/src/main/java/store/ckin/api/review/entity/Review.java index 281e5883..aa3f8cf7 100644 --- a/src/main/java/store/ckin/api/review/entity/Review.java +++ b/src/main/java/store/ckin/api/review/entity/Review.java @@ -45,4 +45,9 @@ public class Review extends Auditable { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "book_id") private Book book; + + public void updateReviewComment(String reviewComment, Integer reviewRate) { + this.reviewComment = reviewComment; + this.reviewRate = reviewRate; + } } diff --git a/src/main/java/store/ckin/api/review/service/ReviewService.java b/src/main/java/store/ckin/api/review/service/ReviewService.java index 964a7eac..2e3f02b6 100644 --- a/src/main/java/store/ckin/api/review/service/ReviewService.java +++ b/src/main/java/store/ckin/api/review/service/ReviewService.java @@ -36,5 +36,5 @@ public interface ReviewService { Page getReviewPageList(Pageable pageable, Long bookId); Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable); - void updateReview(Long reviewId, ReviewUpdateRequestDto updateRequestDto); + void updateReview(ReviewUpdateRequestDto updateRequestDto,Long memberId); } diff --git a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java index 11e53981..c1844142 100644 --- a/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java +++ b/src/main/java/store/ckin/api/review/service/impl/ReviewServiceImpl.java @@ -26,6 +26,7 @@ import store.ckin.api.review.entity.Review; import store.ckin.api.review.exception.ReviewNotFoundException; import store.ckin.api.review.exception.SaveFileException; +import store.ckin.api.review.exception.UnauthorizedReviewAccessException; import store.ckin.api.review.repository.ReviewRepository; import store.ckin.api.review.service.ReviewService; @@ -123,13 +124,14 @@ public Page findReviewsByMemberWithPagination(Long memb @Override @Transactional - public void updateReview(Long reviewId, ReviewUpdateRequestDto updateRequestDto) { - Review existingReview = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException(reviewId)); - - - existingReview.toBuilder() - .reviewComment(updateRequestDto.getReviewComment()) - .reviewRate(updateRequestDto.getReviewRate()).build(); + public void updateReview(ReviewUpdateRequestDto updateRequestDto, Long memberId) { + Review existingReview = reviewRepository.findById(updateRequestDto.getReviewId()) + .orElseThrow(() -> new ReviewNotFoundException(updateRequestDto.getReviewId())); + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new MemberNotFoundException(memberId)); + if (!existingReview.getMember().equals(member)) { + throw new UnauthorizedReviewAccessException(memberId); + } + existingReview.updateReviewComment(updateRequestDto.getReviewComment(), updateRequestDto.getReviewRate()); } } diff --git a/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java b/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java index 8aaad353..95767e44 100644 --- a/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java +++ b/src/test/java/store/ckin/api/review/service/ReviewServiceTest.java @@ -1,5 +1,9 @@ package store.ckin.api.review.service; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import lombok.Data; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -10,6 +14,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.util.ReflectionTestUtils; @@ -24,6 +29,8 @@ import store.ckin.api.member.repository.MemberRepository; import store.ckin.api.objectstorage.service.ObjectStorageService; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; +import store.ckin.api.review.dto.request.ReviewUpdateRequestDto; +import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.entity.Review; import store.ckin.api.review.repository.ReviewRepository; @@ -36,6 +43,8 @@ import java.util.List; import java.util.Optional; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -209,4 +218,64 @@ void testGetReviewPageList_X() { } + @Test + void findReviewsByMemberWithPaginationTest() { + // Given + Long memberId = 1L; + Pageable pageable = PageRequest.of(0, 10); + MyPageReviewResponseDto dto = MyPageReviewResponseDto.builder() + .reviewId(1L) + .author("Author") + .message("Review Message") + .reviewRate(5) + .reviewDate("2024-03-14") + .thumbnailPath("path/to/thumbnail") + .bookId(1L) + .bookTitle("Book Title") + .build(); + List content = Collections.singletonList(dto); + Page page = new PageImpl<>(content, pageable, content.size()); + List filePaths = Arrays.asList("path/to/file1", "path/to/file2"); + + when(memberRepository.existsById(memberId)).thenReturn(true); + when(reviewRepository.findReviewsByMemberWithPagination(memberId, pageable)).thenReturn(page); + when(fileRepository.findFilePathByReviewId(dto.getReviewId())).thenReturn(filePaths); + + // When + Page result = reviewService.findReviewsByMemberWithPagination(memberId, pageable); + + // Then + verify(memberRepository).existsById(memberId); + verify(reviewRepository).findReviewsByMemberWithPagination(memberId, pageable); + verify(fileRepository, times(content.size())).findFilePathByReviewId(anyLong()); + + assertNotNull(result); + assertEquals(1, result.getContent().size()); + assertEquals(filePaths, result.getContent().get(0).getFilePath()); + } + + + @Test + void updateReviewTest() { + // Given + Long reviewId = 1L; + Long memberId = 1L; + ReviewUpdateRequestDto updateRequestDto = new ReviewUpdateRequestDto(); + ReflectionTestUtils.setField(updateRequestDto, "reviewId", reviewId); + ReflectionTestUtils.setField(updateRequestDto, "reviewRate", 5); + ReflectionTestUtils.setField(updateRequestDto, "reviewComment", "Updated comment"); + + when(reviewRepository.findById(reviewId)).thenReturn(Optional.of(review)); + when(memberRepository.findById(memberId)).thenReturn(Optional.of(member)); + + // When + reviewService.updateReview(updateRequestDto, memberId); + + // Then + verify(reviewRepository).findById(reviewId); + verify(memberRepository).findById(memberId); + assertEquals("Updated comment", review.getReviewComment()); + assertEquals(5, review.getReviewRate()); + } + } \ No newline at end of file From ed951bd6799f07309fe41cc38f5c07bd967013f7 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:27:17 +0900 Subject: [PATCH 158/161] =?UTF-8?q?[REFACTOR]=20Review=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckin/api/review/controller/ReviewController.java | 11 +++++------ .../store/ckin/api/review/facade/ReviewFacade.java | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/store/ckin/api/review/controller/ReviewController.java b/src/main/java/store/ckin/api/review/controller/ReviewController.java index 87370ff6..3e12deb3 100644 --- a/src/main/java/store/ckin/api/review/controller/ReviewController.java +++ b/src/main/java/store/ckin/api/review/controller/ReviewController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; @@ -21,7 +22,6 @@ import store.ckin.api.review.dto.response.MyPageReviewResponseDto; import store.ckin.api.review.dto.response.ReviewResponseDto; import store.ckin.api.review.facade.ReviewFacade; -import store.ckin.api.review.service.ReviewService; /** * ReviewController 클래스. @@ -86,13 +86,12 @@ public ResponseEntity> getReviewPageListByMemberId return ResponseEntity.ok().body(content); } - @PutMapping("/members/review/{reviewId}") - public ResponseEntity updateReview(@RequestPart ReviewUpdateRequestDto updateRequestDto, - @PathVariable Long reviewId) { + @PutMapping("/members/review/{memberId}") + public ResponseEntity updateReview(@RequestBody ReviewUpdateRequestDto updateRequestDto, + @PathVariable Long memberId) { - reviewFacade.updateReview(reviewId, updateRequestDto); + reviewFacade.updateReview(updateRequestDto,memberId); return ResponseEntity.status(HttpStatus.OK).build(); } - } diff --git a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java index 3e6d3f5c..5278a216 100644 --- a/src/main/java/store/ckin/api/review/facade/ReviewFacade.java +++ b/src/main/java/store/ckin/api/review/facade/ReviewFacade.java @@ -70,7 +70,7 @@ public Page findReviewsByMemberWithPagination(Long memb return reviewService.findReviewsByMemberWithPagination(memberId, pageable); } - public void updateReview(Long reviewId, ReviewUpdateRequestDto updateRequestDto) { - reviewService.updateReview(reviewId, updateRequestDto); + public void updateReview(ReviewUpdateRequestDto updateRequestDto, Long memberId) { + reviewService.updateReview(updateRequestDto, memberId); } } From 5e01b045d3f380588596bf8ed3c66c13b1da6fe8 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:28:13 +0900 Subject: [PATCH 159/161] =?UTF-8?q?[TEST]=20Review=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1=20=EB=B0=8F?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/BookRepositoryImplTest.java | 66 ++++- .../service/impl/BookServiceImplTest.java | 274 +++++++++++++++--- 2 files changed, 297 insertions(+), 43 deletions(-) diff --git a/src/test/java/store/ckin/api/book/repository/impl/BookRepositoryImplTest.java b/src/test/java/store/ckin/api/book/repository/impl/BookRepositoryImplTest.java index ddcd260a..deb3b675 100644 --- a/src/test/java/store/ckin/api/book/repository/impl/BookRepositoryImplTest.java +++ b/src/test/java/store/ckin/api/book/repository/impl/BookRepositoryImplTest.java @@ -8,18 +8,19 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; -import org.springframework.context.annotation.Import; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.util.ReflectionUtils; import store.ckin.api.author.entity.Author; import store.ckin.api.book.dto.response.BookListResponseDto; +import store.ckin.api.book.dto.response.BookMainPageResponseDto; import store.ckin.api.book.entity.Book; import store.ckin.api.book.relationship.bookauthor.entity.BookAuthor; import store.ckin.api.book.relationship.bookcategory.entity.BookCategory; @@ -35,7 +36,6 @@ * @version 2024. 02. 29. */ @DataJpaTest -@Import(BookRepositoryImpl.class) class BookRepositoryImplTest { @Autowired private BookRepository bookRepository; @@ -72,8 +72,10 @@ void setup() { .bookPublicationDate(LocalDate.now()) .bookRegularPrice(10000) .build(); - testBook = entityManager.persist(testBook); - + BookCategory bookCategory = + new BookCategory(new BookCategory.PK(testBook.getBookId(), category.getCategoryId()), testBook, + category); + entityManager.persist(bookCategory); BookAuthor bookAuthor = new BookAuthor(new BookAuthor.PK(testBook.getBookId(), author.getAuthorId()), testBook, author); entityManager.persist(bookAuthor); @@ -81,10 +83,9 @@ void setup() { BookTag bookTag = new BookTag(new BookTag.PK(testBook.getBookId(), tag.getTagId()), testBook, tag); entityManager.persist(bookTag); - BookCategory bookCategory = - new BookCategory(new BookCategory.PK(testBook.getBookId(), category.getCategoryId()), testBook, - category); - entityManager.persist(bookCategory); + + testBook = entityManager.persist(testBook); + Field authorsField = ReflectionUtils.findField(Book.class, "authors"); if (authorsField != null) { @@ -93,6 +94,21 @@ void setup() { authors.add(bookAuthor); ReflectionUtils.setField(authorsField, testBook, authors); } + Field categoriesField = ReflectionUtils.findField(Book.class, "categories"); + if (categoriesField != null) { + categoriesField.setAccessible(true); + Set categories = new HashSet<>(); + categories.add(bookCategory); + ReflectionUtils.setField(categoriesField, testBook, categories); + } + Field tagsField = ReflectionUtils.findField(Book.class, "tags"); + if (tagsField != null) { + tagsField.setAccessible(true); + Set tags = new HashSet<>(); + tags.add(bookTag); + ReflectionUtils.setField(tagsField, testBook, tags); + } + entityManager.flush(); } @@ -147,5 +163,37 @@ void findByBookIdTest() { .contains(testBook); } + @Test + @DisplayName("카테고리 ID별 메인 페이지 책 목록 조회") + void getMainPageResponseDtoByCategoryIdTest() { + // Given + Long categoryId = category.getCategoryId(); + Integer limit = 5; + + // When + List mainPageBooks = + bookRepository.getMainPageResponseDtoByCategoryId(categoryId, limit); + + // Then + assertThat(mainPageBooks) + .isNotEmpty() + .hasSizeLessThanOrEqualTo(limit) + .allSatisfy(book -> assertThat(book.getBookId()).isNotNull()); + } + + + @Test + @DisplayName("출판 날짜별 책 목록 조회") + void getMainPageResponseDtoOrderByBookPublicationDateTest() { + Integer limit = 5; + + List result = bookRepository.getMainPageResponseDtoOrderByBookPublicationDate(limit); + + Assertions.assertNotNull(result, "결과 목록은 null이 아니어야 합니다."); + Assertions.assertTrue(result.size() <= limit, "결과 목록의 크기가 limit을 초과하지 않아야 합니다."); + + } + + +} -} \ No newline at end of file diff --git a/src/test/java/store/ckin/api/book/service/impl/BookServiceImplTest.java b/src/test/java/store/ckin/api/book/service/impl/BookServiceImplTest.java index eecc0b48..d7a4931c 100644 --- a/src/test/java/store/ckin/api/book/service/impl/BookServiceImplTest.java +++ b/src/test/java/store/ckin/api/book/service/impl/BookServiceImplTest.java @@ -5,12 +5,19 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.io.IOException; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -26,12 +33,16 @@ import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.multipart.MultipartFile; import store.ckin.api.author.entity.Author; import store.ckin.api.author.repository.AuthorRepository; import store.ckin.api.book.dto.request.BookCreateRequestDto; import store.ckin.api.book.dto.request.BookModifyRequestDto; +import store.ckin.api.book.dto.response.BookExtractionResponseDto; import store.ckin.api.book.dto.response.BookListResponseDto; +import store.ckin.api.book.dto.response.BookMainPageResponseDto; import store.ckin.api.book.dto.response.BookResponseDto; import store.ckin.api.book.entity.Book; import store.ckin.api.book.exception.BookNotFoundException; @@ -41,6 +52,9 @@ import store.ckin.api.book.repository.BookRepository; import store.ckin.api.category.entity.Category; import store.ckin.api.category.repository.CategoryRepository; +import store.ckin.api.file.entity.File; +import store.ckin.api.file.repository.FileRepository; +import store.ckin.api.objectstorage.service.ObjectStorageService; import store.ckin.api.tag.entity.Tag; import store.ckin.api.tag.repository.TagRepository; @@ -63,11 +77,22 @@ class BookServiceImplTest { private CategoryRepository categoryRepository; @Mock private TagRepository tagRepository; + @Mock + private ObjectStorageService objectStorageService; + @Mock + private FileRepository fileRepository; + private Pageable pageable; BookListResponseDto book1; BookListResponseDto book2; private Page bookPage; + private Book book; + private Category category1, category2; + private BookCategory bookCategory1, bookCategory2; + + MockMultipartFile mockImageFile; + @BeforeEach void setUp() { @@ -109,44 +134,70 @@ void setUp() { .authorNames(List.of("작가2")) .build(); bookPage = new PageImpl<>(List.of(book1, book2), pageable, 2); + byte[] content = new byte[] { /* 이미지 데이터 */}; + mockImageFile = new MockMultipartFile("file", "filename.jpg", "image/jpeg", content); + + + category1 = new Category(1L, null, "소설", 1, null); + category2 = new Category(2L, null, "과학", 2, null); + + book = new Book(1L, "123456789", "샘플 책", "설명", "출판사", + LocalDate.now(), "목차", true, "판매 중", 10, 100, 10, 90, "0", + LocalDateTime.now(), null, new HashSet<>(), new HashSet<>(), new HashSet<>(), new HashSet<>()); + book = new Book(1L, "123456789", "샘플 책", "설명", "출판사", + LocalDate.now(), "목차", true, "판매 중", 10, 100, 10, 90, "0", + LocalDateTime.now(), null, new HashSet<>(), new HashSet<>(), new HashSet<>(), new HashSet<>()); + + bookCategory1 = new BookCategory(new BookCategory.PK(1L, 1L), book, category1); + bookCategory2 = new BookCategory(new BookCategory.PK(1L, 2L), book, category2); + + book.getCategories().addAll(Arrays.asList(bookCategory1, bookCategory2)); } -// @Test -// @DisplayName("책 생성 성공") -// void givenNewBookInfo_whenCreateBook_thenBookIsSuccessfullyCreated() { -// -// Author author = Author.builder().authorId(1L).authorName("테스트 작가").build(); -// Category category = Category.builder().categoryId(1L).categoryName("테스트 카테고리").build(); -// Tag tag = Tag.builder().tagId(1L).tagName("테스트 태그").build(); -// -// BookCreateRequestDto requestDto = new BookCreateRequestDto(); -// -// ReflectionTestUtils.setField(requestDto, "bookIsbn", "1234567890123"); -// ReflectionTestUtils.setField(requestDto, "bookTitle", "테스트 책 제목"); -// ReflectionTestUtils.setField(requestDto, "bookDescription", "테스트 책 설명"); -// ReflectionTestUtils.setField(requestDto, "bookPublisher", "테스트 출판사"); -// ReflectionTestUtils.setField(requestDto, "bookPublicationDate", LocalDate.now()); -// ReflectionTestUtils.setField(requestDto, "bookRegularPrice", 10000); -// ReflectionTestUtils.setField(requestDto, "bookDiscountRate", 10); -// ReflectionTestUtils.setField(requestDto, "authorIds", new HashSet<>(Set.of(1L))); -// ReflectionTestUtils.setField(requestDto, "categoryIds", new HashSet<>(Set.of(1L))); -// ReflectionTestUtils.setField(requestDto, "tagIds", new HashSet<>(Set.of(1L))); -// -// when(authorRepository.findById(anyLong())).thenReturn(Optional.of(author)); -// when(categoryRepository.findById(anyLong())).thenReturn(Optional.of(category)); -// when(tagRepository.findById(anyLong())).thenReturn(Optional.of(tag)); -// when(bookRepository.save(any(Book.class))).thenAnswer(invocation -> invocation.getArgument(0)); -// -// -//// bookService.createBook(requestDto,); -// -// verify(bookRepository).save(any(Book.class)); -// verify(authorRepository).findById(anyLong()); -// verify(categoryRepository).findById(anyLong()); -// verify(tagRepository).findById(anyLong()); -// } + @Test + @DisplayName("책 생성 성공") + void givenNewBookInfo_whenCreateBook_thenBookIsSuccessfullyCreated() throws IOException { + + Author author = Author.builder().authorId(1L).authorName("테스트 작가").build(); + Category category = Category.builder().categoryId(1L).categoryName("테스트 카테고리").build(); + Tag tag = Tag.builder().tagId(1L).tagName("테스트 태그").build(); + + BookCreateRequestDto requestDto = new BookCreateRequestDto(); + + ReflectionTestUtils.setField(requestDto, "bookIsbn", "1234567890123"); + ReflectionTestUtils.setField(requestDto, "bookTitle", "테스트 책 제목"); + ReflectionTestUtils.setField(requestDto, "bookDescription", "테스트 책 설명"); + ReflectionTestUtils.setField(requestDto, "bookPublisher", "테스트 출판사"); + ReflectionTestUtils.setField(requestDto, "bookPublicationDate", LocalDate.now()); + ReflectionTestUtils.setField(requestDto, "bookRegularPrice", 10000); + ReflectionTestUtils.setField(requestDto, "bookDiscountRate", 10); + ReflectionTestUtils.setField(requestDto, "authorIds", new HashSet<>(Set.of(1L))); + ReflectionTestUtils.setField(requestDto, "categoryIds", new HashSet<>(Set.of(1L))); + ReflectionTestUtils.setField(requestDto, "tagIds", new HashSet<>(Set.of(1L))); + + when(authorRepository.findById(anyLong())).thenReturn(Optional.of(author)); + when(categoryRepository.findById(anyLong())).thenReturn(Optional.of(category)); + when(tagRepository.findById(anyLong())).thenReturn(Optional.of(tag)); + when(bookRepository.save(any(Book.class))).thenAnswer(invocation -> invocation.getArgument(0)); + File mockStoredFile = File.builder() + .fileId("some-id") + .fileOriginName("filename.jpg") + .fileUrl("http://example.com/filename.jpg") + .fileExtension(".jpg") + .fileCategory("book") + .build(); + when(objectStorageService.saveFile(any(MockMultipartFile.class), eq("book"))).thenReturn(mockStoredFile); + + + bookService.createBook(requestDto, mockImageFile); + + verify(bookRepository).save(any(Book.class)); + verify(authorRepository).findById(anyLong()); + verify(categoryRepository).findById(anyLong()); + verify(tagRepository).findById(anyLong()); + } @Test @DisplayName("책 정보 수정 성공") @@ -305,5 +356,160 @@ void givenInvalidBookId_whenFindBookById_thenThrowsException() { verify(bookRepository).findByBookId(bookID); } + @Test + @DisplayName("카테고리 Id로 메인페이지 북리스트 가져오기") + void getMainPageBookListByCategoryIdTest() { + Long categoryId = 1L; + Integer limit = 10; + + // Mock 객체 생성 + BookMainPageResponseDto mockDto = BookMainPageResponseDto.builder() + .bookId(1L) + .bookTitle("Mock Book") + .bookRegularPrice(20000) + .bookDiscountRate(10) + .bookSalePrice(18000) + .thumbnail("http://example.com/thumbnail.jpg") + .productCategories(List.of("Category 1", "Category 2")) + .productAuthorNames(List.of("Author 1", "Author 2")) + .productTags(List.of("Tag 1", "Tag 2")) + .build(); + when(bookRepository.getMainPageResponseDtoByCategoryId(eq(1L), anyInt())).thenReturn(List.of(mockDto)); + List result = bookService.getMainPageBookListByCategoryId(categoryId, limit); + + + assertEquals(1, result.size()); + BookMainPageResponseDto retrievedDto = result.get(0); + assertEquals(mockDto.getBookId(), retrievedDto.getBookId()); + + verify(bookRepository, times(1)).getMainPageResponseDtoByCategoryId(categoryId, limit); + } + + @Test + @DisplayName("주어진 책 ID들로 카테고리 ID들 가져오기") + void givenBookIds_whenGetBookCategoryIdsByBookIds_thenReturnsCategoryIds() { + + } + + + @Test + @DisplayName("최신 출판일순으로 메인페이지 북리스트 가져오기") + void givenLimit_whenGetMainPageBookListOrderByPublicationDate_thenReturnsBooks() { + // Given + Integer limit = 10; + List expectedBooks = Collections.singletonList( + BookMainPageResponseDto.builder() + .bookId(1L) + .bookTitle("Test Book") + .bookRegularPrice(20000) + .bookDiscountRate(10) + .bookSalePrice(18000) + .thumbnail("http://example.com/thumbnail.jpg") + .productCategories(Collections.singletonList("Category 1")) + .productAuthorNames(Collections.singletonList("Author 1")) + .productTags(Collections.singletonList("Tag 1")) + .build() + ); + when(bookRepository.getMainPageResponseDtoOrderByBookPublicationDate(limit)).thenReturn(expectedBooks); + + List actualBooks = bookService.getMainPageBookListOrderByBookPublicationDate(limit); + + assertEquals(expectedBooks.size(), actualBooks.size()); + + verify(bookRepository).getMainPageResponseDtoOrderByBookPublicationDate(limit); + } + + @Test + @DisplayName("Update book thumbnail") + void givenBookIdAndFile_whenUpdateBookThumbnail_thenThumbnailIsUpdated() throws IOException { + Long bookId = 1L; + MultipartFile file = new MockMultipartFile("file", "filename.jpg", "image/jpeg", new byte[] {}); + File thumbnailFile = File.builder() + .fileId("thumbnail-file-id") + .fileOriginName("thumbnail.jpg") + .fileUrl("http://example.com/thumbnail.jpg") + .fileExtension(".jpg") + .fileCategory("thumbnail") + .build(); + Book book = Book.builder().bookId(bookId) + .thumbnail(thumbnailFile).build(); + + when(bookRepository.findById(bookId)).thenReturn(Optional.of(book)); + when(objectStorageService.saveFile(file, "book")).thenReturn(thumbnailFile); + + bookService.updateBookThumbnail(bookId, file); + + verify(bookRepository).findById(bookId); + verify(objectStorageService).saveFile(file, "book"); + assertEquals(thumbnailFile.getFileOriginName(), "thumbnail.jpg"); + assertEquals(thumbnailFile.getFileUrl(), "http://example.com/thumbnail.jpg"); + } + + + @Test + @DisplayName("주어진 도서 ID에 따른 된 도서 목록이 반환") + void givenBookIds_whenGetExtractBookListByBookIds_thenExtractedBookListReturned() { + // Given + List bookIds = List.of(1L, 2L, 3L); + List expectedResponse = new ArrayList<>(); + expectedResponse.add(BookExtractionResponseDto.builder() + .bookId(1L) + .bookImageUrl("image1.jpg") + .bookTitle("Book 1") + .bookPackaging(true) + .bookSalePrice(10000) + .bookStock(50) +// .categoryIds(List.of(1L, 2L)) + .build()); + expectedResponse.add(BookExtractionResponseDto.builder() + .bookId(2L) + .bookImageUrl("image2.jpg") + .bookTitle("Book 2") + .bookPackaging(false) + .bookSalePrice(15000) + .bookStock(30) +// .categoryIds(List.of(3L, 4L)) + .build()); + expectedResponse.add(BookExtractionResponseDto.builder() + .bookId(3L) + .bookImageUrl("image3.jpg") + .bookTitle("Book 3") + .bookPackaging(true) + .bookSalePrice(20000) + .bookStock(20) +// .categoryIds(List.of(5L, 6L)) + .build()); + + when(bookRepository.getExtractBookListByBookIds(bookIds)).thenReturn(expectedResponse); + + // When + List actualResponse = bookService.getExtractBookListByBookIds(bookIds); + + // Then + assertEquals(expectedResponse.size(), actualResponse.size()); + for (int i = 0; i < expectedResponse.size(); i++) { + assertEquals(expectedResponse.get(i), actualResponse.get(i)); + } + } + + + @Test + void whenValidBookIds_thenCategoryIdsShouldBeReturned() { + when(bookRepository.findByBookId(1L)).thenReturn(Optional.of(book)); + + List bookIds = Arrays.asList(1L); + List expectedCategoryIds = Arrays.asList(1L, 2L); + + List result = bookService.getBookCategoryIdsByBookIds(bookIds); + assertEquals(expectedCategoryIds, result); + } + + @Test + void whenBookNotFound_thenThrowException() { + when(bookRepository.findByBookId(3L)).thenReturn(Optional.empty()); + + assertThrows(BookNotFoundException.class, () -> bookService.getBookCategoryIdsByBookIds(Arrays.asList(3L))); + } + } \ No newline at end of file From ae68be401f19ee0f4f183dc1a2c43298c7b806d3 Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:30:12 +0900 Subject: [PATCH 160/161] =?UTF-8?q?[TEST]=20Review=20Restdocs=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20Controller=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/book.adoc | 80 +++++ .../api/book/controller/BookController.java | 28 -- .../book/controller/BookControllerTest.java | 329 +++++++++++------- 3 files changed, 286 insertions(+), 151 deletions(-) create mode 100644 src/docs/asciidoc/book.adoc diff --git a/src/docs/asciidoc/book.adoc b/src/docs/asciidoc/book.adoc new file mode 100644 index 00000000..c0876f86 --- /dev/null +++ b/src/docs/asciidoc/book.adoc @@ -0,0 +1,80 @@ +== 책 + +=== 책 Id로 책 정보 조회 + +==== Request + +include::{snippets}/book/getBookById/success/http-request.adoc[] + +==== Path Parameters + +include::{snippets}/book/getBookById/success/path-parameters.adoc[] + + +==== Response + +include::{snippets}/book/getBookById/success/http-response.adoc[] + +==== Response fields + +include::{snippets}/book/getBookById/success/response-fields.adoc[] + +{empty} + + +=== 책 생성 요청 성공 + +==== Request + +include::{snippets}/book/createBook/success/http-request.adoc[] + +==== Request Parts + +include::{snippets}/book/createBook/success/request-parts.adoc[] + + +==== Request Parts + +include::{snippets}/book/createBook/success/request-part-requestDto-fields.adoc[] + +==== Response + +include::{snippets}/book/createBook/success/http-response.adoc[] + +=== 책 정보 업데이트 + +==== Request + +include::{snippets}/book/updateBook/success/http-request.adoc[] + +==== Path Parameters + +include::{snippets}/book/updateBook/success/path-parameters.adoc[] + +==== Request Fields + +include::{snippets}/book/updateBook/success/request-fields.adoc[] + +==== Response + +include::{snippets}/book/updateBook/success/http-response.adoc[] + +{empty} + + +=== 카테고리 ID로 책 검색 + +==== Request + +include::{snippets}/book/findByCategoryId/http-request.adoc[] + +==== Request Parameters + +include::{snippets}/book/findByCategoryId/request-parameters.adoc[] + +==== Response + +include::{snippets}/book/findByCategoryId/http-response.adoc[] + +==== Response Fields + +include::{snippets}/book/findByCategoryId/response-fields.adoc[] + diff --git a/src/main/java/store/ckin/api/book/controller/BookController.java b/src/main/java/store/ckin/api/book/controller/BookController.java index 8bb69f3d..0cb4f58b 100644 --- a/src/main/java/store/ckin/api/book/controller/BookController.java +++ b/src/main/java/store/ckin/api/book/controller/BookController.java @@ -55,33 +55,6 @@ public ResponseEntity getBookById(@PathVariable Long bookId) { return ResponseEntity.ok(bookResponseDto); } - /** - * 작가 이름으로 도서를 검색하고 페이징된 결과를 반환합니다. - * - * @param authorName 작가 이름 - * @param pageable 페이징 정보 - * @return 작가 이름으로 검색된 도서 목록에 대한 ResponseEntity 객체 - */ - @GetMapping("/search/by-author") - public ResponseEntity> findByAuthorName(@RequestParam String authorName, - @PageableDefault(sort = "bookPublicationDate", direction = Sort.Direction.DESC) - Pageable pageable) { - return ResponseEntity.ok(bookService.findByAuthorName(authorName, pageable)); - } - - /** - * 도서 제목으로 도서를 검색하고 페이징된 결과를 반환합니다. - * - * @param title 도서 제목 - * @param pageable 페이징 정보 - * @return 도서 제목으로 검색된 도서 목록에 대한 ResponseEntity 객체 - */ - @GetMapping("/search/by-title") - public ResponseEntity> findByBookTitle(@RequestParam String title, - @PageableDefault(sort = "bookPublicationDate", direction = Sort.Direction.DESC) - Pageable pageable) { - return ResponseEntity.ok(bookService.findByBookTitle(title, pageable)); - } /** * 카테고리 ID로 도서를 검색하고 페이징된 결과를 반환합니다. @@ -118,7 +91,6 @@ public ResponseEntity> findAllBooks( * @return 생성 성공시 상태 코드 201과 함께 ResponseEntity 반환 * @throws IOException 파일 처리 중 발생하는 예외 */ - @PostMapping(consumes = "multipart/form-data") public ResponseEntity createBook(@Valid @RequestPart("requestDto") BookCreateRequestDto requestDto, @RequestPart("file") MultipartFile file) diff --git a/src/test/java/store/ckin/api/book/controller/BookControllerTest.java b/src/test/java/store/ckin/api/book/controller/BookControllerTest.java index 231b956f..1ee52032 100644 --- a/src/test/java/store/ckin/api/book/controller/BookControllerTest.java +++ b/src/test/java/store/ckin/api/book/controller/BookControllerTest.java @@ -1,9 +1,22 @@ package store.ckin.api.book.controller; -import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.mockito.Mockito.when; +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.multipart; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestPartFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.partWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.restdocs.request.RequestDocumentation.requestParameters; +import static org.springframework.restdocs.request.RequestDocumentation.requestParts; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -12,6 +25,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -20,6 +34,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.Page; @@ -27,10 +42,12 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import store.ckin.api.book.dto.request.BookCreateRequestDto; import store.ckin.api.book.dto.request.BookModifyRequestDto; import store.ckin.api.book.dto.response.BookListResponseDto; import store.ckin.api.book.dto.response.BookResponseDto; @@ -43,6 +60,7 @@ * @author 나국로 * @version 2024. 02. 29. */ +@AutoConfigureRestDocs(uriHost = "133.186.247.149", uriPort = 7030) @WebMvcTest(BookController.class) class BookControllerTest { @Autowired @@ -52,73 +70,89 @@ class BookControllerTest { private BookService bookService; @MockBean private ObjectStorageService objectStorageService; + @Autowired + private ObjectMapper objectMapper; @Test - @DisplayName("ID로 책 조회") - void givenBookId_whenGetBookById_thenReturnsBook() throws Exception { + @DisplayName("ID에 대한 책 정보 조회 성공") + void givenBookId_whenGetBookById_thenReturnsBookInfo() throws Exception { Long bookId = 1L; BookResponseDto bookResponseDto = BookResponseDto.builder() - .bookId(1L) + .bookId(bookId) .bookIsbn("1234567890123") .bookTitle("테스트 책 제목") - .bookDescription("이 책은 테스트를 위해 만들어진 책입니다.") + .bookDescription("테스트 책 설명") .bookPublisher("테스트 출판사") - .bookPublicationDate(LocalDate.of(2024, 1, 1)) - .bookIndex("목차1, 목차2, 목차3") + .bookPublicationDate(LocalDate.now()) + .bookIndex("테스트 목차") .bookPackaging(true) - .bookStock(50) + .bookStock(10) .bookRegularPrice(20000) .bookDiscountRate(10) .bookState("판매중") .bookSalePrice(18000) .bookReviewRate("4.5") - .authorNames(List.of("저자1", "저자2")) - .categoryNames(List.of("카테고리1", "카테고리2")) - .tagNames(List.of("태그1", "태그2")) + .thumbnail("thumbnail/url.jpg") + .authorNames(Arrays.asList("작가1", "작가2")) + .categoryNames(Arrays.asList("카테고리1", "카테고리2")) + .tagNames(Arrays.asList("태그1", "태그2")) .build(); + given(bookService.findBookById(bookId)).willReturn(bookResponseDto); - when(bookService.findBookById(bookId)).thenReturn(bookResponseDto); - - mockMvc.perform(get("/api/books/" + bookId)) + mockMvc.perform(RestDocumentationRequestBuilders.get("/api/books/{bookId}", bookId) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.bookId").value(bookId)); + .andExpect(jsonPath("$.bookId").value(bookId)) + .andExpect(jsonPath("$.bookIsbn").value(bookResponseDto.getBookIsbn())) + .andExpect(jsonPath("$.bookTitle").value(bookResponseDto.getBookTitle())) + .andExpect(jsonPath("$.bookDescription").value(bookResponseDto.getBookDescription())) + .andExpect(jsonPath("$.bookPublisher").value(bookResponseDto.getBookPublisher())) + .andExpect(jsonPath("$.bookPublicationDate").value(bookResponseDto.getBookPublicationDate().toString())) + .andExpect(jsonPath("$.bookIndex").value(bookResponseDto.getBookIndex())) + .andExpect(jsonPath("$.bookPackaging").value(bookResponseDto.getBookPackaging())) + .andExpect(jsonPath("$.bookStock").value(bookResponseDto.getBookStock())) + .andExpect(jsonPath("$.bookRegularPrice").value(bookResponseDto.getBookRegularPrice())) + .andExpect(jsonPath("$.bookState").value(bookResponseDto.getBookState())) + .andExpect(jsonPath("$.bookSalePrice").value(bookResponseDto.getBookSalePrice())) + .andExpect(jsonPath("$.bookReviewRate").value(bookResponseDto.getBookReviewRate())) + .andExpect(jsonPath("$.thumbnail").value(bookResponseDto.getThumbnail())) + .andExpect(jsonPath("$.authorNames", hasSize(bookResponseDto.getAuthorNames().size()))) + .andExpect(jsonPath("$.categoryNames", hasSize(bookResponseDto.getCategoryNames().size()))) + .andExpect(jsonPath("$.tagNames", hasSize(bookResponseDto.getTagNames().size()))) + .andDo(document("book/getBookById/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("bookId").description("도서의 ID") + ), + responseFields( + fieldWithPath("bookId").description("도서 ID"), + fieldWithPath("bookIsbn").description("도서의 ISBN 번호"), + fieldWithPath("bookTitle").description("도서의 제목"), + fieldWithPath("bookDescription").description("도서의 설명"), + fieldWithPath("bookPublisher").description("도서의 출판사"), + fieldWithPath("bookPublicationDate").description("도서의 출판 날짜"), + fieldWithPath("bookIndex").description("도서의 목차"), + fieldWithPath("bookPackaging").description("도서의 포장 여부"), + fieldWithPath("bookStock").description("도서의 재고 수"), + fieldWithPath("bookRegularPrice").description("도서의 정가"), + fieldWithPath("bookDiscountRate").description("도서의 할인율"), + fieldWithPath("bookState").description("도서의 판매 상태"), + fieldWithPath("bookSalePrice").description("도서의 판매 가격"), + fieldWithPath("bookReviewRate").description("도서의 리뷰 평점"), + fieldWithPath("thumbnail").description("도서 썸네일 이미지 URL"), + fieldWithPath("authorNames").description("도서의 작가 이름 목록"), + fieldWithPath("categoryNames").description("도서의 카테고리 이름 목록"), + fieldWithPath("tagNames").description("도서에 연결된 태그 이름 목록") + ))); } -// @Test -// @DisplayName("책 생성 요청") -// void givenBookInfo_whenCreateBook_thenCreatesBook() throws Exception { -// ObjectMapper objectMapper = new ObjectMapper(); -// objectMapper.registerModule(new JavaTimeModule()); -// BookCreateRequestDto createRequestDto = new BookCreateRequestDto(); -// ReflectionTestUtils.setField(createRequestDto, "bookIsbn", "978-3-16-148410-0"); -// ReflectionTestUtils.setField(createRequestDto, "bookTitle", "테스트 책 제목"); -// ReflectionTestUtils.setField(createRequestDto, "bookDescription", "이 책은 테스트 목적으로 작성된 책입니다."); -// ReflectionTestUtils.setField(createRequestDto, "bookPublisher", "테스트 출판사"); -// ReflectionTestUtils.setField(createRequestDto, "bookPublicationDate", LocalDate.of(2024, 1, 1)); -// ReflectionTestUtils.setField(createRequestDto, "bookIndex", "테스트 목차"); -// ReflectionTestUtils.setField(createRequestDto, "bookPackaging", true); -// ReflectionTestUtils.setField(createRequestDto, "bookState", "판매중"); -// ReflectionTestUtils.setField(createRequestDto, "bookStock", 100); -// ReflectionTestUtils.setField(createRequestDto, "bookRegularPrice", 20000); -// ReflectionTestUtils.setField(createRequestDto, "bookDiscountRate", 10); -// ReflectionTestUtils.setField(createRequestDto, "authorIds", new HashSet<>(Set.of(1L, 2L))); -// ReflectionTestUtils.setField(createRequestDto, "categoryIds", new HashSet<>(Set.of(1L))); -// ReflectionTestUtils.setField(createRequestDto, "tagIds", new HashSet<>(Set.of(1L, 2L))); -// -// -// mockMvc.perform(MockMvcRequestBuilders.post("/api/books") -// .contentType(MediaType.APPLICATION_JSON) -// .content(objectMapper.writeValueAsString(createRequestDto))) -// .andExpect(status().isCreated()); -// } - @Test @DisplayName("책 정보 업데이트") void givenBookInfo_whenUpdateBook_thenUpdatesBook() throws Exception { - ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); long bookId = 1L; @@ -139,86 +173,98 @@ void givenBookInfo_whenUpdateBook_thenUpdatesBook() throws Exception { ReflectionTestUtils.setField(modifyRequestDto, "tagIds", new HashSet<>(Set.of(3L, 4L))); - mockMvc.perform(MockMvcRequestBuilders.put("/api/books/" + bookId) + mockMvc.perform(RestDocumentationRequestBuilders.put("/api/books/{bookId}", bookId) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(modifyRequestDto))) - .andExpect(status().isOk()); - } - - - @Test - @DisplayName("저자 이름으로 책 검색") - void givenAuthorName_whenFindByAuthorName_thenReturnsBooks() throws Exception { - String authorName = "저자1"; - List responseDtoList = new ArrayList<>(); - responseDtoList.add(BookListResponseDto.builder() - .bookId(1L) - .bookIsbn("1234567890123") - .bookTitle("테스트 책 제목 1") - .bookDescription("테스트 설명 1") - .bookPublisher("테스트 출판사") - .bookPublicationDate(LocalDate.of(2024, 1, 1)) - .bookIndex("목차 1") - .bookPackaging(true) - .bookStock(100) - .bookRegularPrice(20000) - .bookDiscountRate(10) - .bookState("판매중") - .bookSalePrice(18000) - .bookReviewRate("4.5") - .authorNames(List.of("저자1", "저자2")) - .build()); - - PageRequest pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "bookPublicationDate")); - Page bookPage = new PageImpl<>(responseDtoList, pageable, responseDtoList.size()); - - when(bookService.findByAuthorName(authorName, pageable)).thenReturn(bookPage); - - mockMvc.perform(get("/api/books/search/by-author") - .param("authorName", authorName) - .param("page", String.valueOf(pageable.getPageNumber())) - .param("size", String.valueOf(pageable.getPageSize()))) .andExpect(status().isOk()) - .andExpect(jsonPath("$.content", hasSize(1))) - .andExpect(jsonPath("$.content[0].bookId", is(1))) - .andExpect(jsonPath("$.content[0].bookTitle", is("테스트 책 제목 1"))) - .andExpect(jsonPath("$.content[0].authorNames", containsInAnyOrder("저자1", "저자2"))); - } + .andDo(document("book/updateBook/success", + pathParameters( + parameterWithName("bookId").description("업데이트할 책의 ID") + ), + requestFields( + fieldWithPath("bookIsbn").description("도서의 ISBN"), + fieldWithPath("bookTitle").description("도서 제목"), + fieldWithPath("bookDescription").description("도서 설명"), + fieldWithPath("bookPublisher").description("출판사 이름"), + fieldWithPath("bookPublicationDate").description("도서의 출판일"), + fieldWithPath("bookIndex").description("도서의 목차"), + fieldWithPath("bookPackaging").description("도서의 포장 여부"), + fieldWithPath("bookState").description("도서의 현재 상태"), + fieldWithPath("bookStock").description("도서의 재고 수"), + fieldWithPath("bookRegularPrice").description("도서의 정가"), + fieldWithPath("bookDiscountRate").description("도서의 할인율"), + fieldWithPath("authorIds").description("도서 저자의 ID 목록"), + fieldWithPath("categoryIds").description("도서 카테고리의 ID 목록"), + fieldWithPath("tagIds").description("도서와 관련된 태그 ID 목록").optional() + ) + )); - @Test - @DisplayName("책 제목으로 책 검색") - void givenBookTitle_whenFindByBookTitle_thenReturnsBooks() throws Exception { - String title = "책 제목"; - List bookListResponseDtos = new ArrayList<>(); - bookListResponseDtos.add(BookListResponseDto.builder() - .bookId(1L) - .bookIsbn("1234567890123") - .bookTitle("테스트 책 제목 1") - .bookDescription("테스트 책 설명 1") - .bookPublisher("테스트 출판사") - .bookPublicationDate(LocalDate.of(2024, 1, 1)) - .bookIndex("목차 1") - .bookPackaging(true) - .bookStock(100) - .bookRegularPrice(20000) - .bookDiscountRate(10) - .bookState("판매중") - .bookSalePrice(18000) - .bookReviewRate("4.5") - .authorNames(List.of("저자1", "저자2")) - .build()); - - PageRequest pageable = PageRequest.of(0, 10, Sort.by("bookPublicationDate").descending()); - Page bookPage = - new PageImpl<>(bookListResponseDtos, pageable, bookListResponseDtos.size()); + } - when(bookService.findByBookTitle(title, pageable)).thenReturn(bookPage); + @Test + @DisplayName("도서 생성") + void whenCreateBook_thenReturnStatusCreated() throws Exception { + // DTO 객체 생성 + BookCreateRequestDto requestDto = new BookCreateRequestDto(); + + // ReflectionTestUtils를 사용하여 필드에 데이터 설정 + ReflectionTestUtils.setField(requestDto, "bookIsbn", "123456789"); + ReflectionTestUtils.setField(requestDto, "bookTitle", "책 제목"); + ReflectionTestUtils.setField(requestDto, "bookDescription", "책 설명"); + ReflectionTestUtils.setField(requestDto, "bookPublisher", "출판사"); + ReflectionTestUtils.setField(requestDto, "bookPublicationDate", LocalDate.now()); + ReflectionTestUtils.setField(requestDto, "bookIndex", "책 목차"); + ReflectionTestUtils.setField(requestDto, "bookPackaging", true); + ReflectionTestUtils.setField(requestDto, "bookState", "판매중"); + ReflectionTestUtils.setField(requestDto, "bookStock", 10); + ReflectionTestUtils.setField(requestDto, "bookRegularPrice", 20000); + ReflectionTestUtils.setField(requestDto, "bookDiscountRate", 10); + ReflectionTestUtils.setField(requestDto, "authorIds", Set.of(1L, 2L)); + ReflectionTestUtils.setField(requestDto, "categoryIds", Set.of(1L, 2L)); + ReflectionTestUtils.setField(requestDto, "tagIds", Set.of(1L, 2L)); + + // DTO를 JSON 문자열로 변환 + String bookCreateRequestDtoJson = objectMapper.writeValueAsString(requestDto); + + // MockMultipartFile 형태로 JSON 데이터를 담은 파트 생성 + MockMultipartFile requestDtoPart = new MockMultipartFile( + "requestDto", "", "application/json", bookCreateRequestDtoJson.getBytes()); + + // 파일 모의 객체 생성 + MockMultipartFile filePart = new MockMultipartFile( + "file", "test.jpg", "image/jpeg", "<>".getBytes()); + + mockMvc.perform(multipart("/api/books") + .file(filePart) + .file(requestDtoPart) + .contentType(MediaType.MULTIPART_FORM_DATA)) + .andExpect(status().isCreated()) + .andDo(document("book/createBook/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestParts( + partWithName("requestDto").description("도서 생성에 필요한 상세 정보"), + partWithName("file").description("도서의 썸네일 이미지 파일") + ), + requestPartFields("requestDto", + fieldWithPath("bookIsbn").description("도서의 ISBN"), + fieldWithPath("bookTitle").description("도서 제목"), + fieldWithPath("bookDescription").description("도서 설명"), + fieldWithPath("bookPublisher").description("출판사 이름"), + fieldWithPath("bookPublicationDate").description("도서의 출판일"), + fieldWithPath("bookIndex").description("도서의 목차"), + fieldWithPath("bookPackaging").description("도서의 포장 여부"), + fieldWithPath("bookState").description("도서의 현재 상태"), + fieldWithPath("bookStock").description("도서의 재고 수"), + fieldWithPath("bookRegularPrice").description("도서의 정가"), + fieldWithPath("bookDiscountRate").description("도서의 할인율"), + fieldWithPath("authorIds").description("도서 저자의 ID 목록"), + fieldWithPath("categoryIds").description("도서 카테고리의 ID 목록"), + fieldWithPath("tagIds").description("도서와 관련된 태그 ID 목록").optional() + ) + )); - mockMvc.perform(get("/api/books/search/by-title") - .param("title", title)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.content").exists()); } @@ -250,12 +296,49 @@ void givenCategoryId_whenFindByCategoryId_thenReturnsBooks() throws Exception { Mockito.when(bookService.findByCategoryId(categoryId, pageable)).thenReturn(bookPage); - mockMvc.perform(MockMvcRequestBuilders.get("/api/books/search/by-category") + mockMvc.perform(get("/api/books/search/by-category") .param("categoryId", categoryId.toString()) .param("page", String.valueOf(pageable.getPageNumber())) .param("size", String.valueOf(pageable.getPageSize()))) .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.content", Matchers.hasSize(bookListResponseDtos.size()))); + .andExpect(MockMvcResultMatchers.jsonPath("$.content", Matchers.hasSize(bookListResponseDtos.size()))) + .andDo(document("book/findByCategoryId", + requestParameters( + parameterWithName("categoryId").description("검색할 카테고리의 ID"), + parameterWithName("page").description("페이지 번호"), + parameterWithName("size").description("페이지 크기") + ), + responseFields( + fieldWithPath("content[].bookIsbn").description("도서의 ISBN"), + fieldWithPath("content[].bookId").description("도서 ID"), + fieldWithPath("content[].bookTitle").description("도서 제목"), + fieldWithPath("content[].bookDescription").description("도서 설명"), + fieldWithPath("content[].bookPublisher").description("출판사"), + fieldWithPath("content[].bookPublicationDate").description("도서 출판 날짜"), + fieldWithPath("content[].bookIndex").description("도서 목차"), + fieldWithPath("content[].bookPackaging").description("도서 포장 여부"), + fieldWithPath("content[].bookStock").description("도서 재고 수"), + fieldWithPath("content[].bookRegularPrice").description("도서 정가"), + fieldWithPath("content[].bookDiscountRate").description("도서 할인율"), + fieldWithPath("content[].bookState").description("도서 상태"), + fieldWithPath("content[].bookSalePrice").description("도서 판매 가격"), + fieldWithPath("content[].bookReviewRate").description("도서 리뷰 평점"), + fieldWithPath("content[].authorNames").description("도서의 저자 목록"), + fieldWithPath("content[].thumbnail").description("도서의 썸네일 이미지 URL").optional(), + subsectionWithPath("pageable").ignored(), + fieldWithPath("totalElements").description("전체 도서 수"), + fieldWithPath("totalPages").description("전체 페이지 수"), + fieldWithPath("number").description("현재 페이지 번호"), + fieldWithPath("last").description("현재 페이지가 마지막 페이지인지 여부"), + fieldWithPath("first").description("현재 페이지가 첫 번째 페이지인지 여부"), + fieldWithPath("sort.empty").description("정렬된 데이터가 비어 있는지 여부"), + fieldWithPath("sort.unsorted").description("정렬되지 않은 데이터인지 여부"), + fieldWithPath("sort.sorted").description("정렬된 데이터인지 여부"), + fieldWithPath("size").description("페이지당 요소의 수"), + fieldWithPath("numberOfElements").description("현재 페이지의 요소 수"), + fieldWithPath("empty").description("현재 페이지가 비어 있는지 여부") + ) + )); } @Test @@ -285,7 +368,7 @@ void givenPageable_whenFindAllBooks_thenReturnsPagedBooks() throws Exception { Mockito.when(bookService.findAllBooks(pageable)).thenReturn(bookPage); - mockMvc.perform(MockMvcRequestBuilders.get("/api/books") + mockMvc.perform(get("/api/books") .param("page", String.valueOf(pageable.getPageNumber())) .param("size", String.valueOf(pageable.getPageSize()))) .andExpect(MockMvcResultMatchers.status().isOk()) From fef905a5624fafc98444dccd49d2134be911ee8c Mon Sep 17 00:00:00 2001 From: nayoseb Date: Fri, 22 Mar 2024 17:44:36 +0900 Subject: [PATCH 161/161] =?UTF-8?q?[REFACTOR]=20code=20smell=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/controller/CategoryController.java | 1 - .../dto/response/CategoryNameResponseDto.java | 1 - .../category/repository/CategoryRepository.java | 1 - .../category/service/impl/CategoryServiceImpl.java | 1 - .../ckin/api/review/service/ReviewService.java | 4 ++-- .../api/book/service/impl/BookServiceImplTest.java | 14 +++++++------- .../repository/impl/ReviewRepositoryTest.java | 1 - 7 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/main/java/store/ckin/api/category/controller/CategoryController.java b/src/main/java/store/ckin/api/category/controller/CategoryController.java index 7d81a77c..cdc9b70d 100644 --- a/src/main/java/store/ckin/api/category/controller/CategoryController.java +++ b/src/main/java/store/ckin/api/category/controller/CategoryController.java @@ -16,7 +16,6 @@ import org.springframework.web.bind.annotation.RestController; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; -import store.ckin.api.category.dto.response.CategoryNameResponseDto; import store.ckin.api.category.dto.response.CategoryResponseDto; import store.ckin.api.category.service.CategoryService; diff --git a/src/main/java/store/ckin/api/category/dto/response/CategoryNameResponseDto.java b/src/main/java/store/ckin/api/category/dto/response/CategoryNameResponseDto.java index f504e7af..a800eecc 100644 --- a/src/main/java/store/ckin/api/category/dto/response/CategoryNameResponseDto.java +++ b/src/main/java/store/ckin/api/category/dto/response/CategoryNameResponseDto.java @@ -1,6 +1,5 @@ package store.ckin.api.category.dto.response; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java index 7c85f348..9cf009ef 100644 --- a/src/main/java/store/ckin/api/category/repository/CategoryRepository.java +++ b/src/main/java/store/ckin/api/category/repository/CategoryRepository.java @@ -3,7 +3,6 @@ import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import store.ckin.api.category.dto.response.CategoryNameResponseDto; import store.ckin.api.category.entity.Category; /** diff --git a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java index d73ff206..8801fcab 100644 --- a/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java +++ b/src/main/java/store/ckin/api/category/service/impl/CategoryServiceImpl.java @@ -8,7 +8,6 @@ import store.ckin.api.book.repository.BookRepository; import store.ckin.api.category.dto.request.CategoryCreateRequestDto; import store.ckin.api.category.dto.request.CategoryUpdateRequestDto; -import store.ckin.api.category.dto.response.CategoryNameResponseDto; import store.ckin.api.category.dto.response.CategoryResponseDto; import store.ckin.api.category.entity.Category; import store.ckin.api.category.exception.CategoryNotFoundException; diff --git a/src/main/java/store/ckin/api/review/service/ReviewService.java b/src/main/java/store/ckin/api/review/service/ReviewService.java index 2e3f02b6..709f510a 100644 --- a/src/main/java/store/ckin/api/review/service/ReviewService.java +++ b/src/main/java/store/ckin/api/review/service/ReviewService.java @@ -3,7 +3,6 @@ import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import store.ckin.api.review.dto.request.ReviewCreateRequestDto; import store.ckin.api.review.dto.request.ReviewUpdateRequestDto; @@ -34,7 +33,8 @@ public interface ReviewService { * @return 리뷰 DTO 페이지 */ Page getReviewPageList(Pageable pageable, Long bookId); + Page findReviewsByMemberWithPagination(Long memberId, Pageable pageable); - void updateReview(ReviewUpdateRequestDto updateRequestDto,Long memberId); + void updateReview(ReviewUpdateRequestDto updateRequestDto, Long memberId); } diff --git a/src/test/java/store/ckin/api/book/service/impl/BookServiceImplTest.java b/src/test/java/store/ckin/api/book/service/impl/BookServiceImplTest.java index d7a4931c..49820492 100644 --- a/src/test/java/store/ckin/api/book/service/impl/BookServiceImplTest.java +++ b/src/test/java/store/ckin/api/book/service/impl/BookServiceImplTest.java @@ -385,11 +385,11 @@ void getMainPageBookListByCategoryIdTest() { verify(bookRepository, times(1)).getMainPageResponseDtoByCategoryId(categoryId, limit); } - @Test - @DisplayName("주어진 책 ID들로 카테고리 ID들 가져오기") - void givenBookIds_whenGetBookCategoryIdsByBookIds_thenReturnsCategoryIds() { - - } +// @Test +// @DisplayName("주어진 책 ID들로 카테고리 ID들 가져오기") +// void givenBookIds_whenGetBookCategoryIdsByBookIds_thenReturnsCategoryIds() { +// +// } @Test @@ -441,8 +441,8 @@ void givenBookIdAndFile_whenUpdateBookThumbnail_thenThumbnailIsUpdated() throws verify(bookRepository).findById(bookId); verify(objectStorageService).saveFile(file, "book"); - assertEquals(thumbnailFile.getFileOriginName(), "thumbnail.jpg"); - assertEquals(thumbnailFile.getFileUrl(), "http://example.com/thumbnail.jpg"); + assertEquals("thumbnail.jpg", thumbnailFile.getFileOriginName()); + assertEquals("http://example.com/thumbnail.jpg", thumbnailFile.getFileUrl()); } diff --git a/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java b/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java index 6defd456..757da32d 100644 --- a/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java +++ b/src/test/java/store/ckin/api/review/repository/impl/ReviewRepositoryTest.java @@ -109,7 +109,6 @@ void testFindReviewsByMemberWithPagination() { Assertions.assertThat(result).isNotNull(); Assertions.assertThat(result.getContent()).isNotEmpty(); - Assertions.assertThat(result.getContent().size()).isGreaterThan(0); Assertions.assertThat(result).isNotNull();