diff --git a/src/main/java/com/likelion/monday/domain/mygarden/controller/MyGardenController.java b/src/main/java/com/likelion/monday/domain/mygarden/controller/MyGardenController.java index dc6ca5e..0dd621d 100644 --- a/src/main/java/com/likelion/monday/domain/mygarden/controller/MyGardenController.java +++ b/src/main/java/com/likelion/monday/domain/mygarden/controller/MyGardenController.java @@ -1,7 +1,11 @@ package com.likelion.monday.domain.mygarden.controller; import com.likelion.monday.domain.account.auth.LoginAccountId; +import com.likelion.monday.domain.mygarden.dto.LikedStoryResDto; +import com.likelion.monday.domain.mygarden.dto.MyActivitySummaryResDto; import com.likelion.monday.domain.mygarden.dto.MyStorySummaryResDto; +import com.likelion.monday.domain.mygarden.dto.ReceivedLikeResDto; +import com.likelion.monday.domain.mygarden.dto.SentStoryResDto; import com.likelion.monday.domain.mygarden.service.MyGardenService; import com.likelion.monday.domain.story.entity.StoryStatus; import com.likelion.monday.global.response.ApiResponse; @@ -30,4 +34,28 @@ public ApiResponse> getMyStories( @RequestParam(required = false) StoryStatus status) { return ApiResponse.success(myGardenService.getMyStories(accountId, status)); } + + @Override + @GetMapping("/summary") + public ApiResponse getActivitySummary(@LoginAccountId Long accountId) { + return ApiResponse.success(myGardenService.getActivitySummary(accountId)); + } + + @Override + @GetMapping("/sent-stories") + public ApiResponse> getSentStories(@LoginAccountId Long accountId) { + return ApiResponse.success(myGardenService.getSentStories(accountId)); + } + + @Override + @GetMapping("/received-likes") + public ApiResponse> getReceivedLikes(@LoginAccountId Long accountId) { + return ApiResponse.success(myGardenService.getReceivedLikes(accountId)); + } + + @Override + @GetMapping("/liked-stories") + public ApiResponse> getLikedStories(@LoginAccountId Long accountId) { + return ApiResponse.success(myGardenService.getLikedStories(accountId)); + } } \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/mygarden/controller/MyGardenControllerDocs.java b/src/main/java/com/likelion/monday/domain/mygarden/controller/MyGardenControllerDocs.java index 440e6e5..d0292cd 100644 --- a/src/main/java/com/likelion/monday/domain/mygarden/controller/MyGardenControllerDocs.java +++ b/src/main/java/com/likelion/monday/domain/mygarden/controller/MyGardenControllerDocs.java @@ -1,6 +1,10 @@ package com.likelion.monday.domain.mygarden.controller; +import com.likelion.monday.domain.mygarden.dto.LikedStoryResDto; +import com.likelion.monday.domain.mygarden.dto.MyActivitySummaryResDto; import com.likelion.monday.domain.mygarden.dto.MyStorySummaryResDto; +import com.likelion.monday.domain.mygarden.dto.ReceivedLikeResDto; +import com.likelion.monday.domain.mygarden.dto.SentStoryResDto; import com.likelion.monday.domain.story.entity.StoryStatus; import com.likelion.monday.global.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; @@ -27,4 +31,32 @@ public interface MyGardenControllerDocs { security = @SecurityRequirement(name = "bearerAuth") ) ApiResponse> getMyStories(@Parameter(hidden = true) Long accountId, StoryStatus status); + + @Operation( + summary = "내 정원 홈 - 활동 요약 조회", + description = "보낸 사연 수, 공감받은 수, 공감한 사연 수를 개수로만 조회한다.", + security = @SecurityRequirement(name = "bearerAuth") + ) + ApiResponse getActivitySummary(@Parameter(hidden = true) Long accountId); + + @Operation( + summary = "보낸 사연 조회", + description = "내가 작성한 사연 전체를 최신순으로 조회한다.", + security = @SecurityRequirement(name = "bearerAuth") + ) + ApiResponse> getSentStories(@Parameter(hidden = true) Long accountId); + + @Operation( + summary = "받은 공감 조회", + description = "내가 쓴 사연들에 달린 공감을 최신순으로 조회한다.", + security = @SecurityRequirement(name = "bearerAuth") + ) + ApiResponse> getReceivedLikes(@Parameter(hidden = true) Long accountId); + + @Operation( + summary = "공감한 사연 조회", + description = "내가 다른 사연에 남긴 공감을 최신순으로 조회한다.", + security = @SecurityRequirement(name = "bearerAuth") + ) + ApiResponse> getLikedStories(@Parameter(hidden = true) Long accountId); } \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/mygarden/dto/LikedStoryResDto.java b/src/main/java/com/likelion/monday/domain/mygarden/dto/LikedStoryResDto.java new file mode 100644 index 0000000..6261ca5 --- /dev/null +++ b/src/main/java/com/likelion/monday/domain/mygarden/dto/LikedStoryResDto.java @@ -0,0 +1,18 @@ +package com.likelion.monday.domain.mygarden.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDateTime; + +@Schema(description = "내 정원 - 공감한 사연 목록 항목") +public record LikedStoryResDto( + + @Schema(description = "사연 ID", example = "1") + Long storyId, + + @Schema(description = "사연 제목", example = "우리 집 귀염둥이에게") + String storyTitle, + + @Schema(description = "공감한 일시") + LocalDateTime likedAt +) { +} \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/mygarden/dto/MyActivitySummaryResDto.java b/src/main/java/com/likelion/monday/domain/mygarden/dto/MyActivitySummaryResDto.java new file mode 100644 index 0000000..2d05b88 --- /dev/null +++ b/src/main/java/com/likelion/monday/domain/mygarden/dto/MyActivitySummaryResDto.java @@ -0,0 +1,17 @@ +package com.likelion.monday.domain.mygarden.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "내 정원 홈 - 활동 요약") +public record MyActivitySummaryResDto( + + @Schema(description = "내가 보낸 사연 수", example = "3") + long sentStoryCount, + + @Schema(description = "내가 쓴 사연들이 받은 공감 수", example = "24") + long receivedLikeCount, + + @Schema(description = "내가 남긴 공감 수", example = "10") + long likedStoryCount +) { +} \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/mygarden/dto/ReceivedLikeResDto.java b/src/main/java/com/likelion/monday/domain/mygarden/dto/ReceivedLikeResDto.java new file mode 100644 index 0000000..1f37c29 --- /dev/null +++ b/src/main/java/com/likelion/monday/domain/mygarden/dto/ReceivedLikeResDto.java @@ -0,0 +1,17 @@ +package com.likelion.monday.domain.mygarden.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "내 정원 - 받은 공감 목록 항목") +public record ReceivedLikeResDto( + + @Schema(description = "공감 ID", example = "1") + Long likeId, + + @Schema(description = "공감이 달린 사연 ID", example = "1") + Long storyId, + + @Schema(description = "공감이 달린 사연 제목", example = "우리 집 귀염둥이에게") + String storyTitle +) { +} \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/mygarden/dto/SentStoryResDto.java b/src/main/java/com/likelion/monday/domain/mygarden/dto/SentStoryResDto.java new file mode 100644 index 0000000..e11328c --- /dev/null +++ b/src/main/java/com/likelion/monday/domain/mygarden/dto/SentStoryResDto.java @@ -0,0 +1,22 @@ +package com.likelion.monday.domain.mygarden.dto; + +import com.likelion.monday.domain.story.entity.StoryStatus; +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDateTime; + +@Schema(description = "내 정원 - 보낸 사연 목록 항목") +public record SentStoryResDto( + + @Schema(description = "사연 ID", example = "1") + Long storyId, + + @Schema(description = "사연 제목", example = "우리 집 귀염둥이에게") + String title, + + @Schema(description = "사연 상태", example = "PENDING") + StoryStatus status, + + @Schema(description = "제출 일시") + LocalDateTime createdAt +) { +} \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/mygarden/mapper/MyGardenMapper.java b/src/main/java/com/likelion/monday/domain/mygarden/mapper/MyGardenMapper.java index a5c8487..d0b12ac 100644 --- a/src/main/java/com/likelion/monday/domain/mygarden/mapper/MyGardenMapper.java +++ b/src/main/java/com/likelion/monday/domain/mygarden/mapper/MyGardenMapper.java @@ -1,7 +1,11 @@ package com.likelion.monday.domain.mygarden.mapper; +import com.likelion.monday.domain.mygarden.dto.LikedStoryResDto; import com.likelion.monday.domain.mygarden.dto.MyStorySummaryResDto; +import com.likelion.monday.domain.mygarden.dto.ReceivedLikeResDto; +import com.likelion.monday.domain.mygarden.dto.SentStoryResDto; import com.likelion.monday.domain.story.entity.Story; +import com.likelion.monday.domain.story.entity.StoryLike; import org.springframework.stereotype.Component; @Component @@ -16,4 +20,26 @@ public MyStorySummaryResDto toSummaryResDto(Story story) { story.getLikeCount(), story.getCreatedAt()); } + + public SentStoryResDto toSentStoryResDto(Story story) { + return new SentStoryResDto( + story.getId(), + story.getTitle(), + story.getStatus(), + story.getCreatedAt()); + } + + public ReceivedLikeResDto toReceivedLikeResDto(StoryLike like) { + return new ReceivedLikeResDto( + like.getId(), + like.getStory().getId(), + like.getStory().getTitle()); + } + + public LikedStoryResDto toLikedStoryResDto(StoryLike like) { + return new LikedStoryResDto( + like.getStory().getId(), + like.getStory().getTitle(), + like.getCreatedAt()); + } } \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/mygarden/service/MyGardenService.java b/src/main/java/com/likelion/monday/domain/mygarden/service/MyGardenService.java index aca13c2..bb6d1eb 100644 --- a/src/main/java/com/likelion/monday/domain/mygarden/service/MyGardenService.java +++ b/src/main/java/com/likelion/monday/domain/mygarden/service/MyGardenService.java @@ -1,9 +1,14 @@ package com.likelion.monday.domain.mygarden.service; +import com.likelion.monday.domain.mygarden.dto.LikedStoryResDto; +import com.likelion.monday.domain.mygarden.dto.MyActivitySummaryResDto; import com.likelion.monday.domain.mygarden.dto.MyStorySummaryResDto; +import com.likelion.monday.domain.mygarden.dto.ReceivedLikeResDto; +import com.likelion.monday.domain.mygarden.dto.SentStoryResDto; import com.likelion.monday.domain.mygarden.mapper.MyGardenMapper; import com.likelion.monday.domain.story.entity.Story; import com.likelion.monday.domain.story.entity.StoryStatus; +import com.likelion.monday.domain.story.repository.StoryLikeRepository; import com.likelion.monday.domain.story.repository.StoryRepository; import java.util.List; import lombok.RequiredArgsConstructor; @@ -16,6 +21,7 @@ public class MyGardenService { private final StoryRepository storyRepository; + private final StoryLikeRepository storyLikeRepository; private final MyGardenMapper myGardenMapper; public List getMyStoriesPreview(Long accountId) { @@ -33,4 +39,31 @@ public List getMyStories(Long accountId, StoryStatus statu .map(myGardenMapper::toSummaryResDto) .toList(); } + + public MyActivitySummaryResDto getActivitySummary(Long accountId) { + long sentStoryCount = storyRepository.countByAccountId(accountId); + long receivedLikeCount = storyLikeRepository.countByStory_AccountId(accountId); + long likedStoryCount = storyLikeRepository.countByAccountId(accountId); + + return new MyActivitySummaryResDto(sentStoryCount, receivedLikeCount, likedStoryCount); + } + + public List getSentStories(Long accountId) { + return storyRepository.findAllByAccountIdOrderByCreatedAtDesc(accountId).stream() + .map(myGardenMapper::toSentStoryResDto) + .toList(); + } + + // 받은 공감: 내가 쓴 사연들에 달린 공감 + public List getReceivedLikes(Long accountId) { + return storyLikeRepository.findAllByStory_AccountIdOrderByCreatedAtDesc(accountId).stream() + .map(myGardenMapper::toReceivedLikeResDto) + .toList(); + } + + public List getLikedStories(Long accountId) { + return storyLikeRepository.findAllByAccountIdOrderByCreatedAtDesc(accountId).stream() + .map(myGardenMapper::toLikedStoryResDto) + .toList(); + } } \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/notification/repository/NotificationRepository.java b/src/main/java/com/likelion/monday/domain/notification/repository/NotificationRepository.java index 73834da..bb2a043 100644 --- a/src/main/java/com/likelion/monday/domain/notification/repository/NotificationRepository.java +++ b/src/main/java/com/likelion/monday/domain/notification/repository/NotificationRepository.java @@ -4,4 +4,4 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface NotificationRepository extends JpaRepository { -} +} \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/story/repository/StoryLikeRepository.java b/src/main/java/com/likelion/monday/domain/story/repository/StoryLikeRepository.java new file mode 100644 index 0000000..84d3403 --- /dev/null +++ b/src/main/java/com/likelion/monday/domain/story/repository/StoryLikeRepository.java @@ -0,0 +1,16 @@ +package com.likelion.monday.domain.story.repository; + +import com.likelion.monday.domain.story.entity.StoryLike; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface StoryLikeRepository extends JpaRepository { + + long countByStory_AccountId(Long accountId); + + long countByAccountId(Long accountId); + + List findAllByStory_AccountIdOrderByCreatedAtDesc(Long accountId); + + List findAllByAccountIdOrderByCreatedAtDesc(Long accountId); +} \ No newline at end of file diff --git a/src/main/java/com/likelion/monday/domain/story/repository/StoryRepository.java b/src/main/java/com/likelion/monday/domain/story/repository/StoryRepository.java index 90b1f7b..e5e85f8 100644 --- a/src/main/java/com/likelion/monday/domain/story/repository/StoryRepository.java +++ b/src/main/java/com/likelion/monday/domain/story/repository/StoryRepository.java @@ -12,6 +12,8 @@ public interface StoryRepository extends JpaRepository { long countByStatus(StoryStatus status); + long countByAccountId(Long accountId); + Page findAllByStatus(StoryStatus status, Pageable pageable); List findTop2ByAccountIdOrderByCreatedAtDesc(Long accountId);