From 7a0ba6b827eab433741daeb8859a0bd31863ba08 Mon Sep 17 00:00:00 2001 From: glpshchn <464976@niuitmo.ru> Date: Thu, 11 Dec 2025 03:57:03 +0300 Subject: [PATCH] Update files --- backend/routes/posts.js | 56 ++++++++++++++-------------- frontend/src/pages/Feed.jsx | 74 +++++++++++++++++++------------------ 2 files changed, 66 insertions(+), 64 deletions(-) diff --git a/backend/routes/posts.js b/backend/routes/posts.js index 66857f7..ad08605 100644 --- a/backend/routes/posts.js +++ b/backend/routes/posts.js @@ -14,6 +14,34 @@ const Tag = require('../models/Tag'); const User = require('../models/User'); const { extractHashtags } = require('../utils/hashtags'); +// Получить один пост по ID (должен быть ПЕРЕД общим маршрутом GET /) +router.get('/:id', authenticate, async (req, res) => { + try { + const post = await Post.findById(req.params.id) + .populate('author', 'username firstName lastName photoUrl') + .populate('mentionedUsers', 'username firstName lastName') + .populate('comments.author', 'username firstName lastName photoUrl') + .exec(); + + if (!post) { + return res.status(404).json({ error: 'Пост не найден' }); + } + + // Проверить whitelist настройки пользователя + if (req.user.settings.whitelist.noNSFW && post.isNSFW) { + return res.status(403).json({ error: 'Пост скрыт настройками' }); + } + if (req.user.settings.whitelist.noHomo && post.isHomo) { + return res.status(403).json({ error: 'Пост скрыт настройками' }); + } + + res.json({ post }); + } catch (error) { + console.error('Ошибка получения поста:', error); + res.status(500).json({ error: 'Ошибка сервера' }); + } +}); + // Получить ленту постов router.get('/', authenticate, async (req, res) => { try { @@ -95,34 +123,6 @@ router.get('/', authenticate, async (req, res) => { } }); -// Получить один пост по ID -router.get('/:id', authenticate, async (req, res) => { - try { - const post = await Post.findById(req.params.id) - .populate('author', 'username firstName lastName photoUrl') - .populate('mentionedUsers', 'username firstName lastName') - .populate('comments.author', 'username firstName lastName photoUrl') - .exec(); - - if (!post) { - return res.status(404).json({ error: 'Пост не найден' }); - } - - // Проверить whitelist настройки пользователя - if (req.user.settings.whitelist.noNSFW && post.isNSFW) { - return res.status(403).json({ error: 'Пост скрыт настройками' }); - } - if (req.user.settings.whitelist.noHomo && post.isHomo) { - return res.status(403).json({ error: 'Пост скрыт настройками' }); - } - - res.json({ post }); - } catch (error) { - console.error('Ошибка получения поста:', error); - res.status(500).json({ error: 'Ошибка сервера' }); - } -}); - // Создать пост router.post('/', authenticate, strictPostLimiter, postCreationLimiter, fileUploadLimiter, uploadPostImages, async (req, res) => { try { diff --git a/frontend/src/pages/Feed.jsx b/frontend/src/pages/Feed.jsx index 235dbca..60b2ca9 100644 --- a/frontend/src/pages/Feed.jsx +++ b/frontend/src/pages/Feed.jsx @@ -33,11 +33,14 @@ export default function Feed({ user }) { const loadSpecificPost = async (postId) => { try { + setLoading(true) + // Сначала проверить, есть ли пост уже в загруженных const existingPost = posts.find(p => p._id === postId) if (existingPost) { // Если пост уже загружен, просто прокрутить к нему + setLoading(false) setTimeout(() => { const element = document.getElementById(`post-${postId}`) if (element) { @@ -48,53 +51,52 @@ export default function Feed({ user }) { } // Попытаться загрузить конкретный пост по ID + let foundPost = null try { - const foundPost = await getPost(postId) - - if (foundPost) { - // Если пост найден, добавить его в начало списка - setPosts(prev => { - const filtered = prev.filter(p => p._id !== postId) - return [foundPost, ...filtered] - }) - - // Прокрутить к посту после загрузки - setTimeout(() => { - const element = document.getElementById(`post-${postId}`) - if (element) { - element.scrollIntoView({ behavior: 'smooth', block: 'center' }) - } - }, 100) - return - } + foundPost = await getPost(postId) + console.log('[Feed] Загружен конкретный пост:', foundPost?._id) } catch (postError) { - console.error('Ошибка загрузки конкретного поста:', postError) + console.error('[Feed] Ошибка загрузки конкретного поста:', postError) // Если не удалось загрузить конкретный пост, попробуем найти в ленте } - // Если пост не найден напрямую, загрузить ленту и попытаться найти там + // Загрузить ленту постов const data = await getPosts({ filter, page: 1 }) - const foundInFeed = data.posts.find(p => p._id === postId) + console.log('[Feed] Загружена лента, найдено постов:', data.posts.length) - if (foundInFeed) { - setPosts(prev => { - const filtered = prev.filter(p => p._id !== postId) - return [foundInFeed, ...filtered] - }) - - setTimeout(() => { - const element = document.getElementById(`post-${postId}`) - if (element) { - element.scrollIntoView({ behavior: 'smooth', block: 'center' }) - } - }, 100) + // Если конкретный пост был загружен, добавить его в начало + if (foundPost) { + // Проверить, нет ли его уже в ленте + const inFeed = data.posts.find(p => p._id === postId) + if (!inFeed) { + // Если поста нет в ленте, добавить его в начало + setPosts([foundPost, ...data.posts]) + } else { + // Если пост уже в ленте, просто использовать ленту + setPosts(data.posts) + } } else { - // Если пост не найден, загрузить все посты - await loadPosts() + // Если конкретный пост не загружен, использовать только ленту + setPosts(data.posts) } + + setHasMore(1 < data.totalPages) + setPage(1) + + // Прокрутить к посту после загрузки + setTimeout(() => { + const element = document.getElementById(`post-${postId}`) + if (element) { + element.scrollIntoView({ behavior: 'smooth', block: 'center' }) + } else { + console.warn('[Feed] Элемент поста не найден после загрузки:', postId) + } + }, 300) } catch (error) { - console.error('Ошибка загрузки поста:', error) + console.error('[Feed] Ошибка загрузки поста:', error) await loadPosts() + } finally { + setLoading(false) } }