import express from 'express'; import cors from 'cors'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import generateReviewRouter from './src/api/generate-review.js'; import TelegramBot from 'node-telegram-bot-api'; import PocketBase from 'pocketbase'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const app = express(); const port = process.env.PORT || 3000; // Инициализация Telegram бота const bot = new TelegramBot('8057681898:AAE0BCbcg6M0BgREaOeXsjK7yXBHVpOIs9c', { polling: false }); // Инициализация PocketBase const pb = new PocketBase('https://pocketbase.campfiregg.ru'); // Middleware app.use(cors()); app.use(express.json()); // API routes app.use('/api', generateReviewRouter); // Telegram авторизация app.post('/api/auth/telegram', async (req, res) => { try { const { id, first_name, username, photo_url, auth_date, hash } = req.body; if (!id) { return res.status(400).json({ success: false, error: 'Отсутствует ID пользователя Telegram' }); } console.log('Получены данные от Telegram:', { id, first_name, username }); // Очищаем и валидируем данные const cleanUsername = (username || `user_${id}`).replace(/[^a-zA-Z0-9_]/g, '_').toLowerCase(); const cleanFirstName = (first_name || '').replace(/[<>]/g, ''); // Проверяем, существует ли пользователь с таким Telegram ID const users = await pb.collection('users').getList(1, 1, { filter: `telegram_id = ${id}` }); let user; if (users.items.length > 0) { // Если пользователь существует, используем его user = users.items[0]; console.log('Найден существующий пользователь:', user.id); } else { // Генерируем случайный пароль для пользователя const randomPassword = Math.random().toString(36).slice(-8); // Если пользователь не существует, создаем нового try { const userData = { username: cleanUsername, login: cleanUsername, telegram_id: id, telegram_username: username, telegram_first_name: cleanFirstName, telegram_photo_url: photo_url, email: `${cleanUsername}@telegram.user`, password: randomPassword, passwordConfirm: randomPassword, verified: true }; console.log('Создаем пользователя с данными:', userData); user = await pb.collection('users').create(userData); console.log('Создан новый пользователь:', user.id); } catch (createError) { console.error('Ошибка при создании пользователя:', createError); return res.status(500).json({ success: false, error: 'Ошибка при создании пользователя: ' + (createError.data?.message || createError.message) }); } } // Генерируем JWT токен const token = `telegram_${id}_${Date.now()}`; res.json({ success: true, token, user: { id: user.id, username: user.username, login: user.login, telegram_id: id, telegram_username: username, telegram_first_name: first_name, telegram_photo_url: photo_url } }); } catch (error) { console.error('Ошибка авторизации через Telegram:', error); res.status(500).json({ success: false, error: 'Ошибка авторизации: ' + (error.data?.message || error.message) }); } }); // Привязка Telegram к существующему профилю app.post('/api/auth/telegram/link', async (req, res) => { try { const { id, first_name, username, photo_url, auth_date, hash, userId } = req.body; if (!userId) { return res.status(400).json({ success: false, error: 'Не указан ID пользователя' }); } // Проверяем, не привязан ли уже этот Telegram ID к другому аккаунту const existingUsers = await pb.collection('users').getList(1, 1, { filter: `telegram_id = ${id}` }); if (existingUsers.items.length > 0) { return res.status(400).json({ success: false, error: 'Этот Telegram аккаунт уже привязан к другому профилю' }); } // Обновляем профиль пользователя const user = await pb.collection('users').update(userId, { telegram_id: id, telegram_username: username, telegram_first_name: first_name, telegram_photo_url: photo_url }); res.json({ success: true, user: { id: user.id, username: user.username, telegram_id: id, telegram_username: username, telegram_first_name: first_name, telegram_photo_url: photo_url } }); } catch (error) { console.error('Ошибка привязки Telegram:', error); res.status(500).json({ success: false, error: 'Ошибка привязки Telegram' }); } }); // Serve static files in production if (process.env.NODE_ENV === 'production') { app.use(express.static(join(__dirname, 'dist'))); app.get('*', (req, res) => { res.sendFile(join(__dirname, 'dist', 'index.html')); }); } app.listen(port, () => { console.log(`Server is running on port ${port}`); });