← back to Wine Finder Next

app/api/ingest/drizly/route.ts

91 lines

// app/api/ingest/drizly/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { getDb } from '@/lib/db';

export async function POST(req: NextRequest) {
  try {
    const body = await req.json();
    const { products } = body;

    if (!Array.isArray(products)) {
      return NextResponse.json({ error: 'products array required' }, { status: 400 });
    }

    const db = getDb();
    const insertWine = db.prepare(`
      INSERT OR REPLACE INTO wines (
        name, varietal, vintage, region, country, 
        alc_percent, tasting_notes, drizly_id, 
        image_url
      ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
    `);

    const insertPrice = db.prepare(`
      INSERT INTO wine_prices (wine_id, vendor, price, collected_at, product_id, metadata)
      VALUES (?, 'drizly', ?, datetime('now'), ?, ?)
    `);

    let processed = 0;
    let errors = 0;

    for (const product of products) {
      try {
        // Insert or update wine
        const wineResult = insertWine.run(
          product.name || product.title || '',
          product.varietal || product.wine_type || null,
          product.vintage || null,
          product.region || null,
          product.country || product.origin || null,
          product.alcohol_percentage || product.abv || null,
          product.description || product.tasting_notes || null,
          product.drizly_id || product.product_id || null,
          product.image_url || product.image || null
        );

        // Insert price data
        if (product.price) {
          const metadata = {
            size: product.size,
            availability: product.availability,
            store_count: product.store_count,
            delivery_time: product.delivery_time,
            discount: product.discount,
            original_price: product.original_price
          };

          insertPrice.run(
            wineResult.lastInsertRowid,
            product.price,
            product.drizly_id || product.product_id,
            JSON.stringify(metadata)
          );
        }

        processed++;
      } catch (error) {
        console.error('Error processing product:', error);
        errors++;
      }
    }

    return NextResponse.json({
      success: true,
      processed,
      errors,
      message: `Processed ${processed} products from Drizly`
    });

  } catch (error) {
    console.error('Drizly ingest error:', error);
    return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
  }
}

export async function GET() {
  // Health check endpoint
  return NextResponse.json({ 
    status: 'Drizly ingest endpoint ready',
    timestamp: new Date().toISOString()
  });
}