SCRAPE-17: Implement GET /admin/scraper/status endpoint #22
File diff suppressed because it is too large
Load Diff
@ -1150,9 +1150,13 @@ const crypto = require('crypto');
|
|||||||
const {
|
const {
|
||||||
isScraperRunning,
|
isScraperRunning,
|
||||||
acquireLock,
|
acquireLock,
|
||||||
releaseLock
|
releaseLock,
|
||||||
|
getCurrentJobId,
|
||||||
|
getScheduleExpression,
|
||||||
|
getNextScheduledRun
|
||||||
} = require('../jobs/scraperJob');
|
} = require('../jobs/scraperJob');
|
||||||
const { runScrape } = require('../services/scraperService');
|
const { runScrape } = require('../services/scraperService');
|
||||||
|
const scraperConfig = require('../config/scraper');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* POST /api/admin/scraper/run
|
* POST /api/admin/scraper/run
|
||||||
@ -1206,5 +1210,45 @@ router.post('/scraper/run', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GET /api/admin/scraper/status
|
||||||
|
* Get current scraper status including running state, last run details,
|
||||||
|
* next scheduled run, and schedule expression.
|
||||||
|
*/
|
||||||
|
router.get('/scraper/status', async (req, res) => {
|
||||||
|
try {
|
||||||
|
const db = req.app.locals.db;
|
||||||
|
|
||||||
|
// Get last run from history
|
||||||
|
const lastRunDoc = await db.collection(scraperConfig.COLLECTIONS.SCRAPER_RUNS)
|
||||||
|
.findOne({}, { sort: { startedAt: -1 } });
|
||||||
|
|
||||||
|
const lastRun = lastRunDoc ? {
|
||||||
|
jobId: lastRunDoc.jobId,
|
||||||
|
timestamp: lastRunDoc.startedAt,
|
||||||
|
status: lastRunDoc.status,
|
||||||
|
duration: lastRunDoc.duration,
|
||||||
|
trigger: lastRunDoc.trigger,
|
||||||
|
unitsProcessed: lastRunDoc.unitsProcessed,
|
||||||
|
pricesInserted: lastRunDoc.pricesInserted,
|
||||||
|
errors: lastRunDoc.errors?.length > 0 ? lastRunDoc.errors : null
|
||||||
|
} : null;
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
data: {
|
||||||
|
currentStatus: isScraperRunning() ? 'running' : 'idle',
|
||||||
|
runningJobId: isScraperRunning() ? getCurrentJobId() : null,
|
||||||
|
lastRun,
|
||||||
|
nextScheduledRun: getNextScheduledRun(),
|
||||||
|
schedule: getScheduleExpression()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching scraper status:', error);
|
||||||
|
res.status(503).json({ error: 'Service temporarily unavailable' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
module.exports.clearStatsCache = clearStatsCache;
|
module.exports.clearStatsCache = clearStatsCache;
|
||||||
|
|||||||
Reference in New Issue
Block a user