const express = require('express'); const router = express.Router(); const { authenticate } = require('../middleware/auth'); const { searchLimiter } = require('../middleware/rateLimiter'); const Post = require('../models/Post'); // Поиск постов по тексту и хэштегам router.get('/', authenticate, searchLimiter, async (req, res) => { try { const { query, hashtag, page = 1, limit = 20 } = req.query; let searchQuery = {}; // Применить whitelist настройки пользователя if (req.user.settings.whitelist.noFurry) { searchQuery.tags = { $ne: 'furry' }; } if (req.user.settings.whitelist.onlyAnime) { searchQuery.tags = 'anime'; } if (req.user.settings.whitelist.noNSFW) { searchQuery.isNSFW = false; } if (req.user.settings.whitelist.noHomo) { searchQuery.isHomo = { $ne: true }; } // Поиск по хэштегу if (hashtag) { searchQuery.hashtags = hashtag.toLowerCase(); } // Полнотекстовый поиск else if (query) { searchQuery.$text = { $search: query }; } else { return res.status(400).json({ error: 'Параметр query или hashtag обязателен' }); } const posts = await Post.find(searchQuery) .populate('author', 'username firstName lastName photoUrl') .populate('mentionedUsers', 'username firstName lastName') .populate('comments.author', 'username firstName lastName photoUrl') .sort(query ? { score: { $meta: 'textScore' } } : { createdAt: -1 }) .limit(limit * 1) .skip((page - 1) * limit) .exec(); const count = await Post.countDocuments(searchQuery); res.json({ posts, totalPages: Math.ceil(count / limit), currentPage: page }); } catch (error) { console.error('Ошибка поиска постов:', error); res.status(500).json({ error: 'Ошибка сервера' }); } }); // Получить популярные хэштеги router.get('/trending-hashtags', authenticate, async (req, res) => { try { const { limit = 20 } = req.query; const hashtags = await Post.aggregate([ { $unwind: '$hashtags' }, { $group: { _id: '$hashtags', count: { $sum: 1 } } }, { $sort: { count: -1 } }, { $limit: parseInt(limit) } ]); res.json({ hashtags: hashtags.map(h => ({ tag: h._id, count: h.count })) }); } catch (error) { console.error('Ошибка получения трендовых хэштегов:', error); res.status(500).json({ error: 'Ошибка сервера' }); } }); // Получить посты по хэштегу router.get('/hashtag/:tag', authenticate, async (req, res) => { try { const { page = 1, limit = 20 } = req.query; const hashtag = req.params.tag.toLowerCase(); const query = { hashtags: hashtag }; // Применить whitelist настройки пользователя if (req.user.settings.whitelist.noFurry) { query.tags = { $ne: 'furry' }; } if (req.user.settings.whitelist.onlyAnime) { query.tags = 'anime'; } if (req.user.settings.whitelist.noNSFW) { query.isNSFW = false; } if (req.user.settings.whitelist.noHomo) { query.isHomo = { $ne: true }; } const posts = await Post.find(query) .populate('author', 'username firstName lastName photoUrl') .populate('mentionedUsers', 'username firstName lastName') .populate('comments.author', 'username firstName lastName photoUrl') .sort({ createdAt: -1 }) .limit(limit * 1) .skip((page - 1) * limit) .exec(); const count = await Post.countDocuments(query); res.json({ hashtag, posts, totalPages: Math.ceil(count / limit), currentPage: page }); } catch (error) { console.error('Ошибка получения постов по хэштегу:', error); res.status(500).json({ error: 'Ошибка сервера' }); } }); module.exports = router;