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