CampFireCritics/server.js

176 lines
5.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}`);
});