import express from 'express'; import { getNotifiedArticles, getArticleFacets, searchArticles } from '../services/mongodb.js'; import { basicAuthMiddleware } from '../middlewares/auth.js'; const router = express.Router(); // Obtener artículos notificados (requiere autenticación obligatoria) router.get('/', basicAuthMiddleware, async (req, res) => { try { // Obtener usuario autenticado (requerido) const user = req.user; const isAdmin = user.role === 'admin'; // Construir filtro const filter = {}; // Si no es admin, solo mostrar sus artículos if (!isAdmin) { filter.username = user.username; } else if (req.query.username) { // Admin puede filtrar por username filter.username = req.query.username; } if (req.query.worker_name) filter.worker_name = req.query.worker_name; if (req.query.platform) filter.platform = req.query.platform; const articles = await getNotifiedArticles(filter); const limit = parseInt(req.query.limit) || 100; const offset = parseInt(req.query.offset) || 0; const paginated = articles.slice(offset, offset + limit); res.json({ articles: paginated, total: articles.length, limit, offset, }); } catch (error) { res.status(500).json({ error: error.message }); } }); // Obtener facets (valores únicos) para filtros (requiere autenticación obligatoria) router.get('/facets', basicAuthMiddleware, async (req, res) => { try { // Obtener usuario autenticado (requerido) const user = req.user; const isAdmin = user.role === 'admin'; // Si no es admin, solo mostrar facets de sus propios artículos const usernameFilter = isAdmin ? null : user.username; const facets = await getArticleFacets(usernameFilter); res.json(facets); } catch (error) { res.status(500).json({ error: error.message }); } }); // Buscar artículos en MongoDB (requiere autenticación obligatoria) router.get('/search', basicAuthMiddleware, async (req, res) => { try { const query = req.query.q || ''; if (!query.trim()) { return res.json({ articles: [], total: 0 }); } // Obtener usuario autenticado (requerido) const user = req.user; const isAdmin = user.role === 'admin'; // Construir filtro adicional si se proporciona const filter = {}; // Si no es admin, solo buscar sus artículos if (!isAdmin) { filter.username = user.username; } else if (req.query.username) { // Admin puede filtrar por username filter.username = req.query.username; } if (req.query.worker_name) filter.worker_name = req.query.worker_name; if (req.query.platform) filter.platform = req.query.platform; // Obtener modo de búsqueda (AND u OR), por defecto AND const searchMode = (req.query.mode || 'AND').toUpperCase(); // Usar la función de búsqueda eficiente por palabras const articles = await searchArticles(query, filter, searchMode); res.json({ articles: articles, total: articles.length, query: query, mode: searchMode, }); } catch (error) { res.status(500).json({ error: error.message }); } }); export default router;