Skip to content

Commit 9284d81

Browse files
authored
Merge pull request #148 from prgrms-aibe-devcourse/fix/145-pot-delete-plant-item
fix: 화분 삭제 시 수확 완료 PlantItem 보존되도록 수정
2 parents d8394dc + 34a33b3 commit 9284d81

2 files changed

Lines changed: 43 additions & 3 deletions

File tree

src/main/java/com/Rootin/domain/garden/service/PotService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public PotResponse updatePot(Long potId, Long userId, PotUpdateRequest request)
228228
* 2. 화분에 속한 TIL 기반으로 작성된 AI 분석 결과(AiResult) 조회 및 삭제 처리
229229
* (AiResult 삭제 시 cascade = CascadeType.ALL, orphanRemoval = true 설정에 의해 ai_result_til 중간 테이블 레코드도 자동 제거됨)
230230
* 3. 화분에 속한 모든 TIL 포스트 삭제 처리
231-
* 4. 화분에 심겨진 모든 식물(PlantItem) 데이터 삭제 처리
231+
* 4. 화분에 심겨진 활성 식물(isHarvested=false) 삭제 처리 — 수확 완료 항목은 도감 기록 보존을 위해 제외
232232
* 5. 화분(Pot) 데이터 삭제
233233
*/
234234
@Transactional
@@ -253,8 +253,8 @@ public void deletePot(Long potId, Long userId) {
253253
tilRepository.deleteAll(tils);
254254
}
255255

256-
// 3. 해당 화분에 연결된 모든 식물 아이템(PlantItem) 삭제 처리
257-
List<PlantItem> plantItems = plantItemRepository.findByPotIdOrderByIdAsc(potId);
256+
// 3. 해당 화분에 연결된 활성 식물 아이템(isHarvested=false/null)만 삭제 — 수확 완료 항목은 도감 보존
257+
List<PlantItem> plantItems = plantItemRepository.findActivePlantItemsByPotId(potId);
258258
if (!plantItems.isEmpty()) {
259259
plantItemRepository.deleteAll(plantItems);
260260
}

src/test/java/com/Rootin/domain/garden/service/PotServiceTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,46 @@ void deletePotSuccess() {
456456
assertThat(wateringLogRepository.findById(wateringLog.getId())).isPresent();
457457
}
458458

459+
@Test
460+
@DisplayName("화분 삭제 시 수확 완료(isHarvested=true)된 PlantItem은 삭제되지 않고 도감 기록이 보존된다")
461+
void deletePotPreservesHarvestedPlantItems() {
462+
// given
463+
User user = User.builder()
464+
.email("harvestpreserve@rootin.com")
465+
.nickname("수확보존자")
466+
.build();
467+
userRepository.save(user);
468+
469+
PotResponse createdPot = potService.createPot(
470+
user.getId(),
471+
PotCreateRequest.builder().title("도감보존 화분").build()
472+
);
473+
Long potId = createdPot.getId();
474+
475+
Plant defaultPlant = plantRepository
476+
.findFirstByNameAndGradeAndGrowthStage("기본 씨앗", Grade.COMMON, GrowthStage.SEED)
477+
.orElseThrow();
478+
479+
// 수확 완료된 PlantItem 직접 저장 (도감 기록)
480+
PlantItem harvestedItem = PlantItem.builder()
481+
.userId(user.getId())
482+
.potId(potId)
483+
.plantId(defaultPlant.getId())
484+
.isHarvested(true)
485+
.harvestedAt(java.time.LocalDateTime.now().minusDays(1))
486+
.harvestedLevel(2)
487+
.harvestedStageIndex(3)
488+
.build();
489+
PlantItem saved = plantItemRepository.save(harvestedItem);
490+
491+
// when
492+
potService.deletePot(potId, user.getId());
493+
494+
// then — 화분은 삭제되고, 수확 완료 PlantItem(도감 기록)은 보존
495+
assertThat(potRepository.findById(potId)).isEmpty();
496+
assertThat(plantItemRepository.findById(saved.getId())).isPresent();
497+
}
498+
459499
@Test
460500
@DisplayName("타인의 화분을 삭제하려고 시도하면 FORBIDDEN 예외가 발생한다")
461501
void deletePotForbidden() {

0 commit comments

Comments
 (0)