Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(회원) 선호 카테고리 추가 기능 구현 #70

Merged
merged 7 commits into from
Jul 18, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -10,6 +11,8 @@
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;

Expand All @@ -29,4 +32,12 @@ public ResponseEntity<List<CategoryResponse>> getAllCategories() {
return ResponseEntity.status(HttpStatus.OK).body(categories);
}

@Operation(summary = "선호 카테고리 추가하기", description = "선호하는 카테고리를 선호 카테고리 목록에 추가한다.")
@ApiResponse(responseCode = "201", description = "추가 성공")
@PostMapping("/{categoryId}/like")
public ResponseEntity<Void> addFavoriteCategory(final Member member, @PathVariable final Long categoryId) {
categoryService.addFavoriteCategory(member, categoryId);
return ResponseEntity.status(HttpStatus.CREATED).build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -13,6 +16,7 @@
public class CategoryService {

private final CategoryRepository categoryRepository;
private final MemberCategoryRepository memberCategoryRepository;

@Transactional(readOnly = true)
public List<CategoryResponse> getAllCategories() {
Expand All @@ -23,4 +27,20 @@ public List<CategoryResponse> getAllCategories() {
.toList();
}

@Transactional
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)
.build();
Comment on lines +38 to +41
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 : 멤버가 동일한 카테고리를 추가할 때의 상황에 대한 검증도 필요할 것 같아요!


memberCategoryRepository.save(memberCategory);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +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<MemberCategory, Long> {
Optional<MemberCategory> findByMemberAndCategory(final Member member, final Category category);

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class CategoryRepositoryTest {

@Nested
@DisplayName("카테고리 저장")
class save {
class Saving {

@Test
@DisplayName("카테고리를 저장한다.")
Expand Down Expand Up @@ -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<Category> 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<Category> 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);
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2
개행이 필요합니다!

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
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();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2
카테고리에 대한 자세한 검증이 있으면 더 좋을 것 같아요 ㅎㅎ

assertThat(memberCategory.getCategory().getName()).isEqualTo("개발");
}

@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);
}

}