Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -77,5 +77,15 @@ public RsData<Void> unkeep(
myBarService.unkeep(userId, cocktailId);
return RsData.of(200, "deleted");
}

@DeleteMapping
@Operation(summary = "내 바 전체 삭제", description = "내 바에 담긴 모든 칵테일을 소프트 삭제합니다")
public RsData<Void> clearAll(
@AuthenticationPrincipal SecurityUser principal
) {
Long userId = principal.getId();
myBarService.clearAll(userId);
return RsData.of(200, "cleared");
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ public interface MyBarRepository extends JpaRepository<MyBar, Long> {
/** 복원/재킵을 위해 status 무시하고 한 건 찾기 (없으면 Optional.empty) */
Optional<MyBar> findByUser_IdAndCocktail_Id(Long userId, Long cocktailId);

@Modifying(clearAutomatically = true, flushAutomatically = true)
@Query("""
update MyBar m
set m.status = 'DELETED', m.deletedAt = CURRENT_TIMESTAMP
where m.user.id = :userId
and m.status = 'ACTIVE'
""")
int softDeleteAllByUser(Long userId);

@Modifying(clearAutomatically = true, flushAutomatically = true)
@Query("""
update MyBar m
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/back/domain/mybar/service/MyBarService.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,5 +123,13 @@ public void unkeep(Long userId, Long cocktailId) {
abvScoreService.revokeForKeep(userId);
}
}

@Transactional
public void clearAll(Long userId) {
int changed = myBarRepository.softDeleteAllByUser(userId);
if (changed > 0) {
abvScoreService.revokeForKeep(userId, changed);
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ public void revokeForKeep(Long userId) {
addScore(userId, -KEEP_SCORE);
}

@Transactional
public void revokeForKeep(Long userId, int count) {
if (count <= 0) {
return;
}
addScore(userId, -KEEP_SCORE * count);
}

private void addScore(Long userId, double delta) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new ServiceException(404, "사용자를 찾을 수 없습니다."));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,4 +220,22 @@ void unkeepCocktail() throws Exception {

verify(myBarService).unkeep(principal.getId(), cocktailId);
}

@Test
@DisplayName("Clear entire my bar")
void clearAllMyBar() throws Exception {
SecurityUser principal = createPrincipal(21L);

willDoNothing().given(myBarService).clearAll(principal.getId());

mockMvc.perform(delete("/me/bar")
.with(withPrincipal(principal))
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(200))
.andExpect(jsonPath("$.message").value("cleared"))
.andExpect(jsonPath("$.data").doesNotExist());

verify(myBarService).clearAll(principal.getId());
}
}