80 lines
2.7 KiB
TypeScript
80 lines
2.7 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { query } from '@/lib/db';
|
|
|
|
function parseGermanPrice(priceStr: any): number | null {
|
|
if (!priceStr) return null;
|
|
if (typeof priceStr === 'number') return Math.round(priceStr);
|
|
|
|
let cleaned = String(priceStr).replace(/[^0-9.,]/g, '').trim();
|
|
if (!cleaned) return null;
|
|
|
|
if (cleaned.includes('.') && !cleaned.includes(',')) {
|
|
cleaned = cleaned.replace(/\./g, '');
|
|
} else if (cleaned.includes('.') && cleaned.includes(',')) {
|
|
cleaned = cleaned.replace(/\./g, '').replace(',', '.');
|
|
} else if (cleaned.includes(',')) {
|
|
cleaned = cleaned.replace(',', '.');
|
|
}
|
|
|
|
const parsed = parseFloat(cleaned);
|
|
return isNaN(parsed) ? null : Math.round(parsed);
|
|
}
|
|
|
|
export async function POST(req: NextRequest) {
|
|
try {
|
|
const body = await req.json().catch(() => ({}));
|
|
const { searchParams } = new URL(req.url);
|
|
const hotelId = searchParams.get('hotelId') || body.hotelId;
|
|
|
|
if (!hotelId) {
|
|
return NextResponse.json({ success: false, error: 'hotelId fehlt' }, { status: 400 });
|
|
}
|
|
|
|
const numericPrice = parseGermanPrice(body.price);
|
|
|
|
// 1. In hotel_price_history eintragen mit echten Spalten
|
|
if (numericPrice !== null && numericPrice > 0) {
|
|
try {
|
|
await query(
|
|
`INSERT INTO hotel_price_history (hotel_id, price_numeric, price_raw, currency, nights, persons, tracked_at)
|
|
VALUES ($1::uuid, $2, $3, 'EUR', $4, $5, NOW())`,
|
|
[hotelId, numericPrice, String(body.price || ''), body.nights || 1, body.persons || 2]
|
|
);
|
|
} catch (err: any) {
|
|
console.error('DB Insert Error (hotel_price_history):', err.message);
|
|
}
|
|
}
|
|
|
|
// 2. Stammdaten aktualisieren
|
|
try {
|
|
await query(
|
|
`UPDATE hotels
|
|
SET name = COALESCE($1, name),
|
|
rating = COALESCE($2, rating),
|
|
review_count = COALESCE($3, review_count),
|
|
address = COALESCE($4, address),
|
|
image_url = COALESCE($5, image_url),
|
|
room_size_m2 = COALESCE($6, room_size_m2),
|
|
updated_at = NOW()
|
|
WHERE id = $7::uuid`,
|
|
[
|
|
body.hotelName || null,
|
|
body.rating || null,
|
|
body.reviewCount || null,
|
|
body.address || null,
|
|
body.image || null,
|
|
body.roomSizeM2 || null,
|
|
hotelId
|
|
]
|
|
);
|
|
} catch (err: any) {
|
|
console.error('DB Update Error (hotels):', err.message);
|
|
}
|
|
|
|
return NextResponse.json({ success: true, hotelId, parsedPrice: numericPrice });
|
|
} catch (error: any) {
|
|
console.error('Allgemeiner Fehler im Webhook:', error.message);
|
|
return NextResponse.json({ success: false, error: error.message }, { status: 200 });
|
|
}
|
|
}
|