Gas Station Feature
This commit is contained in:
79
backend/src/features/stations/jobs/cache-cleanup.job.ts
Normal file
79
backend/src/features/stations/jobs/cache-cleanup.job.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
/**
|
||||
* @ai-summary Scheduled cache cleanup job for stations
|
||||
*/
|
||||
|
||||
import { Pool } from 'pg';
|
||||
import { logger } from '../../../core/logging/logger';
|
||||
|
||||
/**
|
||||
* Clean up expired station cache entries
|
||||
* Runs daily at 2 AM
|
||||
* Deletes entries older than 24 hours
|
||||
*/
|
||||
export async function cleanupStationCache(pool: Pool): Promise<void> {
|
||||
const startTime = Date.now();
|
||||
|
||||
try {
|
||||
logger.info('Starting station cache cleanup job');
|
||||
|
||||
// Calculate timestamp for entries older than 24 hours
|
||||
const cutoffTime = new Date(Date.now() - 24 * 60 * 60 * 1000);
|
||||
|
||||
// Execute cleanup query
|
||||
const result = await pool.query(
|
||||
`DELETE FROM station_cache
|
||||
WHERE created_at < $1
|
||||
RETURNING id`,
|
||||
[cutoffTime]
|
||||
);
|
||||
|
||||
const deletedCount = result.rowCount || 0;
|
||||
const duration = Date.now() - startTime;
|
||||
|
||||
logger.info('Station cache cleanup completed', {
|
||||
deletedCount,
|
||||
durationMs: duration,
|
||||
cutoffTime: cutoffTime.toISOString()
|
||||
});
|
||||
|
||||
// Log warning if cleanup took longer than expected
|
||||
if (duration > 5000) {
|
||||
logger.warn('Station cache cleanup took longer than expected', {
|
||||
durationMs: duration
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error('Station cache cleanup failed', {
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
durationMs: Date.now() - startTime
|
||||
});
|
||||
|
||||
// Re-throw to let scheduler handle failure
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cache statistics for monitoring
|
||||
*/
|
||||
export async function getCacheStats(pool: Pool): Promise<{
|
||||
totalEntries: number;
|
||||
oldestEntry: Date | null;
|
||||
newestEntry: Date | null;
|
||||
}> {
|
||||
const result = await pool.query(
|
||||
`SELECT
|
||||
COUNT(*) as total,
|
||||
MIN(created_at) as oldest,
|
||||
MAX(created_at) as newest
|
||||
FROM station_cache`
|
||||
);
|
||||
|
||||
const row = result.rows[0];
|
||||
|
||||
return {
|
||||
totalEntries: parseInt(row.total, 10),
|
||||
oldestEntry: row.oldest ? new Date(row.oldest) : null,
|
||||
newestEntry: row.newest ? new Date(row.newest) : null
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user