60 lines
2.2 KiB
TypeScript
60 lines
2.2 KiB
TypeScript
import { NextResponse } from 'next/server';
|
||
|
||
// Required for Next.js static export (output: 'export' in next.config.ts)
|
||
export const dynamic = 'force-static';
|
||
export const revalidate = 3600; // Re-fetch at most every hour
|
||
|
||
export async function GET() {
|
||
const apiKey = "37eb7f83988cfd76ffb5c5af9adc25652efe5607e39997fc7d0e054d690ef25e";
|
||
// VG Fence Products, Ayr, ON - data_id from Google Maps
|
||
const dataId = "0x0:0xd39d64a69ab32c65";
|
||
|
||
try {
|
||
const url = `https://serpapi.com/search.json?engine=google_maps_reviews&hl=en&api_key=${apiKey}&data_id=${dataId}`;
|
||
|
||
const response = await fetch(url);
|
||
|
||
if (!response.ok) {
|
||
const errorText = await response.text();
|
||
console.error(`SerpAPI error! Status: ${response.status}, Body: ${errorText}`);
|
||
return NextResponse.json({
|
||
error: "SerpAPI Error",
|
||
status: response.status,
|
||
message: errorText
|
||
}, { status: 500 });
|
||
}
|
||
|
||
const data = await response.json();
|
||
|
||
if (data.error) {
|
||
console.error("SerpAPI Data Error:", data.error);
|
||
return NextResponse.json({ error: data.error }, { status: 500 });
|
||
}
|
||
|
||
// Normalize reviews to a consistent shape regardless of SerpAPI field names
|
||
const rawReviews = data.reviews || [];
|
||
// Return ALL reviews – let the UI filter if needed
|
||
const reviews = rawReviews.map((r: any) => ({
|
||
name: r.user?.name || r.username || "Customer",
|
||
rating: r.rating || 5,
|
||
text: r.snippet || r.extracted_snippet?.original || r.description || "",
|
||
date: r.date || r.iso_date || "",
|
||
profilePhoto: r.user?.thumbnail || r.user_thumbnail || null,
|
||
reviewLink: r.link || null,
|
||
}));
|
||
|
||
return NextResponse.json({
|
||
reviews,
|
||
total: reviews.length,
|
||
place: data.place_info || null,
|
||
});
|
||
|
||
} catch (error: any) {
|
||
console.error("Critical error in /api/google-reviews:", error);
|
||
return NextResponse.json({
|
||
error: "Internal Server Error",
|
||
message: error.message,
|
||
}, { status: 500 });
|
||
}
|
||
}
|