diff --git a/src/main/java/com/eod/eod/domain/item/application/ItemClaimService.java b/src/main/java/com/eod/eod/domain/item/application/ItemClaimService.java index c2a42eb..8e5bb31 100644 --- a/src/main/java/com/eod/eod/domain/item/application/ItemClaimService.java +++ b/src/main/java/com/eod/eod/domain/item/application/ItemClaimService.java @@ -54,8 +54,12 @@ public void approveClaim(Long claimId, User currentUser) { // 승인 처리 claim.approve(); + // 물품 승인 처리 (소유권 승인 시 물품도 함께 승인) + Item item = claim.getItem(); + item.processApproval(Item.ApprovalStatus.APPROVED, currentUser); + // 같은 물품에 대한 다른 PENDING 상태의 주장들을 모두 거절 - Long itemId = claim.getItem().getId(); + Long itemId = item.getId(); List otherPendingClaims = itemClaimRepository .findByItemIdAndStatus(itemId, ItemClaim.ClaimStatus.PENDING); diff --git a/src/main/java/com/eod/eod/domain/item/model/Item.java b/src/main/java/com/eod/eod/domain/item/model/Item.java index 2699e14..cc211f7 100644 --- a/src/main/java/com/eod/eod/domain/item/model/Item.java +++ b/src/main/java/com/eod/eod/domain/item/model/Item.java @@ -144,6 +144,7 @@ public void processApproval(ApprovalStatus approvalStatus, User approver) { if (approvalStatus == ApprovalStatus.APPROVED) { this.approvalStatus = ApprovalStatus.APPROVED; + this.status = ItemStatus.GIVEN; } else if (approvalStatus == ApprovalStatus.REJECTED) { this.approvalStatus = ApprovalStatus.REJECTED; } else { diff --git a/src/main/java/com/eod/eod/domain/reward/application/RewardGiveService.java b/src/main/java/com/eod/eod/domain/reward/application/RewardGiveService.java index 8e82f87..808ecc0 100644 --- a/src/main/java/com/eod/eod/domain/reward/application/RewardGiveService.java +++ b/src/main/java/com/eod/eod/domain/reward/application/RewardGiveService.java @@ -29,6 +29,11 @@ public void giveRewardToStudent(Long studentId, Long itemId, User currentUser) { Item item = itemRepository.findById(itemId) .orElseThrow(() -> new IllegalArgumentException("물품을 찾을 수 없습니다.")); + // 중복 상점 지급 방지 + if (rewardRecordRepository.existsByItemId(itemId)) { + throw new IllegalStateException("이미 상점이 지급된 물품입니다."); + } + // 상점 지급 기록 생성 (RewardRecord 도메인에서 권한 및 검증 처리) RewardRecord rewardRecord = RewardRecord.builder() .student(student) diff --git a/src/main/java/com/eod/eod/domain/reward/infrastructure/RewardRecordRepository.java b/src/main/java/com/eod/eod/domain/reward/infrastructure/RewardRecordRepository.java index eef51b2..0acaff2 100644 --- a/src/main/java/com/eod/eod/domain/reward/infrastructure/RewardRecordRepository.java +++ b/src/main/java/com/eod/eod/domain/reward/infrastructure/RewardRecordRepository.java @@ -18,6 +18,9 @@ public interface RewardRecordRepository extends JpaRepository findByStudentId(@Param("studentId") Long studentId); + // 물품 ID로 상점 지급 중복 여부 확인 + boolean existsByItemId(Long itemId); + // 날짜, 학년, 반으로 상점 지급 이력 조회 (N+1 방지: item, teacher fetch join) @Query("SELECT r FROM RewardRecord r " + "JOIN FETCH r.student s " + diff --git a/src/main/java/com/eod/eod/domain/reward/model/RewardRecord.java b/src/main/java/com/eod/eod/domain/reward/model/RewardRecord.java index 134ed08..25eddac 100644 --- a/src/main/java/com/eod/eod/domain/reward/model/RewardRecord.java +++ b/src/main/java/com/eod/eod/domain/reward/model/RewardRecord.java @@ -38,7 +38,7 @@ public class RewardRecord { @Builder public RewardRecord(User student, Item item, User teacher) { validateTeacherRole(teacher); - validateItemNotGiven(item); + validateItemGiven(item); this.student = student; this.item = item; this.teacher = teacher; @@ -52,10 +52,10 @@ private void validateTeacherRole(User user) { } } - // 물품이 이미 지급되지 않았는지 검증 - private void validateItemNotGiven(Item item) { - if (item.isGiven()) { - throw new IllegalStateException("이미 지급된 물품입니다."); + // 물품이 지급 완료 상태인지 검증 + private void validateItemGiven(Item item) { + if (!item.isGiven()) { + throw new IllegalStateException("지급 처리되지 않은 물품입니다."); } } } \ No newline at end of file