Files
motovaultpro/backend/src/features/stations/domain/stations.service.ts
Eric Gullickson 8f5117a4e2 MVP Build
2025-08-09 12:47:15 -05:00

90 lines
2.4 KiB
TypeScript

/**
* @ai-summary Business logic for stations feature
*/
import { StationsRepository } from '../data/stations.repository';
import { googleMapsClient } from '../external/google-maps/google-maps.client';
import { StationSearchRequest, StationSearchResponse } from './stations.types';
import { logger } from '../../../core/logging/logger';
export class StationsService {
constructor(private repository: StationsRepository) {}
async searchNearbyStations(
request: StationSearchRequest,
userId: string
): Promise<StationSearchResponse> {
logger.info('Searching for stations', { userId, ...request });
// Search via Google Maps
const stations = await googleMapsClient.searchNearbyStations(
request.latitude,
request.longitude,
request.radius || 5000
);
// Cache stations for future reference
for (const station of stations) {
await this.repository.cacheStation(station);
}
// Sort by distance
stations.sort((a, b) => (a.distance || 0) - (b.distance || 0));
return {
stations,
searchLocation: {
latitude: request.latitude,
longitude: request.longitude
},
searchRadius: request.radius || 5000,
timestamp: new Date().toISOString()
};
}
async saveStation(
placeId: string,
userId: string,
data?: { nickname?: string; notes?: string; isFavorite?: boolean }
) {
// Get station details from cache
const station = await this.repository.getCachedStation(placeId);
if (!station) {
throw new Error('Station not found. Please search for stations first.');
}
// Save to user's saved stations
const saved = await this.repository.saveStation(userId, placeId, data);
return {
...saved,
station
};
}
async getUserSavedStations(userId: string) {
const savedStations = await this.repository.getUserSavedStations(userId);
// Enrich with cached station data
const enriched = await Promise.all(
savedStations.map(async (saved) => {
const station = await this.repository.getCachedStation(saved.stationId);
return {
...saved,
station
};
})
);
return enriched;
}
async removeSavedStation(placeId: string, userId: string) {
const removed = await this.repository.deleteSavedStation(userId, placeId);
if (!removed) {
throw new Error('Saved station not found');
}
}
}