60 lines
2.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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