mongodb
Signed-off-by: Omar Sánchez Pizarro <omar.sanchez@pistacero.net>
This commit is contained in:
@@ -1,14 +1,19 @@
|
||||
import express from 'express';
|
||||
import { getFavorites, getRedisClient } from '../services/redis.js';
|
||||
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
|
||||
router.get('/', async (req, res) => {
|
||||
// Obtener favoritos (requiere autenticación)
|
||||
router.get('/', basicAuthMiddleware, async (req, res) => {
|
||||
try {
|
||||
const favorites = await getFavorites();
|
||||
// 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 });
|
||||
@@ -18,41 +23,40 @@ router.get('/', async (req, res) => {
|
||||
// Añadir favorito (requiere autenticación)
|
||||
router.post('/', basicAuthMiddleware, async (req, res) => {
|
||||
try {
|
||||
const redisClient = getRedisClient();
|
||||
if (!redisClient) {
|
||||
return res.status(500).json({ error: 'Redis no está disponible' });
|
||||
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' });
|
||||
}
|
||||
|
||||
const key = `notified:${platform}:${id}`;
|
||||
const value = await redisClient.get(key);
|
||||
// Convertir id a string para consistencia
|
||||
const idStr = String(id);
|
||||
|
||||
if (!value) {
|
||||
return res.status(404).json({ error: 'Artículo no encontrado' });
|
||||
// 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}` });
|
||||
}
|
||||
|
||||
try {
|
||||
const articleData = JSON.parse(value);
|
||||
articleData.is_favorite = true;
|
||||
// Mantener el TTL existente
|
||||
const ttl = await redisClient.ttl(key);
|
||||
if (ttl > 0) {
|
||||
await redisClient.setex(key, ttl, JSON.stringify(articleData));
|
||||
} else {
|
||||
await redisClient.set(key, JSON.stringify(articleData));
|
||||
}
|
||||
|
||||
const favorites = await getFavorites();
|
||||
broadcast({ type: 'favorites_updated', data: favorites });
|
||||
res.json({ success: true, favorites });
|
||||
} catch (e) {
|
||||
res.status(500).json({ error: 'Error procesando artículo' });
|
||||
}
|
||||
// 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 });
|
||||
}
|
||||
});
|
||||
@@ -60,37 +64,35 @@ router.post('/', basicAuthMiddleware, async (req, res) => {
|
||||
// Eliminar favorito (requiere autenticación)
|
||||
router.delete('/:platform/:id', basicAuthMiddleware, async (req, res) => {
|
||||
try {
|
||||
const redisClient = getRedisClient();
|
||||
if (!redisClient) {
|
||||
return res.status(500).json({ error: 'Redis no está disponible' });
|
||||
const db = getDB();
|
||||
if (!db) {
|
||||
return res.status(500).json({ error: 'MongoDB no está disponible' });
|
||||
}
|
||||
|
||||
const { platform, id } = req.params;
|
||||
const key = `notified:${platform}:${id}`;
|
||||
const value = await redisClient.get(key);
|
||||
// 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' });
|
||||
}
|
||||
|
||||
if (!value) {
|
||||
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' });
|
||||
}
|
||||
|
||||
try {
|
||||
const articleData = JSON.parse(value);
|
||||
articleData.is_favorite = false;
|
||||
// Mantener el TTL existente
|
||||
const ttl = await redisClient.ttl(key);
|
||||
if (ttl > 0) {
|
||||
await redisClient.setex(key, ttl, JSON.stringify(articleData));
|
||||
} else {
|
||||
await redisClient.set(key, JSON.stringify(articleData));
|
||||
}
|
||||
|
||||
const favorites = await getFavorites();
|
||||
broadcast({ type: 'favorites_updated', data: favorites });
|
||||
res.json({ success: true, favorites });
|
||||
} catch (e) {
|
||||
res.status(500).json({ error: 'Error procesando artículo' });
|
||||
}
|
||||
// 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 });
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user