59 lines
1.6 KiB
JavaScript
59 lines
1.6 KiB
JavaScript
import { fallbackGoogleReviews } from '@/lib/reviewUtils';
|
|
|
|
export const dynamic = 'force-static';
|
|
|
|
const SERPAPI_URL = 'https://serpapi.com/search.json?engine=google_maps_reviews&hl=en';
|
|
|
|
async function fetchGoogleReviews(apiKey, placeId) {
|
|
if (!apiKey || !placeId) {
|
|
throw new Error('Missing SERPAPI_KEY or SERPAPI_PLACE_ID');
|
|
}
|
|
|
|
const url = `${SERPAPI_URL}&api_key=${encodeURIComponent(apiKey)}&place_id=${encodeURIComponent(placeId)}`;
|
|
const response = await fetch(url);
|
|
|
|
if (!response.ok) {
|
|
const body = await response.text().catch(() => '');
|
|
throw new Error(`SerpAPI request failed ${response.status} ${response.statusText}: ${body}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
|
|
if (data.error) {
|
|
throw new Error(data.error.message || data.error);
|
|
}
|
|
|
|
if (!Array.isArray(data.reviews)) {
|
|
throw new Error('SerpAPI returned no reviews array');
|
|
}
|
|
|
|
return data.reviews;
|
|
}
|
|
|
|
export async function GET() {
|
|
const apiKey = process.env.SERPAPI_KEY;
|
|
const placeId = process.env.SERPAPI_PLACE_ID;
|
|
|
|
try {
|
|
const reviews = await fetchGoogleReviews(apiKey, placeId);
|
|
return new Response(JSON.stringify({ reviews, total: reviews.length }), {
|
|
status: 200,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
});
|
|
} catch (error) {
|
|
console.error('Reviews API error:', error);
|
|
return new Response(
|
|
JSON.stringify({
|
|
reviews: fallbackGoogleReviews,
|
|
total: fallbackGoogleReviews.length,
|
|
fallback: true,
|
|
error: error.message,
|
|
}),
|
|
{
|
|
status: 200,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
}
|
|
);
|
|
}
|
|
}
|