Advertisement

← vibesdk

worker/services/oauth/github-exporter.ts

2.0 KB Download file
import type { OAuthUserInfo } from '../../types/auth-types';
import { createLogger } from '../../logger';
import { createGitHubHeaders } from '../../utils/githubUtils';
import { GitHubOAuthProvider } from './github';

const logger = createLogger('GitHubExporterOAuth');

export class GitHubExporterOAuthProvider extends GitHubOAuthProvider {
    protected readonly scopes = [
        'public_repo',
        'repo'
    ];
    
    async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {
        try {
            const userResponse = await fetch(this.userInfoUrl, {
                headers: createGitHubHeaders(accessToken)
            });
            
            if (!userResponse.ok) {
                throw new Error('Failed to retrieve user information from GitHub');
            }
            
            const userData = await userResponse.json() as {
                id: number;
                login: string;
                email?: string;
                name?: string;
                avatar_url?: string;
            };
            
            return {
                id: String(userData.id),
                email: userData.email || `${userData.login}@github.local`,
                name: userData.name || userData.login,
                picture: userData.avatar_url,
                emailVerified: true
            };
        } catch (error) {
            logger.error('Error getting user info', error);
            throw error;
        }
    }
    
    static create(env: Env, baseUrl: string): GitHubExporterOAuthProvider {
        if (!env.GITHUB_EXPORTER_CLIENT_ID || !env.GITHUB_EXPORTER_CLIENT_SECRET) {
            throw new Error('GitHub App OAuth credentials not configured');
        }

        const redirectUri = `${baseUrl}/api/github-exporter/callback`;
        
        return new GitHubExporterOAuthProvider(
            env.GITHUB_EXPORTER_CLIENT_ID,
            env.GITHUB_EXPORTER_CLIENT_SECRET,
            redirectUri
        );
    }
}