Fixed 500 Internal Server Error in search API by correcting the FTS5 full-text search query join. The previous query incorrectly joined fts.rowid directly to repositories.id, but FTS rowid corresponds to the readmes table. Now properly joins through readmes table first. Also enhanced error logging with detailed error messages in development mode for easier debugging. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { searchRepositories } from '@/lib/db'
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const searchParams = request.nextUrl.searchParams
|
|
const query = searchParams.get('q')
|
|
|
|
if (!query) {
|
|
return NextResponse.json(
|
|
{ error: 'Query parameter "q" is required' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
// Parse pagination
|
|
const page = parseInt(searchParams.get('page') || '1', 10)
|
|
const limit = parseInt(searchParams.get('limit') || '20', 10)
|
|
const offset = (page - 1) * limit
|
|
|
|
// Parse filters
|
|
const language = searchParams.get('language') || undefined
|
|
const category = searchParams.get('category') || undefined
|
|
const minStars = searchParams.get('minStars')
|
|
? parseInt(searchParams.get('minStars')!, 10)
|
|
: undefined
|
|
const sortBy = (searchParams.get('sortBy') || 'relevance') as 'relevance' | 'stars' | 'recent'
|
|
|
|
// Perform search
|
|
const results = searchRepositories({
|
|
query,
|
|
limit,
|
|
offset,
|
|
language,
|
|
minStars,
|
|
category,
|
|
sortBy
|
|
})
|
|
|
|
return NextResponse.json(results)
|
|
} catch (error) {
|
|
console.error('Search API error:', error)
|
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error'
|
|
console.error('Error details:', errorMessage)
|
|
|
|
return NextResponse.json(
|
|
{
|
|
error: 'Internal server error',
|
|
...(process.env.NODE_ENV === 'development' && { details: errorMessage })
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|