Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
import io.pakland.mdas.githubstats.application.exceptions.HttpException;
import io.pakland.mdas.githubstats.domain.Organization;
import io.pakland.mdas.githubstats.domain.repository.OrganizationExternalRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
Comment thread
mikededo marked this conversation as resolved.
public class FetchAvailableOrganizations {

private final OrganizationExternalRepository organizationExternalRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.pakland.mdas.githubstats.application;

import io.pakland.mdas.githubstats.application.exceptions.HttpException;
import io.pakland.mdas.githubstats.domain.Commit;
import io.pakland.mdas.githubstats.domain.repository.CommitExternalRepository;

import java.util.ArrayList;
import java.util.List;

public class FetchCommitsFromPullRequest {
private final CommitExternalRepository commitExternalRepository;

public FetchCommitsFromPullRequest(CommitExternalRepository commitExternalRepository) {
this.commitExternalRepository = commitExternalRepository;
}

public List<Commit> execute(String repositoryOwner, String repositoryName, Integer pullRequestNumber) throws HttpException {
int page = 1;
List<Commit> commitList = new ArrayList<>();
int responseResults;
do {
CommitExternalRepository.FetchCommitsFromPullRequestRequest request = CommitExternalRepository.FetchCommitsFromPullRequestRequest.builder()
.repositoryOwner(repositoryOwner)
.repositoryName(repositoryName)
.pullRequestNumber(pullRequestNumber)
.page(page)
.perPage(100)
.build();
List<Commit> apiResults = this.commitExternalRepository.fetchCommitsFromPullRequest(
request);

commitList.addAll(apiResults);
responseResults = apiResults.size();
page++;
} while (responseResults > 0);

return commitList;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,34 @@
import io.pakland.mdas.githubstats.domain.PullRequestState;
import io.pakland.mdas.githubstats.domain.repository.PullRequestExternalRepository;
import io.pakland.mdas.githubstats.domain.repository.PullRequestExternalRepository.FetchPullRequestFromRepositoryRequest;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class FetchPullRequestsFromRepository {

private final PullRequestExternalRepository pullRequestExternalRepository;

public FetchPullRequestsFromRepository(
PullRequestExternalRepository pullRequestExternalRepository) {
PullRequestExternalRepository pullRequestExternalRepository) {
this.pullRequestExternalRepository = pullRequestExternalRepository;
}

public List<PullRequest> execute(String repositoryOwnerLogin, String repositoryName)
throws HttpException {
throws HttpException {
int page = 1;
List<PullRequest> pullRequestList = new ArrayList<>();
int responseResults;
do {
FetchPullRequestFromRepositoryRequest request = FetchPullRequestFromRepositoryRequest.builder()
.repositoryOwner(repositoryOwnerLogin)
.repository(repositoryName)
.page(page)
.perPage(100)
.state(PullRequestState.ALL)
.build();
.repositoryOwner(repositoryOwnerLogin)
.repository(repositoryName)
.page(page)
.perPage(100)
.state(PullRequestState.ALL)
.build();
List<PullRequest> apiResults = this.pullRequestExternalRepository.fetchPullRequestsFromRepository(
request);
request);

pullRequestList.addAll(apiResults);
responseResults = apiResults.size();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
import io.pakland.mdas.githubstats.application.exceptions.HttpException;
import io.pakland.mdas.githubstats.domain.Repository;
import io.pakland.mdas.githubstats.domain.repository.RepositoryExternalRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class FetchRepositoriesFromTeam {

private final RepositoryExternalRepository repositoryExternalRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
import io.pakland.mdas.githubstats.application.exceptions.HttpException;
import io.pakland.mdas.githubstats.domain.Team;
import io.pakland.mdas.githubstats.domain.repository.TeamExternalRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class FetchTeamsFromOrganization {
private final TeamExternalRepository teamExternalRepository;

Expand Down
32 changes: 13 additions & 19 deletions src/main/java/io/pakland/mdas/githubstats/domain/Commit.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package io.pakland.mdas.githubstats.domain;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.Instant;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.persistence.*;
import java.time.Instant;
import java.util.Date;
import java.util.Map;

@Data
@NoArgsConstructor
Expand All @@ -16,30 +19,21 @@ public class Commit {

@Id
@Column(updatable = false, nullable = false)
private Integer id;
@JsonProperty("sha")
private String sha;

@Column(name = "date")
private Date date;

@ManyToOne(fetch = FetchType.LAZY)
private User user;

@ManyToOne(fetch = FetchType.LAZY)
private PullRequest pullRequest;

private int additions;

private int deletions;

private Instant date;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Commit)) return false;
return id != null && id.equals(((Commit) o).getId());
}

@Override
public int hashCode() {
return getClass().hashCode();
@JsonProperty("commit")
private void unpackDateFromNestedObject(Map<String, Object> commitJson) {
Map<String, Object> committer = (Map<String, Object>)commitJson.get("committer");
this.date = Date.from(Instant.parse(committer.get("date").toString()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,15 @@
public class CommitAggregation {

private int numCommits;
private int linesAdded;
private int linesRemoved;

public static CommitAggregation aggregate(List<Commit> commits) {
CommitAggregation commitAggregation = new CommitAggregation();
commitAggregation.numCommits = (int) commits.stream().distinct().count();
commitAggregation.linesAdded = commits.stream().mapToInt(Commit::getAdditions).sum();
commitAggregation.linesRemoved = commits.stream().mapToInt(Commit::getDeletions).sum();
return commitAggregation;
}

public int getNumCommits() {
return numCommits;
}

public int getLinesAdded() {
return linesAdded;
}

public int getLinesRemoved() {
return linesRemoved;
}
}
70 changes: 38 additions & 32 deletions src/main/java/io/pakland/mdas/githubstats/domain/PullRequest.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package io.pakland.mdas.githubstats.domain;

import javax.persistence.*;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import lombok.ToString;
Expand All @@ -17,34 +16,41 @@
@Entity
@Table(name = "pull_request")
public class PullRequest {
@Id
@Column(updatable = false, nullable = false)
@JsonProperty("id")
private Integer id;

@Column(name="number")
@JsonProperty("number")
private Integer number;

@Column
@JsonProperty("state")
private PullRequestState state;

@OneToMany(
mappedBy = "pullRequest",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<UserReview> userReviews = new ArrayList<>();

@OneToMany(
mappedBy = "pullRequest",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Commit> commits = new ArrayList<>();

@ManyToOne(fetch = FetchType.LAZY)
@ToString.Exclude
private Repository repository;
@Id
@Column(updatable = false, nullable = false)
@JsonProperty("id")
private Integer id;

@Column(name = "number")
@JsonProperty("number")
private Integer number;

@Column(name = "state")
@JsonProperty("state")
private PullRequestState state;

@Column(name = "additions")
@JsonProperty("additions")
private Integer additions;

@Column(name = "deletions")
@JsonProperty("deletions")
private Integer deletions;

@OneToMany(
mappedBy = "pullRequest",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<UserReview> userReviews = new ArrayList<>();

@OneToMany(
mappedBy = "pullRequest",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Commit> commits = new ArrayList<>();

@ManyToOne(fetch = FetchType.LAZY)
private Repository repository;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package io.pakland.mdas.githubstats.domain.repository;

import io.pakland.mdas.githubstats.application.exceptions.HttpException;
import io.pakland.mdas.githubstats.domain.Commit;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

public interface CommitExternalRepository {
List<Commit> fetchCommitsFromPullRequest(FetchCommitsFromPullRequestRequest request) throws HttpException;

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
public static class FetchCommitsFromPullRequestRequest {
private String repositoryOwner;
private String repositoryName;
private Integer pullRequestNumber;
private Integer page;
private Integer perPage;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.pakland.mdas.githubstats.infrastructure.github.repository;

import io.pakland.mdas.githubstats.application.exceptions.HttpException;
import io.pakland.mdas.githubstats.domain.Commit;
import io.pakland.mdas.githubstats.domain.repository.CommitExternalRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.reactive.function.client.WebClientResponseException;

import java.util.List;

public class CommitGitHubRepository implements CommitExternalRepository {
private final WebClientConfiguration webClientConfiguration;
private final Logger logger = LoggerFactory.getLogger(CommitGitHubRepository.class);

public CommitGitHubRepository(WebClientConfiguration webClientConfiguration) {
this.webClientConfiguration = webClientConfiguration;
}

@Override
public List<Commit> fetchCommitsFromPullRequest(FetchCommitsFromPullRequestRequest request) throws HttpException {

try {
return this.webClientConfiguration.getWebClient().get()
.uri(String.format("/repos/%s/%s/pulls/%s/commits?%s", request.getRepositoryOwner(),
request.getRepositoryName(), request.getPullRequestNumber(), getRequestParams(request)))
.retrieve()
.bodyToFlux(Commit.class)
.collectList()
.block();
} catch (WebClientResponseException ex) {
logger.error(ex.toString());
throw new HttpException(ex.getRawStatusCode(), ex.getMessage());
}
}

private String getRequestParams(FetchCommitsFromPullRequestRequest request) {
return String.format("per_page=%d&page=%d", request.getPerPage(), request.getPage() < 0 ? 1 : request.getPage());
}
}
Loading