Skip to content

✨ feat: track external contributions and detailed PR/MRs (#52) - #102

Merged
jeanphi-baconnais merged 3 commits into
zenika-open-source:mainfrom
jeanphi-baconnais:feat/external-contributions-details
Oct 13, 2026
Merged

jeanphi-baconnais merged 3 commits into
zenika-open-source:mainfrom
jeanphi-baconnais:feat/external-contributions-details

Conversation

@jeanphi-baconnais

Copy link
Copy Markdown
Member

📝 Description

This PR introduces comprehensive tracking and display of open source contributions across external projects and individual members, addressing issue #52.

It adds detailed Pull Request and Merge Request extraction from GitHub and GitLab, enriches the contributions database schema with contribution details and timestamps, sorts member PRs/MRs by date (most recent first) with formatted date indicators, and introduces a dedicated Latest External Contributions section with real-time filters and social media snippet generation for communication.


🚀 Main Changes

1. Backend & Data Models

  • ContributionDetail: Stores project name/fullName/URL, PR/MR title, URL, state, and creation timestamp (createdAt).
  • ExternalContribution: Represents external open-source contributions with normalized states, formatted dates, and social post generation helpers.
  • GitHub GraphQL: Added PullRequestContributions, PullRequestContributionNode, PullRequestNode, and PullRequestRepository with updated GraphQL queries to retrieve detailed public PR information.
  • GitLab REST: Added GitLabMergeRequest to extract MR metadata and map directly to ContributionDetail.
  • StatsContribution & Mappers: Updated StatsContribution and StatsMapper to persist and map contributionsDetails per member/month.

2. Services & APIs

  • ExternalContributionService: Filters external vs internal/member projects, applies state normalization, deduplication, and chronological sorting (newest first).
  • ContributionsRessources:
    • /v1/contributions/details: Returns detailed PR/MR contributions sorted by creation date descending.
    • /v1/contributions/external: Endpoint for external contributions with query parameters (year, state, memberId, limit).

3. UI Dashboard (Javelit)

  • Member PR/MR Details Table:
    • PR/MRs are now sorted by most recent date first (compareContributionDetailsByDateDesc), with fallback to month/year if createdAt is absent.
    • Added formatted Date (YYYY-MM-DD or month) as the first column of the table.
    • Search filter updated to support filtering by Date, Month, Project, Title, State, or Source.
  • Latest External Contributions Section: Dedicated view with period (Year / All Time), state (ALL / MERGED / OPEN / CLOSED), and limit filters, plus a copyable markdown snippet for social media posts.
  • Stats Tab: External projects summary per period.

4. Developer Experience & Docs

  • Startup Script: Added start.sh to automatically export .env and .gcloud-conf.json credentials and launch Quarkus dev mode.
  • Documentation: Updated README.md with API and startup script instructions.

🧪 Verification & Testing

  • Unit tests added and passing:
    • ContributionsTabTest: Verifies month parsing, sort key generation, date formatting, and descending date comparison.
    • ExternalContributionServiceTest: Tests external project detection, filtering, limit, and newest-first sorting.
    • GitLabMergeRequestTest: Tests conversion of GitLab MR JSON to ContributionDetail.
  • Compilation verified with mvn test-compile.

🔗 Related Issues

# v1.0.0 (2026-09-23)

## ✨ New Features
- [`7882900`](7882900)  Add Quarkus app
- [`ae46f09`](ae46f09)  Organize ressources and schedules
- [`d2aa0b6`](d2aa0b6)  Add Github lib
- [`5646e63`](5646e63)  Add GitHub extension and start to call API
- [`76bdd09`](76bdd09)  Replace library by http client call
- [`850b13d`](850b13d)  Add GitHub endpoint to get information about user and projects (perso and forked)
- [`4e3cd97`](4e3cd97)  Github members endpoint : add page
- [`69c636d`](69c636d)  Add endpoints to get all contribution number for one login on the current Year or a specific year user/{login}/contributions/year/current user/{login}/contributions/year/{year}
- [`55f9024`](55f9024)  Add endpoint to get all contributions for all members of the Zenika Open Source members. + refactor some packages + init test for GitHubServices but in progress (there is a bug)
- [`b061202`](b061202)  Add some tests
- [`4658d0f`](4658d0f)  Add some tests
- [`7eaa19c`](7eaa19c)  Fix bug and get all members of Zenika Open Source organization
- [`55f6db8`](55f6db8)  Start PR : add extension and start creating Firestore Adapter
- [`2359711`](2359711)  Review endpoint and start dev on workflow part (connecting to GCP)
- [`b32c53c`](b32c53c)  Implement the saving of data for a member
- [`b8dd35a`](b8dd35a)  Implements saving stats for all Zenika members
- [`56d5824`](56d5824)  Add Stats ressources
- [`291f033`](291f033)   Integrate Javelit to build dashboard + configure semantic release (zenika-open-source#28) (Issues: [`zenika-open-source#28`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/28))
- [`de24724`](de24724)  ⬆️ Update Java 25 (zenika-open-source#30) (Issues: [`zenika-open-source#30`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/30))
- [`1b8fed6`](1b8fed6)  Fix users recuperation to not remove all users before gett… (zenika-open-source#34) (Issues: [`zenika-open-source#34`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/34))
- [`ffa140a`](ffa140a)  Add contributions elements and some stats  (zenika-open-source#36) (Issues: [`zenika-open-source#36`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/36))
- [`fa1a143`](fa1a143)   🔧  Configure Cloud Run deployment (zenika-open-source#37) (Issues: [`zenika-open-source#37`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/37))
- [`d89b283`](d89b283)  Integrate GitLab 🦊 (zenika-open-source#38) (Issues: [`zenika-open-source#38`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/38))
- [`cecece7`](cecece7)  Add Organization projects (zenika-open-source#41) (Issues: [`zenika-open-source#41`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/41))
- [`e281c37`](e281c37)  44 update information for only news person (zenika-open-source#45) (Issues: [`zenika-open-source#45`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/45))
- [`b833e5a`](b833e5a)  🎨 Review tabs UI, Add top 5️⃣ projects and hide synchro buttons (zenika-open-source#48) (Issues: [`zenika-open-source#48`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/48))
- [`2779996`](2779996)  Prepare project for open source and add some adjustements (zenika-open-source#55) (Issues: [`zenika-open-source#55`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/55))
- [`88fc388`](88fc388)  Add Scheduler to refresh data (zenika-open-source#58) (Issues: [`zenika-open-source#58`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/58))
- [`7ace637`](7ace637)  Add project activity column (zenika-open-source#81) (Issues: [`zenika-open-source#81`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/81))

## 🐛 Bug Fixes
- [`34e4c79`](34e4c79)  Fix gitpod configuration
- [`26604c5`](26604c5)  Fix enum usage
- [`ad37816`](ad37816)  Remove deploy command on semantic release (zenika-open-source#31) (Issues: [`zenika-open-source#31`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/31))
- [`ccd40d1`](ccd40d1)  Fix/semantic release release note (zenika-open-source#32) (Issues: [`zenika-open-source#32`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/32))
- [`d9f69f4`](d9f69f4)  Fix Docker configuration + add doc + remove gitpod configuration (zenika-open-source#33) (Issues: [`zenika-open-source#33`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/33))
- [`57207a4`](57207a4)  Fix number of projects recuperation (zenika-open-source#47) (Issues: [`zenika-open-source#47`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/47))
- [`b633686`](b633686)  Fix Cron to be executed Monday (zenika-open-source#70) (Issues: [`zenika-open-source#70`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/70))
- [`48adbf6`](48adbf6)  Fix update date (zenika-open-source#76) (Issues: [`zenika-open-source#76`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/76))
- [`43c182d`](43c182d)  Review and fix schedule (zenika-open-source#78) (Issues: [`zenika-open-source#78`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/78))
- [`c64c906`](c64c906)  Fix member selectbox reverting to default option (zenika-open-source#82) (Issues: [`zenika-open-source#82`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/82))
- [`03d49f9`](03d49f9)  Fix member edit form rendering and session handling (zenika-open-source#92) (Issues: [`zenika-open-source#92`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/92))
…ource#52)

- Extract and store detailed Pull Requests (GitHub GraphQL) and Merge Requests (GitLab REST)
- Add ExternalContributionService to identify and filter external open source contributions
- Add detailed PR/MR table per collaborator sorted by most recent date first with formatted Date column
- Add Latest External Contributions section in ContributionsTab with period, state, limit filters and social post snippet generator
- Add External Projects summary in StatsTab
- Expose /v1/contributions/details and /v1/contributions/external REST endpoints
- Provide start.sh startup script for easy environment launch and update README
- Add unit tests for GitLabMergeRequest, ExternalContributionService, and ContributionsTab date sorting
@jeanphi-baconnais
jeanphi-baconnais merged commit 08607c5 into zenika-open-source:main Oct 13, 2026
1 check passed
github-actions Bot pushed a commit that referenced this pull request Oct 13, 2026
# [v1.12.0](v1.11.2...v1.12.0) (2026-10-13)

## ✨ New Features
- [`08607c5`](08607c5)  feat: track external contributions and detailed PR/MRs (#52) (#102) (Issues: [`#52`](#52) [`#102`](#102) [`#28`](#28) [`#28`](#28) [`#30`](#30) [`#30`](#30) [`#34`](#34) [`#34`](#34) [`#36`](#36) [`#36`](#36) [`#37`](#37) [`#37`](#37) [`#38`](#38) [`#38`](#38) [`#41`](#41) [`#41`](#41) [`#45`](#45) [`#45`](#45) [`#48`](#48) [`#48`](#48) [`#55`](#55) [`#55`](#55) [`#58`](#58) [`#58`](#58) [`#81`](#81) [`#81`](#81) [`#31`](#31) [`#31`](#31) [`#32`](#32) [`#32`](#32) [`#33`](#33) [`#33`](#33) [`#47`](#47) [`#47`](#47) [`#70`](#70) [`#70`](#70) [`#76`](#76) [`#76`](#76) [`#78`](#78) [`#78`](#78) [`#82`](#82) [`#82`](#82) [`#92`](#92) [`#92`](#92) [`#52`](#52))
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 1.12.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

github-actions Bot pushed a commit to jeanphi-baconnais/opensource-statistics that referenced this pull request Nov 3, 2026
# v1.0.0 (2026-11-03)

## ✨ New Features
- [`7882900`](7882900)  Add Quarkus app
- [`ae46f09`](ae46f09)  Organize ressources and schedules
- [`d2aa0b6`](d2aa0b6)  Add Github lib
- [`5646e63`](5646e63)  Add GitHub extension and start to call API
- [`76bdd09`](76bdd09)  Replace library by http client call
- [`850b13d`](850b13d)  Add GitHub endpoint to get information about user and projects (perso and forked)
- [`4e3cd97`](4e3cd97)  Github members endpoint : add page
- [`69c636d`](69c636d)  Add endpoints to get all contribution number for one login on the current Year or a specific year user/{login}/contributions/year/current user/{login}/contributions/year/{year}
- [`55f9024`](55f9024)  Add endpoint to get all contributions for all members of the Zenika Open Source members. + refactor some packages + init test for GitHubServices but in progress (there is a bug)
- [`b061202`](b061202)  Add some tests
- [`4658d0f`](4658d0f)  Add some tests
- [`7eaa19c`](7eaa19c)  Fix bug and get all members of Zenika Open Source organization
- [`55f6db8`](55f6db8)  Start PR : add extension and start creating Firestore Adapter
- [`2359711`](2359711)  Review endpoint and start dev on workflow part (connecting to GCP)
- [`b32c53c`](b32c53c)  Implement the saving of data for a member
- [`b8dd35a`](b8dd35a)  Implements saving stats for all Zenika members
- [`56d5824`](56d5824)  Add Stats ressources
- [`291f033`](291f033)   Integrate Javelit to build dashboard + configure semantic release (zenika-open-source#28) (Issues: [`zenika-open-source#28`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/28))
- [`de24724`](de24724)  ⬆️ Update Java 25 (zenika-open-source#30) (Issues: [`zenika-open-source#30`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/30))
- [`1b8fed6`](1b8fed6)  Fix users recuperation to not remove all users before gett… (zenika-open-source#34) (Issues: [`zenika-open-source#34`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/34))
- [`ffa140a`](ffa140a)  Add contributions elements and some stats  (zenika-open-source#36) (Issues: [`zenika-open-source#36`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/36))
- [`fa1a143`](fa1a143)   🔧  Configure Cloud Run deployment (zenika-open-source#37) (Issues: [`zenika-open-source#37`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/37))
- [`d89b283`](d89b283)  Integrate GitLab 🦊 (zenika-open-source#38) (Issues: [`zenika-open-source#38`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/38))
- [`cecece7`](cecece7)  Add Organization projects (zenika-open-source#41) (Issues: [`zenika-open-source#41`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/41))
- [`e281c37`](e281c37)  44 update information for only news person (zenika-open-source#45) (Issues: [`zenika-open-source#45`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/45))
- [`b833e5a`](b833e5a)  🎨 Review tabs UI, Add top 5️⃣ projects and hide synchro buttons (zenika-open-source#48) (Issues: [`zenika-open-source#48`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/48))
- [`2779996`](2779996)  Prepare project for open source and add some adjustements (zenika-open-source#55) (Issues: [`zenika-open-source#55`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/55))
- [`88fc388`](88fc388)  Add Scheduler to refresh data (zenika-open-source#58) (Issues: [`zenika-open-source#58`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/58))
- [`7ace637`](7ace637)  Add project activity column (zenika-open-source#81) (Issues: [`zenika-open-source#81`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/81))
- [`08607c5`](08607c5)  feat: track external contributions and detailed PR/MRs (zenika-open-source#52) (zenika-open-source#102) (Issues: [`zenika-open-source#52`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/52) [`zenika-open-source#102`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/102) [`zenika-open-source#28`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/28) [`zenika-open-source#28`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/28) [`zenika-open-source#30`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/30) [`zenika-open-source#30`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/30) [`zenika-open-source#34`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/34) [`zenika-open-source#34`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/34) [`zenika-open-source#36`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/36) [`zenika-open-source#36`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/36) [`zenika-open-source#37`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/37) [`zenika-open-source#37`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/37) [`zenika-open-source#38`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/38) [`zenika-open-source#38`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/38) [`zenika-open-source#41`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/41) [`zenika-open-source#41`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/41) [`zenika-open-source#45`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/45) [`zenika-open-source#45`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/45) [`zenika-open-source#48`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/48) [`zenika-open-source#48`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/48) [`zenika-open-source#55`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/55) [`zenika-open-source#55`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/55) [`zenika-open-source#58`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/58) [`zenika-open-source#58`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/58) [`zenika-open-source#81`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/81) [`zenika-open-source#81`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/81) [`zenika-open-source#31`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/31) [`zenika-open-source#31`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/31) [`zenika-open-source#32`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/32) [`zenika-open-source#32`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/32) [`zenika-open-source#33`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/33) [`zenika-open-source#33`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/33) [`zenika-open-source#47`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/47) [`zenika-open-source#47`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/47) [`zenika-open-source#70`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/70) [`zenika-open-source#70`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/70) [`zenika-open-source#76`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/76) [`zenika-open-source#76`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/76) [`zenika-open-source#78`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/78) [`zenika-open-source#78`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/78) [`zenika-open-source#82`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/82) [`zenika-open-source#82`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/82) [`zenika-open-source#92`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/92) [`zenika-open-source#92`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/92) [`zenika-open-source#52`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/52))

## 🐛 Bug Fixes
- [`34e4c79`](34e4c79)  Fix gitpod configuration
- [`26604c5`](26604c5)  Fix enum usage
- [`ad37816`](ad37816)  Remove deploy command on semantic release (zenika-open-source#31) (Issues: [`zenika-open-source#31`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/31))
- [`ccd40d1`](ccd40d1)  Fix/semantic release release note (zenika-open-source#32) (Issues: [`zenika-open-source#32`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/32))
- [`d9f69f4`](d9f69f4)  Fix Docker configuration + add doc + remove gitpod configuration (zenika-open-source#33) (Issues: [`zenika-open-source#33`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/33))
- [`57207a4`](57207a4)  Fix number of projects recuperation (zenika-open-source#47) (Issues: [`zenika-open-source#47`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/47))
- [`b633686`](b633686)  Fix Cron to be executed Monday (zenika-open-source#70) (Issues: [`zenika-open-source#70`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/70))
- [`48adbf6`](48adbf6)  Fix update date (zenika-open-source#76) (Issues: [`zenika-open-source#76`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/76))
- [`43c182d`](43c182d)  Review and fix schedule (zenika-open-source#78) (Issues: [`zenika-open-source#78`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/78))
- [`c64c906`](c64c906)  Fix member selectbox reverting to default option (zenika-open-source#82) (Issues: [`zenika-open-source#82`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/82))
- [`03d49f9`](03d49f9)  Fix member edit form rendering and session handling (zenika-open-source#92) (Issues: [`zenika-open-source#92`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/92))
- [`45ca8f7`](45ca8f7)  ⬆️ Bump quarkus.platform.version from 3.38.2 to 3.39.4 (zenika-open-source#93) (Issues: [`zenika-open-source#93`](https://github.com/jeanphi-baconnais/opensource-statistics/issues/93))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ Get projects where Z contribute

2 participants