Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Save GitHub contributions #18

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
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
15 changes: 13 additions & 2 deletions src/main/java/zenika/oss/stats/beans/CustomStatsUser.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@
public class CustomStatsUser {

private String login;


private int year;

private List<CustomStatsContributionsUserByMonth> contributionsUserByMonths;

public CustomStatsUser(final String login, final List<CustomStatsContributionsUserByMonth> contributionsUserByMonths) {
public CustomStatsUser(final String login, final int year, final List<CustomStatsContributionsUserByMonth> contributionsUserByMonths) {

this.login = login;
this.year = year;
this.contributionsUserByMonths = contributionsUserByMonths;
}

Expand All @@ -24,6 +27,14 @@ public void setLogin(final String login) {
this.login = login;
}

public int getYear() {
return year;
}

public void setYear(int year) {
this.year = year;
}

public List<CustomStatsContributionsUserByMonth> getContributionsUserByMonths() {

return contributionsUserByMonths;
Expand Down
74 changes: 74 additions & 0 deletions src/main/java/zenika/oss/stats/beans/gcp/StatsContribution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package zenika.oss.stats.beans.gcp;

public class StatsContribution {

public String year;

public String month;

public String idZenikaMember;

public String githubHandle;

public int numberOfContributionsOnGitHub;

public String gitlabHandle;

public int numberOfContributionsOnGitLab;

public String getYear() {
return year;
}

public void setYear(String year) {
this.year = year;
}

public String getMonth() {
return month;
}

public void setMonth(String month) {
this.month = month;
}

public String getIdZenikaMember() {
return idZenikaMember;
}

public void setIdZenikaMember(String idZenikaMember) {
this.idZenikaMember = idZenikaMember;
}

public String getGithubHandle() {
return githubHandle;
}

public void setGithubHandle(String githubHandle) {
this.githubHandle = githubHandle;
}

public int getNumberOfContributionsOnGitHub() {
return numberOfContributionsOnGitHub;
}

public void setNumberOfContributionsOnGitHub(int numberOfContributionsOnGitHub) {
this.numberOfContributionsOnGitHub = numberOfContributionsOnGitHub;
}

public String getGitlabHandle() {
return gitlabHandle;
}

public void setGitlabHandle(String gitlabHandle) {
this.gitlabHandle = gitlabHandle;
}

public int getNumberOfContributionsOnGitLab() {
return numberOfContributionsOnGitLab;
}

public void setNumberOfContributionsOnGitLab(int numberOfContributionsOnGitLab) {
this.numberOfContributionsOnGitLab = numberOfContributionsOnGitLab;
}
}
30 changes: 30 additions & 0 deletions src/main/java/zenika/oss/stats/mapper/StatsMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package zenika.oss.stats.mapper;

import zenika.oss.stats.beans.CustomStatsContributionsUserByMonth;
import zenika.oss.stats.beans.gcp.StatsContribution;

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

public class StatsMapper {
public static List<StatsContribution> mapGithubStatisticsToStatsContribution(String githubMember, int year, List<CustomStatsContributionsUserByMonth> stats) {
List<StatsContribution> statsContributions = new ArrayList<>();

stats.forEach(stat -> statsContributions.add(StatsMapper.mapGithubStatisticToStatsContribution(githubMember, year, stat)));

return statsContributions;
}

private static StatsContribution mapGithubStatisticToStatsContribution(String githubMember, int year, CustomStatsContributionsUserByMonth customStatsContributionsUserByMonth) {
StatsContribution statsContribution = new StatsContribution();

statsContribution.setYear(String.valueOf(year));
statsContribution.setMonth(customStatsContributionsUserByMonth.getMonthLabel());
statsContribution.setNumberOfContributionsOnGitHub(customStatsContributionsUserByMonth.getContributions());
statsContribution.setGithubHandle(githubMember);
statsContribution.setGitlabHandle(null);
statsContribution.setIdZenikaMember(null);

return statsContribution;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,16 @@
import jakarta.inject.Inject;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import zenika.oss.stats.beans.CustomStatsContributionsUserByMonth;
import zenika.oss.stats.beans.CustomStatsUser;
import zenika.oss.stats.beans.gcp.StatsContribution;
import zenika.oss.stats.beans.github.GitHubMember;
import zenika.oss.stats.exception.DatabaseException;
import zenika.oss.stats.mapper.StatsMapper;
import zenika.oss.stats.mapper.ZenikaMemberMapper;
import zenika.oss.stats.services.FirestoreServices;
import zenika.oss.stats.services.GitHubServices;
Expand Down Expand Up @@ -49,4 +54,33 @@ public Response saveForkedProject() {
public Response savePersonalProjects() {
return Response.ok("\uD83D\uDEA7 Not implemented yet").build();
}

@POST
@Path("stats/save/{year}")
@Produces(MediaType.TEXT_PLAIN)
public Response saveStatsForYear(@PathParam("year") int year) {

return Response.ok("\uD83D\uDEA7 Not implemented yet").build();
}

@POST
@Path("stats/save/{githubMember}/{year}")
@Produces(MediaType.TEXT_PLAIN)
public Response saveStatsForAGitHubAccountForAYear(@PathParam("githubMember") String githubMember, @PathParam("year") int year) throws DatabaseException {

firestoreServices.deleteStatsForAGitHubAccountForAYear(githubMember, year);

List<CustomStatsContributionsUserByMonth> stats = gitHubServices.getContributionsForTheCurrentYear(githubMember, year);

List<StatsContribution> statsMap = StatsMapper.mapGithubStatisticsToStatsContribution(githubMember, year, stats);

if (!statsMap.isEmpty()) {
for (StatsContribution stat : statsMap) {
firestoreServices.saveStatsForAGitHubAccountForAYear(stat);
}
}

return Response.ok().build();
}

}
40 changes: 36 additions & 4 deletions src/main/java/zenika/oss/stats/services/FirestoreServices.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package zenika.oss.stats.services;

import com.google.api.core.ApiFuture;
import com.google.cloud.firestore.CollectionReference;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.QuerySnapshot;
import com.google.cloud.firestore.WriteResult;
import com.google.cloud.firestore.*;
import com.google.firestore.v1.Write;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import zenika.oss.stats.beans.CustomStatsContributionsUserByMonth;
import zenika.oss.stats.beans.CustomStatsUser;
import zenika.oss.stats.beans.ZenikaMember;
import zenika.oss.stats.beans.gcp.StatsContribution;
import zenika.oss.stats.exception.DatabaseException;
import zenika.oss.stats.mapper.ZenikaMemberMapper;

Expand All @@ -23,6 +24,7 @@ public class FirestoreServices {

/**
* Create one member in the databse.
*
* @param zMember the member to create.
*/
public void createMember(ZenikaMember zMember) {
Expand All @@ -40,4 +42,34 @@ public List<ZenikaMember> getAllMembers() throws DatabaseException {
throw new DatabaseException(e);
}
}

/**
* Remove stats for a GitHub account for a specific year.
*
* @param githubMember : GitHub login
* @param year : year to delete
*/
public void deleteStatsForAGitHubAccountForAYear(String githubMember, int year) throws DatabaseException {
CollectionReference zStats = firestore.collection("stats");
Query query = zStats.whereEqualTo("githubHandle", githubMember).whereEqualTo("year", String.valueOf(year));
ApiFuture<QuerySnapshot> querySnapshot = query.get();
try {
List<QueryDocumentSnapshot> stats = querySnapshot.get().getDocuments();
for (QueryDocumentSnapshot document : stats) {
document.getReference().delete();
}
} catch (InterruptedException | ExecutionException e) {
throw new DatabaseException(e);
}
}

/**
* Save stats for a GitHub account for a specific month of a year.
*
* @param statsContribution : stats to save
*/
public void saveStatsForAGitHubAccountForAYear(StatsContribution statsContribution) throws DatabaseException {
List<ApiFuture<WriteResult>> futures = new ArrayList<>();
futures.add(firestore.collection("stats").document().set(statsContribution));
}
}
10 changes: 5 additions & 5 deletions src/main/java/zenika/oss/stats/services/GitHubServices.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public List<GitHubProject> getPersonalProjectForAnUser(final String login) {
* @param login : id of the user
* @return a list of public projects created by the user.
*/
public List<GitHubProject> getForkedProjectForAnUser(final String login) {
public List<GitHubProject> getForkedProjectForAnUser(final String login) {

var repos = gitHubClient.getReposForAnUser(login);
return repos.stream()
Expand Down Expand Up @@ -144,7 +144,7 @@ public User getContributionsDataDynamic(final String login) {
* Get contributions for the current year.
*
* @param login
* @param year : year to search number of contributions
* @param year : year to search number of contributions
* @return a map of String (Month), Integer (number of contributions)
*/
public List<CustomStatsContributionsUserByMonth> getContributionsForTheCurrentYear(final String login, final int year) {
Expand Down Expand Up @@ -201,11 +201,11 @@ public List<CustomStatsUser> getContributionsForTheCurrentYearAndAllTheOrganizat
var statsMembers = new ArrayList<CustomStatsUser>();

var members = this.getOrganizationMembers(organizationName);

var currentYear = Year.now().getValue();

members.stream()
.map(member -> {
return statsMembers.add(new CustomStatsUser(member.getLogin(), this.getContributionsForTheCurrentYear(member.login, Year.now()
.getValue())));
return statsMembers.add(new CustomStatsUser(member.getLogin(), currentYear, this.getContributionsForTheCurrentYear(member.login, currentYear)));
})
.collect(Collectors.toList());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,22 @@ void test_savePersonalProjects() {
.then()
.statusCode(200);
}

@Test
void test_saveStatsForYear() {

given().when()
.post("/v1/workflow/stats/save/2024")
.then()
.statusCode(200);
}

@Test
void test_saveStatsForAGitHubAccountForAYear() {

given().when()
.post("/v1/workflow/stats/save/my-user/2024")
.then()
.statusCode(200);
}
}