From 968526a0853b751eef9adf8500be97d92b2383b7 Mon Sep 17 00:00:00 2001 From: aiaiaiai1 Date: Tue, 18 Jul 2023 13:23:05 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20(#66)=20=EC=84=A0=ED=98=B8=20?= =?UTF-8?q?=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20API=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contorller/CategoryController.java | 8 ++++++++ .../category/service/CategoryService.java | 18 ++++++++++++++++++ .../repository/MemberCategoryRepository.java | 7 +++++++ 3 files changed, 33 insertions(+) create mode 100644 backend/src/main/java/com/votogether/domain/member/repository/MemberCategoryRepository.java diff --git a/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java b/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java index 9793aaaf4..ee1f9fef7 100644 --- a/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java +++ b/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java @@ -2,6 +2,7 @@ import com.votogether.domain.category.dto.response.CategoryResponse; import com.votogether.domain.category.service.CategoryService; +import com.votogether.domain.member.entity.Member; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; @@ -10,6 +11,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -29,4 +31,10 @@ public ResponseEntity> getAllCategories() { return ResponseEntity.status(HttpStatus.OK).body(categories); } + @PostMapping("/{categoryId}/like") + public ResponseEntity addFavoriteCategory(final Member member, final Long categoryId) { + categoryService.addFavoriteCategory(member, categoryId); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + } diff --git a/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java b/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java index 3dfd48c06..e323adb08 100644 --- a/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java +++ b/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java @@ -3,6 +3,9 @@ import com.votogether.domain.category.dto.response.CategoryResponse; import com.votogether.domain.category.entity.Category; import com.votogether.domain.category.repository.CategoryRepository; +import com.votogether.domain.member.entity.Member; +import com.votogether.domain.member.entity.MemberCategory; +import com.votogether.domain.member.repository.MemberCategoryRepository; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,6 +16,7 @@ public class CategoryService { private final CategoryRepository categoryRepository; + private final MemberCategoryRepository memberCategoryRepository; @Transactional(readOnly = true) public List getAllCategories() { @@ -23,4 +27,18 @@ public List getAllCategories() { .toList(); } + @Transactional + public void addFavoriteCategory(final Member member, final Long categoryId) { + Category category = categoryRepository.findById(categoryId) + .orElseThrow(() -> new IllegalArgumentException("해당 카테고리가 존재하지 않습니다.")); + + MemberCategory memberCategory = MemberCategory.builder() + .member(member) + .category(category) + .build(); + + memberCategoryRepository.save(memberCategory); + } + + } diff --git a/backend/src/main/java/com/votogether/domain/member/repository/MemberCategoryRepository.java b/backend/src/main/java/com/votogether/domain/member/repository/MemberCategoryRepository.java new file mode 100644 index 000000000..44b412032 --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/member/repository/MemberCategoryRepository.java @@ -0,0 +1,7 @@ +package com.votogether.domain.member.repository; + +import com.votogether.domain.member.entity.MemberCategory; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemberCategoryRepository extends JpaRepository { +} From 8c2cd7b68f324e18114aa2de62a6b7cf76ac4a3c Mon Sep 17 00:00:00 2001 From: aiaiaiai1 Date: Tue, 18 Jul 2023 13:38:18 +0900 Subject: [PATCH 2/7] =?UTF-8?q?test:=20(#66)=20Repository=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 아이디를 통해 카테고리 조회 테스트 - 멤버카테고리 저장 테스트 --- .../repository/CategoryRepositoryTest.java | 67 ++++++++++++------- .../MemberCategoryRepositoryTest.java | 62 +++++++++++++++++ 2 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java diff --git a/backend/src/test/java/com/votogether/domain/category/repository/CategoryRepositoryTest.java b/backend/src/test/java/com/votogether/domain/category/repository/CategoryRepositoryTest.java index f09d07e26..9b6c14070 100644 --- a/backend/src/test/java/com/votogether/domain/category/repository/CategoryRepositoryTest.java +++ b/backend/src/test/java/com/votogether/domain/category/repository/CategoryRepositoryTest.java @@ -21,7 +21,7 @@ class CategoryRepositoryTest { @Nested @DisplayName("카테고리 저장") - class save { + class Saving { @Test @DisplayName("카테고리를 저장한다.") @@ -57,28 +57,49 @@ void saveButException() { } - @Test - @DisplayName("모든 카테고리를 조회한다.") - void getAllCategories() { - // given - Category category1 = Category.builder() - .name("개발") - .build(); - Category category2 = Category.builder() - .name("음식") - .build(); - - categoryRepository.save(category1); - categoryRepository.save(category2); - - // when - List categories = categoryRepository.findAll(); - - // then - assertAll( - () -> assertThat(categories).hasSize(2), - () -> assertThat(categories.get(0).getName()).isEqualTo("개발"), - () -> assertThat(categories.get(1).getName()).isEqualTo("음식")); + @Nested + @DisplayName("카테고리 조회") + class Finding { + + @Test + @DisplayName("모든 카테고리를 조회한다.") + void findAllCategories() { + // given + Category category1 = Category.builder() + .name("개발") + .build(); + Category category2 = Category.builder() + .name("음식") + .build(); + + categoryRepository.save(category1); + categoryRepository.save(category2); + + // when + List categories = categoryRepository.findAll(); + + // then + assertAll( + () -> assertThat(categories).hasSize(2), + () -> assertThat(categories.get(0).getName()).isEqualTo("개발"), + () -> assertThat(categories.get(1).getName()).isEqualTo("음식")); + } + + @Test + @DisplayName("아이디를 통해 카테고리를 조회한다.") + void findById() { + // given + Category category = Category.builder() + .name("개발") + .build(); + categoryRepository.save(category); + + // when + Category findCategory = categoryRepository.findById(category.getId()).get(); + + // then + assertThat(findCategory).isSameAs(category); + } } } diff --git a/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java b/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java new file mode 100644 index 000000000..17bc8bd91 --- /dev/null +++ b/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java @@ -0,0 +1,62 @@ +package com.votogether.domain.member.repository; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.votogether.domain.RepositoryTest; +import com.votogether.domain.category.entity.Category; +import com.votogether.domain.category.repository.CategoryRepository; +import com.votogether.domain.member.entity.Gender; +import com.votogether.domain.member.entity.Member; +import com.votogether.domain.member.entity.MemberCategory; +import com.votogether.domain.member.entity.SocialType; +import java.time.LocalDateTime; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@RepositoryTest +class MemberCategoryRepositoryTest { + + @Autowired + CategoryRepository categoryRepository; + + @Autowired + MemberRepository memberRepository; + + @Autowired + MemberCategoryRepository memberCategoryRepository; + + @Test + @DisplayName("멤버가 선호하는 카테고리를 저장한다.") + void save() { + // given + Category category = Category.builder() + .name("개발") + .build(); + + Member member = Member.builder() + .gender(Gender.MALE) + .point(0) + .socialType(SocialType.GOOGLE) + .nickname("user1") + .socialId("kakao@gmail.com") + .birthDate( + LocalDateTime.of(1995, 07, 12, 00, 00)) + .build(); + + categoryRepository.save(category); + memberRepository.save(member); + + MemberCategory memberCategory = MemberCategory.builder() + .member(member) + .category(category) + .build(); + + // when + memberCategoryRepository.save(memberCategory); + + // then + assertThat(memberCategory.getId()).isNotNull(); + } + +} From aa666cb0ee96acc998d3d2b8094367799c3a46a0 Mon Sep 17 00:00:00 2001 From: aiaiaiai1 Date: Tue, 18 Jul 2023 13:43:31 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20(#66)=20Swagger=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/category/contorller/CategoryController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java b/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java index ee1f9fef7..cc3aa6fd0 100644 --- a/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java +++ b/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java @@ -31,6 +31,8 @@ public ResponseEntity> getAllCategories() { return ResponseEntity.status(HttpStatus.OK).body(categories); } + @Operation(summary = "선호 카테고리 추가하기", description = "선호하는 카테고리를 선호 카테고리 목록에 추가한다.") + @ApiResponse(responseCode = "201", description = "추가 성공") @PostMapping("/{categoryId}/like") public ResponseEntity addFavoriteCategory(final Member member, final Long categoryId) { categoryService.addFavoriteCategory(member, categoryId); From 6bce9d2332ef18dee4f472c92d644849b077aabd Mon Sep 17 00:00:00 2001 From: aiaiaiai1 Date: Tue, 18 Jul 2023 13:43:50 +0900 Subject: [PATCH 4/7] =?UTF-8?q?refactor:=20(#66)=20=EA=B0=9C=ED=96=89=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/votogether/domain/category/service/CategoryService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java b/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java index e323adb08..eda548302 100644 --- a/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java +++ b/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java @@ -40,5 +40,4 @@ public void addFavoriteCategory(final Member member, final Long categoryId) { memberCategoryRepository.save(memberCategory); } - } From c28b22472da9bc24dcb44d4aa77ae2bf37a446b8 Mon Sep 17 00:00:00 2001 From: aiaiaiai1 Date: Tue, 18 Jul 2023 14:43:40 +0900 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20(#66)=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/category/contorller/CategoryController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java b/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java index cc3aa6fd0..e7267cdd8 100644 --- a/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java +++ b/backend/src/main/java/com/votogether/domain/category/contorller/CategoryController.java @@ -11,6 +11,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -34,7 +35,7 @@ public ResponseEntity> getAllCategories() { @Operation(summary = "선호 카테고리 추가하기", description = "선호하는 카테고리를 선호 카테고리 목록에 추가한다.") @ApiResponse(responseCode = "201", description = "추가 성공") @PostMapping("/{categoryId}/like") - public ResponseEntity addFavoriteCategory(final Member member, final Long categoryId) { + public ResponseEntity addFavoriteCategory(final Member member, @PathVariable final Long categoryId) { categoryService.addFavoriteCategory(member, categoryId); return ResponseEntity.status(HttpStatus.CREATED).build(); } From 7fa1caf501a876283642773a53dbca73ba55b58f Mon Sep 17 00:00:00 2001 From: aiaiaiai1 Date: Tue, 18 Jul 2023 14:59:16 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20(#66)=20=EC=9D=B4=EB=AF=B8=20?= =?UTF-8?q?=EC=84=A0=ED=98=B8=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=EC=97=90=20=EC=9E=88=EB=8A=94=20=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=EB=A5=BC=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=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 --- .../category/service/CategoryService.java | 3 ++ .../repository/MemberCategoryRepository.java | 5 +++ .../MemberCategoryRepositoryTest.java | 34 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java b/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java index eda548302..0a63b68f9 100644 --- a/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java +++ b/backend/src/main/java/com/votogether/domain/category/service/CategoryService.java @@ -32,6 +32,9 @@ public void addFavoriteCategory(final Member member, final Long categoryId) { Category category = categoryRepository.findById(categoryId) .orElseThrow(() -> new IllegalArgumentException("해당 카테고리가 존재하지 않습니다.")); + memberCategoryRepository.findByMemberAndCategory(member, category) + .ifPresent(ignore -> new IllegalStateException("이미 선호 카테고리에 등록되어 있습니다.")); + MemberCategory memberCategory = MemberCategory.builder() .member(member) .category(category) diff --git a/backend/src/main/java/com/votogether/domain/member/repository/MemberCategoryRepository.java b/backend/src/main/java/com/votogether/domain/member/repository/MemberCategoryRepository.java index 44b412032..7cc979686 100644 --- a/backend/src/main/java/com/votogether/domain/member/repository/MemberCategoryRepository.java +++ b/backend/src/main/java/com/votogether/domain/member/repository/MemberCategoryRepository.java @@ -1,7 +1,12 @@ package com.votogether.domain.member.repository; +import com.votogether.domain.category.entity.Category; +import com.votogether.domain.member.entity.Member; import com.votogether.domain.member.entity.MemberCategory; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface MemberCategoryRepository extends JpaRepository { + Optional findByMemberAndCategory(final Member member, final Category category); + } diff --git a/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java b/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java index 17bc8bd91..dd2edb1c9 100644 --- a/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java +++ b/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java @@ -59,4 +59,38 @@ void save() { assertThat(memberCategory.getId()).isNotNull(); } + @Test + @DisplayName("멤버와 카테고리를 통해 멤버 카테고리를 조회한다.") + void findByMemberAndCategory() { + // given + Category category = Category.builder() + .name("개발") + .build(); + + Member member = Member.builder() + .gender(Gender.MALE) + .point(0) + .socialType(SocialType.GOOGLE) + .nickname("user1") + .socialId("kakao@gmail.com") + .birthDate( + LocalDateTime.of(1995, 07, 12, 00, 00)) + .build(); + + MemberCategory memberCategory = MemberCategory.builder() + .member(member) + .category(category) + .build(); + + categoryRepository.save(category); + memberRepository.save(member); + memberCategoryRepository.save(memberCategory); + + // when + MemberCategory findMemberCategory = memberCategoryRepository.findByMemberAndCategory(member, category).get(); + + // then + assertThat(findMemberCategory).isSameAs(memberCategory); + } + } From d85e3bc2d1b9cb51df381774e0c04e83209b2121 Mon Sep 17 00:00:00 2001 From: aiaiaiai1 Date: Tue, 18 Jul 2023 15:04:45 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20(#66)=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=9E=90?= =?UTF-8?q?=EC=84=B8=ED=95=9C=20=EA=B2=80=EC=A6=9D=20=EB=B3=B4=EC=B6=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/repository/MemberCategoryRepositoryTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java b/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java index dd2edb1c9..c46cc1a97 100644 --- a/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java +++ b/backend/src/test/java/com/votogether/domain/member/repository/MemberCategoryRepositoryTest.java @@ -57,6 +57,7 @@ void save() { // then assertThat(memberCategory.getId()).isNotNull(); + assertThat(memberCategory.getCategory().getName()).isEqualTo("개발"); } @Test