diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivitiesDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivitiesDTO.java new file mode 100644 index 000000000..44427e46f --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivitiesDTO.java @@ -0,0 +1,14 @@ +package de.tum.in.www1.hephaestus.activitydashboard; + +import de.tum.in.www1.hephaestus.gitprovider.issue.IssueInfoDTO; +import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequestInfoDTO; +import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewInfoDTO; +import io.micrometer.common.lang.NonNull; + +import java.util.List; + +public record ActivitiesDTO( + @NonNull List pullRequests, + @NonNull List issues, + @NonNull List reviews) { +} diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivityDashboardController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivityDashboardController.java new file mode 100644 index 000000000..0abb8f0fa --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivityDashboardController.java @@ -0,0 +1,21 @@ +package de.tum.in.www1.hephaestus.activitydashboard; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/activity") +public class ActivityDashboardController { + + @Autowired + private ActivityDashboardService activityDashboardService; + + @GetMapping("/{login}") + public ResponseEntity getActivitiesByUser(@PathVariable String login) { + return ResponseEntity.ok(activityDashboardService.getActivities(login)); + } +} diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivityDashboardService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivityDashboardService.java new file mode 100644 index 000000000..5132fdb03 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/activitydashboard/ActivityDashboardService.java @@ -0,0 +1,41 @@ +package de.tum.in.www1.hephaestus.activitydashboard; + +import de.tum.in.www1.hephaestus.gitprovider.issue.Issue; +import de.tum.in.www1.hephaestus.gitprovider.issue.IssueInfoDTO; +import de.tum.in.www1.hephaestus.gitprovider.issue.IssueRepository; +import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequest; +import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequestInfoDTO; +import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequestRepository; +import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReview; +import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewInfoDTO; +import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; + +@Service +public class ActivityDashboardService { + + @Autowired + private PullRequestRepository pullRequestRepository; + + @Autowired + private IssueRepository issueRepository; + + @Autowired + private PullRequestReviewRepository pullRequestReviewRepository; + + public ActivitiesDTO getActivities(String login) { + + List pullRequests = pullRequestRepository.findAssignedByLoginAndStates(login, Set.of(PullRequest.State.OPEN)); + List issues = List.of();//issueRepository.findAssignedByLoginAndStates(login, Set.of(Issue.State.OPEN)); + List reviews = List.of(); //TODO: which reviews to return here: all reviews of open PRs of others? what about where review is requested? + return new ActivitiesDTO( + pullRequests.stream().map(PullRequestInfoDTO::fromPullRequest).toList(), + issues.stream().map(IssueInfoDTO::fromIssue).toList(), + reviews.stream().map(PullRequestReviewInfoDTO::fromPullRequestReview).toList() + ); + } +} diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueInfoDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueInfoDTO.java index dcac6917f..6e6144d6a 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueInfoDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueInfoDTO.java @@ -23,4 +23,27 @@ public record IssueInfoDTO( OffsetDateTime createdAt, OffsetDateTime updatedAt ) { + + public static IssueInfoDTO fromIssue(Issue issue) { + return new IssueInfoDTO( + issue.getId(), + issue.getNumber(), + issue.getTitle(), + issue.getState(), + issue.getCommentsCount(), + UserInfoDTO.fromUser(issue.getAuthor()), + issue.getLabels() + .stream() + .map(LabelInfoDTO::fromLabel) + .toList(), + issue.getAssignees() + .stream() + .map(UserInfoDTO::fromUser) + .toList(), + issue.getRepository().getNameWithOwner(), + issue.getHtmlUrl(), + issue.getCreatedAt(), + issue.getUpdatedAt() + ); + } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueRepository.java index 0402a2b73..2df1cf452 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/issue/IssueRepository.java @@ -1,7 +1,25 @@ package de.tum.in.www1.hephaestus.gitprovider.issue; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Set; public interface IssueRepository extends JpaRepository { + @Query(""" + SELECT i + FROM Issue i + LEFT JOIN FETCH i.labels + JOIN FETCH i.author + LEFT JOIN FETCH i.assignees + LEFT JOIN FETCH i.repository + WHERE (i.author.login ILIKE :assigneeLogin OR LOWER(:assigneeLogin) IN (SELECT LOWER(u.login) FROM i.assignees u)) AND i.state IN :states + ORDER BY i.createdAt DESC + """) + List findAssignedByLoginAndStates( + @Param("assigneeLogin") String assigneeLogin, + @Param("states") Set states); }