Skip to content

Commit 65e8476

Browse files
committed
#144: add reviews to the activity service
1 parent 56de603 commit 65e8476

File tree

8 files changed

+168
-49
lines changed

8 files changed

+168
-49
lines changed
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99

1010
@RestController
1111
@RequestMapping("/activity")
12-
public class ActivityDashboardController {
12+
public class ActivityController {
1313

1414
@Autowired
15-
private ActivityDashboardService activityDashboardService;
15+
private ActivityService activityService;
1616

1717
@GetMapping("/{login}")
18-
public ResponseEntity<ActivitiesDTO> getActivitiesByUser(@PathVariable String login) {
19-
return ResponseEntity.ok(activityDashboardService.getActivities(login));
18+
public ResponseEntity<ActivityDTO> getActivityByUser(@PathVariable String login) {
19+
ActivityDTO activity = activityService.getActivity(login);
20+
return ResponseEntity.ok(activity);
2021
}
2122
}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
import de.tum.in.www1.hephaestus.gitprovider.issue.IssueInfoDTO;
44
import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequestInfoDTO;
5-
import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewInfoDTO;
65
import io.micrometer.common.lang.NonNull;
76

87
import java.util.List;
98

10-
public record ActivitiesDTO(
9+
public record ActivityDTO(
1110
@NonNull List<PullRequestInfoDTO> pullRequests,
1211
@NonNull List<IssueInfoDTO> issues,
13-
@NonNull List<PullRequestReviewInfoDTO> reviews) {
12+
@NonNull List<ReviewActivityDto> reviews) {
1413
}

server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivityDashboardService.java

Lines changed: 0 additions & 41 deletions
This file was deleted.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package de.tum.in.www1.hephaestus.activitydashboard;
2+
3+
import de.tum.in.www1.hephaestus.gitprovider.issue.Issue;
4+
import de.tum.in.www1.hephaestus.gitprovider.issue.IssueInfoDTO;
5+
import de.tum.in.www1.hephaestus.gitprovider.issue.IssueRepository;
6+
import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequest;
7+
import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequestInfoDTO;
8+
import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequestRepository;
9+
import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReview;
10+
import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewInfoDTO;
11+
import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewRepository;
12+
import jakarta.transaction.Transactional;
13+
import org.springframework.stereotype.Service;
14+
15+
import java.util.List;
16+
import java.util.Set;
17+
18+
@Service
19+
public class ActivityService {
20+
21+
private PullRequestRepository pullRequestRepository;
22+
23+
private IssueRepository issueRepository;
24+
25+
private PullRequestReviewRepository pullRequestReviewRepository;
26+
27+
public ActivityService(PullRequestRepository pullRequestRepository, IssueRepository issueRepository, PullRequestReviewRepository pullRequestReviewRepository) {
28+
this.pullRequestRepository = pullRequestRepository;
29+
this.issueRepository = issueRepository;
30+
this.pullRequestReviewRepository = pullRequestReviewRepository;
31+
}
32+
33+
@Transactional
34+
public ActivityDTO getActivity(String login) {
35+
36+
List<PullRequestInfoDTO> openPullRequests = pullRequestRepository
37+
.findAssignedByLoginAndStates(login, Set.of(Issue.State.OPEN))
38+
.stream()
39+
.map(PullRequestInfoDTO::fromPullRequest)
40+
.toList();
41+
42+
List<IssueInfoDTO> openIssues = issueRepository.findAssignedByLoginAndStates(login, Set.of(Issue.State.OPEN))
43+
.stream()
44+
.map(IssueInfoDTO::fromIssue)
45+
.toList();
46+
47+
List<ReviewActivityDto> reviews = getReviewedOrRequestedPullRequests(login);
48+
49+
return new ActivityDTO(
50+
openPullRequests,
51+
openIssues,
52+
reviews
53+
);
54+
}
55+
56+
private List<ReviewActivityDto> getReviewedOrRequestedPullRequests(String login) {
57+
List<ReviewActivityDto> reviews = pullRequestReviewRepository.findAllOpenReviewsByAuthorLogin(login)
58+
.stream()
59+
.map(ReviewActivityDto::fromPullRequestReview)
60+
.toList();
61+
62+
List<ReviewActivityDto> requestedReviews = pullRequestRepository.findReviewRequestedByLogin(login)
63+
.stream()
64+
.map(ReviewActivityDto::fromPullRequest)
65+
.toList();
66+
67+
requestedReviews.addAll(reviews);
68+
return requestedReviews;
69+
}
70+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package de.tum.in.www1.hephaestus.activitydashboard;
2+
3+
import java.time.OffsetDateTime;
4+
import org.springframework.lang.NonNull;
5+
import com.fasterxml.jackson.annotation.JsonInclude;
6+
7+
import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequest;
8+
import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequestInfoDTO;
9+
import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReview;
10+
import de.tum.in.www1.hephaestus.gitprovider.user.UserInfoDTO;
11+
12+
@JsonInclude(JsonInclude.Include.NON_EMPTY)
13+
public record ReviewActivityDto(
14+
@NonNull Long id,
15+
@NonNull Boolean isDismissed,
16+
@NonNull ReviewActivityState state,
17+
@NonNull Integer codeComments,
18+
UserInfoDTO author,
19+
PullRequestInfoDTO pullRequest) {
20+
21+
public static ReviewActivityDto fromPullRequestReview(PullRequestReview pullRequestReview) {
22+
return new ReviewActivityDto(
23+
pullRequestReview.getId(),
24+
pullRequestReview.isDismissed(),
25+
ReviewActivityDto.fromPullRequestReviewState(pullRequestReview.getState()),
26+
pullRequestReview.getComments().size(),
27+
UserInfoDTO.fromUser(pullRequestReview.getAuthor()),
28+
PullRequestInfoDTO.fromPullRequest(pullRequestReview.getPullRequest())
29+
);
30+
}
31+
32+
public static ReviewActivityDto fromPullRequest(PullRequest pullRequest) {
33+
return new ReviewActivityDto(
34+
pullRequest.getId(),
35+
false,
36+
ReviewActivityState.REVIEW_REQUESTED,
37+
0,
38+
UserInfoDTO.fromUser(pullRequest.getAuthor()),
39+
PullRequestInfoDTO.fromPullRequest(pullRequest)
40+
);
41+
}
42+
43+
public enum ReviewActivityState {
44+
COMMENTED,
45+
APPROVED,
46+
CHANGES_REQUESTED,
47+
REVIEW_REQUESTED,
48+
UNKNOWN;
49+
}
50+
51+
public static ReviewActivityState fromPullRequestReviewState(PullRequestReview.State state) {
52+
return switch (state) {
53+
case COMMENTED -> ReviewActivityState.COMMENTED;
54+
case APPROVED -> ReviewActivityState.APPROVED;
55+
case CHANGES_REQUESTED -> ReviewActivityState.CHANGES_REQUESTED;
56+
default -> ReviewActivityState.UNKNOWN;
57+
};
58+
}
59+
}

server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ SELECT MAX(i.number)
4747
JOIN FETCH i.author
4848
LEFT JOIN FETCH i.assignees
4949
LEFT JOIN FETCH i.repository
50-
WHERE (i.author.login ILIKE :assigneeLogin OR LOWER(:assigneeLogin) IN (SELECT LOWER(u.login) FROM i.assignees u)) AND i.state IN :states
50+
WHERE LOWER(:assigneeLogin) IN (SELECT LOWER(u.login) FROM i.assignees u) AND i.state IN :states AND TYPE(i) <> PullRequest
5151
ORDER BY i.createdAt DESC
5252
""")
5353
List<Issue> findAssignedByLoginAndStates(

server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/pullrequest/PullRequestRepository.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,17 @@ WHERE Type(p) = PullRequest
5555
"""
5656
)
5757
Set<Integer> findAllSyncedPullRequestNumbers(@Param("repositoryId") long repositoryId);
58+
59+
@Query("""
60+
SELECT p
61+
FROM PullRequest p
62+
LEFT JOIN FETCH p.labels
63+
LEFT JOIN FETCH p.requestedReviewers
64+
JOIN FETCH p.author
65+
LEFT JOIN FETCH p.assignees
66+
LEFT JOIN FETCH p.repository
67+
WHERE LOWER(:reviewerLogin) IN (SELECT LOWER(u.login) FROM p.requestedReviewers u)
68+
ORDER BY p.createdAt DESC
69+
""")
70+
List<PullRequest> findReviewRequestedByLogin(@Param("reviewerLogin") String reviewerLogin);
5871
}

server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/pullrequestreview/PullRequestReviewRepository.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,22 @@ List<PullRequestReview> findAllInTimeframeOfTeam(
8282
@Param("before") OffsetDateTime before,
8383
@Param("teamId") Long teamId
8484
);
85+
86+
@Query("""
87+
SELECT prr
88+
FROM PullRequestReview prr
89+
LEFT JOIN FETCH prr.author
90+
LEFT JOIN FETCH prr.pullRequest
91+
LEFT JOIN FETCH prr.pullRequest.repository
92+
LEFT JOIN FETCH prr.comments
93+
WHERE prr.author.login ILIKE :authorLogin AND prr.pullRequest.state = 'OPEN'
94+
AND prr.submittedAt = (
95+
SELECT MAX(subPrr.submittedAt)
96+
FROM PullRequestReview subPrr
97+
WHERE subPrr.pullRequest.id = prr.pullRequest.id
98+
)
99+
ORDER BY prr.submittedAt DESC
100+
""")
101+
List<PullRequestReview> findAllOpenReviewsByAuthorLogin(@Param("authorLogin") String authorLogin);
102+
85103
}

0 commit comments

Comments
 (0)