Update files
This commit is contained in:
parent
299f872020
commit
5c0d90ec22
|
|
@ -95,6 +95,34 @@ 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 {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ const path = require('path');
|
|||
const http = require('http');
|
||||
|
||||
// Загрузить переменные окружения ДО импорта config
|
||||
dotenv.config({ path: path.join(__dirname, '.env') });
|
||||
// Загружаем из корня проекта (как в moderation/backend)
|
||||
const rootEnvPath = path.resolve(__dirname, '../.env');
|
||||
dotenv.config({ path: rootEnvPath });
|
||||
|
||||
const { generalLimiter } = require('./middleware/rateLimiter');
|
||||
const { initRedis } = require('./utils/redis');
|
||||
|
|
|
|||
|
|
@ -43,20 +43,36 @@ function manualValidateInitData(initDataRaw, botToken) {
|
|||
}
|
||||
|
||||
function validateAndParseInitData(initDataRaw, botToken = null) {
|
||||
// Для основного приложения используем TELEGRAM_BOT_TOKEN
|
||||
// Для модерации передается явно moderationBotToken
|
||||
const tokenToUse = botToken || config.telegramBotToken;
|
||||
|
||||
// Проверка что токен не пустая строка
|
||||
const hasValidToken = tokenToUse && typeof tokenToUse === 'string' && tokenToUse.trim().length > 0;
|
||||
|
||||
if (!hasValidToken) {
|
||||
const errorMsg = botToken
|
||||
? 'Bot token модерации не настроен (MODERATION_BOT_TOKEN)'
|
||||
: 'Bot token не настроен (TELEGRAM_BOT_TOKEN)';
|
||||
console.error('[Telegram] Token error:', {
|
||||
botTokenProvided: !!botToken,
|
||||
telegramBotTokenFromConfig: !!config.telegramBotToken,
|
||||
telegramBotTokenValue: config.telegramBotToken ? `${config.telegramBotToken.substring(0, 10)}...` : 'undefined',
|
||||
tokenToUseValue: tokenToUse ? `${tokenToUse.substring(0, 10)}...` : 'undefined',
|
||||
errorMsg
|
||||
});
|
||||
throw new Error(errorMsg);
|
||||
}
|
||||
|
||||
console.log('[Telegram] validateAndParseInitData called:', {
|
||||
hasInitData: !!initDataRaw,
|
||||
type: typeof initDataRaw,
|
||||
length: initDataRaw?.length || 0,
|
||||
preview: initDataRaw?.substring(0, 100) + '...',
|
||||
usingModerationToken: !!botToken
|
||||
usingModerationToken: !!botToken,
|
||||
hasTelegramBotToken: !!config.telegramBotToken
|
||||
});
|
||||
|
||||
if (!tokenToUse) {
|
||||
throw new Error('Bot token не настроен');
|
||||
}
|
||||
|
||||
if (!initDataRaw || typeof initDataRaw !== 'string') {
|
||||
throw new Error('initData не передан');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { useState, useEffect } from 'react'
|
||||
import { useSearchParams, useNavigate } from 'react-router-dom'
|
||||
import { getPosts } from '../utils/api'
|
||||
import { getPosts, getPost } from '../utils/api'
|
||||
import PostCard from '../components/PostCard'
|
||||
import CreatePostModal from '../components/CreatePostModal'
|
||||
import { Plus, Settings } from 'lucide-react'
|
||||
|
|
@ -33,9 +33,23 @@ export default function Feed({ user }) {
|
|||
|
||||
const loadSpecificPost = async (postId) => {
|
||||
try {
|
||||
// Загрузить посты и найти нужный
|
||||
const data = await getPosts({})
|
||||
const foundPost = data.posts.find(p => p._id === postId)
|
||||
// Сначала проверить, есть ли пост уже в загруженных
|
||||
const existingPost = posts.find(p => p._id === postId)
|
||||
|
||||
if (existingPost) {
|
||||
// Если пост уже загружен, просто прокрутить к нему
|
||||
setTimeout(() => {
|
||||
const element = document.getElementById(`post-${postId}`)
|
||||
if (element) {
|
||||
element.scrollIntoView({ behavior: 'smooth', block: 'center' })
|
||||
}
|
||||
}, 100)
|
||||
return
|
||||
}
|
||||
|
||||
// Попытаться загрузить конкретный пост по ID
|
||||
try {
|
||||
const foundPost = await getPost(postId)
|
||||
|
||||
if (foundPost) {
|
||||
// Если пост найден, добавить его в начало списка
|
||||
|
|
@ -51,6 +65,29 @@ export default function Feed({ user }) {
|
|||
element.scrollIntoView({ behavior: 'smooth', block: 'center' })
|
||||
}
|
||||
}, 100)
|
||||
return
|
||||
}
|
||||
} catch (postError) {
|
||||
console.error('Ошибка загрузки конкретного поста:', postError)
|
||||
// Если не удалось загрузить конкретный пост, попробуем найти в ленте
|
||||
}
|
||||
|
||||
// Если пост не найден напрямую, загрузить ленту и попытаться найти там
|
||||
const data = await getPosts({ filter, page: 1 })
|
||||
const foundInFeed = data.posts.find(p => p._id === postId)
|
||||
|
||||
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)
|
||||
} else {
|
||||
// Если пост не найден, загрузить все посты
|
||||
await loadPosts()
|
||||
|
|
|
|||
|
|
@ -117,6 +117,11 @@ export const getPosts = async (params = {}) => {
|
|||
return response.data
|
||||
}
|
||||
|
||||
export const getPost = async (postId) => {
|
||||
const response = await api.get(`/posts/${postId}`)
|
||||
return response.data.post
|
||||
}
|
||||
|
||||
export const createPost = async (formData) => {
|
||||
const response = await api.post('/posts', formData, {
|
||||
headers: {
|
||||
|
|
|
|||
Loading…
Reference in New Issue