From fdeda6c77a14199c63ea9d8159aec21b7008f816 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Fri, 24 Oct 2025 22:16:31 +0200 Subject: [PATCH] Add GitHub token authentication to sync services - Add GitHub token authentication to GitHubJsonService for API calls - Add GitHub token authentication to GitHubService for API calls - Update fetchFromGitHub methods to use GITHUB_TOKEN from .env - Update downloadJsonFile methods to use GitHub token for raw file downloads - Add proper error handling for rate limit exceeded (403) errors - Add console logging to show when token is/isn't being used - Improve error messages to suggest setting GITHUB_TOKEN for higher rate limits This ensures that when a GitHub token is specified in .env, it will be used for all GitHub API calls during sync operations, providing higher rate limits and better reliability. --- src/server/services/github.ts | 23 ++++++++++---- src/server/services/githubJsonService.ts | 38 +++++++++++++++++++----- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/server/services/github.ts b/src/server/services/github.ts index c5e4a77..2545a6e 100644 --- a/src/server/services/github.ts +++ b/src/server/services/github.ts @@ -29,14 +29,25 @@ export class GitHubService { } private async fetchFromGitHub(endpoint: string): Promise { - const response = await fetch(`${this.baseUrl}${endpoint}`, { - headers: { - 'Accept': 'application/vnd.github.v3+json', - 'User-Agent': 'PVEScripts-Local/1.0', - }, - }); + const headers: HeadersInit = { + 'Accept': 'application/vnd.github.v3+json', + 'User-Agent': 'PVEScripts-Local/1.0', + }; + + // Add GitHub token authentication if available + if (env.GITHUB_TOKEN) { + headers.Authorization = `token ${env.GITHUB_TOKEN}`; + console.log('Using GitHub token for API authentication'); + } else { + console.log('No GitHub token found, using unauthenticated requests (lower rate limits)'); + } + + const response = await fetch(`${this.baseUrl}${endpoint}`, { headers }); if (!response.ok) { + if (response.status === 403) { + throw new Error(`GitHub API rate limit exceeded. Consider setting GITHUB_TOKEN for higher limits. Status: ${response.status} ${response.statusText}`); + } throw new Error(`GitHub API error: ${response.status} ${response.statusText}`); } diff --git a/src/server/services/githubJsonService.ts b/src/server/services/githubJsonService.ts index 30e0742..01a6f82 100644 --- a/src/server/services/githubJsonService.ts +++ b/src/server/services/githubJsonService.ts @@ -41,14 +41,26 @@ export class GitHubJsonService { private async fetchFromGitHub(endpoint: string): Promise { this.initializeConfig(); - const response = await fetch(`${this.baseUrl!}${endpoint}`, { - headers: { - 'Accept': 'application/vnd.github.v3+json', - 'User-Agent': 'PVEScripts-Local/1.0', - }, - }); + + const headers: HeadersInit = { + 'Accept': 'application/vnd.github.v3+json', + 'User-Agent': 'PVEScripts-Local/1.0', + }; + + // Add GitHub token authentication if available + if (env.GITHUB_TOKEN) { + headers.Authorization = `token ${env.GITHUB_TOKEN}`; + console.log('Using GitHub token for API authentication'); + } else { + console.log('No GitHub token found, using unauthenticated requests (lower rate limits)'); + } + + const response = await fetch(`${this.baseUrl!}${endpoint}`, { headers }); if (!response.ok) { + if (response.status === 403) { + throw new Error(`GitHub API rate limit exceeded. Consider setting GITHUB_TOKEN for higher limits. Status: ${response.status} ${response.statusText}`); + } throw new Error(`GitHub API error: ${response.status} ${response.statusText}`); } @@ -59,8 +71,20 @@ export class GitHubJsonService { this.initializeConfig(); const rawUrl = `https://raw.githubusercontent.com/${this.extractRepoPath()}/${this.branch!}/${filePath}`; - const response = await fetch(rawUrl); + const headers: HeadersInit = { + 'User-Agent': 'PVEScripts-Local/1.0', + }; + + // Add GitHub token authentication if available (for raw files, use token in URL or header) + if (env.GITHUB_TOKEN) { + headers.Authorization = `token ${env.GITHUB_TOKEN}`; + } + + const response = await fetch(rawUrl, { headers }); if (!response.ok) { + if (response.status === 403) { + throw new Error(`GitHub rate limit exceeded while downloading ${filePath}. Consider setting GITHUB_TOKEN for higher limits. Status: ${response.status} ${response.statusText}`); + } throw new Error(`Failed to download ${filePath}: ${response.status} ${response.statusText}`); }