176 lines
5.7 KiB
JavaScript
176 lines
5.7 KiB
JavaScript
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}`);
|
||
});
|