Files
awesome-app/app/api/search/route.ts

55 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-10-25 16:09:02 +02:00
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)
2025-10-25 16:09:02 +02:00
return NextResponse.json(
{
error: 'Internal server error',
...(process.env.NODE_ENV === 'development' && { details: errorMessage })
},
2025-10-25 16:09:02 +02:00
{ status: 500 }
)
}
}