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 dd1431b..4f81ea8 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 @@ -10,6 +10,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -45,15 +46,13 @@ public ResponseEntity getLetter(@PathVariable("letterId") Lon } @PostMapping("/storage") - public ResponseEntity createStorage(@RequestBody @Valid CreateStorageRequest request) { - Long userId = 1L; + public ResponseEntity createStorage(@AuthenticationPrincipal Long userId, @RequestBody @Valid CreateStorageRequest request) { letterService.createStorage(userId, request); return ResponseEntity.ok().build(); } @GetMapping("/storages") - public ResponseEntity> getStorages() { - Long userId = 1L; + public ResponseEntity> getStorages(@AuthenticationPrincipal Long userId) { List response = letterService.getStorages(userId); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/cake/pop/domain/letter/controller/MailboxController.java b/src/main/java/com/cake/pop/domain/letter/controller/MailboxController.java new file mode 100644 index 0000000..5128537 --- /dev/null +++ b/src/main/java/com/cake/pop/domain/letter/controller/MailboxController.java @@ -0,0 +1,24 @@ +package com.cake.pop.domain.letter.controller; + +import com.cake.pop.domain.letter.dto.response.GetRankResponse; +import com.cake.pop.domain.letter.service.MailboxService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/mailboxes") +@RequiredArgsConstructor +public class MailboxController { + + private final MailboxService mailboxService; + + @GetMapping("/rank") + public ResponseEntity> getRanks(){ + List response = mailboxService.getRanks(); + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/cake/pop/domain/letter/dto/response/GetRankResponse.java b/src/main/java/com/cake/pop/domain/letter/dto/response/GetRankResponse.java new file mode 100644 index 0000000..2a0fe8c --- /dev/null +++ b/src/main/java/com/cake/pop/domain/letter/dto/response/GetRankResponse.java @@ -0,0 +1,7 @@ +package com.cake.pop.domain.letter.dto.response; + +public record GetRankResponse( + String region, + Integer letterCount +) { +} diff --git a/src/main/java/com/cake/pop/domain/letter/repository/MailboxRepository.java b/src/main/java/com/cake/pop/domain/letter/repository/MailboxRepository.java index c3fdbe5..eb4942e 100644 --- a/src/main/java/com/cake/pop/domain/letter/repository/MailboxRepository.java +++ b/src/main/java/com/cake/pop/domain/letter/repository/MailboxRepository.java @@ -4,6 +4,7 @@ import com.cake.pop.entity.Mailbox; import com.cake.pop.entity.enums.Region; 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.stereotype.Repository; @@ -12,6 +13,8 @@ public interface MailboxRepository extends JpaRepository { Optional findFirstByRegion(Region region); + List findTop3ByOrderByLetterCountDesc(); + default Mailbox getFirstByRegion(Region region) { return findFirstByRegion(region) .orElseThrow(() -> new RestApiException(LetterErrorCode.MAILBOX_NOT_FOUND)); diff --git a/src/main/java/com/cake/pop/domain/letter/service/MailboxService.java b/src/main/java/com/cake/pop/domain/letter/service/MailboxService.java new file mode 100644 index 0000000..b779062 --- /dev/null +++ b/src/main/java/com/cake/pop/domain/letter/service/MailboxService.java @@ -0,0 +1,28 @@ +package com.cake.pop.domain.letter.service; + +import com.cake.pop.domain.letter.dto.response.GetRankResponse; +import com.cake.pop.domain.letter.repository.MailboxRepository; +import com.cake.pop.entity.Mailbox; +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 MailboxService { + + private final MailboxRepository mailboxRepository; + + public List getRanks() { + List topMailboxes = mailboxRepository.findTop3ByOrderByLetterCountDesc(); + + return topMailboxes.stream() + .map(mailbox -> new GetRankResponse( + mailbox.getRegion().getName(), + mailbox.getLetterCount() + )) + .toList(); + } +}