diff --git a/oversweet-api/src/main/java/com/depromeet/oversweet/bookmark/controller/BookmarkController.java b/oversweet-api/src/main/java/com/depromeet/oversweet/bookmark/controller/BookmarkController.java index abae9d7..e0b27dd 100644 --- a/oversweet-api/src/main/java/com/depromeet/oversweet/bookmark/controller/BookmarkController.java +++ b/oversweet-api/src/main/java/com/depromeet/oversweet/bookmark/controller/BookmarkController.java @@ -108,5 +108,21 @@ public ResponseEntity> unMarkFranch return ResponseEntity.ok(DataResponse.of(OK, "프랜차이즈 즐겨 찾기 해제 성공", response)); } + /** + * 유저가 특정 음료를 즐겨 찾기 해제 할 수 있다. + * TODO : 추후 로그인 기능 구현 후, 로그인한 유저의 ID를 받아와야 함 (ex. @AuthenticationPrincipal User user) + */ + @Operation(summary = "음료 즐겨 찾기 해제", description = "유저가 특정 음료를 즐겨 찾기 해제 할 수 있다.") + @ApiResponses({ + @ApiResponse( + responseCode = "200", description = "음료 즐겨 찾기 해제 성공") + }) + @DeleteMapping("/drinks/{drinkId}") + public ResponseEntity> unMarkDrinkAsBookMark(@PathVariable @Parameter(description = "음료 고유 Id") Long drinkId) { + DrinkBookMarkedResponseDto response = drinkBookMarkRegisterService.unregister(100L, drinkId); + return ResponseEntity.ok(DataResponse.of(OK, "음료 즐겨 찾기 해제 성공", response)); + } + + } diff --git a/oversweet-api/src/main/java/com/depromeet/oversweet/bookmark/service/DrinkBookMarkRegisterService.java b/oversweet-api/src/main/java/com/depromeet/oversweet/bookmark/service/DrinkBookMarkRegisterService.java index ec58592..b29412e 100644 --- a/oversweet-api/src/main/java/com/depromeet/oversweet/bookmark/service/DrinkBookMarkRegisterService.java +++ b/oversweet-api/src/main/java/com/depromeet/oversweet/bookmark/service/DrinkBookMarkRegisterService.java @@ -1,14 +1,18 @@ package com.depromeet.oversweet.bookmark.service; +import com.depromeet.oversweet.bookmark.dto.response.DrinkBookMarkedResponseDto; +import com.depromeet.oversweet.domain.bookmark.entity.DrinkBookmarkEntity; import com.depromeet.oversweet.domain.bookmark.repository.FindDrinkBookMarkRepository; import com.depromeet.oversweet.domain.drink.entity.DrinkEntity; import com.depromeet.oversweet.domain.drink.repository.FindDrinkRepository; -import com.depromeet.oversweet.domain.drink.repository.RegisterDrinkBookMarkRepository; +import com.depromeet.oversweet.domain.drink.repository.UpdateDrinkBookMarkRepository; import com.depromeet.oversweet.domain.member.entity.MemberEntity; import com.depromeet.oversweet.domain.member.repository.FindMemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; + /** * 음료 북마크 등록 서비스 */ @@ -19,10 +23,16 @@ public class DrinkBookMarkRegisterService { private final FindMemberRepository findMemberRepository; private final FindDrinkRepository findDrinkRepository; private final FindDrinkBookMarkRepository findDrinkBookMarkRepository; - private final RegisterDrinkBookMarkRepository registerDrinkBookMarkRepository; + private final UpdateDrinkBookMarkRepository updateDrinkBookMarkRepository; + /** + * 음료 즐겨 찾기 등록 + * + * @param memberId Member Entity ID + * @param drinkId 즐겨찾기로 등록할 Drink Entity ID + */ public void register(final Long memberId, final Long drinkId) { - // 즐겨 찾기 위한 유저 조회 + // 유저 조회 final MemberEntity member = findMemberRepository.findById(memberId); // 음료가 존재하는지 확인한다. @@ -31,7 +41,30 @@ public void register(final Long memberId, final Long drinkId) { // 이미 해당 음료가 즐겨찾기에 이미 등록되어 있는지 확인한다. findDrinkBookMarkRepository.validateAlreadyDrinkBookMarked(member, drink); - // 해당 프랜차이즈를 즐겨찾기에 등록한다. - registerDrinkBookMarkRepository.saveDrinkBookmark(member, drink); + // 해당 음료를 즐겨찾기에 등록한다. + updateDrinkBookMarkRepository.saveDrinkBookmark(member, drink); + } + + /** + * 음료 즐겨 찾기 해제 + * + * @param memberId Member Entity ID + * @param drinkId 즐겨찾기 해제할 Drink Entity ID + * @return 새롭게 갱신된 즐겨찾기 음료 목록 + */ + public DrinkBookMarkedResponseDto unregister(Long memberId, Long drinkId) { + // 유저 조회 + final MemberEntity member = findMemberRepository.findById(memberId); + + // 음료가 존재하는지 확인한다. + final DrinkEntity drink = findDrinkRepository.findDrinkById(drinkId); + + // 해당 음료를 즐겨찾기에서 해제한다. + updateDrinkBookMarkRepository.deleteDrinkBookmark(member, drink); + + // 새롭게 갱신된 즐겨찾기 음료 목록을 반환한다. + List bookMarks = findDrinkBookMarkRepository.findDrinkBookMarkByMemberId(memberId); + + return new DrinkBookMarkedResponseDto(bookMarks); } } diff --git a/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/bookmark/repository/DrinkBookMarkJpaRepository.java b/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/bookmark/repository/DrinkBookMarkJpaRepository.java index 9bcefed..a1bc8b7 100644 --- a/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/bookmark/repository/DrinkBookMarkJpaRepository.java +++ b/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/bookmark/repository/DrinkBookMarkJpaRepository.java @@ -15,4 +15,6 @@ public interface DrinkBookMarkJpaRepository extends JpaRepository findByMemberId(@Param("id") Long id); boolean existsByMemberAndDrink(MemberEntity member, DrinkEntity drink); + + void deleteByMemberAndDrink(MemberEntity member, DrinkEntity drink); } diff --git a/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/RegisterDrinkBookMarkRepository.java b/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/UpdateDrinkBookMarkRepository.java similarity index 67% rename from oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/RegisterDrinkBookMarkRepository.java rename to oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/UpdateDrinkBookMarkRepository.java index cedd6ef..6a5694d 100644 --- a/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/RegisterDrinkBookMarkRepository.java +++ b/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/UpdateDrinkBookMarkRepository.java @@ -3,7 +3,10 @@ import com.depromeet.oversweet.domain.drink.entity.DrinkEntity; import com.depromeet.oversweet.domain.member.entity.MemberEntity; -public interface RegisterDrinkBookMarkRepository { +public interface UpdateDrinkBookMarkRepository { void saveDrinkBookmark(final MemberEntity member, final DrinkEntity drink); + + void deleteDrinkBookmark(final MemberEntity member, final DrinkEntity drink); + } diff --git a/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/RegisterDrinkBookMarkRepositoryImpl.java b/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/UpdateDrinkBookMarkRepositoryImpl.java similarity index 58% rename from oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/RegisterDrinkBookMarkRepositoryImpl.java rename to oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/UpdateDrinkBookMarkRepositoryImpl.java index f0eadb7..e30e3ae 100644 --- a/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/RegisterDrinkBookMarkRepositoryImpl.java +++ b/oversweet-domain/src/main/java/com/depromeet/oversweet/domain/drink/repository/UpdateDrinkBookMarkRepositoryImpl.java @@ -9,14 +9,20 @@ import org.springframework.transaction.annotation.Transactional; /** - * 음료 즐겨찾기 등록 레포지토리 + * 음료 즐겨찾기 업데이트(등록, 삭제) 레포지토리 */ @Repository @RequiredArgsConstructor -public class RegisterDrinkBookMarkRepositoryImpl implements RegisterDrinkBookMarkRepository { +public class UpdateDrinkBookMarkRepositoryImpl implements UpdateDrinkBookMarkRepository { private final DrinkBookMarkJpaRepository drinkBookMarkJpaRepository; + /** + * 음료 즐겨찾기 등록 + * + * @param member API 접근자 Member Entity + * @param drink 즐겨찾기 등록할 Drink Entity + */ @Override @Transactional public void saveDrinkBookmark(final MemberEntity member, final DrinkEntity drink) { @@ -27,4 +33,16 @@ public void saveDrinkBookmark(final MemberEntity member, final DrinkEntity drink drinkBookMarkJpaRepository.save(bookMark); } + /** + * 음료 즐겨찾기 해제 + * + * @param member API 접근자 Member Entity + * @param drink 즐겨찾기 해제할 Drink Entity + */ + @Override + @Transactional + public void deleteDrinkBookmark(MemberEntity member, DrinkEntity drink) { + drinkBookMarkJpaRepository.deleteByMemberAndDrink(member, drink); + } + }