← back to Wine Finder Next
app/api/featured/route.ts
82 lines
import { NextResponse } from 'next/server'
// Import wine scrapers
const vivinoScraper = require('@/lib/services/vivinoScraper')
const totalWineScraper = require('@/lib/services/totalWineScraper')
export async function GET() {
try {
// Fetch featured wines from multiple sources in parallel
const [
cabernetResults,
pinotResults,
chardonnayResults,
merlotResults
] = await Promise.all([
vivinoScraper.search('cabernet sauvignon').catch((e: Error) => { console.log('Vivino cabernet failed:', e.message); return { wines: [] }; }),
vivinoScraper.search('pinot noir').catch((e: Error) => { console.log('Vivino pinot failed:', e.message); return { wines: [] }; }),
totalWineScraper.search('chardonnay').catch((e: Error) => { console.log('Total Wine chardonnay failed:', e.message); return { wines: [] }; }),
totalWineScraper.search('merlot').catch((e: Error) => { console.log('Total Wine merlot failed:', e.message); return { wines: [] }; }),
])
// Combine and categorize results - extract wines arrays from scraper responses
const allWines = [
...(cabernetResults.wines || []),
...(pinotResults.wines || []),
...(chardonnayResults.wines || []),
...(merlotResults.wines || [])
]
console.log(`Fetched ${allWines.length} total wines from scrapers`)
if (allWines.length === 0) {
return NextResponse.json({
featured: [],
newVintages: [],
deals: [],
total: 0,
error: 'No wines available from scrapers at this time. Please try again later.'
})
}
// Sort by various criteria
const newVintages = allWines
.filter(w => {
const year = parseInt(w.vintage || '0')
return year >= 2021 && year <= 2024
})
.sort((a, b) => parseInt(b.vintage || '0') - parseInt(a.vintage || '0'))
.slice(0, 12)
.map(w => ({ ...w, badge: 'new' as const }))
const deals = allWines
.filter(w => parseFloat(w.price) < 50)
.sort((a, b) => parseFloat(a.price) - parseFloat(b.price))
.slice(0, 12)
.map(w => ({ ...w, badge: 'deal' as const }))
const featured = allWines
.filter(w => w.rating && parseFloat(w.rating) >= 4.0)
.sort((a, b) => parseFloat(b.rating || '0') - parseFloat(a.rating || '0'))
.slice(0, 12)
.map(w => ({ ...w, badge: 'featured' as const }))
return NextResponse.json({
featured,
newVintages,
deals,
total: allWines.length
})
} catch (error) {
console.error('Error fetching featured wines:', error)
return NextResponse.json({
featured: [],
newVintages: [],
deals: [],
total: 0,
error: 'Failed to fetch wines from sources'
}, { status: 500 })
}
}