← 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 })
  }
}