mirror of
https://github.com/renee-png/acmcc.git
synced 2026-06-21 09:50:01 +00:00
183fe0a93c
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
87 lines
3.2 KiB
TypeScript
87 lines
3.2 KiB
TypeScript
const corsHeaders = {
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
|
|
};
|
|
|
|
Deno.serve(async (req) => {
|
|
if (req.method === 'OPTIONS') {
|
|
return new Response(null, { headers: corsHeaders });
|
|
}
|
|
|
|
try {
|
|
const { address, type, width, height } = await req.json();
|
|
|
|
if (!address) {
|
|
return new Response(
|
|
JSON.stringify({ success: false, error: 'Address is required' }),
|
|
{ status: 400, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
|
|
);
|
|
}
|
|
|
|
const apiKey = Deno.env.get('GOOGLE_MAPS_API_KEY');
|
|
if (!apiKey) {
|
|
return new Response(
|
|
JSON.stringify({ success: false, error: 'Google Maps API key not configured' }),
|
|
{ status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
|
|
);
|
|
}
|
|
|
|
const w = width || 320;
|
|
const h = height || 240;
|
|
const encodedAddress = encodeURIComponent(address);
|
|
|
|
if (type === 'satellite') {
|
|
// Return a static satellite map URL
|
|
const url = `https://maps.googleapis.com/maps/api/staticmap?center=${encodedAddress}&zoom=18&size=${w}x${h}&maptype=satellite&key=${apiKey}`;
|
|
const response = await fetch(url);
|
|
|
|
if (!response.ok) {
|
|
return new Response(
|
|
JSON.stringify({ success: false, error: `Static map request failed: ${response.status}` }),
|
|
{ status: response.status, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
|
|
);
|
|
}
|
|
|
|
const imageBuffer = await response.arrayBuffer();
|
|
return new Response(imageBuffer, {
|
|
headers: { ...corsHeaders, 'Content-Type': 'image/png', 'Cache-Control': 'public, max-age=86400' },
|
|
});
|
|
}
|
|
|
|
// Default: Street View
|
|
// First check if Street View is available via metadata
|
|
const metaUrl = `https://maps.googleapis.com/maps/api/streetview/metadata?location=${encodedAddress}&key=${apiKey}`;
|
|
const metaRes = await fetch(metaUrl);
|
|
const metaData = await metaRes.json();
|
|
|
|
if (metaData.status !== 'OK') {
|
|
return new Response(
|
|
JSON.stringify({ success: false, available: false, error: 'Street View not available' }),
|
|
{ status: 200, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
|
|
);
|
|
}
|
|
|
|
// Street View is available, fetch the image
|
|
const svUrl = `https://maps.googleapis.com/maps/api/streetview?size=${w}x${h}&location=${encodedAddress}&fov=90&heading=0&pitch=5&key=${apiKey}`;
|
|
const svRes = await fetch(svUrl);
|
|
|
|
if (!svRes.ok) {
|
|
return new Response(
|
|
JSON.stringify({ success: false, error: `Street View request failed: ${svRes.status}` }),
|
|
{ status: svRes.status, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
|
|
);
|
|
}
|
|
|
|
const svBuffer = await svRes.arrayBuffer();
|
|
return new Response(svBuffer, {
|
|
headers: { ...corsHeaders, 'Content-Type': 'image/jpeg', 'Cache-Control': 'public, max-age=86400' },
|
|
});
|
|
} catch (error) {
|
|
console.error('Google Maps proxy error:', error);
|
|
return new Response(
|
|
JSON.stringify({ success: false, error: error instanceof Error ? error.message : 'Unknown error' }),
|
|
{ status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
|
|
);
|
|
}
|
|
});
|