import express from 'express'; import { getNotifiedArticles, getArticleFacets, searchArticles, getArticle } 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; // Siempre incluir el username del usuario autenticado para incluir su is_favorite filter.currentUsername = user.username; 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; // Siempre incluir el username del usuario autenticado para incluir su is_favorite filter.currentUsername = user.username; // 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 }); } }); // Obtener un artículo específico por plataforma e ID (requiere autenticación obligatoria) router.get('/:platform/:id', basicAuthMiddleware, async (req, res) => { try { const { platform, id } = req.params; // Obtener usuario autenticado (requerido) const user = req.user; const isAdmin = user.role === 'admin'; // Obtener el artículo con is_favorite del usuario autenticado const article = await getArticle(platform, id, user.username); if (!article) { return res.status(404).json({ error: 'Artículo no encontrado' }); } // Si no es admin, verificar que el artículo pertenezca al usuario // Verificar en user_info si el artículo tiene alguna relación con el usuario if (!isAdmin) { const userInfoList = article.user_info || []; const userHasAccess = userInfoList.some(ui => ui.username === user.username); // También verificar compatibilidad con estructura antigua if (!userHasAccess && article.username !== user.username) { return res.status(403).json({ error: 'No tienes permiso para ver este artículo' }); } } res.json(article); } catch (error) { res.status(500).json({ error: error.message }); } }); export default router;