From f55c375b67a4d04cd5eee4945462ee1080045bf6 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Wed, 6 Dec 2023 13:24:09 +0900 Subject: [PATCH 01/25] =?UTF-8?q?:pencil2:=20Question=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20productName=20=EC=B6=94=EA=B0=80=20#LF1-602=20#LF1-?= =?UTF-8?q?603?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 매번 요청하는 게 비효율적이고 변경이 발생해도 괜찮은 데이터라 반정규화 진행 --- .../controller/request/QuestionCreateRequest.java | 1 + .../store/domain/question/dto/QuestionForOwnerDto.java | 3 ++- .../kr/bb/store/domain/question/entity/Question.java | 6 +++++- .../store/domain/question/handler/QuestionCreator.java | 1 + .../store/domain/question/handler/QuestionReader.java | 6 +++--- .../repository/QuestionRepositoryCustomImpl.java | 1 + .../store/domain/question/service/QuestionService.java | 6 +----- .../domain/question/handler/AnswerCreatorTest.java | 1 + .../domain/question/handler/QuestionCreatorTest.java | 1 + .../domain/question/handler/QuestionReaderTest.java | 10 ++++++---- .../domain/question/service/QuestionServiceTest.java | 2 ++ 11 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java b/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java index 09d053a..a01dd9e 100644 --- a/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java +++ b/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java @@ -11,6 +11,7 @@ @AllArgsConstructor public class QuestionCreateRequest { private Long storeId; + private String productName; private Long productId; private String title; private String content; diff --git a/src/main/java/kr/bb/store/domain/question/dto/QuestionForOwnerDto.java b/src/main/java/kr/bb/store/domain/question/dto/QuestionForOwnerDto.java index 23f65e9..720fdb5 100644 --- a/src/main/java/kr/bb/store/domain/question/dto/QuestionForOwnerDto.java +++ b/src/main/java/kr/bb/store/domain/question/dto/QuestionForOwnerDto.java @@ -23,8 +23,9 @@ public class QuestionForOwnerDto { private Boolean isRead; @QueryProjection - public QuestionForOwnerDto(Long key, String nickname, String title, LocalDateTime createdAt, Boolean isReplied, Boolean isRead) { + public QuestionForOwnerDto(Long key, String productName, String nickname, String title, LocalDateTime createdAt, Boolean isReplied, Boolean isRead) { this.key = key; + this.productName = productName; this.nickname = nickname; this.title = title; this.createdAt = createdAt.toLocalDate(); diff --git a/src/main/java/kr/bb/store/domain/question/entity/Question.java b/src/main/java/kr/bb/store/domain/question/entity/Question.java index f2e0fd1..5ab3267 100644 --- a/src/main/java/kr/bb/store/domain/question/entity/Question.java +++ b/src/main/java/kr/bb/store/domain/question/entity/Question.java @@ -33,6 +33,9 @@ public class Question extends BaseEntity { @NotNull private Long productId; + @NotNull + private String productName; + @NotNull private String title; @@ -46,11 +49,12 @@ public class Question extends BaseEntity { private Boolean isRead; @Builder - public Question(Store store, Long userId, String nickname, Long productId, String title, String content, Boolean isSecret) { + public Question(Store store, Long userId, String nickname, Long productId, String productName, String title, String content, Boolean isSecret) { this.store = store; this.userId = userId; this.nickname = nickname; this.productId = productId; + this.productName = productName; this.title = title; this.content = content; this.isSecret = isSecret; diff --git a/src/main/java/kr/bb/store/domain/question/handler/QuestionCreator.java b/src/main/java/kr/bb/store/domain/question/handler/QuestionCreator.java index 5cde7f0..5bc4fe8 100644 --- a/src/main/java/kr/bb/store/domain/question/handler/QuestionCreator.java +++ b/src/main/java/kr/bb/store/domain/question/handler/QuestionCreator.java @@ -24,6 +24,7 @@ public Question create(Long userId, QuestionCreateRequest questionCreateRequest) .userId(userId) .nickname(questionCreateRequest.getNickname()) .productId(questionCreateRequest.getProductId()) + .productName(questionCreateRequest.getProductName()) .title(questionCreateRequest.getTitle()) .content(questionCreateRequest.getContent()) .isSecret(questionCreateRequest.isSecret()) diff --git a/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java b/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java index 161c677..9c3632b 100644 --- a/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java +++ b/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java @@ -19,7 +19,7 @@ public class QuestionReader { private final QuestionRepository questionRepository; private final AnswerRepository answerRepository; - public QuestionDetailInfoResponse readDetailInfo(Long questionId, String nickname, String productName) { + public QuestionDetailInfoResponse readDetailInfo(Long questionId) { Question question = questionRepository.findById(questionId) .orElseThrow(QuestionNotFoundException::new); question.check(); @@ -29,9 +29,9 @@ public QuestionDetailInfoResponse readDetailInfo(Long questionId, String nicknam return QuestionDetailInfoResponse.builder() .title(question.getTitle()) - .nickname(nickname) + .nickname(question.getNickname()) .createdAt(question.getCreatedAt()) - .productName(productName) + .productName(question.getProductName()) .content(question.getContent()) .isReplied(answer != null) .answer(answer == null ? null : AnswerDto.fromEntity(answer)) diff --git a/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java b/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java index c15972f..f827fea 100644 --- a/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java +++ b/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java @@ -26,6 +26,7 @@ public QuestionRepositoryCustomImpl(EntityManager em) { public Page getQuestionsForStoreOwnerWithPaging(Long storeId, Boolean isReplied, Pageable pageable) { List contents = queryFactory.select(new QQuestionForOwnerDto( question.id, + question.productName, question.nickname, question.title, question.createdAt, diff --git a/src/main/java/kr/bb/store/domain/question/service/QuestionService.java b/src/main/java/kr/bb/store/domain/question/service/QuestionService.java index f4d1e5d..de4954e 100644 --- a/src/main/java/kr/bb/store/domain/question/service/QuestionService.java +++ b/src/main/java/kr/bb/store/domain/question/service/QuestionService.java @@ -32,10 +32,7 @@ public Question createQuestion(Long userId, QuestionCreateRequest questionCreate @Transactional public QuestionDetailInfoResponse getQuestionInfo(Long questionId) { - // TODO : Feign통신으로 값 받아오기 - String nickname = "유저명"; - String productName = "제품명"; - return questionReader.readDetailInfo(questionId, nickname, productName); + return questionReader.readDetailInfo(questionId); } @Transactional @@ -45,7 +42,6 @@ public Answer createAnswer(Long questionId, String content) { public QuestionsForOwnerPagingResponse getQuestionsForStoreOwner(Long storeId, Boolean isReplied, Pageable pageable) { Page questionForOwnerDtos = questionReader.readQuestionsForStoreOwner(storeId, isReplied, pageable); - // TODO : Feign통신으로 productName 받아와 값 채우기 return QuestionsForOwnerPagingResponse.builder() .data(questionForOwnerDtos.getContent()) .totalCnt(questionForOwnerDtos.getTotalElements()) diff --git a/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java b/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java index c51351d..ac3e6b9 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java @@ -84,6 +84,7 @@ private Question createQuestion(Store store) { .userId(1L) .nickname("닉네임") .productId(1L) + .productName("상품명") .title("질문제목") .content("질문내용") .isSecret(true) diff --git a/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java b/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java index 308f7ec..5c57622 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java @@ -77,6 +77,7 @@ private QuestionCreateRequest createQuestionCreateRequest(Long storeId) { return QuestionCreateRequest.builder() .storeId(storeId) .productId(1L) + .productName("제품명") .title("질문제목") .content("질문내용") .isSecret(true) diff --git a/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java b/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java index 02ef5b5..5bafa4e 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java @@ -54,7 +54,7 @@ void readDetailInfo() { String productName = "가게명"; // when - QuestionDetailInfoResponse questionDetailInfoResponse = questionReader.readDetailInfo(question.getId(), nickname, productName); + QuestionDetailInfoResponse questionDetailInfoResponse = questionReader.readDetailInfo(question.getId()); // then assertThat(questionDetailInfoResponse.getTitle()).isEqualTo("질문제목"); @@ -76,7 +76,7 @@ void AnswerInQuestionDetailCanBeNull() { String productName = "가게명"; // when - QuestionDetailInfoResponse questionDetailInfoResponse = questionReader.readDetailInfo(question.getId(), nickname, productName); + QuestionDetailInfoResponse questionDetailInfoResponse = questionReader.readDetailInfo(question.getId()); // then assertThat(questionDetailInfoResponse.getAnswer()).isNull(); @@ -97,7 +97,7 @@ void isReadWillTrueWhenReadDetailInfo() { String productName = "가게명"; // when - questionReader.readDetailInfo(question.getId(), nickname, productName); + questionReader.readDetailInfo(question.getId()); em.flush(); em.clear(); @@ -289,12 +289,13 @@ void readMyQuestions() { } - private Question createQuestionWithProductIdAndUserId(Store store, Long productId, Long userId) { + private Question createQuestionWithProductIdAndUserId(Store store,Long productId, Long userId) { return Question.builder() .store(store) .userId(userId) .nickname("닉네임") .productId(productId) + .productName("상품명") .title("질문제목") .content("질문내용") .isSecret(true) @@ -307,6 +308,7 @@ private Question createQuestion(Store store) { .userId(1L) .nickname("닉네임") .productId(1L) + .productName("상품명") .title("질문제목") .content("질문내용") .isSecret(true) diff --git a/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java b/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java index efaf495..e7f1845 100644 --- a/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java +++ b/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java @@ -102,6 +102,7 @@ private QuestionCreateRequest createQuestionCreateRequest(Long storeId) { return QuestionCreateRequest.builder() .storeId(storeId) .productId(1L) + .productName("상품명") .title("질문제목") .content("질문내용") .isSecret(true) @@ -113,6 +114,7 @@ private Question createQuestion(Store store) { return Question.builder() .store(store) .userId(1L) + .productName("상품명") .productId(1L) .title("질문제목") .content("질문내용") From 1a9b26e3e4cfa89eb967cdc050d50a70f1d2f67e Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Wed, 6 Dec 2023 14:00:07 +0900 Subject: [PATCH 02/25] =?UTF-8?q?:pencil2:=20=EA=B0=80=EA=B2=8C=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=97=AC=EB=B6=80=20=EC=A0=95=EB=B3=B4=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 --- .../domain/store/controller/response/SimpleStoreResponse.java | 1 + .../java/kr/bb/store/domain/store/service/StoreService.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStoreResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStoreResponse.java index 15f9378..e785f0b 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStoreResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStoreResponse.java @@ -16,6 +16,7 @@ public class SimpleStoreResponse { private String storeName; private String detailInfo; private Double averageRating; + private Boolean isLiked; public static SimpleStoreResponse from(Store store) { return SimpleStoreResponse.builder() diff --git a/src/main/java/kr/bb/store/domain/store/service/StoreService.java b/src/main/java/kr/bb/store/domain/store/service/StoreService.java index 91f2951..228c7f6 100644 --- a/src/main/java/kr/bb/store/domain/store/service/StoreService.java +++ b/src/main/java/kr/bb/store/domain/store/service/StoreService.java @@ -59,6 +59,8 @@ public StoreDetailInfoResponse getStoreInfo(Long storeId) { public SimpleStorePagingResponse getStoresWithPaging(Pageable pageable) { Page storePages = storeReader.readStoresWithPaging(pageable); + // TODO : 좋아요 여부 feign으로 받아와서 채우기 + List contents = storePages.getContent().stream() .map(SimpleStoreResponse::from) .collect(Collectors.toList()); From 907e9f8e32d8582984b01b59e0507f12a4142e65 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Wed, 6 Dec 2023 16:17:24 +0900 Subject: [PATCH 03/25] =?UTF-8?q?:pencil2:=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EA=B0=80=EA=B2=8C=EC=A0=95=EB=B3=B4=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20=EC=A3=BC=EC=86=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 프론트 요구사항 반영 --- .../response/SimpleStorePagingResponse.java | 2 +- .../response/SimpleStoreResponse.java | 30 ---------------- .../response/StoreForMapResponse.java | 8 ++++- .../response/StoreListResponse.java | 34 +++++++++++++++++++ .../domain/store/handler/StoreReader.java | 2 +- .../repository/StoreRepositoryCustom.java | 3 +- .../repository/StoreRepositoryCustomImpl.java | 25 +++++++++++--- .../domain/store/service/StoreService.java | 9 +++-- .../domain/store/handler/StoreReaderTest.java | 7 ++-- .../store/service/StoreServiceTest.java | 2 +- 10 files changed, 73 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/kr/bb/store/domain/store/controller/response/SimpleStoreResponse.java create mode 100644 src/main/java/kr/bb/store/domain/store/controller/response/StoreListResponse.java diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStorePagingResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStorePagingResponse.java index 3104176..038aaa1 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStorePagingResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStorePagingResponse.java @@ -12,6 +12,6 @@ @NoArgsConstructor @AllArgsConstructor public class SimpleStorePagingResponse { - private List simpleStores; + private List stores; private Long totalCnt; } diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStoreResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStoreResponse.java deleted file mode 100644 index e785f0b..0000000 --- a/src/main/java/kr/bb/store/domain/store/controller/response/SimpleStoreResponse.java +++ /dev/null @@ -1,30 +0,0 @@ -package kr.bb.store.domain.store.controller.response; - -import kr.bb.store.domain.store.entity.Store; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SimpleStoreResponse { - private Long storeId; - private String storeThumbnailImage; - private String storeName; - private String detailInfo; - private Double averageRating; - private Boolean isLiked; - - public static SimpleStoreResponse from(Store store) { - return SimpleStoreResponse.builder() - .storeId(store.getId()) - .storeThumbnailImage(store.getStoreThumbnailImage()) - .storeName(store.getStoreName()) - .detailInfo(store.getDetailInfo()) - .averageRating(store.getAverageRating()) - .build(); - } -} diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreForMapResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreForMapResponse.java index 6814aeb..16e854b 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/StoreForMapResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreForMapResponse.java @@ -19,14 +19,20 @@ public class StoreForMapResponse { private String thumbnailImage; private Double averageRating; private Position position; + private String address; + private String detailAddress; @QueryProjection - public StoreForMapResponse(Long storeId, String storeName,String detailInfo, String thumbnailImage, Double averageRating, Double lat, Double lon) { + public StoreForMapResponse(Long storeId, String storeName,String detailInfo, String thumbnailImage, + Double averageRating, Double lat, Double lon, + String address, String detailAddress) { this.storeId = storeId; this.storeName = storeName; this.detailInfo = detailInfo; this.thumbnailImage = thumbnailImage; this.averageRating = averageRating; this.position = new Position(lat,lon); + this.address = address; + this.detailAddress = detailAddress; } } diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreListResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreListResponse.java new file mode 100644 index 0000000..5116429 --- /dev/null +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreListResponse.java @@ -0,0 +1,34 @@ +package kr.bb.store.domain.store.controller.response; + + +import com.querydsl.core.annotations.QueryProjection; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StoreListResponse { + private Long storeId; + private String storeThumbnailImage; + private String storeName; + private String detailInfo; + private Double averageRating; + private Boolean isLiked; + private String address; + private String detailAddress; + + @QueryProjection + public StoreListResponse(Long storeId, String storeThumbnailImage, String storeName, String detailInfo, Double averageRating, String address, String detailAddress) { + this.storeId = storeId; + this.storeThumbnailImage = storeThumbnailImage; + this.storeName = storeName; + this.detailInfo = detailInfo; + this.averageRating = averageRating; + this.address = address; + this.detailAddress = detailAddress; + } +} diff --git a/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java b/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java index f54da13..79e6f8c 100644 --- a/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java +++ b/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java @@ -54,7 +54,7 @@ public StoreDetailInfoResponse readDetailInfo(Long storeId) { return StoreDetailInfoResponse.of(store,deliveryPolicy,storeAddress); } - public Page readStoresWithPaging(Pageable pageable) { + public Page readStoresWithPaging(Pageable pageable) { return storeRepository.getStoresWithPaging(pageable); } diff --git a/src/main/java/kr/bb/store/domain/store/repository/StoreRepositoryCustom.java b/src/main/java/kr/bb/store/domain/store/repository/StoreRepositoryCustom.java index cdc5fe2..3fa3c95 100644 --- a/src/main/java/kr/bb/store/domain/store/repository/StoreRepositoryCustom.java +++ b/src/main/java/kr/bb/store/domain/store/repository/StoreRepositoryCustom.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.store.repository; +import kr.bb.store.domain.store.controller.response.StoreListResponse; import kr.bb.store.domain.store.entity.Store; import kr.bb.store.domain.store.entity.address.Gugun; import kr.bb.store.domain.store.entity.address.Sido; @@ -10,7 +11,7 @@ import java.util.List; public interface StoreRepositoryCustom { - Page getStoresWithPaging(Pageable pageable); + Page getStoresWithPaging(Pageable pageable); List getNearbyStores(double lat, double lon, double radius); diff --git a/src/main/java/kr/bb/store/domain/store/repository/StoreRepositoryCustomImpl.java b/src/main/java/kr/bb/store/domain/store/repository/StoreRepositoryCustomImpl.java index 48359fe..5c09436 100644 --- a/src/main/java/kr/bb/store/domain/store/repository/StoreRepositoryCustomImpl.java +++ b/src/main/java/kr/bb/store/domain/store/repository/StoreRepositoryCustomImpl.java @@ -3,6 +3,8 @@ import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; +import kr.bb.store.domain.store.controller.response.QStoreListResponse; +import kr.bb.store.domain.store.controller.response.StoreListResponse; import kr.bb.store.domain.store.entity.Store; import kr.bb.store.domain.store.entity.address.Gugun; import kr.bb.store.domain.store.entity.address.Sido; @@ -26,8 +28,19 @@ public StoreRepositoryCustomImpl(EntityManager em) { } @Override - public Page getStoresWithPaging(Pageable pageable) { - List contents = queryFactory.selectFrom(store) + public Page getStoresWithPaging(Pageable pageable) { + List contents = queryFactory.select(new QStoreListResponse( + store.id, + store.storeThumbnailImage, + store.storeName, + store.detailInfo, + store.averageRating, + storeAddress.address, + storeAddress.detailAddress + )) + .from(store) + .leftJoin(storeAddress) + .on(store.id.eq(storeAddress.id)) .where( store.isDeleted.isFalse() ) @@ -53,7 +66,9 @@ public List getNearbyStores(double centerLat, double center store.storeThumbnailImage, store.averageRating, storeAddress.lat, - storeAddress.lon + storeAddress.lon, + storeAddress.address, + storeAddress.detailAddress )) .from(storeAddress) .leftJoin(storeAddress.store, store) @@ -74,7 +89,9 @@ public List getStoresWithRegion(Sido sido, Gugun gugun) { store.storeThumbnailImage, store.averageRating, storeAddress.lat, - storeAddress.lon + storeAddress.lon, + storeAddress.address, + storeAddress.detailAddress )) .from(storeAddress) .leftJoin(storeAddress.store, store) diff --git a/src/main/java/kr/bb/store/domain/store/service/StoreService.java b/src/main/java/kr/bb/store/domain/store/service/StoreService.java index 228c7f6..50c0a7a 100644 --- a/src/main/java/kr/bb/store/domain/store/service/StoreService.java +++ b/src/main/java/kr/bb/store/domain/store/service/StoreService.java @@ -58,15 +58,14 @@ public StoreDetailInfoResponse getStoreInfo(Long storeId) { } public SimpleStorePagingResponse getStoresWithPaging(Pageable pageable) { - Page storePages = storeReader.readStoresWithPaging(pageable); - // TODO : 좋아요 여부 feign으로 받아와서 채우기 + Page storePages = storeReader.readStoresWithPaging(pageable); - List contents = storePages.getContent().stream() - .map(SimpleStoreResponse::from) + // TODO : 좋아요 여부 feign으로 받아와서 채우기 + List contents = storePages.getContent().stream() .collect(Collectors.toList()); return SimpleStorePagingResponse.builder() - .simpleStores(contents) + .stores(contents) .totalCnt(storePages.getTotalElements()) .build(); } diff --git a/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java b/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java index 44bfb06..d25f15e 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.store.handler; +import kr.bb.store.domain.store.controller.response.*; import kr.bb.store.domain.store.dto.Position; import kr.bb.store.domain.store.entity.DeliveryPolicy; import kr.bb.store.domain.store.entity.Store; @@ -9,10 +10,6 @@ import kr.bb.store.domain.store.entity.address.Sido; import kr.bb.store.domain.store.entity.address.SidoRepository; import kr.bb.store.domain.store.exception.StoreNotFoundException; -import kr.bb.store.domain.store.controller.response.StoreDetailInfoResponse; -import kr.bb.store.domain.store.controller.response.StoreInfoManagerResponse; -import kr.bb.store.domain.store.controller.response.StoreInfoUserResponse; -import kr.bb.store.domain.store.controller.response.StoreListForMapResponse; import kr.bb.store.domain.store.repository.DeliveryPolicyRepository; import kr.bb.store.domain.store.repository.StoreAddressRepository; import kr.bb.store.domain.store.repository.StoreRepository; @@ -112,7 +109,7 @@ void readStoresWithPaging() { Pageable pageable = PageRequest.of(page,size); // when - Page stores = storeReader.readStoresWithPaging(pageable); + Page stores = storeReader.readStoresWithPaging(pageable); // then assertThat(stores.getTotalPages()).isEqualTo(2); diff --git a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java index 6c5dbad..e78e3bb 100644 --- a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java +++ b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java @@ -202,7 +202,7 @@ public void getStoresWithPaing() { // then assertThat(response.getTotalCnt()).isEqualTo(7); - assertThat(response.getSimpleStores().get(0)).isInstanceOf(SimpleStoreResponse.class); + assertThat(response.getStores().get(0)).isInstanceOf(StoreListResponse.class); } @DisplayName("유저에게 보이는 가게정보를 반환한다") From ce2358521ecb996b300496c89033a051497234b0 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Wed, 6 Dec 2023 16:32:21 +0900 Subject: [PATCH 04/25] =?UTF-8?q?:recycle:=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/coupon/service/CouponService.java | 6 ----- .../response/QuestionDetailInfoResponse.java | 14 +++++++++++ .../question/handler/QuestionReader.java | 10 +------- .../response/StoreInfoManagerResponse.java | 15 +++++++++++ .../response/StoreInfoUserResponse.java | 16 ++++++++++++ .../domain/store/handler/StoreReader.java | 25 ++----------------- 6 files changed, 48 insertions(+), 38 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java b/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java index 6896e3e..f7c6b15 100644 --- a/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java +++ b/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java @@ -91,12 +91,6 @@ public void useCoupon(Long couponId, Long userId, LocalDate useDate) { couponManager.use(issuedCoupon, useDate); } - - - - - - private void validateCouponAuthorization(Coupon coupon, Long storeId) { if(!coupon.getStore().getId().equals(storeId)) throw new UnAuthorizedCouponException(); } diff --git a/src/main/java/kr/bb/store/domain/question/controller/response/QuestionDetailInfoResponse.java b/src/main/java/kr/bb/store/domain/question/controller/response/QuestionDetailInfoResponse.java index 39baaee..7a5cd36 100644 --- a/src/main/java/kr/bb/store/domain/question/controller/response/QuestionDetailInfoResponse.java +++ b/src/main/java/kr/bb/store/domain/question/controller/response/QuestionDetailInfoResponse.java @@ -1,6 +1,8 @@ package kr.bb.store.domain.question.controller.response; import kr.bb.store.domain.question.dto.AnswerDto; +import kr.bb.store.domain.question.entity.Answer; +import kr.bb.store.domain.question.entity.Question; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -21,4 +23,16 @@ public class QuestionDetailInfoResponse { private Boolean isReplied; private AnswerDto answer; + public static QuestionDetailInfoResponse of(Question question, Answer answer) { + return QuestionDetailInfoResponse.builder() + .title(question.getTitle()) + .nickname(question.getNickname()) + .createdAt(question.getCreatedAt()) + .productName(question.getProductName()) + .content(question.getContent()) + .isReplied(answer != null) + .answer(answer == null ? null : AnswerDto.fromEntity(answer)) + .build(); + } + } diff --git a/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java b/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java index 9c3632b..90e42f9 100644 --- a/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java +++ b/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java @@ -27,15 +27,7 @@ public QuestionDetailInfoResponse readDetailInfo(Long questionId) { Answer answer = answerRepository.findById(questionId) .orElse(null); - return QuestionDetailInfoResponse.builder() - .title(question.getTitle()) - .nickname(question.getNickname()) - .createdAt(question.getCreatedAt()) - .productName(question.getProductName()) - .content(question.getContent()) - .isReplied(answer != null) - .answer(answer == null ? null : AnswerDto.fromEntity(answer)) - .build(); + return QuestionDetailInfoResponse.of(question,answer); } public Page readQuestionsForStoreOwner(Long storeId, Boolean isReplied, Pageable pageable) { diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoManagerResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoManagerResponse.java index d565009..41e8c0a 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoManagerResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoManagerResponse.java @@ -1,5 +1,7 @@ package kr.bb.store.domain.store.controller.response; +import kr.bb.store.domain.store.entity.Store; +import kr.bb.store.domain.store.entity.StoreAddress; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -18,4 +20,17 @@ public class StoreInfoManagerResponse { private String detailInfo; private String address; private String addressDetail; + + public static StoreInfoManagerResponse of(Store store, StoreAddress storeAddress) { + return StoreInfoManagerResponse.builder() + .storeName(store.getStoreName()) + .storeThumbnailImage(store.getStoreThumbnailImage()) + .phoneNumber(store.getPhoneNumber()) + .accountNumber(store.getAccountNumber()) + .bank(store.getBank()) + .detailInfo(store.getDetailInfo()) + .address(storeAddress.getAddress()) + .addressDetail(storeAddress.getDetailAddress()) + .build(); + } } diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoUserResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoUserResponse.java index 9da2b9b..2e49d87 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoUserResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoUserResponse.java @@ -1,5 +1,7 @@ package kr.bb.store.domain.store.controller.response; +import kr.bb.store.domain.store.entity.Store; +import kr.bb.store.domain.store.entity.StoreAddress; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -19,4 +21,18 @@ public class StoreInfoUserResponse { private String phoneNumber; private Boolean isLiked; private Boolean isSubscribed; + + public static StoreInfoUserResponse of(Store store, StoreAddress storeAddress, Boolean isLiked, Boolean isSubscribed) { + return StoreInfoUserResponse.builder() + .storeName(store.getStoreName()) + .storeThumbnailImage(store.getStoreThumbnailImage()) + .address(storeAddress.getAddress()) + .detailAddress(storeAddress.getDetailAddress()) + .averageRating(store.getAverageRating()) + .detailInfo(store.getDetailInfo()) + .phoneNumber(store.getPhoneNumber()) + .isLiked(isLiked) + .isSubscribed(isSubscribed) + .build(); + } } diff --git a/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java b/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java index 79e6f8c..c1426b1 100644 --- a/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java +++ b/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java @@ -42,8 +42,6 @@ public DeliveryPolicy findDeliveryPolicyByStoreId(Long storeId) { .orElseThrow(DeliveryPolicyNotFoundException::new); } - - public StoreDetailInfoResponse readDetailInfo(Long storeId) { Store store = storeRepository.findById(storeId).orElseThrow(StoreNotFoundException::new); DeliveryPolicy deliveryPolicy = deliveryPolicyRepository.findByStoreId(storeId) @@ -62,33 +60,14 @@ public StoreInfoUserResponse readForUser(Long storeId, Boolean isLiked, Boolean Store store = storeRepository.findById(storeId).orElseThrow(StoreNotFoundException::new); StoreAddress storeAddress = storeAddressRepository.findByStoreId(storeId) .orElseThrow(StoreAddressNotFoundException::new); - return StoreInfoUserResponse.builder() - .storeName(store.getStoreName()) - .storeThumbnailImage(store.getStoreThumbnailImage()) - .address(storeAddress.getAddress()) - .detailAddress(storeAddress.getDetailAddress()) - .averageRating(store.getAverageRating()) - .detailInfo(store.getDetailInfo()) - .phoneNumber(store.getPhoneNumber()) - .isLiked(isLiked) - .isSubscribed(isSubscribed) - .build(); + return StoreInfoUserResponse.of(store, storeAddress, isLiked, isSubscribed); } public StoreInfoManagerResponse readForManager(Long storeId) { Store store = storeRepository.findById(storeId).orElseThrow(StoreNotFoundException::new); StoreAddress storeAddress = storeAddressRepository.findByStoreId(storeId) .orElseThrow(StoreAddressNotFoundException::new); - return StoreInfoManagerResponse.builder() - .storeName(store.getStoreName()) - .storeThumbnailImage(store.getStoreThumbnailImage()) - .phoneNumber(store.getPhoneNumber()) - .accountNumber(store.getAccountNumber()) - .bank(store.getBank()) - .detailInfo(store.getDetailInfo()) - .address(storeAddress.getAddress()) - .addressDetail(storeAddress.getDetailAddress()) - .build(); + return StoreInfoManagerResponse.of(store, storeAddress); } public StoreListForMapResponse getNearbyStores(Double lat, Double lon, Integer level) { From d9963e547746349c16708527bf2476c5e3447240 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Wed, 6 Dec 2023 19:29:34 +0900 Subject: [PATCH 05/25] =?UTF-8?q?:pencil2:=20=EB=8B=A4=EB=A5=B8=20MS?= =?UTF-8?q?=EC=9D=98=20subscriptionId=EA=B0=80=20String=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/request/SubscriptionCreateRequest.java | 2 +- .../bb/store/domain/subscription/entity/Subscription.java | 2 +- .../subscription/handler/SubscriptionCreatorTest.java | 2 +- .../subscription/handler/SubscriptionManagerTest.java | 2 +- .../domain/subscription/handler/SubscriptionReaderTest.java | 6 +++--- .../subscription/service/SubscriptionServiceTest.java | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/subscription/controller/request/SubscriptionCreateRequest.java b/src/main/java/kr/bb/store/domain/subscription/controller/request/SubscriptionCreateRequest.java index 2dea65b..ff73a16 100644 --- a/src/main/java/kr/bb/store/domain/subscription/controller/request/SubscriptionCreateRequest.java +++ b/src/main/java/kr/bb/store/domain/subscription/controller/request/SubscriptionCreateRequest.java @@ -15,7 +15,7 @@ public class SubscriptionCreateRequest { private Long orderSubscriptionId; private Long storeId; private Long userId; - private Long subscriptionProductId; + private String subscriptionProductId; private LocalDate deliveryDate; } diff --git a/src/main/java/kr/bb/store/domain/subscription/entity/Subscription.java b/src/main/java/kr/bb/store/domain/subscription/entity/Subscription.java index e672bd1..f6916ba 100644 --- a/src/main/java/kr/bb/store/domain/subscription/entity/Subscription.java +++ b/src/main/java/kr/bb/store/domain/subscription/entity/Subscription.java @@ -29,7 +29,7 @@ public class Subscription extends BaseEntity { private Long userId; @NotNull - private Long subscriptionProductId; + private String subscriptionProductId; @NotNull private String subscriptionCode; diff --git a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionCreatorTest.java b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionCreatorTest.java index 7751939..4da79c1 100644 --- a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionCreatorTest.java @@ -62,7 +62,7 @@ private SubscriptionCreateRequest createRequest(Long storeId) { .orderSubscriptionId(1L) .storeId(storeId) .userId(1L) - .subscriptionProductId(1L) + .subscriptionProductId("1") .deliveryDate(LocalDate.now()) .build(); } diff --git a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionManagerTest.java b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionManagerTest.java index 5b19831..ef4913f 100644 --- a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionManagerTest.java +++ b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionManagerTest.java @@ -49,7 +49,7 @@ private Subscription makeSubscription(Store store) { .store(store) .orderSubscriptionId(1L) .userId(1L) - .subscriptionProductId(1L) + .subscriptionProductId("1") .subscriptionCode("Code") .deliveryDate(LocalDate.now()) .build(); diff --git a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionReaderTest.java b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionReaderTest.java index 1bed88c..9674a9e 100644 --- a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionReaderTest.java +++ b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionReaderTest.java @@ -132,7 +132,7 @@ private Subscription makeSubscription(Store store, Long orderSubscriptionId) { .store(store) .orderSubscriptionId(orderSubscriptionId) .userId(1L) - .subscriptionProductId(1L) + .subscriptionProductId("1") .subscriptionCode("Code") .deliveryDate(LocalDate.now()) .build(); @@ -142,7 +142,7 @@ private Subscription makeSubscription(Store store, LocalDate deliveryDate) { .store(store) .orderSubscriptionId(1L) .userId(1L) - .subscriptionProductId(1L) + .subscriptionProductId("1") .subscriptionCode("Code") .deliveryDate(deliveryDate) .build(); @@ -152,7 +152,7 @@ private Subscription makeSubscriptionWithUserId(Store store, Long userId) { .store(store) .orderSubscriptionId(1L) .userId(userId) - .subscriptionProductId(1L) + .subscriptionProductId("1") .subscriptionCode("Code") .deliveryDate(LocalDate.now()) .build(); diff --git a/src/test/java/kr/bb/store/domain/subscription/service/SubscriptionServiceTest.java b/src/test/java/kr/bb/store/domain/subscription/service/SubscriptionServiceTest.java index 9e2aa70..2ac7a64 100644 --- a/src/test/java/kr/bb/store/domain/subscription/service/SubscriptionServiceTest.java +++ b/src/test/java/kr/bb/store/domain/subscription/service/SubscriptionServiceTest.java @@ -57,7 +57,7 @@ private SubscriptionCreateRequest createRequest(Long storeId) { .orderSubscriptionId(1L) .storeId(storeId) .userId(1L) - .subscriptionProductId(1L) + .subscriptionProductId("1") .deliveryDate(LocalDate.now()) .build(); } From 3fb440c1186c78860a1a98907c76556fd5fdac2d Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Wed, 6 Dec 2023 19:34:05 +0900 Subject: [PATCH 06/25] =?UTF-8?q?:pencil2:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B3=80=EA=B2=BD=20-=20=EA=B0=80=EA=B2=8C=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EA=B5=AC?= =?UTF-8?q?=EB=8F=85=EC=83=81=ED=92=88=20=EC=95=84=EC=9D=B4=EB=94=94=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/controller/response/StoreInfoUserResponse.java | 5 ++++- .../java/kr/bb/store/domain/store/handler/StoreReader.java | 5 +++-- .../java/kr/bb/store/domain/store/service/StoreService.java | 3 ++- .../kr/bb/store/domain/store/handler/StoreReaderTest.java | 3 ++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoUserResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoUserResponse.java index 2e49d87..32ef027 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoUserResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreInfoUserResponse.java @@ -21,8 +21,10 @@ public class StoreInfoUserResponse { private String phoneNumber; private Boolean isLiked; private Boolean isSubscribed; + private String subscriptionProductId; - public static StoreInfoUserResponse of(Store store, StoreAddress storeAddress, Boolean isLiked, Boolean isSubscribed) { + public static StoreInfoUserResponse of(Store store, StoreAddress storeAddress, Boolean isLiked, + Boolean isSubscribed, String subscriptionProductId) { return StoreInfoUserResponse.builder() .storeName(store.getStoreName()) .storeThumbnailImage(store.getStoreThumbnailImage()) @@ -33,6 +35,7 @@ public static StoreInfoUserResponse of(Store store, StoreAddress storeAddress, B .phoneNumber(store.getPhoneNumber()) .isLiked(isLiked) .isSubscribed(isSubscribed) + .subscriptionProductId(subscriptionProductId) .build(); } } diff --git a/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java b/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java index c1426b1..7bb7ef4 100644 --- a/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java +++ b/src/main/java/kr/bb/store/domain/store/handler/StoreReader.java @@ -56,11 +56,12 @@ public Page readStoresWithPaging(Pageable pageable) { return storeRepository.getStoresWithPaging(pageable); } - public StoreInfoUserResponse readForUser(Long storeId, Boolean isLiked, Boolean isSubscribed) { + public StoreInfoUserResponse readForUser(Long storeId, Boolean isLiked, Boolean isSubscribed, + String subscriptionProductId) { Store store = storeRepository.findById(storeId).orElseThrow(StoreNotFoundException::new); StoreAddress storeAddress = storeAddressRepository.findByStoreId(storeId) .orElseThrow(StoreAddressNotFoundException::new); - return StoreInfoUserResponse.of(store, storeAddress, isLiked, isSubscribed); + return StoreInfoUserResponse.of(store, storeAddress, isLiked, isSubscribed, subscriptionProductId); } public StoreInfoManagerResponse readForManager(Long storeId) { diff --git a/src/main/java/kr/bb/store/domain/store/service/StoreService.java b/src/main/java/kr/bb/store/domain/store/service/StoreService.java index 50c0a7a..aede0d9 100644 --- a/src/main/java/kr/bb/store/domain/store/service/StoreService.java +++ b/src/main/java/kr/bb/store/domain/store/service/StoreService.java @@ -74,7 +74,8 @@ public StoreInfoUserResponse getStoreInfoForUser(Long storeId) { // TODO : Feign통신으로 값 받아오기 Boolean isLiked = false; Boolean isSubscribed = false; - return storeReader.readForUser(storeId, isLiked, isSubscribed); + String subscriptionProductId = "구독상품아이디"; + return storeReader.readForUser(storeId, isLiked, isSubscribed, subscriptionProductId); } public StoreInfoManagerResponse getStoreInfoForManager(Long storeId) { diff --git a/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java b/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java index d25f15e..5945c10 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java @@ -137,9 +137,10 @@ void readForUser() { Boolean isLiked = true; Boolean isSubscribed = true; + String subscriptionProductId = "구독용 상품 아이디"; // when - StoreInfoUserResponse response = storeReader.readForUser(store.getId(),isLiked, isSubscribed); + StoreInfoUserResponse response = storeReader.readForUser(store.getId(),isLiked, isSubscribed, subscriptionProductId); // then assertThat(response.getStoreName()).isEqualTo("가게1"); From ba9b72a96ddb77373414f94d4446e5262ce7b59f Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Thu, 7 Dec 2023 09:16:45 +0900 Subject: [PATCH 07/25] =?UTF-8?q?:green=5Fheart:=20bus-refresh=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20[=ED=8C=80=20=EC=A0=84=EC=B2=B4]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 4c68b21..e2524a1 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation "org.springframework.cloud:spring-cloud-starter-bus-kafka" + implementation 'org.springframework.cloud:spring-cloud-starter-stream-kafka:2.2.1.RELEASE' runtimeOnly 'com.h2database:h2' runtimeOnly 'com.mysql:mysql-connector-j' From 12dd9baa656b4f69d250cf7f1b7057b02cdd4d13 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Thu, 7 Dec 2023 14:06:25 +0900 Subject: [PATCH 08/25] =?UTF-8?q?:green=5Fheart:=20kafka-stream=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20[=ED=8C=80=20=EC=A0=84=EC=B2=B4]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index e2524a1..4c68b21 100644 --- a/build.gradle +++ b/build.gradle @@ -45,7 +45,6 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation "org.springframework.cloud:spring-cloud-starter-bus-kafka" - implementation 'org.springframework.cloud:spring-cloud-starter-stream-kafka:2.2.1.RELEASE' runtimeOnly 'com.h2database:h2' runtimeOnly 'com.mysql:mysql-connector-j' From 32d03775fff7c8a55c407621ad66ff890de2f5d5 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Thu, 7 Dec 2023 14:07:00 +0900 Subject: [PATCH 09/25] =?UTF-8?q?:pencil2:=20=EB=B3=B8=EC=9D=B8=20?= =?UTF-8?q?=EB=B9=84=EB=B0=80=EA=B8=80=EC=9D=B4=20=EC=95=84=EB=8B=90=20?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=9C=EB=AA=A9=EA=B3=BC=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=EC=9D=84=20=EB=85=B8=EC=B6=9C=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuestionController.java | 2 +- .../request/QuestionCreateRequest.java | 2 +- .../question/handler/QuestionCreator.java | 2 +- .../QuestionRepositoryCustomImpl.java | 39 +++++++++-- .../question/handler/QuestionReaderTest.java | 66 +++++++++++++++++++ 5 files changed, 104 insertions(+), 7 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java b/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java index 64e51ff..9624283 100644 --- a/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java +++ b/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java @@ -48,7 +48,7 @@ public ResponseEntity storeQuestions(@PathVaria public ResponseEntity productQuestions(@PathVariable Long productId, @RequestParam(required = false) Boolean isReplied, Pageable pageable, - @RequestHeader(value = "userId") Long userId) { + @RequestHeader(value = "userId", required = false) Long userId) { return ResponseEntity.ok().body(questionService.getQuestionsInProduct(userId, productId, isReplied, pageable)); } diff --git a/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java b/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java index a01dd9e..bb4215a 100644 --- a/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java +++ b/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java @@ -15,6 +15,6 @@ public class QuestionCreateRequest { private Long productId; private String title; private String content; - private boolean isSecret; + private Boolean isSecret; private String nickname; } diff --git a/src/main/java/kr/bb/store/domain/question/handler/QuestionCreator.java b/src/main/java/kr/bb/store/domain/question/handler/QuestionCreator.java index 5bc4fe8..a8be4e1 100644 --- a/src/main/java/kr/bb/store/domain/question/handler/QuestionCreator.java +++ b/src/main/java/kr/bb/store/domain/question/handler/QuestionCreator.java @@ -27,7 +27,7 @@ public Question create(Long userId, QuestionCreateRequest questionCreateRequest) .productName(questionCreateRequest.getProductName()) .title(questionCreateRequest.getTitle()) .content(questionCreateRequest.getContent()) - .isSecret(questionCreateRequest.isSecret()) + .isSecret(questionCreateRequest.getIsSecret()) .build(); return questionRepository.save(question); diff --git a/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java b/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java index f827fea..c5ff90b 100644 --- a/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java +++ b/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java @@ -1,7 +1,10 @@ package kr.bb.store.domain.question.repository; +import com.querydsl.core.types.Expression; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.StringExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import kr.bb.store.domain.question.dto.*; import org.springframework.data.domain.Page; @@ -12,6 +15,8 @@ import java.util.List; +import static com.querydsl.core.types.ExpressionUtils.as; +import static com.querydsl.jpa.JPAExpressions.select; import static kr.bb.store.domain.question.entity.QAnswer.answer; import static kr.bb.store.domain.question.entity.QQuestion.question; @@ -61,12 +66,12 @@ public Page getQuestionsInProductWithPaging(Long userId, L List contents = queryFactory.select(new QQuestionInProductDto( question.id, Expressions.asBoolean(answer.question.id.isNotNull()), - question.title, - question.content, + makeTitle(userId), + makeContent(userId), question.nickname, question.createdAt, question.isSecret, - question.userId.eq(userId), + subQueryOfIsMine(userId), answer.content, answer.createdAt )) @@ -171,9 +176,35 @@ public Page getMyQuestionsWithPaging(Long userId, Boolean } + + + private StringExpression makeTitle(Long userId) { + return new CaseBuilder() + .when(question.isSecret.isTrue().and(isNotMyQuestion(userId))) + .then(Expressions.asString("비밀글입니다")) + .otherwise(question.title); + } + + private StringExpression makeContent(Long userId) { + return new CaseBuilder() + .when(question.isSecret.isTrue().and(isNotMyQuestion(userId))) + .then(Expressions.asString("")) + .otherwise(question.content); + } + + private Expression subQueryOfIsMine(Long userId) { + if(userId == null) return Expressions.asBoolean(false); + return as(select(question.id.count().goe(1)) + .from(question) + .where(question.userId.eq(userId)), "isMine"); + } + + private BooleanExpression isNotMyQuestion(Long userId) { + return (userId == null) ? null : question.userId.ne(userId); + } + private BooleanExpression checkRepliedCondition(boolean isReplied) { return isReplied ? answer.question.id.isNotNull() : answer.question.id.isNull(); - } } diff --git a/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java b/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java index 5bafa4e..74b3f13 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java @@ -235,6 +235,60 @@ void readQuestionsInProduct() { assertThat(result.getTotalElements()).isEqualTo(3); } + @DisplayName("내가 작성하지 않은 비밀글은 제목과 내용이 비밀처리된다") + @Test + void cannotSeeOthersSecretQuesetion() { + // given + Store store = createStore(1L); + storeRepository.save(store); + long writerId = 1L; + + Question q1 = createQuestion(store,writerId,true); + questionRepository.save(q1); + + long readerId = 2L; + long productId = 1L; + Boolean isReplied = false; + PageRequest pageRequest = PageRequest.of(0, 10); + + // when + Page questionInProductDtos = questionReader.readQuestionsInProduct(readerId, productId, isReplied, pageRequest); + QuestionInProductDto result = questionInProductDtos.getContent().get(0); + + // then + assertThat(result.getTitle()).isEqualTo("비밀글입니다"); + assertThat(result.getContent()).isEqualTo(""); + + } + + @DisplayName("비회원은 비밀글을 볼 수 없다") + @Test + void nonMembersCannotSeeSecretQuestion() { + // given + Store store = createStore(1L); + storeRepository.save(store); + long writerId = 1L; + + Question q1 = createQuestion(store,writerId,true); + questionRepository.save(q1); + + Long nonMemberId = null; + long productId = 1L; + Boolean isReplied = false; + PageRequest pageRequest = PageRequest.of(0, 10); + + // when + Page questionInProductDtos = questionReader.readQuestionsInProduct(nonMemberId, productId, isReplied, pageRequest); + QuestionInProductDto result = questionInProductDtos.getContent().get(0); + + // then + assertThat(result.getTitle()).isEqualTo("비밀글입니다"); + assertThat(result.getContent()).isEqualTo(""); + } + + + + @DisplayName("해당 상품에서 내가 남긴 문의만 모아본다") @Test void readMyQuestionsInProduct() { @@ -314,6 +368,18 @@ private Question createQuestion(Store store) { .isSecret(true) .build(); } + private Question createQuestion(Store store, Long writerId, boolean isSecret) { + return Question.builder() + .store(store) + .userId(writerId) + .nickname("닉네임") + .productId(1L) + .productName("상품명") + .title("질문제목") + .content("질문내용") + .isSecret(isSecret) + .build(); + } private Answer createAnswer(Question question) { return Answer.builder() From 0e9bc9ad7eb8527b2b60b9fb27b6cc4742f22b0c Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Thu, 7 Dec 2023 15:15:45 +0900 Subject: [PATCH 10/25] =?UTF-8?q?:pencil2:=20=EB=B9=84=ED=9A=8C=EC=9B=90(u?= =?UTF-8?q?serId=EA=B0=80=20null=EC=9D=BC=20=EC=88=98=20=EC=9E=88=EB=8B=A4?= =?UTF-8?q?)=20=EC=A0=91=EC=86=8D=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/controller/StoreController.java | 18 +++++++++++------- .../domain/store/service/StoreService.java | 16 ++++++++-------- .../store/service/StoreServiceTest.java | 19 +++++++++++-------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/store/controller/StoreController.java b/src/main/java/kr/bb/store/domain/store/controller/StoreController.java index f9944b7..6451d61 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/StoreController.java +++ b/src/main/java/kr/bb/store/domain/store/controller/StoreController.java @@ -45,13 +45,15 @@ public ResponseEntity getStoreInfo(@PathVariable Long s } @GetMapping("/list") - public ResponseEntity getStores(Pageable pageable) { - return ResponseEntity.ok().body(storeService.getStoresWithPaging(pageable)); + public ResponseEntity getStores(@RequestHeader(value = "userId") Long userId, + Pageable pageable) { + return ResponseEntity.ok().body(storeService.getStoresWithPaging(userId, pageable)); } @GetMapping("/{storeId}/user") - public ResponseEntity getStoreInfoForUser(@PathVariable Long storeId){ - return ResponseEntity.ok().body(storeService.getStoreInfoForUser(storeId)); + public ResponseEntity getStoreInfoForUser(@RequestHeader(value = "userId") Long userId, + @PathVariable Long storeId){ + return ResponseEntity.ok().body(storeService.getStoreInfoForUser(userId, storeId)); } @GetMapping("/{storeId}/manager") @@ -61,13 +63,15 @@ public ResponseEntity getStoreInfoForManager(@PathVari @GetMapping("/map/location") public ResponseEntity getNearbyStores(@RequestParam Double lat, @RequestParam Double lon, + @RequestHeader(value = "userId") Long userId, @RequestParam Integer level) { - return ResponseEntity.ok().body(storeService.getNearbyStores(lat,lon,level)); + return ResponseEntity.ok().body(storeService.getNearbyStores(userId, lat, lon, level)); } @GetMapping("/map/region") - public ResponseEntity getStoresWithRegion(@RequestParam String sido, @RequestParam String gugun) { - return ResponseEntity.ok().body(storeService.getStoresWithRegion(sido,gugun)); + public ResponseEntity getStoresWithRegion(@RequestParam String sido, @RequestParam String gugun, + @RequestHeader(value = "userId") Long userId) { + return ResponseEntity.ok().body(storeService.getStoresWithRegion(userId, sido, gugun)); } @GetMapping("/address/sido") diff --git a/src/main/java/kr/bb/store/domain/store/service/StoreService.java b/src/main/java/kr/bb/store/domain/store/service/StoreService.java index aede0d9..24e9304 100644 --- a/src/main/java/kr/bb/store/domain/store/service/StoreService.java +++ b/src/main/java/kr/bb/store/domain/store/service/StoreService.java @@ -57,10 +57,10 @@ public StoreDetailInfoResponse getStoreInfo(Long storeId) { return storeReader.readDetailInfo(storeId); } - public SimpleStorePagingResponse getStoresWithPaging(Pageable pageable) { + public SimpleStorePagingResponse getStoresWithPaging(Long userId, Pageable pageable) { Page storePages = storeReader.readStoresWithPaging(pageable); - // TODO : 좋아요 여부 feign으로 받아와서 채우기 + // TODO : 좋아요 여부 feign으로 받아와서 채우기, userId가 null이면 통신하지 말기 List contents = storePages.getContent().stream() .collect(Collectors.toList()); @@ -70,8 +70,8 @@ public SimpleStorePagingResponse getStoresWithPaging(Pageable pageable) { .build(); } - public StoreInfoUserResponse getStoreInfoForUser(Long storeId) { - // TODO : Feign통신으로 값 받아오기 + public StoreInfoUserResponse getStoreInfoForUser(Long userId, Long storeId) { + // TODO : Feign통신으로 값 받아오기, userId가 null이면 통신하지 말기 Boolean isLiked = false; Boolean isSubscribed = false; String subscriptionProductId = "구독상품아이디"; @@ -82,14 +82,14 @@ public StoreInfoManagerResponse getStoreInfoForManager(Long storeId) { return storeReader.readForManager(storeId); } - public StoreListForMapResponse getNearbyStores(Double lat, Double lon, Integer level) { - // TODO : 좋아요 여부 feign으로 받아와서 채우기 + public StoreListForMapResponse getNearbyStores(Long userId, Double lat, Double lon, Integer level) { + // TODO : 좋아요 여부 feign으로 받아와서 채우기, null이면 요청하지말기 StoreListForMapResponse nearbyStores = storeReader.getNearbyStores(lat, lon, level); return nearbyStores; } - public StoreListForMapResponse getStoresWithRegion(String sidoCode, String gugunCode) { - // TODO : 좋아요 여부 feign으로 받아와서 채우기 + public StoreListForMapResponse getStoresWithRegion(Long userId, String sidoCode, String gugunCode) { + // TODO : 좋아요 여부 feign으로 받아와서 채우기, null이면 요청하지말기 Sido sido = sidoReader.readSido(sidoCode); Gugun gugun = "".equals(gugunCode) ? null : gugunReader.readGugunCorrespondingSidoWithCode(sido, gugunCode); StoreListForMapResponse storesWithRegion = storeReader.getStoresWithRegion(sido, gugun); diff --git a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java index e78e3bb..83d4e2b 100644 --- a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java +++ b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java @@ -195,10 +195,11 @@ public void getStoresWithPaing() { int page = 1; int size = 5; + long userId = 1L; Pageable pageable = PageRequest.of(page,size); // when - SimpleStorePagingResponse response = storeService.getStoresWithPaging(pageable); + SimpleStorePagingResponse response = storeService.getStoresWithPaging(userId, pageable); // then assertThat(response.getTotalCnt()).isEqualTo(7); @@ -210,7 +211,7 @@ public void getStoresWithPaing() { public void getStoreInfoForUser() { Long userId = 1L; - Store store = createStoreEntity(userId,"가게1"); + Store store = createStoreEntity(1L,"가게1"); storeRepository.save(store); StoreAddress storeAddress = createStoreAddressEntity(store,0D,0D); @@ -223,7 +224,7 @@ public void getStoreInfoForUser() { em.clear(); // when - StoreInfoUserResponse response = storeService.getStoreInfoForUser(store.getId()); + StoreInfoUserResponse response = storeService.getStoreInfoForUser(userId, store.getId()); // then assertThat(response.getStoreName()).isEqualTo("가게1"); @@ -264,7 +265,7 @@ void getStoresWithRegion() { Sido sido2 = new Sido("2", "부산"); Gugun gugun1 = new Gugun("100",sido1,"강남구"); Gugun gugun2 = new Gugun("200",sido1,"종로구"); - + Long userId = 1L; Store s1 = createStoreEntity(1L,"가게1"); Store s2 = createStoreEntity(1L,"가게2"); @@ -283,7 +284,7 @@ void getStoresWithRegion() { em.flush(); em.clear(); - StoreListForMapResponse storesWithRegion = storeService.getStoresWithRegion(sido1.getCode(), gugun1.getCode()); + StoreListForMapResponse storesWithRegion = storeService.getStoresWithRegion(userId, sido1.getCode(), gugun1.getCode()); assertThat(storesWithRegion.getStores()).hasSize(2) .extracting("storeName") .containsExactlyInAnyOrder( @@ -296,7 +297,7 @@ void getStoresWithRegion() { @Test void sidoMustNotBeNullWhenGetStoresWithRegion() { // when // then - assertThatThrownBy(() -> storeService.getStoresWithRegion(null,"강남구")) + assertThatThrownBy(() -> storeService.getStoresWithRegion(1L, null,"강남구")) .isInstanceOf(InvalidDataAccessApiUsageException.class); } @@ -309,9 +310,10 @@ void gugunHasRightSidoWhenGetStoresWithRegion() { Gugun gugun1 = new Gugun("300",sido2,"해운대구"); sidoRepository.saveAll(List.of(sido1, sido2)); gugunRepository.save(gugun1); + Long userId = 1L; // when // then - assertThatThrownBy(() -> storeService.getStoresWithRegion(sido1.getCode(),gugun1.getCode())) + assertThatThrownBy(() -> storeService.getStoresWithRegion(userId, sido1.getCode(),gugun1.getCode())) .isInstanceOf(InvalidParentException.class) .hasMessage("선택한 시/도와 구/군이 맞지 않습니다."); @@ -325,6 +327,7 @@ void getStoresWithRegionReadAllSidoWhenGugunIsBlank() { Gugun gugun1 = new Gugun("100",sido1,"강남구"); Gugun gugun2 = new Gugun("200",sido1,"종로구"); Gugun gugun3 = new Gugun("300",sido2,"해운대구"); + Long userId = 1L; Store s1 = createStoreEntity(1L,"가게1"); Store s2 = createStoreEntity(1L,"가게2"); @@ -343,7 +346,7 @@ void getStoresWithRegionReadAllSidoWhenGugunIsBlank() { em.flush(); em.clear(); - StoreListForMapResponse storesWithRegion = storeService.getStoresWithRegion(sido1.getCode(), ""); + StoreListForMapResponse storesWithRegion = storeService.getStoresWithRegion(userId, sido1.getCode(), ""); assertThat(storesWithRegion.getStores()).hasSize(4) .extracting("storeName") .containsExactlyInAnyOrder( From 11cbbbe887e56a05f979dc8f7bbfb2287f61cefc Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Thu, 7 Dec 2023 15:39:54 +0900 Subject: [PATCH 11/25] =?UTF-8?q?:pencil2:=20=EB=8B=A4=EB=A5=B8=20MS?= =?UTF-8?q?=EC=9D=98=20=EB=B3=80=EC=88=98=20=ED=83=80=EC=9E=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/PickupCreateRequest.java | 4 +- .../pickup/entity/PickupReservation.java | 6 +-- .../controller/QuestionController.java | 4 +- .../request/QuestionCreateRequest.java | 2 +- .../domain/question/entity/Question.java | 4 +- .../question/handler/QuestionReader.java | 4 +- .../repository/QuestionRepositoryCustom.java | 4 +- .../QuestionRepositoryCustomImpl.java | 4 +- .../question/service/QuestionService.java | 4 +- .../pickup/handler/PickupCreatorTest.java | 4 +- .../pickup/handler/PickupReaderTest.java | 8 ++-- .../pickup/service/PickupServiceTest.java | 4 +- .../question/handler/AnswerCreatorTest.java | 2 +- .../question/handler/QuestionCreatorTest.java | 2 +- .../question/handler/QuestionReaderTest.java | 44 +++++++++---------- .../question/service/QuestionServiceTest.java | 4 +- 16 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/pickup/controller/request/PickupCreateRequest.java b/src/main/java/kr/bb/store/domain/pickup/controller/request/PickupCreateRequest.java index fabd58e..a64153e 100644 --- a/src/main/java/kr/bb/store/domain/pickup/controller/request/PickupCreateRequest.java +++ b/src/main/java/kr/bb/store/domain/pickup/controller/request/PickupCreateRequest.java @@ -14,8 +14,8 @@ public class PickupCreateRequest { private Long storeId; private Long userId; - private Long orderPickupId; - private Long productId; + private String orderPickupId; + private String productId; private LocalDate pickupDate; private String pickupTime; } diff --git a/src/main/java/kr/bb/store/domain/pickup/entity/PickupReservation.java b/src/main/java/kr/bb/store/domain/pickup/entity/PickupReservation.java index 0ba5e68..367d57d 100644 --- a/src/main/java/kr/bb/store/domain/pickup/entity/PickupReservation.java +++ b/src/main/java/kr/bb/store/domain/pickup/entity/PickupReservation.java @@ -28,10 +28,10 @@ public class PickupReservation extends BaseEntity { private Long userId; @NotNull - private Long orderPickupId; + private String orderPickupId; @NotNull - private Long productId; + private String productId; @NotNull private String reservationCode; @@ -47,7 +47,7 @@ public class PickupReservation extends BaseEntity { private ReservationStatus reservationStatus = ReservationStatus.READY; @Builder - public PickupReservation(Store store, Long userId, Long orderPickupId, Long productId, String reservationCode, LocalDate pickupDate, String pickupTime) { + public PickupReservation(Store store, Long userId, String orderPickupId, String productId, String reservationCode, LocalDate pickupDate, String pickupTime) { this.store = store; this.userId = userId; this.orderPickupId = orderPickupId; diff --git a/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java b/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java index 9624283..dc6e68f 100644 --- a/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java +++ b/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java @@ -45,7 +45,7 @@ public ResponseEntity storeQuestions(@PathVaria } @GetMapping("/questions/product/{productId}") - public ResponseEntity productQuestions(@PathVariable Long productId, + public ResponseEntity productQuestions(@PathVariable String productId, @RequestParam(required = false) Boolean isReplied, Pageable pageable, @RequestHeader(value = "userId", required = false) Long userId) { @@ -53,7 +53,7 @@ public ResponseEntity productQuestions(@PathVa } @GetMapping("/questions/product/{productId}/my") - public ResponseEntity myQuestionsInProduct(@PathVariable Long productId, + public ResponseEntity myQuestionsInProduct(@PathVariable String productId, @RequestParam(required = false) Boolean isReplied, Pageable pageable, @RequestHeader(value = "userId") Long userId) { diff --git a/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java b/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java index bb4215a..10319ef 100644 --- a/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java +++ b/src/main/java/kr/bb/store/domain/question/controller/request/QuestionCreateRequest.java @@ -12,7 +12,7 @@ public class QuestionCreateRequest { private Long storeId; private String productName; - private Long productId; + private String productId; private String title; private String content; private Boolean isSecret; diff --git a/src/main/java/kr/bb/store/domain/question/entity/Question.java b/src/main/java/kr/bb/store/domain/question/entity/Question.java index 5ab3267..98b2c3b 100644 --- a/src/main/java/kr/bb/store/domain/question/entity/Question.java +++ b/src/main/java/kr/bb/store/domain/question/entity/Question.java @@ -31,7 +31,7 @@ public class Question extends BaseEntity { private String nickname; @NotNull - private Long productId; + private String productId; @NotNull private String productName; @@ -49,7 +49,7 @@ public class Question extends BaseEntity { private Boolean isRead; @Builder - public Question(Store store, Long userId, String nickname, Long productId, String productName, String title, String content, Boolean isSecret) { + public Question(Store store, Long userId, String nickname, String productId, String productName, String title, String content, Boolean isSecret) { this.store = store; this.userId = userId; this.nickname = nickname; diff --git a/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java b/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java index 90e42f9..cca415b 100644 --- a/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java +++ b/src/main/java/kr/bb/store/domain/question/handler/QuestionReader.java @@ -34,11 +34,11 @@ public Page readQuestionsForStoreOwner(Long storeId, Boolea return questionRepository.getQuestionsForStoreOwnerWithPaging(storeId, isReplied, pageable); } - public Page readQuestionsInProduct(Long userId, Long productId, Boolean isReplied, Pageable pageable) { + public Page readQuestionsInProduct(Long userId, String productId, Boolean isReplied, Pageable pageable) { return questionRepository.getQuestionsInProductWithPaging(userId, productId, isReplied, pageable); } - public Page readMyQuestionsInProduct(Long userId, Long productId, Boolean isReplied, Pageable pageable) { + public Page readMyQuestionsInProduct(Long userId, String productId, Boolean isReplied, Pageable pageable) { return questionRepository.getMyQuestionsInProductWithPaging(userId, productId, isReplied, pageable); } diff --git a/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustom.java b/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustom.java index a5a320b..f7f9f9c 100644 --- a/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustom.java +++ b/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustom.java @@ -8,7 +8,7 @@ public interface QuestionRepositoryCustom { Page getQuestionsForStoreOwnerWithPaging(Long storeId, Boolean isReplied, Pageable pageable); - Page getQuestionsInProductWithPaging(Long userId, Long productId, Boolean isReplied, Pageable pageable); - Page getMyQuestionsInProductWithPaging(Long userId, Long productId, Boolean isReplied, Pageable pageable); + Page getQuestionsInProductWithPaging(Long userId, String productId, Boolean isReplied, Pageable pageable); + Page getMyQuestionsInProductWithPaging(Long userId, String productId, Boolean isReplied, Pageable pageable); Page getMyQuestionsWithPaging(Long userId, Boolean isReplied, Pageable pageable); } diff --git a/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java b/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java index c5ff90b..6b59437 100644 --- a/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java +++ b/src/main/java/kr/bb/store/domain/question/repository/QuestionRepositoryCustomImpl.java @@ -62,7 +62,7 @@ public Page getQuestionsForStoreOwnerWithPaging(Long storeI } @Override - public Page getQuestionsInProductWithPaging(Long userId, Long productId, Boolean isReplied, Pageable pageable) { + public Page getQuestionsInProductWithPaging(Long userId, String productId, Boolean isReplied, Pageable pageable) { List contents = queryFactory.select(new QQuestionInProductDto( question.id, Expressions.asBoolean(answer.question.id.isNotNull()), @@ -101,7 +101,7 @@ public Page getQuestionsInProductWithPaging(Long userId, L } @Override - public Page getMyQuestionsInProductWithPaging(Long userId, Long productId, Boolean isReplied, Pageable pageable) { + public Page getMyQuestionsInProductWithPaging(Long userId, String productId, Boolean isReplied, Pageable pageable) { List contents = queryFactory.select(new QMyQuestionInMypageDto( question.id, Expressions.asBoolean(answer.question.id.isNotNull()), diff --git a/src/main/java/kr/bb/store/domain/question/service/QuestionService.java b/src/main/java/kr/bb/store/domain/question/service/QuestionService.java index de4954e..df4afd0 100644 --- a/src/main/java/kr/bb/store/domain/question/service/QuestionService.java +++ b/src/main/java/kr/bb/store/domain/question/service/QuestionService.java @@ -48,7 +48,7 @@ public QuestionsForOwnerPagingResponse getQuestionsForStoreOwner(Long storeId, B .build(); } - public QuestionsInProductPagingResponse getQuestionsInProduct(Long userId, Long productId, Boolean isReplied, Pageable pageable) { + public QuestionsInProductPagingResponse getQuestionsInProduct(Long userId, String productId, Boolean isReplied, Pageable pageable) { Page questionInProductDtos = questionReader.readQuestionsInProduct(userId, productId, isReplied, pageable); return QuestionsInProductPagingResponse.builder() .data(questionInProductDtos.getContent()) @@ -56,7 +56,7 @@ public QuestionsInProductPagingResponse getQuestionsInProduct(Long userId, Long .build(); } - public MyQuestionsInProductPagingResponse getMyQuestionsInProduct(Long userId, Long productId, Boolean isReplied, Pageable pageable) { + public MyQuestionsInProductPagingResponse getMyQuestionsInProduct(Long userId, String productId, Boolean isReplied, Pageable pageable) { Page questionInProductDtos = questionReader.readMyQuestionsInProduct(userId, productId, isReplied, pageable); return MyQuestionsInProductPagingResponse.builder() .data(questionInProductDtos.getContent()) diff --git a/src/test/java/kr/bb/store/domain/pickup/handler/PickupCreatorTest.java b/src/test/java/kr/bb/store/domain/pickup/handler/PickupCreatorTest.java index 12582a7..4bd25c3 100644 --- a/src/test/java/kr/bb/store/domain/pickup/handler/PickupCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/pickup/handler/PickupCreatorTest.java @@ -58,8 +58,8 @@ private PickupCreateRequest createRequest(Long storeId) { return PickupCreateRequest.builder() .storeId(storeId) .userId(1L) - .orderPickupId(1L) - .productId(1L) + .orderPickupId("1") + .productId("1") .pickupDate(LocalDate.now()) .pickupTime("13:00") .build(); diff --git a/src/test/java/kr/bb/store/domain/pickup/handler/PickupReaderTest.java b/src/test/java/kr/bb/store/domain/pickup/handler/PickupReaderTest.java index 3f0792e..1773128 100644 --- a/src/test/java/kr/bb/store/domain/pickup/handler/PickupReaderTest.java +++ b/src/test/java/kr/bb/store/domain/pickup/handler/PickupReaderTest.java @@ -86,8 +86,8 @@ private PickupReservation createPickup(Store store, LocalDate pickupDate) { return PickupReservation.builder() .store(store) .userId(1L) - .orderPickupId(1L) - .productId(1L) + .orderPickupId("1") + .productId("1") .reservationCode(UUID.randomUUID().toString().substring(0,8)) .pickupDate(pickupDate) .pickupTime("13:00") @@ -98,8 +98,8 @@ private PickupReservation createPickup(Store store, Long userId) { return PickupReservation.builder() .store(store) .userId(userId) - .orderPickupId(1L) - .productId(1L) + .orderPickupId("1") + .productId("1") .reservationCode(UUID.randomUUID().toString().substring(0,8)) .pickupDate(LocalDate.now()) .pickupTime("13:00") diff --git a/src/test/java/kr/bb/store/domain/pickup/service/PickupServiceTest.java b/src/test/java/kr/bb/store/domain/pickup/service/PickupServiceTest.java index 7bf3d95..fdfca22 100644 --- a/src/test/java/kr/bb/store/domain/pickup/service/PickupServiceTest.java +++ b/src/test/java/kr/bb/store/domain/pickup/service/PickupServiceTest.java @@ -59,8 +59,8 @@ private PickupReservation createPickup(Store store, LocalDate pickupDate) { return PickupReservation.builder() .store(store) .userId(1L) - .orderPickupId(1L) - .productId(1L) + .orderPickupId("1") + .productId("1") .reservationCode(UUID.randomUUID().toString().substring(0,8)) .pickupDate(pickupDate) .pickupTime("13:00") diff --git a/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java b/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java index ac3e6b9..d87997e 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java @@ -83,7 +83,7 @@ private Question createQuestion(Store store) { .store(store) .userId(1L) .nickname("닉네임") - .productId(1L) + .productId("1") .productName("상품명") .title("질문제목") .content("질문내용") diff --git a/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java b/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java index 5c57622..3ad5b8e 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java @@ -76,7 +76,7 @@ void isReadAlwaysFalseWhenQuestionCreated() { private QuestionCreateRequest createQuestionCreateRequest(Long storeId) { return QuestionCreateRequest.builder() .storeId(storeId) - .productId(1L) + .productId("1") .productName("제품명") .title("질문제목") .content("질문내용") diff --git a/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java b/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java index 74b3f13..febab59 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java @@ -216,14 +216,14 @@ void readQuestionsInProduct() { Store store = createStore(1L); storeRepository.save(store); - Question q1 = createQuestionWithProductIdAndUserId(store,1L,2L); - Question q2 = createQuestionWithProductIdAndUserId(store,1L,2L); - Question q3 = createQuestionWithProductIdAndUserId(store,1L,3L); - Question q4 = createQuestionWithProductIdAndUserId(store,2L,3L); - Question q5 = createQuestionWithProductIdAndUserId(store,2L,2L); + Question q1 = createQuestionWithProductIdAndUserId(store,"1",2L); + Question q2 = createQuestionWithProductIdAndUserId(store,"1",2L); + Question q3 = createQuestionWithProductIdAndUserId(store,"1",3L); + Question q4 = createQuestionWithProductIdAndUserId(store,"2",3L); + Question q5 = createQuestionWithProductIdAndUserId(store,"2",2L); questionRepository.saveAll(List.of(q1,q2,q3,q4,q5)); - Long productId = 1L; + String productId = "1"; Long userId = 2L; Boolean isReplied = false; PageRequest pageRequest = PageRequest.of(0, 10); @@ -247,7 +247,7 @@ void cannotSeeOthersSecretQuesetion() { questionRepository.save(q1); long readerId = 2L; - long productId = 1L; + String productId = "1"; Boolean isReplied = false; PageRequest pageRequest = PageRequest.of(0, 10); @@ -273,7 +273,7 @@ void nonMembersCannotSeeSecretQuestion() { questionRepository.save(q1); Long nonMemberId = null; - long productId = 1L; + String productId = "1"; Boolean isReplied = false; PageRequest pageRequest = PageRequest.of(0, 10); @@ -296,14 +296,14 @@ void readMyQuestionsInProduct() { Store store = createStore(1L); storeRepository.save(store); - Question q1 = createQuestionWithProductIdAndUserId(store,1L,2L); - Question q2 = createQuestionWithProductIdAndUserId(store,1L,2L); - Question q3 = createQuestionWithProductIdAndUserId(store,1L,3L); - Question q4 = createQuestionWithProductIdAndUserId(store,2L,3L); - Question q5 = createQuestionWithProductIdAndUserId(store,2L,2L); + Question q1 = createQuestionWithProductIdAndUserId(store,"1",2L); + Question q2 = createQuestionWithProductIdAndUserId(store,"1",2L); + Question q3 = createQuestionWithProductIdAndUserId(store,"1",3L); + Question q4 = createQuestionWithProductIdAndUserId(store,"2",3L); + Question q5 = createQuestionWithProductIdAndUserId(store,"2",2L); questionRepository.saveAll(List.of(q1,q2,q3,q4,q5)); - Long productId = 1L; + String productId = "1"; Long userId = 2L; Boolean isReplied = false; PageRequest pageRequest = PageRequest.of(0, 10); @@ -323,11 +323,11 @@ void readMyQuestions() { Store store = createStore(1L); storeRepository.save(store); - Question q1 = createQuestionWithProductIdAndUserId(store,1L,2L); - Question q2 = createQuestionWithProductIdAndUserId(store,1L,2L); - Question q3 = createQuestionWithProductIdAndUserId(store,1L,3L); - Question q4 = createQuestionWithProductIdAndUserId(store,2L,3L); - Question q5 = createQuestionWithProductIdAndUserId(store,2L,2L); + Question q1 = createQuestionWithProductIdAndUserId(store,"1",2L); + Question q2 = createQuestionWithProductIdAndUserId(store,"1",2L); + Question q3 = createQuestionWithProductIdAndUserId(store,"1",3L); + Question q4 = createQuestionWithProductIdAndUserId(store,"2",3L); + Question q5 = createQuestionWithProductIdAndUserId(store,"2",2L); questionRepository.saveAll(List.of(q1,q2,q3,q4,q5)); Long userId = 2L; @@ -343,7 +343,7 @@ void readMyQuestions() { } - private Question createQuestionWithProductIdAndUserId(Store store,Long productId, Long userId) { + private Question createQuestionWithProductIdAndUserId(Store store,String productId, Long userId) { return Question.builder() .store(store) .userId(userId) @@ -361,7 +361,7 @@ private Question createQuestion(Store store) { .store(store) .userId(1L) .nickname("닉네임") - .productId(1L) + .productId("1") .productName("상품명") .title("질문제목") .content("질문내용") @@ -373,7 +373,7 @@ private Question createQuestion(Store store, Long writerId, boolean isSecret) { .store(store) .userId(writerId) .nickname("닉네임") - .productId(1L) + .productId("1") .productName("상품명") .title("질문제목") .content("질문내용") diff --git a/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java b/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java index e7f1845..983f243 100644 --- a/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java +++ b/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java @@ -101,7 +101,7 @@ void createAnswer() { private QuestionCreateRequest createQuestionCreateRequest(Long storeId) { return QuestionCreateRequest.builder() .storeId(storeId) - .productId(1L) + .productId("1") .productName("상품명") .title("질문제목") .content("질문내용") @@ -115,7 +115,7 @@ private Question createQuestion(Store store) { .store(store) .userId(1L) .productName("상품명") - .productId(1L) + .productId("1") .title("질문제목") .content("질문내용") .isSecret(true) From 2d22174bbb6d29d902e94d7b23e35766bc3ab84d Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Thu, 7 Dec 2023 15:46:20 +0900 Subject: [PATCH 12/25] =?UTF-8?q?:ambulance:=20=EC=B5=9C=EC=86=8C=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=EA=B8=88=EC=95=A1=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 일반적인 쇼핑몰에 잘 존재하지 않는 개념으로 서비스 전체에 불필요하다는 팀 전체의 판단으로 삭제 --- .../store/controller/request/StoreCreateRequest.java | 3 --- .../store/controller/request/StoreInfoEditRequest.java | 2 -- .../controller/response/StoreDetailInfoResponse.java | 2 -- .../kr/bb/store/domain/store/dto/DeliveryPolicyDto.java | 1 - .../kr/bb/store/domain/store/entity/DeliveryPolicy.java | 9 ++------- .../kr/bb/store/domain/store/handler/StoreCreator.java | 1 - .../kr/bb/store/domain/store/handler/StoreManager.java | 1 - .../domain/store/controller/StoreControllerTest.java | 2 -- .../bb/store/domain/store/handler/StoreCreatorTest.java | 1 - .../bb/store/domain/store/handler/StoreManagerTest.java | 6 ++---- .../bb/store/domain/store/handler/StoreReaderTest.java | 3 +-- .../bb/store/domain/store/service/StoreServiceTest.java | 5 +---- 12 files changed, 6 insertions(+), 30 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/store/controller/request/StoreCreateRequest.java b/src/main/java/kr/bb/store/domain/store/controller/request/StoreCreateRequest.java index 7f4c867..d04da09 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/request/StoreCreateRequest.java +++ b/src/main/java/kr/bb/store/domain/store/controller/request/StoreCreateRequest.java @@ -29,8 +29,6 @@ public class StoreCreateRequest { @NotNull(message = "bank cannot be null") private String bank; - @PositiveOrZero(message = "minOrderPrice cannot be negative") - private Long minOrderPrice; @PositiveOrZero(message = "deliveryPrice cannot be negative") private Long deliveryPrice; @PositiveOrZero(message = "freeDeliveryMinPrice cannot be negative") @@ -63,7 +61,6 @@ public StoreDto toStoreRequest() { } public DeliveryPolicyDto toDeliveryPolicyRequest() { return DeliveryPolicyDto.builder() - .minOrderPrice(minOrderPrice) .deliveryPrice(deliveryPrice) .freeDeliveryMinPrice(freeDeliveryMinPrice) .build(); diff --git a/src/main/java/kr/bb/store/domain/store/controller/request/StoreInfoEditRequest.java b/src/main/java/kr/bb/store/domain/store/controller/request/StoreInfoEditRequest.java index c36d84e..8b1f8e7 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/request/StoreInfoEditRequest.java +++ b/src/main/java/kr/bb/store/domain/store/controller/request/StoreInfoEditRequest.java @@ -19,8 +19,6 @@ public class StoreInfoEditRequest { private String accountNumber; private String bank; - @PositiveOrZero(message = "minOrderPrice cannot be negative") - private Long minOrderPrice; @PositiveOrZero(message = "deliveryPrice cannot be negative") private Long deliveryPrice; @PositiveOrZero(message = "freeDeliveryMinPrice cannot be negative") diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreDetailInfoResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreDetailInfoResponse.java index d209aee..0b5df51 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/StoreDetailInfoResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreDetailInfoResponse.java @@ -20,7 +20,6 @@ public class StoreDetailInfoResponse { private String accountNumber; private String bank; - private Long minOrderPrice; private Long deliveryPrice; private Long freeDeliveryMinPrice; @@ -40,7 +39,6 @@ public static StoreDetailInfoResponse of(Store store, DeliveryPolicy deliveryPol .phoneNumber(store.getPhoneNumber()) .accountNumber(store.getAccountNumber()) .bank(store.getBank()) - .minOrderPrice(deliveryPolicy.getMinOrderPrice()) .deliveryPrice(deliveryPolicy.getDeliveryPrice()) .freeDeliveryMinPrice(deliveryPolicy.getFreeDeliveryMinPrice()) .sido(storeAddress.getSido().getName()) diff --git a/src/main/java/kr/bb/store/domain/store/dto/DeliveryPolicyDto.java b/src/main/java/kr/bb/store/domain/store/dto/DeliveryPolicyDto.java index 9799d0c..4f82119 100644 --- a/src/main/java/kr/bb/store/domain/store/dto/DeliveryPolicyDto.java +++ b/src/main/java/kr/bb/store/domain/store/dto/DeliveryPolicyDto.java @@ -10,7 +10,6 @@ @NoArgsConstructor @AllArgsConstructor public class DeliveryPolicyDto { - private Long minOrderPrice; private Long deliveryPrice; private Long freeDeliveryMinPrice; } \ No newline at end of file diff --git a/src/main/java/kr/bb/store/domain/store/entity/DeliveryPolicy.java b/src/main/java/kr/bb/store/domain/store/entity/DeliveryPolicy.java index 9213000..2c3b58d 100644 --- a/src/main/java/kr/bb/store/domain/store/entity/DeliveryPolicy.java +++ b/src/main/java/kr/bb/store/domain/store/entity/DeliveryPolicy.java @@ -21,9 +21,6 @@ public class DeliveryPolicy extends BaseEntity { @JoinColumn(name="store_id") private Store store; - @NotNull - private Long minOrderPrice; - @NotNull private Long freeDeliveryMinPrice; @@ -31,16 +28,14 @@ public class DeliveryPolicy extends BaseEntity { private Long deliveryPrice; @Builder - public DeliveryPolicy(Store store, Long minOrderPrice, Long freeDeliveryMinPrice, Long deliveryPrice) { + public DeliveryPolicy(Store store, Long freeDeliveryMinPrice, Long deliveryPrice) { this.store = store; - this.minOrderPrice = minOrderPrice; this.freeDeliveryMinPrice = freeDeliveryMinPrice; this.deliveryPrice = deliveryPrice; } - public void update(Long minOrderPrice, Long deliveryPrice, Long freeDeliveryMinPrice) { - this.minOrderPrice = minOrderPrice; + public void update(Long deliveryPrice, Long freeDeliveryMinPrice) { this.deliveryPrice = deliveryPrice; this.freeDeliveryMinPrice = freeDeliveryMinPrice; } diff --git a/src/main/java/kr/bb/store/domain/store/handler/StoreCreator.java b/src/main/java/kr/bb/store/domain/store/handler/StoreCreator.java index 5e97599..5583341 100644 --- a/src/main/java/kr/bb/store/domain/store/handler/StoreCreator.java +++ b/src/main/java/kr/bb/store/domain/store/handler/StoreCreator.java @@ -53,7 +53,6 @@ public Store createStore(Long userId, StoreDto storeDto) { private DeliveryPolicy createDeliveryPolicy(Store store, DeliveryPolicyDto deliveryPolicyDto) { DeliveryPolicy deliveryPolicy = DeliveryPolicy.builder() .store(store) - .minOrderPrice(deliveryPolicyDto.getMinOrderPrice()) .freeDeliveryMinPrice(deliveryPolicyDto.getFreeDeliveryMinPrice()) .deliveryPrice(deliveryPolicyDto.getDeliveryPrice()) .build(); diff --git a/src/main/java/kr/bb/store/domain/store/handler/StoreManager.java b/src/main/java/kr/bb/store/domain/store/handler/StoreManager.java index a93c106..04b96da 100644 --- a/src/main/java/kr/bb/store/domain/store/handler/StoreManager.java +++ b/src/main/java/kr/bb/store/domain/store/handler/StoreManager.java @@ -47,7 +47,6 @@ public void edit(Store store, StoreAddress storeAddress, DeliveryPolicy delivery deliveryPolicy.update( - storeInfoEditRequest.getMinOrderPrice(), storeInfoEditRequest.getDeliveryPrice(), storeInfoEditRequest.getFreeDeliveryMinPrice() ); diff --git a/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java b/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java index 5bda980..ca9e953 100644 --- a/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java +++ b/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java @@ -52,7 +52,6 @@ void storeCreateRequestPropertiesCannotBeNull2() throws Exception { .phoneNumber("가게 전화번호") .accountNumber("가게 계좌정보") .bank("가게 계좌 은행정보") - .minOrderPrice(10_000L) .deliveryPrice(5_000L) .freeDeliveryMinPrice(10_000L) .sido("서울") @@ -84,7 +83,6 @@ private StoreCreateRequest createStoreCreateRequest() { .phoneNumber("가게 전화번호") .accountNumber("가게 계좌정보") .bank("가게 계좌 은행정보") - .minOrderPrice(10_000L) .deliveryPrice(5_000L) .freeDeliveryMinPrice(10_000L) .sido("서울") diff --git a/src/test/java/kr/bb/store/domain/store/handler/StoreCreatorTest.java b/src/test/java/kr/bb/store/domain/store/handler/StoreCreatorTest.java index 04065e2..cd9c6a3 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/StoreCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/StoreCreatorTest.java @@ -114,7 +114,6 @@ private StoreCreateRequest createStoreRequest() { .zipCode("001112") .lat(33.33322D) .lon(127.13123D) - .minOrderPrice(10_000L) .deliveryPrice(5_000L) .freeDeliveryMinPrice(10_000L) .build(); diff --git a/src/test/java/kr/bb/store/domain/store/handler/StoreManagerTest.java b/src/test/java/kr/bb/store/domain/store/handler/StoreManagerTest.java index 3598635..36d9fe1 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/StoreManagerTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/StoreManagerTest.java @@ -67,8 +67,7 @@ public void editStore() { .phoneNumber("가게 전화번호") .accountNumber("가게 계좌정보") .bank("가게 계좌 은행정보") - .minOrderPrice(99_999L) // 수정됨 - .deliveryPrice(5_000L) + .deliveryPrice(9_999L) // 수정됨 .freeDeliveryMinPrice(10_000L) .sido("서울") .gugun("강남구") @@ -95,7 +94,7 @@ public void editStore() { assertThat(changedStore.getStoreName()).isEqualTo("가게2"); assertThat(changedStoreAddress.getLat()).isEqualTo(-11.1111D); - assertThat(changedDeliveryPolicy.getMinOrderPrice()).isEqualTo(99_999L); + assertThat(changedDeliveryPolicy.getDeliveryPrice()).isEqualTo(9_999L); } @@ -133,7 +132,6 @@ private Store createStore(Long userId) { private DeliveryPolicy createDeliveryPolicy(Store store) { return DeliveryPolicy.builder() .store(store) - .minOrderPrice(10_000L) .deliveryPrice(5_000L) .freeDeliveryMinPrice(10_000L) .build(); diff --git a/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java b/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java index 5945c10..cc08bae 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java @@ -70,7 +70,7 @@ void readDetailInfo() { // then assertThat(response.getStoreName()).isEqualTo("가게1"); - assertThat(response.getMinOrderPrice()).isEqualTo(10_000L); + assertThat(response.getDeliveryPrice()).isEqualTo(5_000L); assertThat(response.getSido()).isEqualTo("서울"); } @@ -340,7 +340,6 @@ private Store createStore(Long userId, String storeName) { private DeliveryPolicy createDeliveryPolicy(Store store) { return DeliveryPolicy.builder() .store(store) - .minOrderPrice(10_000L) .deliveryPrice(5_000L) .freeDeliveryMinPrice(10_000L) .build(); diff --git a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java index 83d4e2b..2faa3f7 100644 --- a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java +++ b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java @@ -128,7 +128,6 @@ public void editStore() { .phoneNumber("가게 전화번호") .accountNumber("가게 계좌정보") .bank("가게 계좌 은행정보") - .minOrderPrice(10_000L) .deliveryPrice(5_000L) .freeDeliveryMinPrice(10_000L) .sido("서울") @@ -172,7 +171,7 @@ void getStoreInfo() { // then assertThat(response.getStoreName()).isEqualTo("가게1"); - assertThat(response.getMinOrderPrice()).isEqualTo(10_000L); + assertThat(response.getDeliveryPrice()).isEqualTo(5000L); assertThat(response.getSido()).isEqualTo("서울"); } @@ -379,7 +378,6 @@ private StoreCreateRequest createStoreCreateRequest() { .phoneNumber("가게 전화번호") .accountNumber("가게 계좌정보") .bank("가게 계좌 은행정보") - .minOrderPrice(10_000L) .deliveryPrice(5_000L) .freeDeliveryMinPrice(10_000L) .sido("서울") @@ -426,7 +424,6 @@ private Store createStoreEntity(Long userId, String storeName) { private DeliveryPolicy createDeliveryPolicyEntity(Store store) { return DeliveryPolicy.builder() .store(store) - .minOrderPrice(10_000L) .deliveryPrice(5_000L) .freeDeliveryMinPrice(10_000L) .build(); From 75dd6eee5d1be4e38636a31a470b25d9131a8493 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Thu, 7 Dec 2023 19:51:09 +0900 Subject: [PATCH 13/25] =?UTF-8?q?:green=5Fheart:=20kafka=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=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 --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 4c68b21..56c52a6 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation "org.springframework.cloud:spring-cloud-starter-bus-kafka" + implementation 'org.springframework.kafka:spring-kafka' runtimeOnly 'com.h2database:h2' runtimeOnly 'com.mysql:mysql-connector-j' From dc705a34d13119b73d76bcc0a4a4e6d0ebdc5d21 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 09:37:00 +0900 Subject: [PATCH 14/25] =?UTF-8?q?:pencil2:=20=EA=B2=B0=EC=A0=9C=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=BF=A0=ED=8F=B0=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=8B=9C=20=EC=82=AC=EC=9A=A9=EC=97=AC=EB=B6=80=EB=8F=84=20?= =?UTF-8?q?=ED=95=A8=EA=BB=98=20=EB=B0=98=ED=99=98=20[=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=B6=94=EA=B0=80]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coupon/controller/CouponController.java | 14 ++-- .../request/TotalAmountRequest.java | 14 ++++ .../coupon/dto/CouponWithAvailabilityDto.java | 19 +++++ .../domain/coupon/handler/CouponReader.java | 6 +- .../repository/CouponRepositoryCustom.java | 3 +- .../CouponRepositoryCustomImpl.java | 18 ++--- .../domain/coupon/service/CouponService.java | 10 +-- .../coupon/handler/CouponReaderTest.java | 74 ++++++++++++++++++- 8 files changed, 135 insertions(+), 23 deletions(-) create mode 100644 src/main/java/kr/bb/store/domain/coupon/controller/request/TotalAmountRequest.java create mode 100644 src/main/java/kr/bb/store/domain/coupon/dto/CouponWithAvailabilityDto.java diff --git a/src/main/java/kr/bb/store/domain/coupon/controller/CouponController.java b/src/main/java/kr/bb/store/domain/coupon/controller/CouponController.java index 660fbdb..a5f79e0 100644 --- a/src/main/java/kr/bb/store/domain/coupon/controller/CouponController.java +++ b/src/main/java/kr/bb/store/domain/coupon/controller/CouponController.java @@ -2,6 +2,7 @@ import kr.bb.store.domain.coupon.controller.request.CouponCreateRequest; import kr.bb.store.domain.coupon.controller.request.CouponEditRequest; +import kr.bb.store.domain.coupon.controller.request.TotalAmountRequest; import kr.bb.store.domain.coupon.controller.response.CouponsForOwnerResponse; import kr.bb.store.domain.coupon.controller.response.CouponsForUserResponse; import kr.bb.store.domain.coupon.service.CouponService; @@ -70,16 +71,19 @@ public ResponseEntity storeCouponsForUser(@PathVariable return ResponseEntity.ok().body(couponService.getAllStoreCouponsForUser(userId, storeId, now)); } - @GetMapping("/{storeId}/coupons/my") + @PostMapping("/{storeId}/coupons/payment") public ResponseEntity couponsInPaymentStep(@PathVariable Long storeId, - @RequestHeader(value = "userId") Long userId) { + @RequestHeader(value = "userId") Long userId, + @RequestBody TotalAmountRequest totalAmountRequest) { - return ResponseEntity.ok().body(couponService.getAvailableCouponsInPayment(userId, storeId)); + LocalDate now = LocalDate.now(); + return ResponseEntity.ok().body(couponService.getAvailableCouponsInPayment(totalAmountRequest, userId, storeId, now)); } - @GetMapping("/coupons/list") + @GetMapping("/coupons/my") public ResponseEntity myCoupons(@RequestHeader(value = "userId") Long userId) { - return ResponseEntity.ok().body(couponService.getMyValidCoupons(userId)); + LocalDate now = LocalDate.now(); + return ResponseEntity.ok().body(couponService.getMyValidCoupons(userId, now)); } } diff --git a/src/main/java/kr/bb/store/domain/coupon/controller/request/TotalAmountRequest.java b/src/main/java/kr/bb/store/domain/coupon/controller/request/TotalAmountRequest.java new file mode 100644 index 0000000..189c70f --- /dev/null +++ b/src/main/java/kr/bb/store/domain/coupon/controller/request/TotalAmountRequest.java @@ -0,0 +1,14 @@ +package kr.bb.store.domain.coupon.controller.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TotalAmountRequest { + private Long totalAmount; +} diff --git a/src/main/java/kr/bb/store/domain/coupon/dto/CouponWithAvailabilityDto.java b/src/main/java/kr/bb/store/domain/coupon/dto/CouponWithAvailabilityDto.java new file mode 100644 index 0000000..70f5f6c --- /dev/null +++ b/src/main/java/kr/bb/store/domain/coupon/dto/CouponWithAvailabilityDto.java @@ -0,0 +1,19 @@ +package kr.bb.store.domain.coupon.dto; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Getter +@NoArgsConstructor +public class CouponWithAvailabilityDto extends CouponDto { + private Boolean isAvailable; + + @QueryProjection + public CouponWithAvailabilityDto(Long couponId, String couponName, String storeName, Long discountPrice, LocalDate endDate, Long minPrice, Boolean isAvailable) { + super(couponId, couponName, storeName, discountPrice, endDate, minPrice); + this.isAvailable = isAvailable; + } +} diff --git a/src/main/java/kr/bb/store/domain/coupon/handler/CouponReader.java b/src/main/java/kr/bb/store/domain/coupon/handler/CouponReader.java index 120393b..1e47d7e 100644 --- a/src/main/java/kr/bb/store/domain/coupon/handler/CouponReader.java +++ b/src/main/java/kr/bb/store/domain/coupon/handler/CouponReader.java @@ -2,6 +2,7 @@ import kr.bb.store.domain.coupon.dto.CouponDto; import kr.bb.store.domain.coupon.dto.CouponForOwnerDto; +import kr.bb.store.domain.coupon.dto.CouponWithAvailabilityDto; import kr.bb.store.domain.coupon.dto.CouponWithIssueStatusDto; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.exception.CouponNotFoundException; @@ -33,8 +34,9 @@ public List readStoreCouponsForUser(Long userId, Long return couponRepository.findStoreCouponsForUser(userId, storeId, now); } - public List readAvailableCouponsInStore(Long userId, Long storeId, LocalDate readDate) { - return couponRepository.findAvailableCoupons(userId, storeId, readDate); + public List readAvailableCouponsInStore(Long totalAmount, Long userId, Long storeId, + LocalDate readDate) { + return couponRepository.findAvailableCoupons(totalAmount, userId, storeId, readDate); } public List readMyValidCoupons(Long userId, LocalDate readDate) { diff --git a/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustom.java b/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustom.java index d0979fb..6766a6c 100644 --- a/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustom.java +++ b/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustom.java @@ -2,6 +2,7 @@ import kr.bb.store.domain.coupon.dto.CouponDto; import kr.bb.store.domain.coupon.dto.CouponForOwnerDto; +import kr.bb.store.domain.coupon.dto.CouponWithAvailabilityDto; import kr.bb.store.domain.coupon.dto.CouponWithIssueStatusDto; import kr.bb.store.domain.coupon.entity.Coupon; @@ -12,6 +13,6 @@ public interface CouponRepositoryCustom { List findAllDtoByStoreId(Long storeId); List findAllDownloadableCouponsByStoreId(Long storeId, LocalDate now); List findStoreCouponsForUser(Long userId, Long storeId, LocalDate now); - List findAvailableCoupons(Long userId, Long storeId, LocalDate now); + List findAvailableCoupons(Long totalAmount, Long userId, Long storeId, LocalDate now); List findMyValidCoupons(Long userId, LocalDate now); } diff --git a/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustomImpl.java b/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustomImpl.java index f9e7666..2241f8b 100644 --- a/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustomImpl.java +++ b/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustomImpl.java @@ -106,15 +106,15 @@ public List findStoreCouponsForUser(Long userId, Long } @Override - public List findAvailableCoupons(Long userId, Long storeId, LocalDate now) { - return queryFactory - .select(new QCouponDto( - coupon.id, - coupon.couponName, - coupon.store.storeName, - coupon.discountPrice, - coupon.endDate, - coupon.minPrice + public List findAvailableCoupons(Long totalAmount, Long userId, Long storeId, LocalDate now) { + return queryFactory.select(new QCouponWithAvailabilityDto( + coupon.id, + coupon.couponName, + coupon.store.storeName, + coupon.discountPrice, + coupon.endDate, + coupon.minPrice, + coupon.minPrice.loe(totalAmount) )) .from(coupon) .leftJoin(issuedCoupon) diff --git a/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java b/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java index f7c6b15..0ace7d2 100644 --- a/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java +++ b/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java @@ -2,6 +2,7 @@ import kr.bb.store.domain.coupon.controller.request.CouponCreateRequest; import kr.bb.store.domain.coupon.controller.request.CouponEditRequest; +import kr.bb.store.domain.coupon.controller.request.TotalAmountRequest; import kr.bb.store.domain.coupon.controller.response.CouponsForOwnerResponse; import kr.bb.store.domain.coupon.controller.response.CouponsForUserResponse; import kr.bb.store.domain.coupon.entity.Coupon; @@ -72,15 +73,14 @@ public CouponsForUserResponse getAllStoreCouponsForUser(Long userId, Long storeI .build(); } - public CouponsForUserResponse getAvailableCouponsInPayment(Long userId, Long storeId) { - LocalDate now = LocalDate.now(); + public CouponsForUserResponse getAvailableCouponsInPayment(TotalAmountRequest totalAmountRequest, + Long userId, Long storeId, LocalDate now) { return CouponsForUserResponse.builder() - .data(couponReader.readAvailableCouponsInStore(userId, storeId, now)) + .data(couponReader.readAvailableCouponsInStore(totalAmountRequest.getTotalAmount(), userId, storeId, now)) .build(); } - public CouponsForUserResponse getMyValidCoupons(Long userId) { - LocalDate now = LocalDate.now(); + public CouponsForUserResponse getMyValidCoupons(Long userId, LocalDate now) { return CouponsForUserResponse.builder() .data(couponReader.readMyValidCoupons(userId, now)) .build(); diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java index 1ab469a..1ee9eba 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java @@ -2,6 +2,7 @@ import kr.bb.store.domain.coupon.dto.CouponDto; import kr.bb.store.domain.coupon.dto.CouponForOwnerDto; +import kr.bb.store.domain.coupon.dto.CouponWithAvailabilityDto; import kr.bb.store.domain.coupon.dto.CouponWithIssueStatusDto; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.entity.IssuedCoupon; @@ -155,6 +156,8 @@ void readAvailableCouponsInStore() { Coupon c2 = createCouponWithDate(s1,now,now.plusDays(5)); couponRepository.saveAll(List.of(c1,c2)); + Long totalAmount = Long.MAX_VALUE; + Long userId = 1L; // 사용할 수 있는 쿠폰 issuedCouponRepository.save(createIssuedCoupon(c1, userId)); @@ -180,13 +183,69 @@ void readAvailableCouponsInStore() { couponRepository.save(c5); // when - List result = couponReader.readAvailableCouponsInStore(userId, s1.getId(), LocalDate.now().plusDays(2)); + List result = couponReader.readAvailableCouponsInStore(totalAmount, userId, s1.getId(), LocalDate.now().plusDays(2)); // then assertThat(result).hasSize(1); } + @DisplayName("주문금액이 쿠폰의 최소사용금액보다 작다면 사용불가로 표시된다") + @Test + void couponCannotUseWhenTotalAmountLowerThanCouponMinPrice() { + // given + LocalDate now = LocalDate.now(); + Store store = createStore(1L); + storeRepository.save(store); + + Long minPrice = 10_000L; + Coupon coupon = createCouponWithMinPrice(store,minPrice); + couponRepository.save(coupon); + + Long totalAmount = minPrice - 1; + + Long userId = 1L; + // 사용할 수 있는 쿠폰 + issuedCouponRepository.save(createIssuedCoupon(coupon, userId)); + + // when + List result = couponReader.readAvailableCouponsInStore(totalAmount, userId, store.getId(), LocalDate.now()); + + // then + assertThat(result) + .extracting("isAvailable") + .containsExactly(false); + + } + @DisplayName("주문금액과 쿠폰의 최소사용금액이 동일할 때는 사용가능으로 표시된다") + @Test + void couponCanUseWhenTotalAmountIsEqualToCouponMinPrice() { + // given + LocalDate now = LocalDate.now(); + Store store = createStore(1L); + storeRepository.save(store); + + Long minPrice = 10_000L; + Coupon coupon = createCouponWithMinPrice(store,minPrice); + couponRepository.save(coupon); + + Long totalAmount = minPrice; + + Long userId = 1L; + // 사용할 수 있는 쿠폰 + issuedCouponRepository.save(createIssuedCoupon(coupon, userId)); + + // when + List result = couponReader.readAvailableCouponsInStore(totalAmount, userId, store.getId(), LocalDate.now()); + + // then + assertThat(result) + .extracting("isAvailable") + .containsExactly(true); + + } + + @DisplayName("내가 보유한 사용할 수 있는 모든 쿠폰을 조회한다") @Test void readMyValidCoupons() { @@ -314,4 +373,17 @@ private Coupon createCouponWithDate(Store store, LocalDate startDate, LocalDate .build(); } + private Coupon createCouponWithMinPrice(Store store, Long minPrice) { + return Coupon.builder() + .couponCode("쿠폰코드") + .store(store) + .limitCount(100) + .couponName("쿠폰이름") + .discountPrice(10000L) + .minPrice(minPrice) + .startDate(LocalDate.now()) + .endDate(LocalDate.now()) + .build(); + } + } \ No newline at end of file From 389c9c8ffcb2468755c647a9535cd1f27fcc916f Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 11:21:18 +0900 Subject: [PATCH 15/25] =?UTF-8?q?:sparkles:=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=ED=95=9C=20=EA=B5=AC=ED=8F=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CouponFeignController.java | 10 ++++- .../response/CouponCountResponse.java | 14 +++++++ .../domain/coupon/handler/CouponReader.java | 4 ++ .../repository/CouponRepositoryCustom.java | 2 + .../CouponRepositoryCustomImpl.java | 16 ++++++++ .../domain/coupon/service/CouponService.java | 7 ++++ .../coupon/handler/CouponReaderTest.java | 40 +++++++++++++++++++ 7 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/main/java/kr/bb/store/domain/coupon/controller/response/CouponCountResponse.java diff --git a/src/main/java/kr/bb/store/domain/coupon/controller/CouponFeignController.java b/src/main/java/kr/bb/store/domain/coupon/controller/CouponFeignController.java index a6d2abf..ecb0cd7 100644 --- a/src/main/java/kr/bb/store/domain/coupon/controller/CouponFeignController.java +++ b/src/main/java/kr/bb/store/domain/coupon/controller/CouponFeignController.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.coupon.controller; +import kr.bb.store.domain.coupon.controller.response.CouponCountResponse; import kr.bb.store.domain.coupon.service.CouponService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -10,7 +11,7 @@ @CrossOrigin(origins = "*") @RestController @RequiredArgsConstructor -@RequestMapping(("/coupons")) +@RequestMapping(("stores/coupons")) public class CouponFeignController { private final CouponService couponService; @@ -21,4 +22,11 @@ public ResponseEntity useCoupon(@PathVariable Long couponId, @PathVariable return ResponseEntity.ok().build(); } + + @GetMapping("/count") + public ResponseEntity availableCouponCountOfUser(@RequestHeader(value = "userId") Long userId) { + LocalDate now = LocalDate.now(); + + return ResponseEntity.ok().body(couponService.getAvailableCouponCount(userId, now)); + } } diff --git a/src/main/java/kr/bb/store/domain/coupon/controller/response/CouponCountResponse.java b/src/main/java/kr/bb/store/domain/coupon/controller/response/CouponCountResponse.java new file mode 100644 index 0000000..1a88cb8 --- /dev/null +++ b/src/main/java/kr/bb/store/domain/coupon/controller/response/CouponCountResponse.java @@ -0,0 +1,14 @@ +package kr.bb.store.domain.coupon.controller.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CouponCountResponse { + private Integer couponCnt; +} diff --git a/src/main/java/kr/bb/store/domain/coupon/handler/CouponReader.java b/src/main/java/kr/bb/store/domain/coupon/handler/CouponReader.java index 1e47d7e..eeafa87 100644 --- a/src/main/java/kr/bb/store/domain/coupon/handler/CouponReader.java +++ b/src/main/java/kr/bb/store/domain/coupon/handler/CouponReader.java @@ -42,4 +42,8 @@ public List readAvailableCouponsInStore(Long totalAmo public List readMyValidCoupons(Long userId, LocalDate readDate) { return couponRepository.findMyValidCoupons(userId, readDate); } + + public Integer readMyValidCouponCount(Long userId, LocalDate readDate) { + return couponRepository.findMyValidCouponCount(userId, readDate); + } } diff --git a/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustom.java b/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustom.java index 6766a6c..0fa86cb 100644 --- a/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustom.java +++ b/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustom.java @@ -15,4 +15,6 @@ public interface CouponRepositoryCustom { List findStoreCouponsForUser(Long userId, Long storeId, LocalDate now); List findAvailableCoupons(Long totalAmount, Long userId, Long storeId, LocalDate now); List findMyValidCoupons(Long userId, LocalDate now); + + Integer findMyValidCouponCount(Long userId, LocalDate now); } diff --git a/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustomImpl.java b/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustomImpl.java index 2241f8b..f19f1e8 100644 --- a/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustomImpl.java +++ b/src/main/java/kr/bb/store/domain/coupon/repository/CouponRepositoryCustomImpl.java @@ -152,6 +152,22 @@ public List findMyValidCoupons(Long userId, LocalDate now) { .fetch(); } + @Override + public Integer findMyValidCouponCount(Long userId, LocalDate now) { + return Math.toIntExact(queryFactory + .select(coupon.count()) + .from(coupon) + .leftJoin(issuedCoupon) + .on(coupon.id.eq(issuedCoupon.id.couponId)) + .where( + issuedCoupon.id.userId.eq(userId), + issuedCoupon.isUsed.isFalse(), + isCouponUnexpired(now), + coupon.isDeleted.isFalse() + ) + .fetchFirst()); + } + private BooleanExpression isCouponUnexpired(LocalDate now) { return coupon.endDate.after(now).or(coupon.endDate.eq(now)); } diff --git a/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java b/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java index 0ace7d2..70e6158 100644 --- a/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java +++ b/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.coupon.service; +import kr.bb.store.domain.coupon.controller.response.CouponCountResponse; import kr.bb.store.domain.coupon.controller.request.CouponCreateRequest; import kr.bb.store.domain.coupon.controller.request.CouponEditRequest; import kr.bb.store.domain.coupon.controller.request.TotalAmountRequest; @@ -91,6 +92,12 @@ public void useCoupon(Long couponId, Long userId, LocalDate useDate) { couponManager.use(issuedCoupon, useDate); } + public CouponCountResponse getAvailableCouponCount(Long userId, LocalDate now) { + return CouponCountResponse.builder() + .couponCnt(couponReader.readMyValidCouponCount(userId, now)) + .build(); + } + private void validateCouponAuthorization(Coupon coupon, Long storeId) { if(!coupon.getStore().getId().equals(storeId)) throw new UnAuthorizedCouponException(); } diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java index 1ee9eba..f613595 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java @@ -286,6 +286,46 @@ void readMyValidCoupons() { assertThat(result).hasSize(1); } + @DisplayName("내가 보유한 사용할 수 있는 쿠폰 개수를 조회한다") + @Test + void readMyValidCouponCount() { + // given + LocalDate now = LocalDate.now(); + Store s1 = createStore(1L); + Store s2 = createStore(1L); + storeRepository.saveAll(List.of(s1,s2)); + Coupon c1 = createCouponWithDate(s1,now,now.plusDays(5)); + Coupon c2 = createCoupon(s1); + + couponRepository.saveAll(List.of(c1,c2)); + + Long userId = 1L; + // 사용할 수 있는 쿠폰 + issuedCouponRepository.save(createIssuedCoupon(c1, userId)); + + // 이미 사용한 쿠폰 + IssuedCoupon issuedCoupon = issuedCouponRepository.save(createIssuedCoupon(c2, userId)); + em.flush(); + em.clear(); + IssuedCoupon couponsToUse = issuedCouponRepository.findById(issuedCoupon.getId()).get(); + couponsToUse.use(LocalDate.now()); + + // 사용 기간이 지난 쿠폰 + Coupon c3 = createCouponWithDate(s2,now,now); + couponRepository.save(c3); + issuedCouponRepository.save(createIssuedCoupon(c3, userId)); + + // 유효하지만 다운로드 받지 않은 쿠폰 + Coupon c4 = createCouponWithDate(s1,now,now.plusDays(5)); + couponRepository.save(c4); + + // when + int result = couponReader.readMyValidCouponCount(userId,now.plusDays(1)); + + // then + assertThat(result).isEqualTo(1); + } + @DisplayName("현재 다운받을 수 있는 쿠폰 목록을 반환한다") @Test void readStoresAllValidateCoupon() { From c2cb193a12ace3652f2f6d377ebf736261f80bf1 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 11:24:22 +0900 Subject: [PATCH 16/25] =?UTF-8?q?:pencil2:=20=EC=BF=A0=ED=8F=B0=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EC=9A=94=EC=B2=AD=20=EC=8B=9C=20Response?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EA=B0=90=EC=8B=B8=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EA=B3=A0=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coupon/controller/CouponFeignController.java | 3 +-- .../controller/response/CouponCountResponse.java | 14 -------------- .../store/domain/coupon/service/CouponService.java | 7 ++----- .../store/controller/StoreFeignController.java | 2 +- 4 files changed, 4 insertions(+), 22 deletions(-) delete mode 100644 src/main/java/kr/bb/store/domain/coupon/controller/response/CouponCountResponse.java diff --git a/src/main/java/kr/bb/store/domain/coupon/controller/CouponFeignController.java b/src/main/java/kr/bb/store/domain/coupon/controller/CouponFeignController.java index ecb0cd7..f7938d9 100644 --- a/src/main/java/kr/bb/store/domain/coupon/controller/CouponFeignController.java +++ b/src/main/java/kr/bb/store/domain/coupon/controller/CouponFeignController.java @@ -1,6 +1,5 @@ package kr.bb.store.domain.coupon.controller; -import kr.bb.store.domain.coupon.controller.response.CouponCountResponse; import kr.bb.store.domain.coupon.service.CouponService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -24,7 +23,7 @@ public ResponseEntity useCoupon(@PathVariable Long couponId, @PathVariable } @GetMapping("/count") - public ResponseEntity availableCouponCountOfUser(@RequestHeader(value = "userId") Long userId) { + public ResponseEntity availableCouponCountOfUser(@RequestHeader(value = "userId") Long userId) { LocalDate now = LocalDate.now(); return ResponseEntity.ok().body(couponService.getAvailableCouponCount(userId, now)); diff --git a/src/main/java/kr/bb/store/domain/coupon/controller/response/CouponCountResponse.java b/src/main/java/kr/bb/store/domain/coupon/controller/response/CouponCountResponse.java deleted file mode 100644 index 1a88cb8..0000000 --- a/src/main/java/kr/bb/store/domain/coupon/controller/response/CouponCountResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package kr.bb.store.domain.coupon.controller.response; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class CouponCountResponse { - private Integer couponCnt; -} diff --git a/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java b/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java index 70e6158..7b31853 100644 --- a/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java +++ b/src/main/java/kr/bb/store/domain/coupon/service/CouponService.java @@ -1,6 +1,5 @@ package kr.bb.store.domain.coupon.service; -import kr.bb.store.domain.coupon.controller.response.CouponCountResponse; import kr.bb.store.domain.coupon.controller.request.CouponCreateRequest; import kr.bb.store.domain.coupon.controller.request.CouponEditRequest; import kr.bb.store.domain.coupon.controller.request.TotalAmountRequest; @@ -92,10 +91,8 @@ public void useCoupon(Long couponId, Long userId, LocalDate useDate) { couponManager.use(issuedCoupon, useDate); } - public CouponCountResponse getAvailableCouponCount(Long userId, LocalDate now) { - return CouponCountResponse.builder() - .couponCnt(couponReader.readMyValidCouponCount(userId, now)) - .build(); + public Integer getAvailableCouponCount(Long userId, LocalDate now) { + return couponReader.readMyValidCouponCount(userId, now); } private void validateCouponAuthorization(Coupon coupon, Long storeId) { diff --git a/src/main/java/kr/bb/store/domain/store/controller/StoreFeignController.java b/src/main/java/kr/bb/store/domain/store/controller/StoreFeignController.java index 6ca8561..a3ad1e1 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/StoreFeignController.java +++ b/src/main/java/kr/bb/store/domain/store/controller/StoreFeignController.java @@ -13,7 +13,7 @@ public class StoreFeignController { private final StoreService storeService; @GetMapping("/id") - public ResponseEntity getStoreId(@RequestHeader Long userId) { + public ResponseEntity getStoreId(@RequestHeader Long userId) { return ResponseEntity.ok().body(storeService.getStoreId(userId)); } } From 63b597ad54bcfda5e66701fee71a0c52bee20b3a Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 14:04:19 +0900 Subject: [PATCH 17/25] =?UTF-8?q?:sparkles:=20Product=EC=84=9C=EB=B2=84?= =?UTF-8?q?=EC=99=80=EC=9D=98=20=ED=86=B5=EC=8B=A0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../bb/store/client/ProductFeignClient.java | 20 ++++++++ .../bb/store/client/StoreLikeFeignClient.java | 16 +++++++ .../client/StoreSubscriptionFeignClient.java | 15 ++++++ .../cargo => client}/dto/FlowerDto.java | 2 +- .../java/kr/bb/store/config/FeignConfig.java | 9 ++++ .../domain/cargo/service/CargoService.java | 8 ++-- .../store/controller/StoreController.java | 11 +++-- .../response/StoreForMapResponse.java | 4 ++ .../response/StoreListForMapResponse.java | 12 +++++ .../response/StoreListResponse.java | 4 ++ .../domain/store/service/StoreService.java | 48 ++++++++++++++----- .../cargo/service/CargoServiceTest.java | 9 +++- .../coupon/handler/CouponCreatorTest.java | 4 ++ .../coupon/handler/CouponIssuerTest.java | 4 ++ .../coupon/handler/CouponManagerTest.java | 4 ++ .../coupon/handler/CouponReaderTest.java | 4 ++ .../handler/IssuedCouponReaderTest.java | 4 ++ .../coupon/service/CouponServiceTest.java | 4 ++ .../pickup/handler/PickupCreatorTest.java | 5 ++ .../pickup/handler/PickupReaderTest.java | 4 ++ .../pickup/service/PickupServiceTest.java | 4 ++ .../question/handler/AnswerCreatorTest.java | 5 +- .../question/handler/QuestionCreatorTest.java | 4 ++ .../question/handler/QuestionReaderTest.java | 4 ++ .../question/service/QuestionServiceTest.java | 5 ++ .../store/controller/StoreControllerTest.java | 5 +- .../domain/store/handler/GugunReaderTest.java | 4 ++ .../store/handler/StoreCreatorTest.java | 4 ++ .../store/handler/StoreManagerTest.java | 4 ++ .../domain/store/handler/StoreReaderTest.java | 5 +- .../store/service/StoreServiceTest.java | 17 +++++-- .../handler/SubscriptionCreatorTest.java | 4 ++ .../handler/SubscriptionManagerTest.java | 4 ++ .../handler/SubscriptionReaderTest.java | 4 ++ .../service/SubscriptionServiceTest.java | 4 ++ 36 files changed, 238 insertions(+), 31 deletions(-) create mode 100644 src/main/java/kr/bb/store/client/ProductFeignClient.java create mode 100644 src/main/java/kr/bb/store/client/StoreLikeFeignClient.java create mode 100644 src/main/java/kr/bb/store/client/StoreSubscriptionFeignClient.java rename src/main/java/kr/bb/store/{domain/cargo => client}/dto/FlowerDto.java (87%) create mode 100644 src/main/java/kr/bb/store/config/FeignConfig.java diff --git a/build.gradle b/build.gradle index 56c52a6..e8de8c3 100644 --- a/build.gradle +++ b/build.gradle @@ -46,6 +46,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation "org.springframework.cloud:spring-cloud-starter-bus-kafka" implementation 'org.springframework.kafka:spring-kafka' + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' runtimeOnly 'com.h2database:h2' runtimeOnly 'com.mysql:mysql-connector-j' diff --git a/src/main/java/kr/bb/store/client/ProductFeignClient.java b/src/main/java/kr/bb/store/client/ProductFeignClient.java new file mode 100644 index 0000000..5dc404d --- /dev/null +++ b/src/main/java/kr/bb/store/client/ProductFeignClient.java @@ -0,0 +1,20 @@ +package kr.bb.store.client; + +import kr.bb.store.client.dto.FlowerDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(name = "product-service") +public interface ProductFeignClient { + @GetMapping + List getFlowers(); + + @GetMapping + String getProductThumbnail(@RequestParam Long productId); + + @GetMapping + String getSubscriptionProductId(@RequestParam Long storeId); +} diff --git a/src/main/java/kr/bb/store/client/StoreLikeFeignClient.java b/src/main/java/kr/bb/store/client/StoreLikeFeignClient.java new file mode 100644 index 0000000..d78b72d --- /dev/null +++ b/src/main/java/kr/bb/store/client/StoreLikeFeignClient.java @@ -0,0 +1,16 @@ +package kr.bb.store.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.util.List; +import java.util.Map; + +@FeignClient(name = "storeLike-service") +public interface StoreLikeFeignClient { + @PostMapping + Map getStoreLikes(@RequestHeader(value = "userId") Long userId, + List storeIds); + +} diff --git a/src/main/java/kr/bb/store/client/StoreSubscriptionFeignClient.java b/src/main/java/kr/bb/store/client/StoreSubscriptionFeignClient.java new file mode 100644 index 0000000..8e67007 --- /dev/null +++ b/src/main/java/kr/bb/store/client/StoreSubscriptionFeignClient.java @@ -0,0 +1,15 @@ +package kr.bb.store.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.util.List; +import java.util.Map; + +@FeignClient(name = "storeSubscription-service") +public interface StoreSubscriptionFeignClient { + @PostMapping + Map getStoreSubscriptions(@RequestHeader(value = "userId") Long userId, + List storeIds); +} diff --git a/src/main/java/kr/bb/store/domain/cargo/dto/FlowerDto.java b/src/main/java/kr/bb/store/client/dto/FlowerDto.java similarity index 87% rename from src/main/java/kr/bb/store/domain/cargo/dto/FlowerDto.java rename to src/main/java/kr/bb/store/client/dto/FlowerDto.java index 016f2e9..1bb3d7a 100644 --- a/src/main/java/kr/bb/store/domain/cargo/dto/FlowerDto.java +++ b/src/main/java/kr/bb/store/client/dto/FlowerDto.java @@ -1,4 +1,4 @@ -package kr.bb.store.domain.cargo.dto; +package kr.bb.store.client.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/kr/bb/store/config/FeignConfig.java b/src/main/java/kr/bb/store/config/FeignConfig.java new file mode 100644 index 0000000..920838e --- /dev/null +++ b/src/main/java/kr/bb/store/config/FeignConfig.java @@ -0,0 +1,9 @@ +package kr.bb.store.config; + +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.stereotype.Component; + +@EnableFeignClients(basePackages = "kr.bb.store") +@Component +public class FeignConfig { +} diff --git a/src/main/java/kr/bb/store/domain/cargo/service/CargoService.java b/src/main/java/kr/bb/store/domain/cargo/service/CargoService.java index 53675c1..8e5b230 100644 --- a/src/main/java/kr/bb/store/domain/cargo/service/CargoService.java +++ b/src/main/java/kr/bb/store/domain/cargo/service/CargoService.java @@ -2,7 +2,7 @@ import kr.bb.store.domain.cargo.controller.response.RemainingStocksResponse; -import kr.bb.store.domain.cargo.dto.FlowerDto; +import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.cargo.dto.StockInfoDto; import kr.bb.store.domain.cargo.dto.StockModifyDto; import kr.bb.store.domain.cargo.entity.FlowerCargo; @@ -64,10 +64,10 @@ public RemainingStocksResponse getAllStocks(Long storeId) { @Transactional public void createBasicCargo(Store store, List flowers) { List flowerCargos = flowers.stream() - .map(v -> FlowerCargo.builder() - .id(makeKeys(store.getId(), v.getFlowerId())) + .map(flowerDto -> FlowerCargo.builder() + .id(makeKeys(store.getId(), flowerDto.getFlowerId())) .store(store) - .flowerName(v.getFlowerName()) + .flowerName(flowerDto.getFlowerName()) .build() ) .collect(Collectors.toList()); diff --git a/src/main/java/kr/bb/store/domain/store/controller/StoreController.java b/src/main/java/kr/bb/store/domain/store/controller/StoreController.java index 6451d61..de4c380 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/StoreController.java +++ b/src/main/java/kr/bb/store/domain/store/controller/StoreController.java @@ -1,7 +1,8 @@ package kr.bb.store.domain.store.controller; -import kr.bb.store.domain.cargo.dto.FlowerDto; +import kr.bb.store.client.ProductFeignClient; +import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.controller.request.StoreInfoEditRequest; import kr.bb.store.domain.store.controller.response.*; @@ -14,7 +15,6 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; -import java.util.ArrayList; import java.util.List; @CrossOrigin(origins = "*") @@ -23,12 +23,12 @@ @RequestMapping("/api/stores") public class StoreController { private final StoreService storeService; + private final ProductFeignClient productFeignClient; @PostMapping public ResponseEntity createStore(@Valid @RequestBody StoreCreateRequest storeCreateRequest, @RequestHeader(value = "userId") Long userId) { - // TODO : feign통신 - List flowers = new ArrayList<>(); + List flowers = productFeignClient.getFlowers(); return ResponseEntity.ok().body(storeService.createStore(userId, storeCreateRequest, flowers)); } @@ -53,7 +53,8 @@ public ResponseEntity getStores(@RequestHeader(value @GetMapping("/{storeId}/user") public ResponseEntity getStoreInfoForUser(@RequestHeader(value = "userId") Long userId, @PathVariable Long storeId){ - return ResponseEntity.ok().body(storeService.getStoreInfoForUser(userId, storeId)); + String subscriptionProductId = productFeignClient.getSubscriptionProductId(storeId); + return ResponseEntity.ok().body(storeService.getStoreInfoForUser(userId, storeId, subscriptionProductId)); } @GetMapping("/{storeId}/manager") diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreForMapResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreForMapResponse.java index 16e854b..8199fed 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/StoreForMapResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreForMapResponse.java @@ -35,4 +35,8 @@ public StoreForMapResponse(Long storeId, String storeName,String detailInfo, Str this.address = address; this.detailAddress = detailAddress; } + + public void setIsLiked(Boolean isLiked) { + this.isLiked = isLiked; + } } diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreListForMapResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreListForMapResponse.java index 8d088c5..ea5cbba 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/StoreListForMapResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreListForMapResponse.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Getter @Builder @@ -14,4 +16,14 @@ public class StoreListForMapResponse { List stores; + public void setLikes(Map storeLikes) { + stores.forEach(store -> store.setIsLiked(storeLikes.get(store.getStoreId()))); + } + + public List getStoreIds() { + return stores.stream() + .map(StoreForMapResponse::getStoreId) + .collect(Collectors.toList()); + } + } diff --git a/src/main/java/kr/bb/store/domain/store/controller/response/StoreListResponse.java b/src/main/java/kr/bb/store/domain/store/controller/response/StoreListResponse.java index 5116429..e077333 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/response/StoreListResponse.java +++ b/src/main/java/kr/bb/store/domain/store/controller/response/StoreListResponse.java @@ -31,4 +31,8 @@ public StoreListResponse(Long storeId, String storeThumbnailImage, String storeN this.address = address; this.detailAddress = detailAddress; } + + public void setIsLiked(Boolean isLiked) { + this.isLiked = isLiked; + } } diff --git a/src/main/java/kr/bb/store/domain/store/service/StoreService.java b/src/main/java/kr/bb/store/domain/store/service/StoreService.java index 24e9304..7b456b0 100644 --- a/src/main/java/kr/bb/store/domain/store/service/StoreService.java +++ b/src/main/java/kr/bb/store/domain/store/service/StoreService.java @@ -1,6 +1,8 @@ package kr.bb.store.domain.store.service; -import kr.bb.store.domain.cargo.dto.FlowerDto; +import kr.bb.store.client.StoreLikeFeignClient; +import kr.bb.store.client.StoreSubscriptionFeignClient; +import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.cargo.service.CargoService; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.controller.request.StoreInfoEditRequest; @@ -20,7 +22,9 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; @RequiredArgsConstructor @Transactional(readOnly = true) @@ -32,6 +36,8 @@ public class StoreService { private final SidoReader sidoReader; private final GugunReader gugunReader; private final CargoService cargoService; + private final StoreLikeFeignClient storeLikeFeignClient; + private final StoreSubscriptionFeignClient storeSubscriptionFeignClient; @Transactional @@ -59,22 +65,29 @@ public StoreDetailInfoResponse getStoreInfo(Long storeId) { public SimpleStorePagingResponse getStoresWithPaging(Long userId, Pageable pageable) { Page storePages = storeReader.readStoresWithPaging(pageable); - - // TODO : 좋아요 여부 feign으로 받아와서 채우기, userId가 null이면 통신하지 말기 - List contents = storePages.getContent().stream() + List storeIds = storePages.getContent() + .stream() + .map(StoreListResponse::getStoreId) .collect(Collectors.toList()); + // TODO : userId가 null이면 통신하지 말기 + Map storeLikes = storeLikeFeignClient.getStoreLikes(userId, storeIds); + + storePages.getContent() + .forEach(store -> store.setIsLiked(storeLikes.get(store.getStoreId()))); + return SimpleStorePagingResponse.builder() - .stores(contents) + .stores(storePages.getContent()) .totalCnt(storePages.getTotalElements()) .build(); } - public StoreInfoUserResponse getStoreInfoForUser(Long userId, Long storeId) { - // TODO : Feign통신으로 값 받아오기, userId가 null이면 통신하지 말기 - Boolean isLiked = false; - Boolean isSubscribed = false; - String subscriptionProductId = "구독상품아이디"; + public StoreInfoUserResponse getStoreInfoForUser(Long userId, Long storeId, String subscriptionProductId) { + // TODO : userId가 null이면 통신하지 말기 + Map storeLikes = storeLikeFeignClient.getStoreLikes(userId, List.of(storeId)); + Map storeSubscriptions = storeSubscriptionFeignClient.getStoreSubscriptions(userId, List.of(storeId)); + Boolean isLiked = storeLikes.get(storeId); + Boolean isSubscribed = storeSubscriptions.get(storeId); return storeReader.readForUser(storeId, isLiked, isSubscribed, subscriptionProductId); } @@ -83,16 +96,27 @@ public StoreInfoManagerResponse getStoreInfoForManager(Long storeId) { } public StoreListForMapResponse getNearbyStores(Long userId, Double lat, Double lon, Integer level) { - // TODO : 좋아요 여부 feign으로 받아와서 채우기, null이면 요청하지말기 StoreListForMapResponse nearbyStores = storeReader.getNearbyStores(lat, lon, level); + List storeIds = nearbyStores.getStoreIds(); + // TODO : userId가 null이면 통신하지 말기 + Map storeLikes = storeLikeFeignClient.getStoreLikes(userId, storeIds); + + nearbyStores.setLikes(storeLikes); + return nearbyStores; } public StoreListForMapResponse getStoresWithRegion(Long userId, String sidoCode, String gugunCode) { - // TODO : 좋아요 여부 feign으로 받아와서 채우기, null이면 요청하지말기 Sido sido = sidoReader.readSido(sidoCode); Gugun gugun = "".equals(gugunCode) ? null : gugunReader.readGugunCorrespondingSidoWithCode(sido, gugunCode); StoreListForMapResponse storesWithRegion = storeReader.getStoresWithRegion(sido, gugun); + + List storeIds = storesWithRegion.getStoreIds(); + // TODO : userId가 null이면 통신하지 말기 + Map storeLikes = storeLikeFeignClient.getStoreLikes(userId, storeIds); + + storesWithRegion.setLikes(storeLikes); + return storesWithRegion; } diff --git a/src/test/java/kr/bb/store/domain/cargo/service/CargoServiceTest.java b/src/test/java/kr/bb/store/domain/cargo/service/CargoServiceTest.java index 1c55adc..2417f4d 100644 --- a/src/test/java/kr/bb/store/domain/cargo/service/CargoServiceTest.java +++ b/src/test/java/kr/bb/store/domain/cargo/service/CargoServiceTest.java @@ -1,7 +1,8 @@ package kr.bb.store.domain.cargo.service; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.cargo.controller.response.RemainingStocksResponse; -import kr.bb.store.domain.cargo.dto.FlowerDto; +import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.cargo.dto.StockModifyDto; import kr.bb.store.domain.cargo.entity.FlowerCargo; import kr.bb.store.domain.cargo.entity.FlowerCargoId; @@ -14,6 +15,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; @@ -43,7 +45,10 @@ class CargoServiceTest { private EntityManager em; @Autowired - PlatformTransactionManager txManager; + private PlatformTransactionManager txManager; + + @MockBean + private ProductFeignClient productFeignClient; @AfterEach public void teardown() { diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponCreatorTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponCreatorTest.java index d1aaadf..f369e8c 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponCreatorTest.java @@ -1,6 +1,7 @@ package kr.bb.store.domain.coupon.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.exception.InvalidCouponDurationException; import kr.bb.store.domain.coupon.exception.InvalidCouponStartDateException; @@ -11,6 +12,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -26,6 +28,8 @@ class CouponCreatorTest { private CouponCreator couponCreator; @Autowired private StoreRepository storeRepository; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("쿠폰 정보를 전달받아 쿠폰을 생성한다") @Test diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponIssuerTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponIssuerTest.java index b4d368a..d886897 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponIssuerTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponIssuerTest.java @@ -1,6 +1,7 @@ package kr.bb.store.domain.coupon.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.entity.IssuedCoupon; import kr.bb.store.domain.coupon.exception.AlreadyIssuedCouponException; @@ -14,6 +15,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -36,6 +38,8 @@ class CouponIssuerTest { private CouponRepository couponRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("사용자에게 쿠폰을 발급해 준다") @Test diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponManagerTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponManagerTest.java index c315e1e..f3a7837 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponManagerTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponManagerTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.coupon.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.exception.InvalidCouponDurationException; import kr.bb.store.domain.coupon.exception.InvalidCouponStartDateException; @@ -11,6 +12,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -30,6 +32,8 @@ class CouponManagerTest { private StoreRepository storeRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("요청받은 내용으로 쿠폰 정보를 수정한다") @Test diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java index f613595..42dc79e 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponReaderTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.coupon.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.coupon.dto.CouponDto; import kr.bb.store.domain.coupon.dto.CouponForOwnerDto; import kr.bb.store.domain.coupon.dto.CouponWithAvailabilityDto; @@ -16,6 +17,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -37,6 +39,8 @@ class CouponReaderTest { private IssuedCouponRepository issuedCouponRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("가게 사장에게 보여줄 쿠폰 정보를 조회한다") @Test diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/IssuedCouponReaderTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/IssuedCouponReaderTest.java index e3651db..0d3337c 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/IssuedCouponReaderTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/IssuedCouponReaderTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.coupon.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.entity.IssuedCoupon; import kr.bb.store.domain.coupon.entity.IssuedCouponId; @@ -12,6 +13,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -28,6 +30,8 @@ class IssuedCouponReaderTest { private CouponRepository couponRepository; @Autowired private IssuedCouponRepository issuedCouponRepository; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("유저Id와 쿠폰Id로 해당 유저의 쿠폰 발급 여부를 조사한다") @Test diff --git a/src/test/java/kr/bb/store/domain/coupon/service/CouponServiceTest.java b/src/test/java/kr/bb/store/domain/coupon/service/CouponServiceTest.java index f6fa795..866c0d2 100644 --- a/src/test/java/kr/bb/store/domain/coupon/service/CouponServiceTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/service/CouponServiceTest.java @@ -1,6 +1,7 @@ package kr.bb.store.domain.coupon.service; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.coupon.controller.request.CouponEditRequest; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.exception.UnAuthorizedCouponException; @@ -13,6 +14,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import javax.persistence.EntityManager; import java.time.LocalDate; @@ -35,6 +37,8 @@ class CouponServiceTest { private EntityManager em; @Autowired private IssuedCouponRepository issuedCouponRepository; + @MockBean + private ProductFeignClient productFeignClient; @AfterEach public void teardown() { diff --git a/src/test/java/kr/bb/store/domain/pickup/handler/PickupCreatorTest.java b/src/test/java/kr/bb/store/domain/pickup/handler/PickupCreatorTest.java index 4bd25c3..dceaa94 100644 --- a/src/test/java/kr/bb/store/domain/pickup/handler/PickupCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/pickup/handler/PickupCreatorTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.pickup.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.pickup.controller.request.PickupCreateRequest; import kr.bb.store.domain.pickup.entity.PickupReservation; import kr.bb.store.domain.pickup.entity.ReservationStatus; @@ -9,6 +10,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -22,6 +24,9 @@ class PickupCreatorTest { private PickupCreator pickupCreator; @Autowired private StoreRepository storeRepository; + @MockBean + private ProductFeignClient productFeignClient; + @DisplayName("픽업예약을 생성한다") @Test void create() { diff --git a/src/test/java/kr/bb/store/domain/pickup/handler/PickupReaderTest.java b/src/test/java/kr/bb/store/domain/pickup/handler/PickupReaderTest.java index 1773128..4a995a8 100644 --- a/src/test/java/kr/bb/store/domain/pickup/handler/PickupReaderTest.java +++ b/src/test/java/kr/bb/store/domain/pickup/handler/PickupReaderTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.pickup.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.pickup.dto.PickupsForDateDto; import kr.bb.store.domain.pickup.dto.PickupsInMypageDto; import kr.bb.store.domain.pickup.entity.PickupReservation; @@ -10,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -31,6 +33,8 @@ class PickupReaderTest { private StoreRepository storeRepository; @Autowired private PickupReservationRepository pickupReservationRepository; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("마이페이지에 보일 예약정보를 불러온다") @Test diff --git a/src/test/java/kr/bb/store/domain/pickup/service/PickupServiceTest.java b/src/test/java/kr/bb/store/domain/pickup/service/PickupServiceTest.java index fdfca22..1517d45 100644 --- a/src/test/java/kr/bb/store/domain/pickup/service/PickupServiceTest.java +++ b/src/test/java/kr/bb/store/domain/pickup/service/PickupServiceTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.pickup.service; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.pickup.controller.response.PickAndSubResponse; import kr.bb.store.domain.pickup.entity.PickupReservation; import kr.bb.store.domain.pickup.repository.PickupReservationRepository; @@ -10,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -25,6 +27,8 @@ class PickupServiceTest { private StoreRepository storeRepository; @Autowired private PickupReservationRepository pickupReservationRepository; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("특정 가게의 달력에 표시될 픽업예약 및 정기구독 정보를 가져온다") @Test diff --git a/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java b/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java index d87997e..a223b96 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/AnswerCreatorTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.question.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.question.entity.Answer; import kr.bb.store.domain.question.entity.Question; import kr.bb.store.domain.question.repository.AnswerRepository; @@ -10,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -27,7 +29,8 @@ class AnswerCreatorTest { private AnswerRepository answerRepository; @Autowired private StoreRepository storeRepository; - + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("답변 정보를 전달받아 답변을 생성한다") @Test diff --git a/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java b/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java index 3ad5b8e..e9c99ee 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/QuestionCreatorTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.question.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.question.controller.request.QuestionCreateRequest; import kr.bb.store.domain.question.entity.Question; import kr.bb.store.domain.question.repository.QuestionRepository; @@ -9,6 +10,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -26,6 +28,8 @@ class QuestionCreatorTest { private StoreRepository storeRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("질문 정보를 전달받아 질문을 생성한다") @Test diff --git a/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java b/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java index febab59..fba6dbc 100644 --- a/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java +++ b/src/test/java/kr/bb/store/domain/question/handler/QuestionReaderTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.question.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.question.controller.response.QuestionDetailInfoResponse; import kr.bb.store.domain.question.dto.MyQuestionInMypageDto; import kr.bb.store.domain.question.dto.QuestionForOwnerDto; @@ -14,6 +15,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.transaction.annotation.Transactional; @@ -36,6 +38,8 @@ class QuestionReaderTest { private StoreRepository storeRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("질문 Id를 바탕으로 질문 상세정보를 받아온다") @Test diff --git a/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java b/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java index 983f243..38140e8 100644 --- a/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java +++ b/src/test/java/kr/bb/store/domain/question/service/QuestionServiceTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.question.service; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.question.controller.request.QuestionCreateRequest; import kr.bb.store.domain.question.controller.response.QuestionDetailInfoResponse; import kr.bb.store.domain.question.entity.Answer; @@ -12,6 +13,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -31,6 +33,9 @@ class QuestionServiceTest { private StoreRepository storeRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; + @DisplayName("질문 Id를 바탕으로 질문 상세정보를 받아온다") @Test void readDetailInfo() { diff --git a/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java b/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java index ca9e953..cd78684 100644 --- a/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java +++ b/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java @@ -1,6 +1,7 @@ package kr.bb.store.domain.store.controller; import com.fasterxml.jackson.databind.ObjectMapper; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.service.StoreService; import org.junit.jupiter.api.DisplayName; @@ -18,12 +19,12 @@ class StoreControllerTest { @Autowired private MockMvc mockMvc; - @Autowired private ObjectMapper objectMapper; - @MockBean private StoreService storeService; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("주문생성 시 요청값은 모두 null이 아니여야 한다") @Test diff --git a/src/test/java/kr/bb/store/domain/store/handler/GugunReaderTest.java b/src/test/java/kr/bb/store/domain/store/handler/GugunReaderTest.java index 1b5d94e..e8bfd75 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/GugunReaderTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/GugunReaderTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.store.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.entity.address.Gugun; import kr.bb.store.domain.store.entity.address.GugunRepository; import kr.bb.store.domain.store.entity.address.Sido; @@ -9,6 +10,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -25,6 +27,8 @@ class GugunReaderTest { private SidoRepository sidoRepository; @Autowired private GugunRepository gugunRepository; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("시/도, 그리고 구/군명을 입력받아 gugun값을 반환한다") @Test diff --git a/src/test/java/kr/bb/store/domain/store/handler/StoreCreatorTest.java b/src/test/java/kr/bb/store/domain/store/handler/StoreCreatorTest.java index cd9c6a3..a0e88b5 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/StoreCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/StoreCreatorTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.store.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.entity.Store; import kr.bb.store.domain.store.entity.address.Gugun; @@ -13,6 +14,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -33,6 +35,8 @@ class StoreCreatorTest { private GugunRepository gugunRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("회원 번호를 전달받아 가게를 생성한다") @Test diff --git a/src/test/java/kr/bb/store/domain/store/handler/StoreManagerTest.java b/src/test/java/kr/bb/store/domain/store/handler/StoreManagerTest.java index 36d9fe1..d69d2e9 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/StoreManagerTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/StoreManagerTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.store.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.controller.request.StoreInfoEditRequest; import kr.bb.store.domain.store.entity.DeliveryPolicy; @@ -17,6 +18,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -40,6 +42,8 @@ class StoreManagerTest { private GugunRepository gugunRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("요청받은 내용으로 가게 정보를 수정한다 - 가게명, 위도, 최소주문금액 수정") @Test diff --git a/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java b/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java index cc08bae..dac1cc9 100644 --- a/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java +++ b/src/test/java/kr/bb/store/domain/store/handler/StoreReaderTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.store.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.controller.response.*; import kr.bb.store.domain.store.dto.Position; import kr.bb.store.domain.store.entity.DeliveryPolicy; @@ -18,6 +19,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -46,7 +48,8 @@ class StoreReaderTest { private GugunRepository gugunRepository; @Autowired private EntityManager em; - + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("가게 아이디를 입력받아 가게에 대한 상세정보를 반환한다") @Test diff --git a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java index 2faa3f7..6e3a7f7 100644 --- a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java +++ b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java @@ -1,6 +1,9 @@ package kr.bb.store.domain.store.service; -import kr.bb.store.domain.cargo.dto.FlowerDto; +import kr.bb.store.client.ProductFeignClient; +import kr.bb.store.client.StoreLikeFeignClient; +import kr.bb.store.client.StoreSubscriptionFeignClient; +import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.controller.request.StoreInfoEditRequest; import kr.bb.store.domain.store.controller.response.*; @@ -21,6 +24,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -32,7 +36,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.assertj.core.groups.Tuple.tuple; @SpringBootTest @Transactional @@ -51,6 +54,12 @@ class StoreServiceTest { private DeliveryPolicyRepository deliveryPolicyRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; + @MockBean + private StoreLikeFeignClient storeLikeFeignClient; + @MockBean + private StoreSubscriptionFeignClient storeSubscriptionFeignClient; @DisplayName("회원 번호를 전달받아 가게를 생성한다") @Test @@ -219,11 +228,13 @@ public void getStoreInfoForUser() { DeliveryPolicy deliveryPolicy = createDeliveryPolicyEntity(store); deliveryPolicyRepository.save(deliveryPolicy); + String subscriptionProductId = "1"; + em.flush(); em.clear(); // when - StoreInfoUserResponse response = storeService.getStoreInfoForUser(userId, store.getId()); + StoreInfoUserResponse response = storeService.getStoreInfoForUser(userId, store.getId(), subscriptionProductId); // then assertThat(response.getStoreName()).isEqualTo("가게1"); diff --git a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionCreatorTest.java b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionCreatorTest.java index 4da79c1..8a7c358 100644 --- a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionCreatorTest.java @@ -1,6 +1,7 @@ package kr.bb.store.domain.subscription.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.entity.Store; import kr.bb.store.domain.store.repository.StoreRepository; import kr.bb.store.domain.subscription.controller.request.SubscriptionCreateRequest; @@ -11,6 +12,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -26,6 +28,8 @@ class SubscriptionCreatorTest { private StoreRepository storeRepository; @Autowired private SubscriptionRepository subscriptionRepository; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("구독정보를 생성한다") @Test diff --git a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionManagerTest.java b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionManagerTest.java index ef4913f..962b7b9 100644 --- a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionManagerTest.java +++ b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionManagerTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.subscription.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.entity.Store; import kr.bb.store.domain.store.repository.StoreRepository; import kr.bb.store.domain.subscription.entity.Subscription; @@ -8,6 +9,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -24,6 +26,8 @@ class SubscriptionManagerTest { private SubscriptionRepository subscriptionRepository; @Autowired private SubscriptionManager subscriptionManager; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("구독을 취소한다") @Test diff --git a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionReaderTest.java b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionReaderTest.java index 9674a9e..f261caa 100644 --- a/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionReaderTest.java +++ b/src/test/java/kr/bb/store/domain/subscription/handler/SubscriptionReaderTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.subscription.handler; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.entity.Store; import kr.bb.store.domain.store.repository.StoreRepository; import kr.bb.store.domain.subscription.entity.Subscription; @@ -9,6 +10,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -30,6 +32,8 @@ class SubscriptionReaderTest { private SubscriptionRepository subscriptionRepository; @Autowired private EntityManager em; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("주문 구독 아이디로 구독 정보를 읽어온다") @Test diff --git a/src/test/java/kr/bb/store/domain/subscription/service/SubscriptionServiceTest.java b/src/test/java/kr/bb/store/domain/subscription/service/SubscriptionServiceTest.java index 2ac7a64..2e25332 100644 --- a/src/test/java/kr/bb/store/domain/subscription/service/SubscriptionServiceTest.java +++ b/src/test/java/kr/bb/store/domain/subscription/service/SubscriptionServiceTest.java @@ -1,5 +1,6 @@ package kr.bb.store.domain.subscription.service; +import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.store.entity.Store; import kr.bb.store.domain.store.repository.StoreRepository; import kr.bb.store.domain.subscription.controller.request.SubscriptionCreateRequest; @@ -8,6 +9,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -21,6 +23,8 @@ class SubscriptionServiceTest { private SubscriptionService subscriptionService; @Autowired private StoreRepository storeRepository; + @MockBean + private ProductFeignClient productFeignClient; @DisplayName("구독생성 정보를 받아 구독을 생성한다") @Test From 61fbd00a9aee61439880e6bb0f6e9ee4d99edccb Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 14:19:54 +0900 Subject: [PATCH 18/25] =?UTF-8?q?:bulb:=20TODO=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/kr/bb/store/domain/store/service/StoreService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/kr/bb/store/domain/store/service/StoreService.java b/src/main/java/kr/bb/store/domain/store/service/StoreService.java index 7b456b0..7689e80 100644 --- a/src/main/java/kr/bb/store/domain/store/service/StoreService.java +++ b/src/main/java/kr/bb/store/domain/store/service/StoreService.java @@ -85,6 +85,7 @@ public SimpleStorePagingResponse getStoresWithPaging(Long userId, Pageable pagea public StoreInfoUserResponse getStoreInfoForUser(Long userId, Long storeId, String subscriptionProductId) { // TODO : userId가 null이면 통신하지 말기 Map storeLikes = storeLikeFeignClient.getStoreLikes(userId, List.of(storeId)); + // TODO : feign말고 내가가진 NoSQL에서 가져오기 Map storeSubscriptions = storeSubscriptionFeignClient.getStoreSubscriptions(userId, List.of(storeId)); Boolean isLiked = storeLikes.get(storeId); Boolean isSubscribed = storeSubscriptions.get(storeId); From 69593759c844ed1422ca362f0fca8c7e5e2dcbbb Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 16:38:27 +0900 Subject: [PATCH 19/25] =?UTF-8?q?:white=5Fcheck=5Fmark:=20=EA=B0=80?= =?UTF-8?q?=EA=B2=8C=20=EC=95=84=EC=9D=B4=EB=94=94=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/service/StoreServiceTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java index 6e3a7f7..a7c8f35 100644 --- a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java +++ b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java @@ -365,6 +365,35 @@ void getStoresWithRegionReadAllSidoWhenGugunIsBlank() { } + @DisplayName("가게사장 아이디를 통해 가게 아이디를 가져온다") + @Test + void getStoreId() { + // given + Long userId = 1L; + Store store = createStoreWithManagerId(userId); + storeRepository.save(store); + + // when + Long result = storeService.getStoreId(userId); + + // then + assertThat(result).isEqualTo(store.getId()); + + } + + + private Store createStoreWithManagerId(Long userId) { + return Store.builder() + .storeManagerId(userId) + .storeCode("가게코드") + .storeName("가게이름") + .detailInfo("가게 상세정보") + .storeThumbnailImage("가게 썸네일") + .phoneNumber("가게 전화번호") + .accountNumber("가게 계좌정보") + .bank("가게 계좌 은행정보") + .build(); + } private StoreAddress createStoresAddressWithSidoGugun(Store store, Sido sido, Gugun gugun) { sidoRepository.save(sido); From 5736998aa182ab1a77832771ba2ee5fb45b56453 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 17:07:21 +0900 Subject: [PATCH 20/25] =?UTF-8?q?:truck:=20Dto=20=EC=9C=84=EC=B9=98=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 --- .../dto/StockChangeDto.java} | 4 ++-- .../domain/cargo/controller/CargoFeignController.java | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/kr/bb/store/{domain/cargo/controller/request/StockFeignRequest.java => client/dto/StockChangeDto.java} (74%) diff --git a/src/main/java/kr/bb/store/domain/cargo/controller/request/StockFeignRequest.java b/src/main/java/kr/bb/store/client/dto/StockChangeDto.java similarity index 74% rename from src/main/java/kr/bb/store/domain/cargo/controller/request/StockFeignRequest.java rename to src/main/java/kr/bb/store/client/dto/StockChangeDto.java index 0b235dc..41cfcb8 100644 --- a/src/main/java/kr/bb/store/domain/cargo/controller/request/StockFeignRequest.java +++ b/src/main/java/kr/bb/store/client/dto/StockChangeDto.java @@ -1,4 +1,4 @@ -package kr.bb.store.domain.cargo.controller.request; +package kr.bb.store.client.dto; import lombok.AllArgsConstructor; import lombok.Builder; @@ -9,7 +9,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class StockFeignRequest { +public class StockChangeDto { private Long storeId; private Long flowerId; private Long stock; diff --git a/src/main/java/kr/bb/store/domain/cargo/controller/CargoFeignController.java b/src/main/java/kr/bb/store/domain/cargo/controller/CargoFeignController.java index 9f66220..36ec815 100644 --- a/src/main/java/kr/bb/store/domain/cargo/controller/CargoFeignController.java +++ b/src/main/java/kr/bb/store/domain/cargo/controller/CargoFeignController.java @@ -1,6 +1,6 @@ package kr.bb.store.domain.cargo.controller; -import kr.bb.store.domain.cargo.controller.request.StockFeignRequest; +import kr.bb.store.client.dto.StockChangeDto; import kr.bb.store.domain.cargo.service.CargoService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -13,14 +13,14 @@ public class CargoFeignController { private final CargoService cargoService; @PutMapping("/add") - public ResponseEntity addStock(@RequestBody StockFeignRequest stockFeignRequest) { - cargoService.plusStockCount(stockFeignRequest.getStoreId(), stockFeignRequest.getFlowerId(), stockFeignRequest.getStock()); + public ResponseEntity addStock(@RequestBody StockChangeDto stockChangeDto) { + cargoService.plusStockCount(stockChangeDto.getStoreId(), stockChangeDto.getFlowerId(), stockChangeDto.getStock()); return ResponseEntity.ok().build(); } @PutMapping("/substract") - public ResponseEntity subtractStock(@RequestBody StockFeignRequest stockFeignRequest) { - cargoService.minusStockCount(stockFeignRequest.getStoreId(), stockFeignRequest.getFlowerId(), stockFeignRequest.getStock()); + public ResponseEntity subtractStock(@RequestBody StockChangeDto stockChangeDto) { + cargoService.minusStockCount(stockChangeDto.getStoreId(), stockChangeDto.getFlowerId(), stockChangeDto.getStock()); return ResponseEntity.ok().build(); } } From d1b2bd86bd3d5e63ee64a2f4e16bdec732e15678 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 17:08:18 +0900 Subject: [PATCH 21/25] =?UTF-8?q?:pencil2:=20data.sql=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20=EB=B0=8F=20gitignore=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + src/main/resources/data.sql | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 src/main/resources/data.sql diff --git a/.gitignore b/.gitignore index 35bc9c5..30b757f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ build/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ +data.sql ### STS ### .apt_generated diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql deleted file mode 100644 index 5aaf2a2..0000000 --- a/src/main/resources/data.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO `sido` VALUES ('11','서울'),('26','부산'),('27','대구'),('28','인천'),('29','광주'),('30','대전'),('31','울산'),('36','세종'),('41','경기도'),('42','강원도'),('43','충청북도'),('44','충청남도'),('45','전라북도'),('46','전라남도'),('47','경상북도'),('48','경상남도'),('50','제주특별자치도'); -INSERT INTO `gugun` VALUES ('11110','종로구','11'),('11140','중구','11'),('11170','용산구','11'),('11200','성동구','11'),('11215','광진구','11'),('11230','동대문구','11'),('11260','중랑구','11'),('11290','성북구','11'),('11305','강북구','11'),('11320','도봉구','11'),('11350','노원구','11'),('11380','은평구','11'),('11410','서대문구','11'),('11440','마포구','11'),('11470','양천구','11'),('11500','강서구','11'),('11530','구로구','11'),('11545','금천구','11'),('11560','영등포구','11'),('11590','동작구','11'),('11620','관악구','11'),('11650','서초구','11'),('11680','강남구','11'),('11710','송파구','11'),('11740','강동구','11'),('26110','중구','26'),('26140','서구','26'),('26170','동구','26'),('26200','영도구','26'),('26230','부산진구','26'),('26260','동래구','26'),('26290','남구','26'),('26320','북구','26'),('26350','해운대구','26'),('26380','사하구','26'),('26410','금정구','26'),('26440','강서구','26'),('26470','연제구','26'),('26500','수영구','26'),('26530','사상구','26'),('26710','기장군','26'),('27110','중구','27'),('27140','동구','27'),('27170','서구','27'),('27200','남구','27'),('27230','북구','27'),('27260','수성구','27'),('27290','달서구','27'),('27710','달성군','27'),('28110','중구','28'),('28140','동구','28'),('28177','미추홀구','28'),('28185','연수구','28'),('28200','남동구','28'),('28237','부평구','28'),('28245','계양구','28'),('28260','서구','28'),('28710','강화군','28'),('28720','옹진군','28'),('29110','동구','29'),('29140','서구','29'),('29155','남구','29'),('29170','북구','29'),('29200','광산구','29'),('30110','동구','30'),('30140','중구','30'),('30170','서구','30'),('30200','유성구','30'),('30230','대덕구','30'),('31110','중구','31'),('31140','남구','31'),('31170','동구','31'),('31200','북구','31'),('31710','울주군','31'),('36110','조치원읍','36'),('41111','수원시','41'),('41131','성남시','41'),('41150','의정부시','41'),('41171','안양시','41'),('41190','부천시','41'),('41210','광명시','41'),('41220','평택시','41'),('41250','동두천시','41'),('41271','안산시','41'),('41281','고양시','41'),('41290','과천시','41'),('41310','구리시','41'),('41360','남양주시','41'),('41370','오산시','41'),('41390','시흥시','41'),('41410','군포시','41'),('41430','의왕시','41'),('41450','하남시','41'),('41461','용인시','41'),('41480','파주시','41'),('41500','이천시','41'),('41550','안성시','41'),('41570','김포시','41'),('41590','화성시','41'),('41610','광주시','41'),('41630','양주시','41'),('41650','포천시','41'),('41670','여주시','41'),('41800','연천군','41'),('41820','가평군','41'),('41830','양평군','41'),('42110','춘천시','42'),('42130','원주시','42'),('42150','강릉시','42'),('42170','동해시','42'),('42190','태백시','42'),('42210','속초시','42'),('42230','삼척시','42'),('42720','홍천군','42'),('42730','횡성군','42'),('42750','영월군','42'),('42760','평창군','42'),('42770','정선군','42'),('42780','철원군','42'),('42790','화천군','42'),('42800','양구군','42'),('42810','인제군','42'),('42820','고성군','42'),('42830','양양군','42'),('43111','청주시','43'),('43130','충주시','43'),('43150','제천시','43'),('43720','보은군','43'),('43730','옥천군','43'),('43740','영동군','43'),('43745','증평군','43'),('43750','진천군','43'),('43760','괴산군','43'),('43770','음성군','43'),('43800','단양군','43'),('44131','천안시','44'),('44133','천안시','44'),('44150','공주시','44'),('44180','보령시','44'),('44200','아산시','44'),('44210','서산시','44'),('44230','논산시','44'),('44250','계룡시','44'),('44270','당진시','44'),('44710','금산군','44'),('44760','부여군','44'),('44770','서천군','44'),('44790','청양군','44'),('44800','홍성군','44'),('44810','예산군','44'),('44825','태안군','44'),('45111','전주시','45'),('45130','군산시','45'),('45140','익산시','45'),('45180','정읍시','45'),('45190','남원시','45'),('45210','김제시','45'),('45710','완주군','45'),('45720','진안군','45'),('45730','무주군','45'),('45740','장수군','45'),('45750','임실군','45'),('45770','순창군','45'),('45790','고창군','45'),('45800','부안군','45'),('46110','목포시','46'),('46130','여수시','46'),('46150','순천시','46'),('46170','나주시','46'),('46230','광양시','46'),('46710','담양군','46'),('46720','곡성군','46'),('46730','구례군','46'),('46770','고흥군','46'),('46780','보성군','46'),('46790','화순군','46'),('46800','장흥군','46'),('46810','강진군','46'),('46820','해남군','46'),('46830','영암군','46'),('46840','무안군','46'),('46860','함평군','46'),('46870','영광군','46'),('46880','장성군','46'),('46890','완도군','46'),('46900','진도군','46'),('46910','신안군','46'),('47111','포항시','47'),('47130','경주시','47'),('47150','김천시','47'),('47170','안동시','47'),('47190','구미시','47'),('47210','영주시','47'),('47230','영천시','47'),('47250','상주시','47'),('47280','문경시','47'),('47290','경산시','47'),('47720','군위군','47'),('47730','의성군','47'),('47750','청송군','47'),('47760','영양군','47'),('47770','영덕군','47'),('47820','청도군','47'),('47830','고령군','47'),('47840','성주군','47'),('47850','칠곡군','47'),('47900','예천군','47'),('47920','봉화군','47'),('47930','울진군','47'),('47940','울릉군','47'),('48121','창원시','48'),('48170','진주시','48'),('48220','통영시','48'),('48240','사천시','48'),('48250','김해시','48'),('48270','밀양시','48'),('48310','거제시','48'),('48330','양산시','48'),('48720','의령군','48'),('48730','함안군','48'),('48740','창녕군','48'),('48820','고성군','48'),('48840','남해군','48'),('48850','하동군','48'),('48860','산청군','48'),('48870','함양군','48'),('48880','거창군','48'),('48890','합천군','48'),('50110','제주시','50'),('50130','서귀포시','50'); From 8423c2a547e2b5c5c983e5982ec3bb3f59bc67fc Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 17:44:48 +0900 Subject: [PATCH 22/25] =?UTF-8?q?:green=5Fheart:=20yml=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/bb/store/client/ProductFeignClient.java | 4 ++-- src/main/resources/application-dev.yml | 16 ++++++++++++++++ .../{application.yml => application-local.yml} | 2 +- src/main/resources/application-prod.yml | 16 ++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/application-dev.yml rename src/main/resources/{application.yml => application-local.yml} (87%) create mode 100644 src/main/resources/application-prod.yml diff --git a/src/main/java/kr/bb/store/client/ProductFeignClient.java b/src/main/java/kr/bb/store/client/ProductFeignClient.java index 5dc404d..82d72d7 100644 --- a/src/main/java/kr/bb/store/client/ProductFeignClient.java +++ b/src/main/java/kr/bb/store/client/ProductFeignClient.java @@ -13,8 +13,8 @@ public interface ProductFeignClient { List getFlowers(); @GetMapping - String getProductThumbnail(@RequestParam Long productId); + String getProductThumbnail(@RequestParam(name="productId") Long productId); @GetMapping - String getSubscriptionProductId(@RequestParam Long storeId); + String getSubscriptionProductId(@RequestParam(name="storeId") Long storeId); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..9cbc45a --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,16 @@ +server: + port: 8700 +spring: + application: + name: store-service + config: + activate: + on-profile: dev + import: optional:configserver:http://config-service:8888 +management: + endpoints: + web: + exposure: + include: + - "refresh" + - "bus-refresh" diff --git a/src/main/resources/application.yml b/src/main/resources/application-local.yml similarity index 87% rename from src/main/resources/application.yml rename to src/main/resources/application-local.yml index ded404b..d1add9f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application-local.yml @@ -5,7 +5,7 @@ spring: name: store-service config: activate: - on-profile: local, dev, local + on-profile: local import: optional:configserver:http://localhost:8888 management: endpoints: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 0000000..f77c0ab --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,16 @@ +server: + port: 8700 +spring: + application: + name: store-service + config: + activate: + on-profile: prod + import: optional:configserver:http://config-service:8888 +management: + endpoints: + web: + exposure: + include: + - "refresh" + - "bus-refresh" From f2d229705ab4f119dc18e81ca69740c959a282ec Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 17:47:49 +0900 Subject: [PATCH 23/25] =?UTF-8?q?:pencil2:=20feign=ED=86=B5=EC=8B=A0?= =?UTF-8?q?=EC=97=90=20=EA=B3=B5=ED=86=B5=20Dto=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../kr/bb/store/client/ProductFeignClient.java | 2 +- .../java/kr/bb/store/client/dto/FlowerDto.java | 15 --------------- .../kr/bb/store/client/dto/StockChangeDto.java | 16 ---------------- .../cargo/controller/CargoFeignController.java | 2 +- .../store/domain/cargo/service/CargoService.java | 2 +- .../domain/store/controller/StoreController.java | 2 +- .../store/domain/store/service/StoreService.java | 2 +- 8 files changed, 6 insertions(+), 37 deletions(-) delete mode 100644 src/main/java/kr/bb/store/client/dto/FlowerDto.java delete mode 100644 src/main/java/kr/bb/store/client/dto/StockChangeDto.java diff --git a/build.gradle b/build.gradle index e8de8c3..2fde363 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation("it.ozimov:embedded-redis:0.7.2") - implementation group: 'io.github.lotteon-maven', name: 'blooming-blooms-utils', version: '0.1.0-alpha1' + implementation group: 'io.github.lotteon-maven', name: 'blooming-blooms-utils', version: '25041622' } dependencyManagement { diff --git a/src/main/java/kr/bb/store/client/ProductFeignClient.java b/src/main/java/kr/bb/store/client/ProductFeignClient.java index 82d72d7..066d39e 100644 --- a/src/main/java/kr/bb/store/client/ProductFeignClient.java +++ b/src/main/java/kr/bb/store/client/ProductFeignClient.java @@ -1,6 +1,6 @@ package kr.bb.store.client; -import kr.bb.store.client.dto.FlowerDto; +import bloomingblooms.domain.flower.FlowerDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; diff --git a/src/main/java/kr/bb/store/client/dto/FlowerDto.java b/src/main/java/kr/bb/store/client/dto/FlowerDto.java deleted file mode 100644 index 1bb3d7a..0000000 --- a/src/main/java/kr/bb/store/client/dto/FlowerDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package kr.bb.store.client.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class FlowerDto { - private Long flowerId; - private String flowerName; -} diff --git a/src/main/java/kr/bb/store/client/dto/StockChangeDto.java b/src/main/java/kr/bb/store/client/dto/StockChangeDto.java deleted file mode 100644 index 41cfcb8..0000000 --- a/src/main/java/kr/bb/store/client/dto/StockChangeDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package kr.bb.store.client.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class StockChangeDto { - private Long storeId; - private Long flowerId; - private Long stock; -} diff --git a/src/main/java/kr/bb/store/domain/cargo/controller/CargoFeignController.java b/src/main/java/kr/bb/store/domain/cargo/controller/CargoFeignController.java index 36ec815..9286c8a 100644 --- a/src/main/java/kr/bb/store/domain/cargo/controller/CargoFeignController.java +++ b/src/main/java/kr/bb/store/domain/cargo/controller/CargoFeignController.java @@ -1,6 +1,6 @@ package kr.bb.store.domain.cargo.controller; -import kr.bb.store.client.dto.StockChangeDto; +import bloomingblooms.domain.flower.StockChangeDto; import kr.bb.store.domain.cargo.service.CargoService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/kr/bb/store/domain/cargo/service/CargoService.java b/src/main/java/kr/bb/store/domain/cargo/service/CargoService.java index 8e5b230..162f18a 100644 --- a/src/main/java/kr/bb/store/domain/cargo/service/CargoService.java +++ b/src/main/java/kr/bb/store/domain/cargo/service/CargoService.java @@ -1,8 +1,8 @@ package kr.bb.store.domain.cargo.service; +import bloomingblooms.domain.flower.FlowerDto; import kr.bb.store.domain.cargo.controller.response.RemainingStocksResponse; -import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.cargo.dto.StockInfoDto; import kr.bb.store.domain.cargo.dto.StockModifyDto; import kr.bb.store.domain.cargo.entity.FlowerCargo; diff --git a/src/main/java/kr/bb/store/domain/store/controller/StoreController.java b/src/main/java/kr/bb/store/domain/store/controller/StoreController.java index de4c380..a1c41cb 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/StoreController.java +++ b/src/main/java/kr/bb/store/domain/store/controller/StoreController.java @@ -1,8 +1,8 @@ package kr.bb.store.domain.store.controller; +import bloomingblooms.domain.flower.FlowerDto; import kr.bb.store.client.ProductFeignClient; -import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.controller.request.StoreInfoEditRequest; import kr.bb.store.domain.store.controller.response.*; diff --git a/src/main/java/kr/bb/store/domain/store/service/StoreService.java b/src/main/java/kr/bb/store/domain/store/service/StoreService.java index 7689e80..3177885 100644 --- a/src/main/java/kr/bb/store/domain/store/service/StoreService.java +++ b/src/main/java/kr/bb/store/domain/store/service/StoreService.java @@ -1,8 +1,8 @@ package kr.bb.store.domain.store.service; +import bloomingblooms.domain.flower.FlowerDto; import kr.bb.store.client.StoreLikeFeignClient; import kr.bb.store.client.StoreSubscriptionFeignClient; -import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.cargo.service.CargoService; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.controller.request.StoreInfoEditRequest; From cfd4521dea61f477340c0136fb9947422f1c906f Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Fri, 8 Dec 2023 17:55:12 +0900 Subject: [PATCH 24/25] =?UTF-8?q?:pencil2:=20crossorigin,=20requestmapping?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/bb/store/domain/cargo/controller/CargoController.java | 2 -- .../kr/bb/store/domain/coupon/controller/CouponController.java | 2 -- .../kr/bb/store/domain/pickup/controller/PickupController.java | 2 -- .../bb/store/domain/question/controller/QuestionController.java | 2 -- .../kr/bb/store/domain/store/controller/StoreController.java | 2 -- .../domain/subscription/controller/SubscriptionController.java | 2 -- .../java/kr/bb/store/domain/cargo/service/CargoServiceTest.java | 2 +- .../java/kr/bb/store/domain/store/service/StoreServiceTest.java | 2 +- 8 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/main/java/kr/bb/store/domain/cargo/controller/CargoController.java b/src/main/java/kr/bb/store/domain/cargo/controller/CargoController.java index 49a494c..a3d981f 100644 --- a/src/main/java/kr/bb/store/domain/cargo/controller/CargoController.java +++ b/src/main/java/kr/bb/store/domain/cargo/controller/CargoController.java @@ -7,10 +7,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -@CrossOrigin(origins = "*") @RestController @RequiredArgsConstructor -@RequestMapping("/api/stores") public class CargoController { private final CargoService cargoService; diff --git a/src/main/java/kr/bb/store/domain/coupon/controller/CouponController.java b/src/main/java/kr/bb/store/domain/coupon/controller/CouponController.java index a5f79e0..e01dcc1 100644 --- a/src/main/java/kr/bb/store/domain/coupon/controller/CouponController.java +++ b/src/main/java/kr/bb/store/domain/coupon/controller/CouponController.java @@ -12,10 +12,8 @@ import java.time.LocalDate; -@CrossOrigin(origins = "*") @RestController @RequiredArgsConstructor -@RequestMapping("/api/stores") public class CouponController { private final CouponService couponService; diff --git a/src/main/java/kr/bb/store/domain/pickup/controller/PickupController.java b/src/main/java/kr/bb/store/domain/pickup/controller/PickupController.java index 56d41e6..865cc0c 100644 --- a/src/main/java/kr/bb/store/domain/pickup/controller/PickupController.java +++ b/src/main/java/kr/bb/store/domain/pickup/controller/PickupController.java @@ -12,10 +12,8 @@ import java.time.LocalDate; import java.util.List; -@CrossOrigin(origins = "*") @RestController @RequiredArgsConstructor -@RequestMapping("/api/stores") public class PickupController { private final PickupService pickupService; diff --git a/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java b/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java index dc6e68f..2d2a079 100644 --- a/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java +++ b/src/main/java/kr/bb/store/domain/question/controller/QuestionController.java @@ -10,10 +10,8 @@ import org.springframework.web.bind.annotation.*; -@CrossOrigin(origins = "*") @RestController @RequiredArgsConstructor -@RequestMapping("/api/stores") public class QuestionController { private final QuestionService questionService; diff --git a/src/main/java/kr/bb/store/domain/store/controller/StoreController.java b/src/main/java/kr/bb/store/domain/store/controller/StoreController.java index a1c41cb..2e71054 100644 --- a/src/main/java/kr/bb/store/domain/store/controller/StoreController.java +++ b/src/main/java/kr/bb/store/domain/store/controller/StoreController.java @@ -17,10 +17,8 @@ import javax.validation.Valid; import java.util.List; -@CrossOrigin(origins = "*") @RestController @RequiredArgsConstructor -@RequestMapping("/api/stores") public class StoreController { private final StoreService storeService; private final ProductFeignClient productFeignClient; diff --git a/src/main/java/kr/bb/store/domain/subscription/controller/SubscriptionController.java b/src/main/java/kr/bb/store/domain/subscription/controller/SubscriptionController.java index 4d47b0c..91aba28 100644 --- a/src/main/java/kr/bb/store/domain/subscription/controller/SubscriptionController.java +++ b/src/main/java/kr/bb/store/domain/subscription/controller/SubscriptionController.java @@ -9,10 +9,8 @@ import java.time.LocalDate; -@CrossOrigin(origins = "*") @RestController @RequiredArgsConstructor -@RequestMapping("api/stores") public class SubscriptionController { private final SubscriptionService subscriptionService; diff --git a/src/test/java/kr/bb/store/domain/cargo/service/CargoServiceTest.java b/src/test/java/kr/bb/store/domain/cargo/service/CargoServiceTest.java index 2417f4d..2c84d0c 100644 --- a/src/test/java/kr/bb/store/domain/cargo/service/CargoServiceTest.java +++ b/src/test/java/kr/bb/store/domain/cargo/service/CargoServiceTest.java @@ -1,8 +1,8 @@ package kr.bb.store.domain.cargo.service; +import bloomingblooms.domain.flower.FlowerDto; import kr.bb.store.client.ProductFeignClient; import kr.bb.store.domain.cargo.controller.response.RemainingStocksResponse; -import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.cargo.dto.StockModifyDto; import kr.bb.store.domain.cargo.entity.FlowerCargo; import kr.bb.store.domain.cargo.entity.FlowerCargoId; diff --git a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java index a7c8f35..94284ef 100644 --- a/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java +++ b/src/test/java/kr/bb/store/domain/store/service/StoreServiceTest.java @@ -1,9 +1,9 @@ package kr.bb.store.domain.store.service; +import bloomingblooms.domain.flower.FlowerDto; import kr.bb.store.client.ProductFeignClient; import kr.bb.store.client.StoreLikeFeignClient; import kr.bb.store.client.StoreSubscriptionFeignClient; -import kr.bb.store.client.dto.FlowerDto; import kr.bb.store.domain.store.controller.request.StoreCreateRequest; import kr.bb.store.domain.store.controller.request.StoreInfoEditRequest; import kr.bb.store.domain.store.controller.response.*; From a80146e826c36275677771315248d15028cfda14 Mon Sep 17 00:00:00 2001 From: qwerty1434 Date: Sat, 9 Dec 2023 11:23:01 +0900 Subject: [PATCH 25/25] =?UTF-8?q?:sparkles:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BB=A8=ED=85=8C=EC=9D=B4=EB=84=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 + .../kr/bb/store/config/LocalRedisConfig.java | 97 ------------------- .../kr/bb/store/domain/AbstractContainer.java | 23 +++++ .../coupon/handler/CouponCreatorTest.java | 5 +- .../coupon/handler/CouponIssuerTest.java | 5 +- .../coupon/handler/CouponManagerTest.java | 5 +- .../coupon/service/CouponServiceTest.java | 5 +- .../store/controller/StoreControllerTest.java | 8 +- 8 files changed, 47 insertions(+), 105 deletions(-) delete mode 100644 src/main/java/kr/bb/store/config/LocalRedisConfig.java create mode 100644 src/test/java/kr/bb/store/domain/AbstractContainer.java diff --git a/build.gradle b/build.gradle index 2fde363..6058791 100644 --- a/build.gradle +++ b/build.gradle @@ -59,6 +59,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation("it.ozimov:embedded-redis:0.7.2") + // testContainers + testImplementation "org.junit.jupiter:junit-jupiter:5.8.1" + testImplementation "org.testcontainers:junit-jupiter:1.16.3" + implementation group: 'io.github.lotteon-maven', name: 'blooming-blooms-utils', version: '25041622' } diff --git a/src/main/java/kr/bb/store/config/LocalRedisConfig.java b/src/main/java/kr/bb/store/config/LocalRedisConfig.java deleted file mode 100644 index 70407c9..0000000 --- a/src/main/java/kr/bb/store/config/LocalRedisConfig.java +++ /dev/null @@ -1,97 +0,0 @@ -package kr.bb.store.config; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.util.StringUtils; -import redis.embedded.RedisServer; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -@Slf4j -@Configuration -public class LocalRedisConfig { - @Value("${spring.data.redis.port}") - private int redisPort; - - private RedisServer redisServer; - - @PostConstruct - public void redisServer() throws IOException { - int port = isRedisRunning() ? findAvailablePort() : redisPort; - redisServer = RedisServer.builder() - .port(port) - .setting("maxmemory 128M") - .build(); - redisServer.start(); - } - - @PreDestroy - public void stopRedis() { - if (redisServer != null) { - redisServer.stop(); - } - } - - - /** - * Embedded Redis가 현재 실행중인지 확인 - */ - private boolean isRedisRunning() throws IOException { - return isRunning(executeGrepProcessCommand(redisPort)); - } - - /** - * 현재 PC/서버에서 사용가능한 포트 조회 - */ - public int findAvailablePort() throws IOException { - - for (int port = 10000; port <= 65535; port++) { - Process process = executeGrepProcessCommand(port); - if (!isRunning(process)) { - return port; - } - } - - throw new IllegalArgumentException("Not Found Available port: 10000 ~ 65535"); - } - - /** - * 해당 port를 사용중인 프로세스 확인하는 sh 실행 - */ - private Process executeGrepProcessCommand(int port) throws IOException { - String OS = System.getProperty("os.name").toLowerCase(); - if (OS.contains("win")) { - log.info("OS is " + OS + " " + port); - String command = String.format("netstat -nao | find \"LISTEN\" | find \"%d\"", port); - String[] shell = {"cmd.exe", "/y", "/c", command}; - return Runtime.getRuntime().exec(shell); - } - String command = String.format("netstat -nat | grep LISTEN|grep %d", port); - String[] shell = {"/bin/sh", "-c", command}; - return Runtime.getRuntime().exec(shell); - } - - /** - * 해당 Process가 현재 실행중인지 확인 - */ - private boolean isRunning(Process process) { - String line; - StringBuilder pidInfo = new StringBuilder(); - - try (BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()))) { - - while ((line = input.readLine()) != null) { - pidInfo.append(line); - } - - } catch (Exception e) { - } - - return !StringUtils.isEmpty(pidInfo.toString()); - } -} \ No newline at end of file diff --git a/src/test/java/kr/bb/store/domain/AbstractContainer.java b/src/test/java/kr/bb/store/domain/AbstractContainer.java new file mode 100644 index 0000000..9e621c3 --- /dev/null +++ b/src/test/java/kr/bb/store/domain/AbstractContainer.java @@ -0,0 +1,23 @@ +package kr.bb.store.domain; + +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.GenericContainer; + +public abstract class AbstractContainer { + static final String REDIS_IMAGE = "redis:6-alpine"; + static final GenericContainer REDIS_CONTAINER; + + static { + REDIS_CONTAINER = new GenericContainer<>(REDIS_IMAGE) + .withExposedPorts(6379) + .withReuse(true); + REDIS_CONTAINER.start(); + } + + @DynamicPropertySource + public static void overrideProps(DynamicPropertyRegistry registry){ + registry.add("spring.data.redis.host", REDIS_CONTAINER::getHost); + registry.add("spring.data.redis.port", () -> ""+REDIS_CONTAINER.getMappedPort(6379)); + } +} diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponCreatorTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponCreatorTest.java index f369e8c..d3930e4 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponCreatorTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponCreatorTest.java @@ -2,6 +2,7 @@ import kr.bb.store.client.ProductFeignClient; +import kr.bb.store.domain.AbstractContainer; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.exception.InvalidCouponDurationException; import kr.bb.store.domain.coupon.exception.InvalidCouponStartDateException; @@ -14,6 +15,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; +import org.testcontainers.junit.jupiter.Testcontainers; import java.time.LocalDate; import java.util.UUID; @@ -21,9 +23,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@Testcontainers @SpringBootTest @Transactional -class CouponCreatorTest { +class CouponCreatorTest extends AbstractContainer { @Autowired private CouponCreator couponCreator; @Autowired diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponIssuerTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponIssuerTest.java index d886897..fec2df2 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponIssuerTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponIssuerTest.java @@ -2,6 +2,7 @@ import kr.bb.store.client.ProductFeignClient; +import kr.bb.store.domain.AbstractContainer; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.entity.IssuedCoupon; import kr.bb.store.domain.coupon.exception.AlreadyIssuedCouponException; @@ -17,6 +18,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; +import org.testcontainers.junit.jupiter.Testcontainers; import javax.persistence.EntityManager; import java.time.LocalDate; @@ -25,9 +27,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@Testcontainers @SpringBootTest @Transactional -class CouponIssuerTest { +class CouponIssuerTest extends AbstractContainer { @Autowired private CouponIssuer couponIssuer; @Autowired diff --git a/src/test/java/kr/bb/store/domain/coupon/handler/CouponManagerTest.java b/src/test/java/kr/bb/store/domain/coupon/handler/CouponManagerTest.java index f3a7837..45a4f42 100644 --- a/src/test/java/kr/bb/store/domain/coupon/handler/CouponManagerTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/handler/CouponManagerTest.java @@ -1,6 +1,7 @@ package kr.bb.store.domain.coupon.handler; import kr.bb.store.client.ProductFeignClient; +import kr.bb.store.domain.AbstractContainer; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.exception.InvalidCouponDurationException; import kr.bb.store.domain.coupon.exception.InvalidCouponStartDateException; @@ -14,6 +15,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; +import org.testcontainers.junit.jupiter.Testcontainers; import javax.persistence.EntityManager; import java.time.LocalDate; @@ -21,9 +23,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@Testcontainers @SpringBootTest @Transactional -class CouponManagerTest { +class CouponManagerTest extends AbstractContainer { @Autowired private CouponManager couponManager; @Autowired diff --git a/src/test/java/kr/bb/store/domain/coupon/service/CouponServiceTest.java b/src/test/java/kr/bb/store/domain/coupon/service/CouponServiceTest.java index 866c0d2..5f1845d 100644 --- a/src/test/java/kr/bb/store/domain/coupon/service/CouponServiceTest.java +++ b/src/test/java/kr/bb/store/domain/coupon/service/CouponServiceTest.java @@ -2,6 +2,7 @@ import kr.bb.store.client.ProductFeignClient; +import kr.bb.store.domain.AbstractContainer; import kr.bb.store.domain.coupon.controller.request.CouponEditRequest; import kr.bb.store.domain.coupon.entity.Coupon; import kr.bb.store.domain.coupon.exception.UnAuthorizedCouponException; @@ -15,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.testcontainers.junit.jupiter.Testcontainers; import javax.persistence.EntityManager; import java.time.LocalDate; @@ -25,8 +27,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@Testcontainers @SpringBootTest -class CouponServiceTest { +class CouponServiceTest extends AbstractContainer { @Autowired private CouponService couponService; @Autowired diff --git a/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java b/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java index cd78684..b9a71ce 100644 --- a/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java +++ b/src/test/java/kr/bb/store/domain/store/controller/StoreControllerTest.java @@ -26,14 +26,14 @@ class StoreControllerTest { @MockBean private ProductFeignClient productFeignClient; - @DisplayName("주문생성 시 요청값은 모두 null이 아니여야 한다") + @DisplayName("가게생성 시 요청값은 모두 null이 아니여야 한다") @Test void storeCreateRequestPropertiesCannotBeNull() throws Exception { // given StoreCreateRequest storeCreateRequest = createStoreCreateRequest(); // when // then - mockMvc.perform(MockMvcRequestBuilders.post("/api/stores") + mockMvc.perform(MockMvcRequestBuilders.post("/") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(storeCreateRequest)) .header("userId",1L) @@ -42,7 +42,7 @@ void storeCreateRequestPropertiesCannotBeNull() throws Exception { .andExpect(MockMvcResultMatchers.status().isOk()); } - @DisplayName("주문생성 시 요청값은 모두 null이 아니여야 한다") + @DisplayName("가게생성 시 요청값은 모두 null이 아니여야 한다") @Test void storeCreateRequestPropertiesCannotBeNull2() throws Exception { // given @@ -65,7 +65,7 @@ void storeCreateRequestPropertiesCannotBeNull2() throws Exception { .build(); // when // then - mockMvc.perform(MockMvcRequestBuilders.post("/api/stores") + mockMvc.perform(MockMvcRequestBuilders.post("/") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(storeCreateRequest)) )