Files
wallabicher/web/backend/routes/favorites.js
Omar Sánchez Pizarro 81bf0675ed mongodb
Signed-off-by: Omar Sánchez Pizarro <omar.sanchez@pistacero.net>
2026-01-20 03:21:50 +01:00

102 lines
3.6 KiB
JavaScript

import express from 'express';
import { getFavorites, getDB, updateArticleFavorite, getArticle } from '../services/mongodb.js';
import { basicAuthMiddleware } from '../middlewares/auth.js';
import { broadcast } from '../services/websocket.js';
const router = express.Router();
// Obtener favoritos (requiere autenticación)
router.get('/', basicAuthMiddleware, async (req, res) => {
try {
// Obtener usuario autenticado (requerido)
const user = req.user;
// Todos los usuarios (incluidos admins) ven solo sus propios favoritos
const username = user.username;
const favorites = await getFavorites(username);
res.json(favorites);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Añadir favorito (requiere autenticación)
router.post('/', basicAuthMiddleware, async (req, res) => {
try {
const db = getDB();
if (!db) {
return res.status(500).json({ error: 'MongoDB no está disponible' });
}
// Verificar que el usuario está autenticado (middleware ya lo valida, pero doble verificación)
if (!req.user || !req.user.username) {
return res.status(401).json({ error: 'Se requiere autenticación', message: 'Se requiere autenticación para marcar favoritos' });
}
const username = req.user.username;
const { platform, id } = req.body;
if (!platform || !id) {
return res.status(400).json({ error: 'platform e id son requeridos' });
}
// Convertir id a string para consistencia
const idStr = String(id);
// Verificar si el artículo existe
const article = await getArticle(platform, idStr);
if (!article) {
return res.status(404).json({ error: `Artículo no encontrado en MongoDB: ${platform}:${idStr}` });
}
// Actualizar favorito para el usuario autenticado
await updateArticleFavorite(platform, idStr, true, username);
// Obtener favoritos del usuario autenticado (todos ven solo los suyos)
const favorites = await getFavorites(username);
broadcast({ type: 'favorites_updated', data: favorites, username });
res.json({ success: true, favorites });
} catch (error) {
console.error('Error en POST /favorites:', error);
res.status(500).json({ error: error.message });
}
});
// Eliminar favorito (requiere autenticación)
router.delete('/:platform/:id', basicAuthMiddleware, async (req, res) => {
try {
const db = getDB();
if (!db) {
return res.status(500).json({ error: 'MongoDB no está disponible' });
}
// Verificar que el usuario está autenticado (middleware ya lo valida, pero doble verificación)
if (!req.user || !req.user.username) {
return res.status(401).json({ error: 'Se requiere autenticación', message: 'Se requiere autenticación para eliminar favoritos' });
}
const username = req.user.username;
const { platform, id } = req.params;
const idStr = String(id);
// Verificar si el artículo existe
const article = await getArticle(platform, idStr);
if (!article) {
return res.status(404).json({ error: 'Artículo no encontrado' });
}
// Actualizar favorito para el usuario autenticado
await updateArticleFavorite(platform, idStr, false, username);
// Obtener favoritos del usuario autenticado (todos ven solo los suyos)
const favorites = await getFavorites(username);
broadcast({ type: 'favorites_updated', data: favorites, username });
res.json({ success: true, favorites });
} catch (error) {
console.error('Error en DELETE /favorites:', error);
res.status(500).json({ error: error.message });
}
});
export default router;