Update files
This commit is contained in:
parent
5c0d90ec22
commit
7a0ba6b827
|
|
@ -14,6 +14,34 @@ const Tag = require('../models/Tag');
|
||||||
const User = require('../models/User');
|
const User = require('../models/User');
|
||||||
const { extractHashtags } = require('../utils/hashtags');
|
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) => {
|
router.get('/', authenticate, async (req, res) => {
|
||||||
try {
|
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) => {
|
router.post('/', authenticate, strictPostLimiter, postCreationLimiter, fileUploadLimiter, uploadPostImages, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -33,11 +33,14 @@ export default function Feed({ user }) {
|
||||||
|
|
||||||
const loadSpecificPost = async (postId) => {
|
const loadSpecificPost = async (postId) => {
|
||||||
try {
|
try {
|
||||||
|
setLoading(true)
|
||||||
|
|
||||||
// Сначала проверить, есть ли пост уже в загруженных
|
// Сначала проверить, есть ли пост уже в загруженных
|
||||||
const existingPost = posts.find(p => p._id === postId)
|
const existingPost = posts.find(p => p._id === postId)
|
||||||
|
|
||||||
if (existingPost) {
|
if (existingPost) {
|
||||||
// Если пост уже загружен, просто прокрутить к нему
|
// Если пост уже загружен, просто прокрутить к нему
|
||||||
|
setLoading(false)
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const element = document.getElementById(`post-${postId}`)
|
const element = document.getElementById(`post-${postId}`)
|
||||||
if (element) {
|
if (element) {
|
||||||
|
|
@ -48,53 +51,52 @@ export default function Feed({ user }) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Попытаться загрузить конкретный пост по ID
|
// Попытаться загрузить конкретный пост по ID
|
||||||
|
let foundPost = null
|
||||||
try {
|
try {
|
||||||
const foundPost = await getPost(postId)
|
foundPost = await getPost(postId)
|
||||||
|
console.log('[Feed] Загружен конкретный пост:', foundPost?._id)
|
||||||
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
|
|
||||||
}
|
|
||||||
} catch (postError) {
|
} catch (postError) {
|
||||||
console.error('Ошибка загрузки конкретного поста:', postError)
|
console.error('[Feed] Ошибка загрузки конкретного поста:', postError)
|
||||||
// Если не удалось загрузить конкретный пост, попробуем найти в ленте
|
// Если не удалось загрузить конкретный пост, попробуем найти в ленте
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если пост не найден напрямую, загрузить ленту и попытаться найти там
|
// Загрузить ленту постов
|
||||||
const data = await getPosts({ filter, page: 1 })
|
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 => {
|
if (foundPost) {
|
||||||
const filtered = prev.filter(p => p._id !== postId)
|
// Проверить, нет ли его уже в ленте
|
||||||
return [foundInFeed, ...filtered]
|
const inFeed = data.posts.find(p => p._id === postId)
|
||||||
})
|
if (!inFeed) {
|
||||||
|
// Если поста нет в ленте, добавить его в начало
|
||||||
setTimeout(() => {
|
setPosts([foundPost, ...data.posts])
|
||||||
const element = document.getElementById(`post-${postId}`)
|
} else {
|
||||||
if (element) {
|
// Если пост уже в ленте, просто использовать ленту
|
||||||
element.scrollIntoView({ behavior: 'smooth', block: 'center' })
|
setPosts(data.posts)
|
||||||
}
|
}
|
||||||
}, 100)
|
|
||||||
} else {
|
} 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) {
|
} catch (error) {
|
||||||
console.error('Ошибка загрузки поста:', error)
|
console.error('[Feed] Ошибка загрузки поста:', error)
|
||||||
await loadPosts()
|
await loadPosts()
|
||||||
|
} finally {
|
||||||
|
setLoading(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue