Skip to content

Commit

Permalink
✨ [Feat] 프랜차이즈 즐겨찾기 해제 기능 구현 (#40)
Browse files Browse the repository at this point in the history
* feat: 프랜차이즈 즐겨찾기 해제 기능 구현

* chore: repository 네이밍 변경 (#39)

* test: 현재 시간을 가져오는 테스트에서 한국 시간으로 테스트 수행하도록 변경 (#39)

* test: 테스트 환경 시간을 기본 한국시간대로 설정 (#39)
  • Loading branch information
soochangoforit authored Jul 7, 2023
1 parent 5c4d744 commit ea14dfc
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 10 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ subprojects {

tasks.named('test') {
useJUnitPlatform()

// time zone 설정
systemProperty 'user.timezone', 'Asia/Seoul'
}

// api를 제외한 나머지 모듈에 해당
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,20 @@ public ResponseEntity<MessageResponse> markDrinkAsBookMark(@PathVariable @Parame
return ResponseEntity.ok(MessageResponse.of(OK, "음료 즐겨 찾기 등록 성공"));
}

/**
* 유저가 특정 프랜차이즈를 즐겨 찾기 해제 할 수 있다.
* TODO : 추후 로그인 기능 구현 후, 로그인한 유저의 ID를 받아와야 함 (ex. @AuthenticationPrincipal User user)
*/
@Operation(summary = "프랜차이즈 즐겨 찾기 해제", description = "유저가 특정 프랜차이즈를 즐겨 찾기 해제 할 수 있다.")
@ApiResponses({
@ApiResponse(
responseCode = "200", description = "프랜차이즈 즐겨 찾기 해제 성공")
})
@DeleteMapping("/franchises/{franchiseId}")
public ResponseEntity<DataResponse<FranchiseBookMarkedResponseDto>> unMarkFranchiseAsBookMark(@PathVariable @Parameter(description = "프랜차이즈 고유 Id") Long franchiseId) {
FranchiseBookMarkedResponseDto response = franchiseBookMarkRegisterService.unregister(100L, franchiseId);
return ResponseEntity.ok(DataResponse.of(OK, "프랜차이즈 즐겨 찾기 해제 성공", response));
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@ public FranchiseBookMarkedInfo(long id, String imageUrl, String name) {
}

public FranchiseBookMarkedInfo(FranchiseBookmarkEntity bookMark) {
this(bookMark.getId(), bookMark.getFranchise().getImageUrl(), bookMark.getFranchise().getName());
this(bookMark.getFranchise().getId(), bookMark.getFranchise().getImageUrl(), bookMark.getFranchise().getName());
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
package com.depromeet.oversweet.bookmark.service;

import com.depromeet.oversweet.bookmark.dto.response.FranchiseBookMarkedResponseDto;
import com.depromeet.oversweet.domain.bookmark.entity.FranchiseBookmarkEntity;
import com.depromeet.oversweet.domain.bookmark.repository.FindFranchiseBookMarkRepository;
import com.depromeet.oversweet.domain.bookmark.repository.RegisterFranchiseBookMarkRepository;
import com.depromeet.oversweet.domain.bookmark.repository.UpdateFranchiseBookMarkRepository;
import com.depromeet.oversweet.domain.franchise.entity.FranchiseEntity;
import com.depromeet.oversweet.domain.franchise.repository.FindFranchiseRepository;
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;

/**
* 프랜차이즈 북마크 등록 서비스.
*/
Expand All @@ -19,7 +23,7 @@ public class FranchiseBookMarkRegisterService {
private final FindMemberRepository findMemberRepository;
private final FindFranchiseRepository findFranchiseRepository;
private final FindFranchiseBookMarkRepository findFranchiseBookMarkRepository;
private final RegisterFranchiseBookMarkRepository registerFranchiseBookMarkRepository;
private final UpdateFranchiseBookMarkRepository updateFranchiseBookMarkRepository;

/**
* 프랜차이즈 북마크를 등록한다.
Expand All @@ -29,16 +33,38 @@ public class FranchiseBookMarkRegisterService {
*/
public void register(Long memberId, Long franchiseId) {
// 즐겨 찾기 위한 유저 조회
MemberEntity member = findMemberRepository.findById(memberId);
final MemberEntity member = findMemberRepository.findById(memberId);

// 프랜차이즈가 존재하는지 확인한다.
FranchiseEntity franchise = findFranchiseRepository.findFranchiseById(franchiseId);
final FranchiseEntity franchise = findFranchiseRepository.findFranchiseById(franchiseId);

// 이미 해당 프랜차이즈가 즐겨찾기에 이미 등록되어 있는지 확인한다.
findFranchiseBookMarkRepository.validateAlreadyFranchiseBookMarked(member, franchise);

// 해당 프랜차이즈를 즐겨찾기에 등록한다.
registerFranchiseBookMarkRepository.saveFranchiseBookmark(member, franchise);
updateFranchiseBookMarkRepository.saveFranchiseBookmark(member, franchise);
}

/**
* 프랜차이즈 북마크를 해제한다.
*
* @param memberId 유저 고유 ID
* @param franchiseId 프랜차이즈 고유 ID
* @return 최신 즐겨찾기 목록
*/
public FranchiseBookMarkedResponseDto unregister(Long memberId, Long franchiseId) {
// 즐겨 찾기 위한 유저 조회
final MemberEntity member = findMemberRepository.findById(memberId);

// 프랜차이즈가 존재하는지 확인한다.
final FranchiseEntity franchise = findFranchiseRepository.findFranchiseById(franchiseId);

// 해당 프랜차이즈를 즐겨찾기에서 삭제한다.
updateFranchiseBookMarkRepository.deleteFranchiseBookmark(member, franchise);

// 최신 즐겨찾기 목록을 반환한다.
final List<FranchiseBookmarkEntity> bookMarks = findFranchiseBookMarkRepository.findFranchiseBookMarkByMemberId(memberId);

return new FranchiseBookMarkedResponseDto(bookMarks);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;

import static com.depromeet.oversweet.drink.vo.LocalDateTimeInfo.DEFAULT_ZONE_ID;
import static org.junit.jupiter.api.Assertions.*;

class LocalDateTimeInfoTest {
Expand All @@ -15,7 +17,7 @@ class LocalDateTimeInfoTest {
LocalDateTimeInfo dateTimeInfo = LocalDateTimeInfo.getDailyDateTime();

// Then
LocalDateTime now = LocalDateTime.now();
LocalDateTime now = LocalDateTime.now(ZoneId.of(DEFAULT_ZONE_ID));
assertEquals(now.with(LocalTime.MIN), dateTimeInfo.startDateTime());
assertEquals(now.with(LocalTime.MAX), dateTimeInfo.endDateTime());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ public interface FranchiseBookMarkJpaRepository extends JpaRepository<FranchiseB

boolean existsByMemberAndFranchise(MemberEntity member, FranchiseEntity franchise);


void deleteByMemberAndFranchise(MemberEntity member, FranchiseEntity franchise);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
/**
* 특정 프랜차이즈 즐겨찾기 등록 Interface
*/
public interface RegisterFranchiseBookMarkRepository {
public interface UpdateFranchiseBookMarkRepository {

void saveFranchiseBookmark(final MemberEntity member, final FranchiseEntity franchise);

void deleteFranchiseBookmark(final MemberEntity member, final FranchiseEntity franchise);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
*/
@Repository
@RequiredArgsConstructor
public class RegisterFranchiseBookMarkRepositoryImpl implements RegisterFranchiseBookMarkRepository {
public class UpdateFranchiseBookMarkRepositoryImpl implements UpdateFranchiseBookMarkRepository {

private final FranchiseBookMarkJpaRepository franchiseBookMarkJpaRepository;

Expand All @@ -29,4 +29,16 @@ public void saveFranchiseBookmark(MemberEntity member, FranchiseEntity franchise
FranchiseBookmarkEntity franchiseBookmark = new FranchiseBookmarkEntity(member, franchise);
franchiseBookMarkJpaRepository.save(franchiseBookmark);
}

/**
* 특정 프랜차이즈을 즐겨찾기에서 삭제한다.
*
* @param member API 요청자 Entity
* @param franchise 즐겨찾기에서 삭제할 프랜차이즈 Entity
*/
@Override
@Transactional
public void deleteFranchiseBookmark(MemberEntity member, FranchiseEntity franchise) {
franchiseBookMarkJpaRepository.deleteByMemberAndFranchise(member, franchise);
}
}

0 comments on commit ea14dfc

Please sign in to comment.