bookwiz.io / app / auth / github / route.ts
route.ts
Raw
import { NextRequest, NextResponse } from 'next/server'

export async function GET(request: NextRequest) {
  const searchParams = request.nextUrl.searchParams
  const bookId = searchParams.get('bookId')
  const redirectUrl = searchParams.get('redirectUrl') || '/dashboard'

  if (!bookId) {
    return NextResponse.json(
      { error: 'bookId parameter is required' },
      { status: 400 }
    )
  }

  // Use the repository management OAuth app
  const clientId = process.env.GITHUB_REPO_CLIENT_ID
  if (!clientId) {
    return NextResponse.json(
      { error: 'GitHub repository OAuth not configured' },
      { status: 500 }
    )
  }

  // Use a simple state parameter for CSRF protection
  const state = Buffer.from(JSON.stringify({ bookId, redirectUrl })).toString('base64')

  // Use the custom callback URL for repository integration
  const customCallbackUrl = `${process.env.NEXT_PUBLIC_BASE_URL || request.nextUrl.origin}/auth/github/integration-callback`

  // GitHub OAuth URL for repository management
  const githubAuthUrl = new URL('https://github.com/login/oauth/authorize')
  githubAuthUrl.searchParams.set('client_id', clientId)
  githubAuthUrl.searchParams.set('redirect_uri', customCallbackUrl)
  githubAuthUrl.searchParams.set('scope', 'repo user:email')
  githubAuthUrl.searchParams.set('state', state)
  githubAuthUrl.searchParams.set('allow_signup', 'true')

  return NextResponse.redirect(githubAuthUrl.toString())
}