84 lines
2.3 KiB
TypeScript
84 lines
2.3 KiB
TypeScript
import { json, error } from '@sveltejs/kit';
|
|
import type { RequestHandler } from './$types';
|
|
import { env } from '$env/dynamic/private';
|
|
import { createPlacesService } from '$lib/utils/places';
|
|
|
|
const getPlacesService = () => {
|
|
const apiKey = env.GOOGLE_MAPS_API_KEY;
|
|
if (!apiKey) {
|
|
throw new Error('GOOGLE_MAPS_API_KEY environment variable is not set');
|
|
}
|
|
return createPlacesService(apiKey);
|
|
};
|
|
|
|
export const GET: RequestHandler = async ({ url, locals }) => {
|
|
if (!locals.user) {
|
|
throw error(401, 'Unauthorized');
|
|
}
|
|
|
|
const action = url.searchParams.get('action');
|
|
const query = url.searchParams.get('query');
|
|
const placeId = url.searchParams.get('placeId');
|
|
const lat = url.searchParams.get('lat');
|
|
const lng = url.searchParams.get('lng');
|
|
const radius = url.searchParams.get('radius');
|
|
const type = url.searchParams.get('type');
|
|
|
|
try {
|
|
const placesService = getPlacesService();
|
|
|
|
let location;
|
|
if (lat && lng) {
|
|
location = { lat: parseFloat(lat), lng: parseFloat(lng) };
|
|
}
|
|
|
|
switch (action) {
|
|
case 'search': {
|
|
if (!query) {
|
|
throw error(400, 'Query parameter is required for search');
|
|
}
|
|
const searchResults = await placesService.searchPlaces(query, location);
|
|
return json(searchResults);
|
|
}
|
|
|
|
case 'autocomplete': {
|
|
if (!query) {
|
|
throw error(400, 'Query parameter is required for autocomplete');
|
|
}
|
|
const suggestions = await placesService.getAutocompleteSuggestions(query, location);
|
|
return json(suggestions);
|
|
}
|
|
|
|
case 'details': {
|
|
if (!placeId) {
|
|
throw error(400, 'PlaceId parameter is required for details');
|
|
}
|
|
const placeDetails = await placesService.getPlaceDetails(placeId);
|
|
return json(placeDetails);
|
|
}
|
|
|
|
case 'nearby': {
|
|
if (!location) {
|
|
throw error(400, 'Location parameters (lat, lng) are required for nearby search');
|
|
}
|
|
const radiusNum = radius ? parseInt(radius) : 5000;
|
|
const nearbyResults = await placesService.findNearbyPlaces(
|
|
location,
|
|
radiusNum,
|
|
type || undefined
|
|
);
|
|
return json(nearbyResults);
|
|
}
|
|
|
|
default:
|
|
throw error(400, 'Invalid action parameter');
|
|
}
|
|
} catch (err) {
|
|
console.error('Places API error:', err);
|
|
if (err instanceof Error) {
|
|
throw error(500, err.message);
|
|
}
|
|
throw error(500, 'Failed to fetch places data');
|
|
}
|
|
};
|