From 1f284f25faa650b5f2492a017727fc49354bcc38 Mon Sep 17 00:00:00 2001 From: Jean-Phi Baconnais Date: Tue, 4 Feb 2025 22:35:52 +0100 Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=9A=A7=20Init=20statistics=20adding?= =?UTF-8?q?=20a=20ressource=20and=20a=20Stats=20bean?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stats/beans/gcp/StatsContribution.java | 74 +++++++++++++++++++ .../workflow/WorkflowRessources.java | 18 +++++ .../workflow/WorkflowRessourcesTest.java | 18 +++++ 3 files changed, 110 insertions(+) create mode 100644 src/main/java/zenika/oss/stats/beans/gcp/StatsContribution.java diff --git a/src/main/java/zenika/oss/stats/beans/gcp/StatsContribution.java b/src/main/java/zenika/oss/stats/beans/gcp/StatsContribution.java new file mode 100644 index 0000000..624dfae --- /dev/null +++ b/src/main/java/zenika/oss/stats/beans/gcp/StatsContribution.java @@ -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; + } +} diff --git a/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java b/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java index 3ec3ca4..80a095d 100644 --- a/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java +++ b/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java @@ -4,6 +4,7 @@ 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; @@ -49,4 +50,21 @@ 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") int githubMember, @PathParam("year") int year) { + + return Response.ok("\uD83D\uDEA7 Not implemented yet").build(); + } + } diff --git a/src/test/java/zenika/oss/stats/ressources/workflow/WorkflowRessourcesTest.java b/src/test/java/zenika/oss/stats/ressources/workflow/WorkflowRessourcesTest.java index 43b3f77..c47d312 100644 --- a/src/test/java/zenika/oss/stats/ressources/workflow/WorkflowRessourcesTest.java +++ b/src/test/java/zenika/oss/stats/ressources/workflow/WorkflowRessourcesTest.java @@ -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); + } } From da08cbfe653e29ad8bd30480b176210e9d1a657c Mon Sep 17 00:00:00 2001 From: Jean-Phi Baconnais Date: Thu, 6 Feb 2025 17:13:39 +0100 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=9A=A7=20Init=20feature=20to=20save?= =?UTF-8?q?=20stats=20for=20one=20person=20on=20GCP=20(but=20not=20tested?= =?UTF-8?q?=20yet)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/WorkflowRessources.java | 13 +++++- .../oss/stats/services/FirestoreServices.java | 44 +++++++++++++++++-- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java b/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java index 80a095d..4d1fe60 100644 --- a/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java +++ b/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java @@ -8,6 +8,7 @@ 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.github.GitHubMember; import zenika.oss.stats.exception.DatabaseException; import zenika.oss.stats.mapper.ZenikaMemberMapper; @@ -62,9 +63,17 @@ public Response saveStatsForYear(@PathParam("year") int year) { @POST @Path("stats/save/{githubMember}/{year}") @Produces(MediaType.TEXT_PLAIN) - public Response saveStatsForAGitHubAccountForAYear(@PathParam("githubMember") int githubMember, @PathParam("year") int year) { + public Response saveStatsForAGitHubAccountForAYear(@PathParam("githubMember") String githubMember, @PathParam("year") int year) throws DatabaseException { - return Response.ok("\uD83D\uDEA7 Not implemented yet").build(); + firestoreServices.deleteStatsForAGitHubAccountForAYear(githubMember, year); + + List stats = gitHubServices.getContributionsForTheCurrentYear(githubMember, year); + + if (!stats.isEmpty()) { + firestoreServices.saveStatsForAGitHubAccountForAYear(githubMember, year, stats); + } + + return Response.ok().build(); } } diff --git a/src/main/java/zenika/oss/stats/services/FirestoreServices.java b/src/main/java/zenika/oss/stats/services/FirestoreServices.java index c383c7e..c2c2828 100644 --- a/src/main/java/zenika/oss/stats/services/FirestoreServices.java +++ b/src/main/java/zenika/oss/stats/services/FirestoreServices.java @@ -1,12 +1,10 @@ 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 jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import zenika.oss.stats.beans.CustomStatsContributionsUserByMonth; import zenika.oss.stats.beans.ZenikaMember; import zenika.oss.stats.exception.DatabaseException; import zenika.oss.stats.mapper.ZenikaMemberMapper; @@ -40,4 +38,42 @@ public List 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("year", year); + ApiFuture querySnapshot = query.get(); + try { + querySnapshot.get().getDocuments().forEach(documentSnapshot -> { + documentSnapshot.getReference().delete(); + }); + } catch (InterruptedException | ExecutionException e) { + throw new DatabaseException(e); + } + } + + /** + * Save stats for a GitHub account for a specific year. + * @param githubMember : GitHub login + * @param year : year to save + * @param stats : stats to save + */ + public void saveStatsForAGitHubAccountForAYear(String githubMember, int year, List stats) { + CollectionReference zStats = firestore.collection("stats"); + List> futures = new ArrayList<>(); + stats.forEach(stat -> { + DocumentReference docRef = firestore.collection("stats").document(); + stat.getClass().getDeclaredFields(); + futures.add(docRef.set(new CustomStatsContributionsUserByMonth( + stat.getMonth(), + stat.getMonthLabel(), + stat.getContributions() + ))); + }); + } } From b32c53cfec35a9eb041a388dba1c087809e1b47e Mon Sep 17 00:00:00 2001 From: Jean-Phi Baconnais Date: Fri, 7 Feb 2025 17:35:00 +0100 Subject: [PATCH 3/4] :sparkles: Implement the saving of data for a member --- .../oss/stats/beans/CustomStatsUser.java | 15 ++++++-- .../zenika/oss/stats/mapper/StatsMapper.java | 30 ++++++++++++++++ .../workflow/WorkflowRessources.java | 11 ++++-- .../oss/stats/services/FirestoreServices.java | 36 +++++++++---------- .../oss/stats/services/GitHubServices.java | 10 +++--- 5 files changed, 73 insertions(+), 29 deletions(-) create mode 100644 src/main/java/zenika/oss/stats/mapper/StatsMapper.java diff --git a/src/main/java/zenika/oss/stats/beans/CustomStatsUser.java b/src/main/java/zenika/oss/stats/beans/CustomStatsUser.java index 58ccd42..bf8b292 100644 --- a/src/main/java/zenika/oss/stats/beans/CustomStatsUser.java +++ b/src/main/java/zenika/oss/stats/beans/CustomStatsUser.java @@ -5,12 +5,15 @@ public class CustomStatsUser { private String login; - + + private int year; + private List contributionsUserByMonths; - public CustomStatsUser(final String login, final List contributionsUserByMonths) { + public CustomStatsUser(final String login, final int year, final List contributionsUserByMonths) { this.login = login; + this.year = year; this.contributionsUserByMonths = contributionsUserByMonths; } @@ -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 getContributionsUserByMonths() { return contributionsUserByMonths; diff --git a/src/main/java/zenika/oss/stats/mapper/StatsMapper.java b/src/main/java/zenika/oss/stats/mapper/StatsMapper.java new file mode 100644 index 0000000..9f483c6 --- /dev/null +++ b/src/main/java/zenika/oss/stats/mapper/StatsMapper.java @@ -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 mapGithubStatisticsToStatsContribution(String githubMember, int year, List stats) { + List 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; + } +} diff --git a/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java b/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java index 4d1fe60..392f274 100644 --- a/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java +++ b/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java @@ -9,8 +9,11 @@ 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; @@ -69,8 +72,12 @@ public Response saveStatsForAGitHubAccountForAYear(@PathParam("githubMember") St List stats = gitHubServices.getContributionsForTheCurrentYear(githubMember, year); - if (!stats.isEmpty()) { - firestoreServices.saveStatsForAGitHubAccountForAYear(githubMember, year, stats); + List statsMap = StatsMapper.mapGithubStatisticsToStatsContribution(githubMember, year, stats); + + if (!statsMap.isEmpty()) { + for (StatsContribution stat : statsMap) { + firestoreServices.saveStatsForAGitHubAccountForAYear(stat); + } } return Response.ok().build(); diff --git a/src/main/java/zenika/oss/stats/services/FirestoreServices.java b/src/main/java/zenika/oss/stats/services/FirestoreServices.java index c2c2828..ff22bb1 100644 --- a/src/main/java/zenika/oss/stats/services/FirestoreServices.java +++ b/src/main/java/zenika/oss/stats/services/FirestoreServices.java @@ -2,10 +2,13 @@ import com.google.api.core.ApiFuture; 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; @@ -21,6 +24,7 @@ public class FirestoreServices { /** * Create one member in the databse. + * * @param zMember the member to create. */ public void createMember(ZenikaMember zMember) { @@ -41,39 +45,31 @@ public List getAllMembers() throws DatabaseException { /** * Remove stats for a GitHub account for a specific year. + * * @param githubMember : GitHub login - * @param year : year to delete + * @param year : year to delete */ public void deleteStatsForAGitHubAccountForAYear(String githubMember, int year) throws DatabaseException { CollectionReference zStats = firestore.collection("stats"); - Query query = zStats.whereEqualTo("year", year); + Query query = zStats.whereEqualTo("githubHandle", githubMember).whereEqualTo("year", String.valueOf(year)); ApiFuture querySnapshot = query.get(); try { - querySnapshot.get().getDocuments().forEach(documentSnapshot -> { - documentSnapshot.getReference().delete(); - }); + List 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 year. - * @param githubMember : GitHub login - * @param year : year to save - * @param stats : stats to save + * Save stats for a GitHub account for a specific month of a year. + * + * @param statsContribution : stats to save */ - public void saveStatsForAGitHubAccountForAYear(String githubMember, int year, List stats) { - CollectionReference zStats = firestore.collection("stats"); + public void saveStatsForAGitHubAccountForAYear(StatsContribution statsContribution) throws DatabaseException { List> futures = new ArrayList<>(); - stats.forEach(stat -> { - DocumentReference docRef = firestore.collection("stats").document(); - stat.getClass().getDeclaredFields(); - futures.add(docRef.set(new CustomStatsContributionsUserByMonth( - stat.getMonth(), - stat.getMonthLabel(), - stat.getContributions() - ))); - }); + futures.add(firestore.collection("stats").document().set(statsContribution)); } } diff --git a/src/main/java/zenika/oss/stats/services/GitHubServices.java b/src/main/java/zenika/oss/stats/services/GitHubServices.java index f14486f..f263482 100644 --- a/src/main/java/zenika/oss/stats/services/GitHubServices.java +++ b/src/main/java/zenika/oss/stats/services/GitHubServices.java @@ -104,7 +104,7 @@ public List getPersonalProjectForAnUser(final String login) { * @param login : id of the user * @return a list of public projects created by the user. */ - public List getForkedProjectForAnUser(final String login) { + public List getForkedProjectForAnUser(final String login) { var repos = gitHubClient.getReposForAnUser(login); return repos.stream() @@ -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 getContributionsForTheCurrentYear(final String login, final int year) { @@ -201,11 +201,11 @@ public List getContributionsForTheCurrentYearAndAllTheOrganizat var statsMembers = new ArrayList(); 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()); From b8dd35a999876a87e7146e69f4bfefad2cce95cd Mon Sep 17 00:00:00 2001 From: Jean-Phi Baconnais Date: Wed, 12 Feb 2025 14:21:22 +0100 Subject: [PATCH 4/4] :sparkles: Implements saving stats for all Zenika members --- .../workflow/WorkflowRessources.java | 31 ++++++++++++-- .../oss/stats/services/FirestoreServices.java | 41 +++++++++++++++++-- .../oss/stats/services/GitHubServices.java | 13 +++--- src/main/resources/application.properties | 1 + 4 files changed, 73 insertions(+), 13 deletions(-) diff --git a/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java b/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java index 392f274..dda640d 100644 --- a/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java +++ b/src/main/java/zenika/oss/stats/ressources/workflow/WorkflowRessources.java @@ -9,7 +9,7 @@ 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.ZenikaMember; import zenika.oss.stats.beans.gcp.StatsContribution; import zenika.oss.stats.beans.github.GitHubMember; import zenika.oss.stats.exception.DatabaseException; @@ -18,6 +18,7 @@ import zenika.oss.stats.services.FirestoreServices; import zenika.oss.stats.services.GitHubServices; +import java.util.ArrayList; import java.util.List; @ApplicationScoped @@ -33,7 +34,9 @@ public class WorkflowRessources { @POST @Path("members/save") @Produces(MediaType.TEXT_PLAIN) - public Response saveMembers() { + public Response saveMembers() throws DatabaseException { + + firestoreServices.deleteAllMembers(); List gitHubMembers = gitHubServices.getZenikaOpenSourceMembers(); gitHubMembers.forEach(gitHubMember -> firestoreServices.createMember(ZenikaMemberMapper.mapGitHubMemberToZenikaMember(gitHubMember))); @@ -58,9 +61,29 @@ public Response savePersonalProjects() { @POST @Path("stats/save/{year}") @Produces(MediaType.TEXT_PLAIN) - public Response saveStatsForYear(@PathParam("year") int year) { + public Response saveStatsForYear(@PathParam("year") int year) throws DatabaseException { + List stats = new ArrayList<>(); - return Response.ok("\uD83D\uDEA7 Not implemented yet").build(); + firestoreServices.deleteStatsForAllGitHubAccountForAYear(year); + + List zMembers = firestoreServices.getAllMembers(); + + for (ZenikaMember zenikaMember : zMembers) { + if (zenikaMember.getGitHubAccount() != null) { + System.out.println("\uD83D\uDD0E Check information for " + zenikaMember.getGitHubAccount().getLogin()); + stats.addAll(gitHubServices.getContributionsForTheCurrentYear(zenikaMember.getGitHubAccount().getLogin(), year)); + List statsMap = StatsMapper.mapGithubStatisticsToStatsContribution(zenikaMember.getGitHubAccount().getLogin(), year, stats); + + System.out.println("\uD83D\uDCBD Save information for " + zenikaMember.getGitHubAccount().getLogin()); + if (!statsMap.isEmpty()) { + for (StatsContribution stat : statsMap) { + firestoreServices.saveStatsForAGitHubAccountForAYear(stat); + } + } + } + } + + return Response.ok().build(); } @POST diff --git a/src/main/java/zenika/oss/stats/services/FirestoreServices.java b/src/main/java/zenika/oss/stats/services/FirestoreServices.java index ff22bb1..6dd9ee6 100644 --- a/src/main/java/zenika/oss/stats/services/FirestoreServices.java +++ b/src/main/java/zenika/oss/stats/services/FirestoreServices.java @@ -2,11 +2,8 @@ import com.google.api.core.ApiFuture; 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; @@ -48,6 +45,7 @@ public List getAllMembers() throws DatabaseException { * * @param githubMember : GitHub login * @param year : year to delete + * @throws DatabaseException exception */ public void deleteStatsForAGitHubAccountForAYear(String githubMember, int year) throws DatabaseException { CollectionReference zStats = firestore.collection("stats"); @@ -72,4 +70,41 @@ public void saveStatsForAGitHubAccountForAYear(StatsContribution statsContributi List> futures = new ArrayList<>(); futures.add(firestore.collection("stats").document().set(statsContribution)); } + + /** + * Delete all stats for the year in parameter. + * @param year : the year that we want to remove stats + * @throws DatabaseException exception + */ + public void deleteStatsForAllGitHubAccountForAYear(int year) throws DatabaseException { + CollectionReference zStats = firestore.collection("stats"); + Query query = zStats.whereEqualTo("year", String.valueOf(year)); + ApiFuture querySnapshot = query.get(); + try { + List stats = querySnapshot.get().getDocuments(); + for (QueryDocumentSnapshot document : stats) { + document.getReference().delete(); + } + } catch (InterruptedException | ExecutionException e) { + throw new DatabaseException(e); + } + } + + /** + * Remove all members + * + * @throws DatabaseException exception + */ + public void deleteAllMembers() throws DatabaseException { + CollectionReference zStats = firestore.collection("members"); + ApiFuture querySnapshot = zStats.get(); + try { + List stats = querySnapshot.get().getDocuments(); + for (QueryDocumentSnapshot document : stats) { + document.getReference().delete(); + } + } catch (InterruptedException | ExecutionException e) { + throw new DatabaseException(e); + } + } } diff --git a/src/main/java/zenika/oss/stats/services/GitHubServices.java b/src/main/java/zenika/oss/stats/services/GitHubServices.java index f263482..60e5086 100644 --- a/src/main/java/zenika/oss/stats/services/GitHubServices.java +++ b/src/main/java/zenika/oss/stats/services/GitHubServices.java @@ -173,14 +173,15 @@ public List getContributionsForTheCurrentYe variables.put("to", lastDayOfMonth.format(formatter)); response = dynamicGraphQLClient.executeSync(GitHubGraphQLQueries.qGetNumberOfContributionsForAPeriod, variables); - prContributions = response.getObject(UserStatsNumberContributions.class, "user") - .getContributionsCollection() - .getPullRequestContributions(); + var userStats = response.getObject(UserStatsNumberContributions.class, "user"); - contributionsTab.add( - new CustomStatsContributionsUserByMonth(month.getValue(), month.getDisplayName(TextStyle.FULL, Locale.ENGLISH), - prContributions.getTotalCount())); + if (userStats != null) { + prContributions = userStats.getContributionsCollection().getPullRequestContributions(); + contributionsTab.add( + new CustomStatsContributionsUserByMonth(month.getValue(), month.getDisplayName(TextStyle.FULL, Locale.ENGLISH), + prContributions.getTotalCount())); + } } } catch (ExecutionException | InterruptedException e) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f56c543..6e3f271 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -33,5 +33,6 @@ github-api/mp-graphql/bearer=${github.token} quarkus.google.cloud.project-id=github-insights-247314 quarkus.google.cloud.firestore.database-id=opensource-statistics %dev.quarkus.google.cloud.firestore.devservice.enabled=false +%test.quarkus.google.cloud.firestore.devservice.enabled=true quarkus.google.cloud.service-account-location = ./.gcloud-conf.json %dev.quarkus.google.cloud.service-account-location = ./.gcloud-conf.json \ No newline at end of file