Update files

This commit is contained in:
glpshchn 2025-12-11 03:57:03 +03:00
parent 5c0d90ec22
commit 7a0ba6b827
2 changed files with 66 additions and 64 deletions

View File

@ -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 {

View File

@ -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)
}
}