mirror of
https://github.com/renee-png/acmcc.git
synced 2026-06-21 09:50:01 +00:00
Add ACMCC app source, Supabase backend, and project config
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
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' } }
|
||||
);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user