Update files

This commit is contained in:
glpshchn 2025-12-11 03:21:17 +03:00
parent 299f872020
commit 5c0d90ec22
5 changed files with 102 additions and 14 deletions

View File

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

View File

@ -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');

View File

@ -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 не передан');
}

View File

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

View File

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