82 lines
2.4 KiB
JavaScript
82 lines
2.4 KiB
JavaScript
import express from 'express';
|
|
import { readJSON } from '../utils/fileUtils.js';
|
|
import { PATHS } from '../config/constants.js';
|
|
import { getFavorites, getNotifiedArticles, getRedisClient } from '../services/redis.js';
|
|
import { basicAuthMiddleware } from '../middlewares/auth.js';
|
|
import { broadcast } from '../services/websocket.js';
|
|
|
|
const router = express.Router();
|
|
|
|
// Obtener estadísticas
|
|
router.get('/stats', async (req, res) => {
|
|
try {
|
|
const workers = readJSON(PATHS.WORKERS, { items: [] });
|
|
const favorites = await getFavorites();
|
|
const notifiedArticles = await getNotifiedArticles();
|
|
|
|
const stats = {
|
|
totalWorkers: workers.items?.length || 0,
|
|
activeWorkers: (workers.items || []).filter(w => !workers.disabled?.includes(w.name)).length,
|
|
totalFavorites: favorites.length,
|
|
totalNotified: notifiedArticles.length,
|
|
platforms: {
|
|
wallapop: notifiedArticles.filter(a => a.platform === 'wallapop').length,
|
|
vinted: notifiedArticles.filter(a => a.platform === 'vinted').length,
|
|
},
|
|
};
|
|
|
|
res.json(stats);
|
|
} catch (error) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// Limpiar toda la caché de Redis (requiere autenticación)
|
|
router.delete('/cache', basicAuthMiddleware, async (req, res) => {
|
|
try {
|
|
const redisClient = getRedisClient();
|
|
if (!redisClient) {
|
|
return res.status(500).json({ error: 'Redis no está disponible' });
|
|
}
|
|
|
|
// Obtener todas las claves que empiezan con 'notified:'
|
|
const keys = await redisClient.keys('notified:*');
|
|
|
|
if (!keys || keys.length === 0) {
|
|
return res.json({
|
|
success: true,
|
|
message: 'Cache ya está vacío',
|
|
count: 0
|
|
});
|
|
}
|
|
|
|
// Eliminar todas las claves
|
|
const count = keys.length;
|
|
for (const key of keys) {
|
|
await redisClient.del(key);
|
|
}
|
|
|
|
// Notificar a los clientes WebSocket
|
|
broadcast({
|
|
type: 'cache_cleared',
|
|
data: { count, timestamp: Date.now() }
|
|
});
|
|
|
|
// También actualizar favoritos (debería estar vacío ahora)
|
|
const favorites = await getFavorites();
|
|
broadcast({ type: 'favorites_updated', data: favorites });
|
|
|
|
res.json({
|
|
success: true,
|
|
message: `Cache limpiado: ${count} artículos eliminados`,
|
|
count
|
|
});
|
|
} catch (error) {
|
|
console.error('Error limpiando cache de Redis:', error);
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
export default router;
|
|
|