Files
flyer-crawler.projectium.com/src/services/googleGeocodingService.server.ts
Torben Sorensen 921c48fc57
All checks were successful
Deploy to Test Environment / deploy-to-test (push) Successful in 10m14s
more unit test fixes now the UseProfileAddress OOM has been identified
2025-12-23 15:50:01 -08:00

57 lines
1.9 KiB
TypeScript

// src/services/googleGeocodingService.server.ts
import type { Logger } from 'pino';
import { logger as defaultLogger } from './logger.server';
export class GoogleGeocodingService {
private readonly baseUrl = 'https://maps.googleapis.com/maps/api/geocode/json';
/**
* Geocodes an address using the Google Maps Geocoding API.
* @param address The address string to geocode.
* @param logger A logger instance.
* @returns A promise that resolves to the coordinates or null if not found.
*/
async geocode(
address: string,
logger: Logger = defaultLogger,
): Promise<{ lat: number; lng: number } | null> {
const apiKey = process.env.GOOGLE_MAPS_API_KEY;
if (!apiKey) {
logger.error('[GoogleGeocodingService] API key is missing.');
throw new Error('GOOGLE_MAPS_API_KEY is not set.');
}
const url = `${this.baseUrl}?address=${encodeURIComponent(address)}&key=${apiKey}`;
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Google Maps API returned status ${response.status}`);
}
const data = await response.json();
if (data.status === 'OK' && data.results.length > 0) {
logger.info(
{ address, result: data.results[0].geometry.location },
`[GoogleGeocodingService] Successfully geocoded address`,
);
return data.results[0].geometry.location;
}
logger.warn(
{ address, status: data.status },
'[GoogleGeocodingService] Geocoding failed or returned no results.',
);
return null;
} catch (error) {
logger.error(
{ err: error, address },
'[GoogleGeocodingService] An error occurred while calling the Google Maps API.',
);
throw error; // Re-throw to allow the calling service to handle the failure (e.g., by falling back).
}
}
}
export const googleGeocodingService = new GoogleGeocodingService();