diff --git a/src/main/java/com/cake/pop/domain/letter/controller/LetterController.java b/src/main/java/com/cake/pop/domain/letter/controller/LetterController.java index 8b11d83..dd1431b 100644 --- a/src/main/java/com/cake/pop/domain/letter/controller/LetterController.java +++ b/src/main/java/com/cake/pop/domain/letter/controller/LetterController.java @@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -57,4 +58,9 @@ public ResponseEntity> getStorages() { return ResponseEntity.ok(response); } + @PatchMapping("/{letterId}/report") + public ResponseEntity reportLetter(@PathVariable("letterId") Long letterId) { + letterService.reportLetter(letterId); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/cake/pop/domain/letter/repository/LetterRepository.java b/src/main/java/com/cake/pop/domain/letter/repository/LetterRepository.java index 79af9d4..2608a6a 100644 --- a/src/main/java/com/cake/pop/domain/letter/repository/LetterRepository.java +++ b/src/main/java/com/cake/pop/domain/letter/repository/LetterRepository.java @@ -16,15 +16,21 @@ public interface LetterRepository extends JpaRepository { List findByMailbox(Mailbox mailbox); - @Query("SELECT l FROM Letter l JOIN FETCH l.mailbox WHERE l.id = :id") - Optional findByIdWithMailbox(@Param("id") Long id); + List findByMailboxAndStatus(Mailbox mailbox, com.cake.pop.entity.enums.Status status); + + @Query("SELECT l FROM Letter l WHERE l.id = :id AND l.status = 'ACTIVE'") + Optional findActiveById(@Param("id") Long id); + + @Query("SELECT l FROM Letter l JOIN FETCH l.mailbox WHERE l.id = :id AND l.status = 'ACTIVE'") + Optional findActiveByIdWithMailbox(@Param("id") Long id); default Letter getById(Long id) { - return findById(id).orElseThrow(() -> new RestApiException(LetterErrorCode.LETTER_NOT_FOUND)); + return findActiveById(id) + .orElseThrow(() -> new RestApiException(LetterErrorCode.LETTER_NOT_FOUND)); } default Letter getByIdWithMailbox(Long id) { - return findByIdWithMailbox(id) + return findActiveByIdWithMailbox(id) .orElseThrow(() -> new RestApiException(LetterErrorCode.LETTER_NOT_FOUND)); } } diff --git a/src/main/java/com/cake/pop/domain/letter/service/LetterService.java b/src/main/java/com/cake/pop/domain/letter/service/LetterService.java index f50e648..603fac4 100644 --- a/src/main/java/com/cake/pop/domain/letter/service/LetterService.java +++ b/src/main/java/com/cake/pop/domain/letter/service/LetterService.java @@ -14,10 +14,13 @@ import com.cake.pop.entity.Storage; import com.cake.pop.entity.User; import com.cake.pop.entity.enums.Region; +import com.cake.pop.entity.enums.Status; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +@Transactional(readOnly = true) @Service @RequiredArgsConstructor public class LetterService { @@ -27,19 +30,19 @@ public class LetterService { private final StorageRepository storageRepository; private final UserRepository userRepository; + @Transactional public void createLetter(CreateLetterRequest request) { Mailbox findMailbox = mailboxRepository.getFirstByRegion(request.region()); findMailbox.increaseLetterCount(); Letter letter = Letter.of(request.content(), findMailbox, request.imageUrl()); letterRepository.save(letter); - mailboxRepository.save(findMailbox); } public GetLettersResponse getLetters(String region){ Mailbox findMailbox = mailboxRepository.getFirstByRegion(Region.fromKoreanName(region)); - List letters = letterRepository.findByMailbox(findMailbox); + List letters = letterRepository.findByMailboxAndStatus(findMailbox, Status.ACTIVE); List letterDtos = letters.stream() .map(letter -> new SimpleLetterDto( @@ -63,6 +66,7 @@ public GetLetterResponse getLetter(Long letterId){ ); } + @Transactional public void createStorage(Long userId, CreateStorageRequest request){ User findUser = userRepository.getById(userId); Letter findLetter = letterRepository.getById(request.letterId()); @@ -86,4 +90,10 @@ public List getStorages(Long userId){ }) .toList(); } + + @Transactional + public void reportLetter(Long letterId){ + Letter findLetter = letterRepository.getById(letterId); + findLetter.report(); + } } diff --git a/src/main/java/com/cake/pop/entity/Letter.java b/src/main/java/com/cake/pop/entity/Letter.java index a1c9dec..8fb505a 100644 --- a/src/main/java/com/cake/pop/entity/Letter.java +++ b/src/main/java/com/cake/pop/entity/Letter.java @@ -62,4 +62,11 @@ public static Letter of(String content, Mailbox mailbox, String imageUrl) { .imageUrl(imageUrl) .build(); } + + public void report() { + this.report++; + if (this.report >= 3) { + this.status = Status.INACTIVE; + } + } }