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 04ec3d9..dbb4e90 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 @@ -1,6 +1,7 @@ package com.cake.pop.domain.letter.controller; import com.cake.pop.domain.letter.dto.request.CreateLetterRequest; +import com.cake.pop.domain.letter.dto.request.CreateStorageRequest; import com.cake.pop.domain.letter.dto.response.GetLetterResponse; import com.cake.pop.domain.letter.dto.response.GetLettersResponse; import com.cake.pop.domain.letter.service.LetterService; @@ -24,7 +25,7 @@ public class LetterController { @PostMapping public ResponseEntity createLetter(@RequestBody @Valid CreateLetterRequest request) { - letterService.create(request); + letterService.createLetter(request); return ResponseEntity.ok().build(); } @@ -39,4 +40,13 @@ public ResponseEntity getLetter(@PathVariable("letterId") Lon GetLetterResponse response = letterService.getLetter(letterId); return ResponseEntity.ok(response); } + + @PostMapping("/storage") + public ResponseEntity createStorage(@RequestBody @Valid CreateStorageRequest request){ + Long userId = 1L; + letterService.createStorage(userId, request); + return ResponseEntity.ok().build(); + } + + } diff --git a/src/main/java/com/cake/pop/domain/letter/dto/request/CreateStorageRequest.java b/src/main/java/com/cake/pop/domain/letter/dto/request/CreateStorageRequest.java new file mode 100644 index 0000000..da0c3d2 --- /dev/null +++ b/src/main/java/com/cake/pop/domain/letter/dto/request/CreateStorageRequest.java @@ -0,0 +1,6 @@ +package com.cake.pop.domain.letter.dto.request; + +public record CreateStorageRequest( + Long letterId +) { +} diff --git a/src/main/java/com/cake/pop/domain/letter/dto/response/GetLetterResponse.java b/src/main/java/com/cake/pop/domain/letter/dto/response/GetLetterResponse.java index 3f13010..4160f1d 100644 --- a/src/main/java/com/cake/pop/domain/letter/dto/response/GetLetterResponse.java +++ b/src/main/java/com/cake/pop/domain/letter/dto/response/GetLetterResponse.java @@ -3,6 +3,7 @@ public record GetLetterResponse( Long letterId, String content, - String imageUrl + String imageUrl, + String region ) { } 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 df42be6..79af9d4 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 @@ -5,7 +5,10 @@ import com.cake.pop.entity.Mailbox; import com.cake.pop.global.exception.RestApiException; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository @@ -13,7 +16,15 @@ 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); + default Letter getById(Long id) { return findById(id).orElseThrow(() -> new RestApiException(LetterErrorCode.LETTER_NOT_FOUND)); } + + default Letter getByIdWithMailbox(Long id) { + return findByIdWithMailbox(id) + .orElseThrow(() -> new RestApiException(LetterErrorCode.LETTER_NOT_FOUND)); + } } diff --git a/src/main/java/com/cake/pop/domain/letter/repository/StorageRepository.java b/src/main/java/com/cake/pop/domain/letter/repository/StorageRepository.java new file mode 100644 index 0000000..00a4ad7 --- /dev/null +++ b/src/main/java/com/cake/pop/domain/letter/repository/StorageRepository.java @@ -0,0 +1,9 @@ +package com.cake.pop.domain.letter.repository; + +import com.cake.pop.entity.Storage; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StorageRepository extends JpaRepository { +} 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 3b5aebf..8b0d9ad 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 @@ -1,13 +1,18 @@ package com.cake.pop.domain.letter.service; import com.cake.pop.domain.letter.dto.request.CreateLetterRequest; +import com.cake.pop.domain.letter.dto.request.CreateStorageRequest; import com.cake.pop.domain.letter.dto.response.GetLetterResponse; import com.cake.pop.domain.letter.dto.response.GetLettersResponse; import com.cake.pop.domain.letter.dto.response.SimpleLetterDto; import com.cake.pop.domain.letter.repository.LetterRepository; import com.cake.pop.domain.letter.repository.MailboxRepository; +import com.cake.pop.domain.letter.repository.StorageRepository; +import com.cake.pop.domain.user.repository.UserRepository; import com.cake.pop.entity.Letter; import com.cake.pop.entity.Mailbox; +import com.cake.pop.entity.Storage; +import com.cake.pop.entity.User; import com.cake.pop.entity.enums.Region; import java.util.List; import lombok.RequiredArgsConstructor; @@ -19,11 +24,16 @@ public class LetterService { private final LetterRepository letterRepository; private final MailboxRepository mailboxRepository; + private final StorageRepository storageRepository; + private final UserRepository userRepository; - public void create(CreateLetterRequest request) { + 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){ @@ -43,12 +53,21 @@ public GetLettersResponse getLetters(String region){ } public GetLetterResponse getLetter(Long letterId){ - Letter findLetter = letterRepository.getById(letterId); + Letter findLetter = letterRepository.getByIdWithMailbox(letterId); return new GetLetterResponse( findLetter.getId(), findLetter.getContent(), - findLetter.getImageUrl() + findLetter.getImageUrl(), + findLetter.getMailbox().getRegion().getName() ); } + + public void createStorage(Long userId, CreateStorageRequest request){ + User findUser = userRepository.getById(userId); + Letter findLetter = letterRepository.getById(request.letterId()); + Storage storage = Storage.of(findUser, findLetter); + + storageRepository.save(storage); + } } diff --git a/src/main/java/com/cake/pop/entity/Mailbox.java b/src/main/java/com/cake/pop/entity/Mailbox.java index 489c713..7d9e3d2 100644 --- a/src/main/java/com/cake/pop/entity/Mailbox.java +++ b/src/main/java/com/cake/pop/entity/Mailbox.java @@ -44,4 +44,8 @@ public static Mailbox of(Region region) { .region(region) .build(); } + + public void increaseLetterCount() { + this.letterCount = this.letterCount + 1; + } }