diff --git a/src/main/java/com/whylog/server/domain/git/controller/GitController.java b/src/main/java/com/whylog/server/domain/git/controller/GitController.java index 4c38c32..c030e6b 100644 --- a/src/main/java/com/whylog/server/domain/git/controller/GitController.java +++ b/src/main/java/com/whylog/server/domain/git/controller/GitController.java @@ -164,6 +164,9 @@ public ApiResponse deleteRepository( 3. hasNext가 false가 나올 때까지 반복 💡 응답 필드: + - totalCommitCount: 현재 레포지토리에 저장된 전체 커밋 개수 + - connectedCommitCount: 적용사항에 연결된 커밋 개수 + - unconnectedCommitCount: 아직 적용사항에 연결되지 않은 커밋 개수 - hasNext: 다음 페이지 존재 여부 (더 불러올 커밋이 있으면 true) - nextCursorId: 다음 요청에 사용할 커서 ID - isFirst: 첫 페이지 여부 diff --git a/src/main/java/com/whylog/server/domain/git/dto/GitResponse.java b/src/main/java/com/whylog/server/domain/git/dto/GitResponse.java index 51ba4c6..cf477aa 100644 --- a/src/main/java/com/whylog/server/domain/git/dto/GitResponse.java +++ b/src/main/java/com/whylog/server/domain/git/dto/GitResponse.java @@ -84,6 +84,9 @@ public static class CommitDTO { @Schema(description = "작성자 이름", example = "김준용") private String authorName; + @Schema(description = "작성자 프로필 사진", example = "https://img.com/profile.jpg") + private String authorProfileImage; + @Schema(description = "커밋 날짜", example = "2026-03-24T10:30:00") private LocalDateTime dateTime; @@ -102,6 +105,7 @@ public static CommitDTO from(Commit commit, ConnectedApplicationDTO connectedApp .hash(commit.getHash()) .message(commit.getMessage()) .authorName(commit.getAuthorName()) + .authorProfileImage(commit.getAuthorProfileImage()) .dateTime(commit.getDateTime()) .addedLines(commit.getAddedLines()) .deletedLines(commit.getDeletedLines()) @@ -299,6 +303,15 @@ public static class CommitListResponseDTO { @Schema(description = "현재 페이지의 커밋 개수", example = "10") private Integer commitListSize; + @Schema(description = "현재 레포지토리에 있는 전체 커밋 개수", example = "123") + private Long totalCommitCount; + + @Schema(description = "현재 레포지토리에서 적용사항에 연결된 커밋 개수", example = "80") + private Long connectedCommitCount; + + @Schema(description = "현재 레포지토리에서 아직 적용사항에 연결되지 않은 커밋 개수", example = "43") + private Long unconnectedCommitCount; + @Schema(description = "페이지 처음 여부", example = "true") private Boolean isFirst; @@ -311,7 +324,9 @@ public static class CommitListResponseDTO { public static CommitListResponseDTO from( Slice commitSlice, Long cursorId, - java.util.Map connectedApplicationsByCommitId + java.util.Map connectedApplicationsByCommitId, + Long totalCommitCount, + Long connectedCommitCount ) { List commitDTOs = commitSlice.getContent().stream() .map(commit -> CommitDTO.from(commit, connectedApplicationsByCommitId.get(commit.getId()))) @@ -325,6 +340,9 @@ public static CommitListResponseDTO from( return CommitListResponseDTO.builder() .commitDTOList(commitDTOs) .commitListSize(commitDTOs.size()) + .totalCommitCount(totalCommitCount) + .connectedCommitCount(connectedCommitCount) + .unconnectedCommitCount(totalCommitCount - connectedCommitCount) .isFirst(cursorId == null) .hasNext(commitSlice.hasNext()) .nextCursorId(nextCursorId) diff --git a/src/main/java/com/whylog/server/domain/git/repository/CommitConnectionRepository.java b/src/main/java/com/whylog/server/domain/git/repository/CommitConnectionRepository.java index 9f4008d..5385d4c 100644 --- a/src/main/java/com/whylog/server/domain/git/repository/CommitConnectionRepository.java +++ b/src/main/java/com/whylog/server/domain/git/repository/CommitConnectionRepository.java @@ -42,6 +42,13 @@ public interface CommitConnectionRepository extends JpaRepository findConnectedCommitIds(@Param("commitIds") List commitIds); + @Query(""" + SELECT COUNT(DISTINCT cc.commit.id) + FROM CommitConnection cc + WHERE cc.commit.repository.id = :repositoryId + """) + long countByRepositoryId(@Param("repositoryId") Long repositoryId); + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(""" DELETE FROM CommitConnection cc diff --git a/src/main/java/com/whylog/server/domain/git/repository/CommitRepository.java b/src/main/java/com/whylog/server/domain/git/repository/CommitRepository.java index 46f1de1..07990a7 100644 --- a/src/main/java/com/whylog/server/domain/git/repository/CommitRepository.java +++ b/src/main/java/com/whylog/server/domain/git/repository/CommitRepository.java @@ -51,6 +51,8 @@ Set findExistingHashes( """) void deleteByRepositoryId(@Param("repositoryId") Long repositoryId); + long countByRepositoryId(Long repositoryId); + // 커서 기반 무한스크롤 - 커밋 목록 조회 @Query("SELECT c FROM Commit c " + "WHERE c.repository.id = :repositoryId " + diff --git a/src/main/java/com/whylog/server/domain/git/service/GitQueryServiceImpl.java b/src/main/java/com/whylog/server/domain/git/service/GitQueryServiceImpl.java index 7942242..7a41913 100644 --- a/src/main/java/com/whylog/server/domain/git/service/GitQueryServiceImpl.java +++ b/src/main/java/com/whylog/server/domain/git/service/GitQueryServiceImpl.java @@ -86,6 +86,8 @@ public Slice getCommitsByRepository(Long repositoryId, Long cursorId) { public GitResponse.CommitListResponseDTO getCommitListResponse(Long repositoryId, Long cursorId) { // 커밋 페이지를 조회한 뒤, 각 커밋에 연결된 적용사항을 함께 응답 DTO로 조립 Slice commitSlice = getCommitsByRepository(repositoryId, cursorId); + long totalCommitCount = commitRepository.countByRepositoryId(repositoryId); + long connectedCommitCount = commitConnectionRepository.countByRepositoryId(repositoryId); List commits = commitSlice.getContent(); Map connectedApplicationsByCommitId = new LinkedHashMap<>(); @@ -104,7 +106,13 @@ public GitResponse.CommitListResponseDTO getCommitListResponse(Long repositoryId ); } - return GitResponse.CommitListResponseDTO.from(commitSlice, cursorId, connectedApplicationsByCommitId); + return GitResponse.CommitListResponseDTO.from( + commitSlice, + cursorId, + connectedApplicationsByCommitId, + totalCommitCount, + connectedCommitCount + ); } /**