feat:use GMaps places api for searching poi's
This commit is contained in:
83
src/routes/api/places/+server.ts
Normal file
83
src/routes/api/places/+server.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
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');
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user