From b9772aede0d4f266efc449a1292abaffb3549c25 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 26 Apr 2026 09:01:28 +0200 Subject: [PATCH 1/2] Count forks on GitHub --- libs/common/src/lib/config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 42e1f6b63..2c2a63366 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -200,6 +200,9 @@ export const GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME = export const GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME = 'GATHER_STATISTICS_GITHUB_CONTRIBUTORS'; +export const GATHER_STATISTICS_GITHUB_FORKS_PROCESS_JOB_NAME = + 'GATHER_STATISTICS_GITHUB_FORKS'; + export const GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME = 'GATHER_STATISTICS_GITHUB_STARGAZERS'; @@ -234,6 +237,7 @@ export const PROPERTY_BENCHMARKS = 'BENCHMARKS'; export const PROPERTY_BETTER_UPTIME_MONITOR_ID = 'BETTER_UPTIME_MONITOR_ID'; export const PROPERTY_DOCKER_HUB_PULLS = 'DOCKER_HUB_PULLS'; export const PROPERTY_GITHUB_CONTRIBUTORS = 'GITHUB_CONTRIBUTORS'; +export const PROPERTY_GITHUB_FORKS = 'GITHUB_FORKS'; export const PROPERTY_GITHUB_STARGAZERS = 'GITHUB_STARGAZERS'; export const PROPERTY_COUNTRIES_OF_SUBSCRIBERS = 'COUNTRIES_OF_SUBSCRIBERS'; export const PROPERTY_COUPONS = 'COUPONS'; From 02eb054466dee203c8c7bad4ce91e7420665c801 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 26 Apr 2026 09:02:31 +0200 Subject: [PATCH 2/2] Count forks on GitHub --- .../statistics-gathering.processor.ts | 42 +++++++++++++++++++ .../statistics-gathering.service.ts | 2 + 2 files changed, 44 insertions(+) diff --git a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts index 07fc32585..f61713bcc 100644 --- a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts +++ b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts @@ -3,12 +3,14 @@ import { PropertyService } from '@ghostfolio/api/services/property/property.serv import { GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME, GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME, + GATHER_STATISTICS_GITHUB_FORKS_PROCESS_JOB_NAME, GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME, GATHER_STATISTICS_UPTIME_PROCESS_JOB_NAME, HEADER_KEY_TOKEN, PROPERTY_BETTER_UPTIME_MONITOR_ID, PROPERTY_DOCKER_HUB_PULLS, PROPERTY_GITHUB_CONTRIBUTORS, + PROPERTY_GITHUB_FORKS, PROPERTY_GITHUB_STARGAZERS, PROPERTY_UPTIME, STATISTICS_GATHERING_QUEUE @@ -71,6 +73,26 @@ export class StatisticsGatheringProcessor { ); } + @Process(GATHER_STATISTICS_GITHUB_FORKS_PROCESS_JOB_NAME) + public async gatherGitHubForksStatistics() { + Logger.log( + 'GitHub forks statistics gathering has been started', + 'StatisticsGatheringProcessor' + ); + + const gitHubForks = await this.countGitHubForks(); + + await this.propertyService.put({ + key: PROPERTY_GITHUB_FORKS, + value: String(gitHubForks) + }); + + Logger.log( + 'GitHub forks statistics gathering has been completed', + 'StatisticsGatheringProcessor' + ); + } + @Process(GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME) public async gatherGitHubStargazersStatistics() { Logger.log( @@ -159,6 +181,26 @@ export class StatisticsGatheringProcessor { } } + private async countGitHubForks(): Promise { + try { + const { forks_count } = (await fetch( + 'https://api.github.com/repos/ghostfolio/ghostfolio', + { + headers: { 'User-Agent': 'request' }, + signal: AbortSignal.timeout( + this.configurationService.get('REQUEST_TIMEOUT') + ) + } + ).then((res) => res.json())) as { forks_count: number }; + + return forks_count; + } catch (error) { + Logger.error(error, 'StatisticsGatheringProcessor - GitHub'); + + throw error; + } + } + private async countGitHubStargazers(): Promise { try { const { stargazers_count } = (await fetch( diff --git a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.service.ts b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.service.ts index 68c674688..026f7b377 100644 --- a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.service.ts +++ b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.service.ts @@ -1,6 +1,7 @@ import { GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME, GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME, + GATHER_STATISTICS_GITHUB_FORKS_PROCESS_JOB_NAME, GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME, GATHER_STATISTICS_PROCESS_JOB_OPTIONS, GATHER_STATISTICS_UPTIME_PROCESS_JOB_NAME, @@ -23,6 +24,7 @@ export class StatisticsGatheringService { [ GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME, GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME, + GATHER_STATISTICS_GITHUB_FORKS_PROCESS_JOB_NAME, GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME, GATHER_STATISTICS_UPTIME_PROCESS_JOB_NAME ].map((jobName) => {