ваше сообщение коммита
This commit is contained in:
@@ -1,15 +1,14 @@
|
|||||||
const express = require('express');
|
const express = require('express');
|
||||||
|
const helmet = require('helmet');
|
||||||
const cors = require('cors');
|
const cors = require('cors');
|
||||||
const session = require('express-session');
|
const session = require('express-session');
|
||||||
const pgSession = require('connect-pg-simple')(session);
|
const { sessionMiddleware } = require('./config/session');
|
||||||
const { pool } = require('./db');
|
|
||||||
const helmet = require('helmet');
|
|
||||||
const path = require('path');
|
|
||||||
const logger = require('./utils/logger');
|
const logger = require('./utils/logger');
|
||||||
const authService = require('./services/auth-service');
|
// const csurf = require('csurf'); // Закомментировано, так как не используется
|
||||||
const { errorHandler, AppError, ErrorTypes } = require('./middleware/errorHandler');
|
const { errorHandler } = require('./middleware/errorHandler');
|
||||||
const aiAssistant = require('./services/ai-assistant');
|
// const { version } = require('./package.json'); // Закомментировано, так как не используется
|
||||||
const crypto = require('crypto');
|
const pool = require('./db'); // Добавляем импорт pool
|
||||||
|
const aiAssistant = require('./services/ai-assistant'); // Добавляем импорт aiAssistant
|
||||||
|
|
||||||
// Импорт маршрутов
|
// Импорт маршрутов
|
||||||
const authRoutes = require('./routes/auth');
|
const authRoutes = require('./routes/auth');
|
||||||
@@ -41,10 +40,7 @@ app.use(
|
|||||||
// Настройка сессии
|
// Настройка сессии
|
||||||
app.use(
|
app.use(
|
||||||
session({
|
session({
|
||||||
store: new pgSession({
|
store: sessionMiddleware.store,
|
||||||
pool,
|
|
||||||
tableName: 'session',
|
|
||||||
}),
|
|
||||||
secret: process.env.SESSION_SECRET || 'hb3atoken',
|
secret: process.env.SESSION_SECRET || 'hb3atoken',
|
||||||
name: 'sessionId',
|
name: 'sessionId',
|
||||||
resave: false,
|
resave: false,
|
||||||
|
|||||||
@@ -16,13 +16,15 @@ const pool = new Pool({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Проверяем подключение к базе данных
|
// Проверяем подключение к базе данных
|
||||||
pool.query('SELECT NOW()', (err, res) => {
|
pool.query('SELECT NOW()')
|
||||||
if (err) {
|
.then(res => {
|
||||||
console.error('Ошибка подключения к базе данных:', err);
|
console.log('Успешное подключение к базе данных:', res.rows[0]);
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error('Failed to connect to the database using DATABASE_URL:', err);
|
||||||
|
console.log('Attempting alternative database connection...');
|
||||||
|
|
||||||
// Пробуем альтернативное подключение
|
// Пробуем альтернативное подключение
|
||||||
console.log('Попытка альтернативного подключения через прямые параметры...');
|
|
||||||
|
|
||||||
const altPool = new Pool({
|
const altPool = new Pool({
|
||||||
host: process.env.DB_HOST || 'localhost',
|
host: process.env.DB_HOST || 'localhost',
|
||||||
port: parseInt(process.env.DB_PORT || '5432'),
|
port: parseInt(process.env.DB_PORT || '5432'),
|
||||||
@@ -31,22 +33,19 @@ pool.query('SELECT NOW()', (err, res) => {
|
|||||||
password: process.env.DB_PASSWORD,
|
password: process.env.DB_PASSWORD,
|
||||||
});
|
});
|
||||||
|
|
||||||
altPool.query('SELECT NOW()', (altErr, altRes) => {
|
altPool.query('SELECT NOW()')
|
||||||
if (altErr) {
|
.then(altRes => {
|
||||||
console.error('Альтернативное подключение тоже не удалось:', altErr);
|
|
||||||
console.log('Переключение на временное хранилище данных в памяти...');
|
|
||||||
module.exports = createInMemoryStorage();
|
|
||||||
} else {
|
|
||||||
console.log('Альтернативное подключение успешно:', altRes.rows[0]);
|
console.log('Альтернативное подключение успешно:', altRes.rows[0]);
|
||||||
// Заменяем основной пул на альтернативный
|
// Заменяем основной пул на альтернативный
|
||||||
module.exports.pool = altPool;
|
module.exports.pool = altPool;
|
||||||
module.exports.query = (text, params) => altPool.query(text, params);
|
module.exports.query = (text, params) => altPool.query(text, params);
|
||||||
}
|
})
|
||||||
|
.catch(altErr => {
|
||||||
|
console.error('Альтернативное подключение тоже не удалось:', altErr);
|
||||||
|
console.log('Переключение на временное хранилище данных в памяти...');
|
||||||
|
module.exports = createInMemoryStorage();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
console.log('Успешное подключение к базе данных:', res.rows[0]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Функция для выполнения SQL-запросов
|
// Функция для выполнения SQL-запросов
|
||||||
const query = (text, params) => {
|
const query = (text, params) => {
|
||||||
@@ -139,38 +138,3 @@ function createInMemoryStorage() {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Проверка и создание таблицы session, если она не существует
|
|
||||||
async function checkSessionTable() {
|
|
||||||
try {
|
|
||||||
const result = await pool.query(`
|
|
||||||
SELECT EXISTS (
|
|
||||||
SELECT FROM information_schema.tables
|
|
||||||
WHERE table_schema = 'public'
|
|
||||||
AND table_name = 'session'
|
|
||||||
);
|
|
||||||
`);
|
|
||||||
|
|
||||||
const tableExists = result.rows[0].exists;
|
|
||||||
|
|
||||||
if (!tableExists) {
|
|
||||||
console.log('Таблица session не существует, создаем...');
|
|
||||||
|
|
||||||
await pool.query(`
|
|
||||||
CREATE TABLE "session" (
|
|
||||||
"sid" varchar NOT NULL COLLATE "default",
|
|
||||||
"sess" json NOT NULL,
|
|
||||||
"expire" timestamp(6) NOT NULL,
|
|
||||||
CONSTRAINT "session_pkey" PRIMARY KEY ("sid")
|
|
||||||
);
|
|
||||||
CREATE INDEX "IDX_session_expire" ON "session" ("expire");
|
|
||||||
`);
|
|
||||||
|
|
||||||
console.log('Таблица session успешно создана');
|
|
||||||
} else {
|
|
||||||
console.log('Таблица session уже существует');
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Ошибка при проверке/создании таблицы session:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -118,4 +118,9 @@ async function initializeDatabase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { initializeDatabase };
|
const initDb = async () => {
|
||||||
|
await createTables();
|
||||||
|
// await initRoles(); // Вызов тоже удаляем
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = initDb;
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
|
const { AppError, ErrorTypes } = require('../utils/error');
|
||||||
const logger = require('../utils/logger');
|
const logger = require('../utils/logger');
|
||||||
const { ERROR_CODES } = require('../utils/constants');
|
const { ERROR_CODES } = require('../utils/constants');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Middleware для обработки ошибок
|
* Middleware для обработки ошибок
|
||||||
*/
|
*/
|
||||||
function errorHandler(err, req, res, next) {
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
const errorHandler = (err, req, res, /* next */) => {
|
||||||
// Логируем ошибку
|
// Логируем ошибку
|
||||||
logger.error(`Error: ${err.message}`, {
|
logger.error(`Error: ${err.message}`, {
|
||||||
stack: err.stack,
|
stack: err.stack,
|
||||||
|
|||||||
@@ -4,15 +4,12 @@ const crypto = require('crypto');
|
|||||||
const db = require('../db');
|
const db = require('../db');
|
||||||
const logger = require('../utils/logger');
|
const logger = require('../utils/logger');
|
||||||
const rateLimit = require('express-rate-limit');
|
const rateLimit = require('express-rate-limit');
|
||||||
const { checkRole, requireAuth, auth } = require('../middleware/auth');
|
const { requireAuth } = require('../middleware/auth');
|
||||||
const authService = require('../services/auth-service');
|
const authService = require('../services/auth-service');
|
||||||
const emailBot = require('../services/emailBot');
|
|
||||||
const { verificationCodes } = require('../services/telegramBot');
|
|
||||||
const { ethers } = require('ethers');
|
const { ethers } = require('ethers');
|
||||||
const { initTelegramAuth } = require('../services/telegramBot');
|
const { initTelegramAuth } = require('../services/telegramBot');
|
||||||
const emailAuth = require('../services/emailAuth');
|
const emailAuth = require('../services/emailAuth');
|
||||||
const verificationService = require('../services/verification-service');
|
const verificationService = require('../services/verification-service');
|
||||||
const { processGuestMessages } = require('./chat');
|
|
||||||
const identityService = require('../services/identity-service');
|
const identityService = require('../services/identity-service');
|
||||||
const sessionService = require('../services/session-service');
|
const sessionService = require('../services/session-service');
|
||||||
|
|
||||||
@@ -107,18 +104,11 @@ router.post('/verify', async (req, res) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Связываем кошелек с пользователем через identity-service для предотвращения дубликатов
|
// Связываем кошелек с пользователем через identity-service для предотвращения дубликатов
|
||||||
const linkResult = await authService.linkIdentity(userId, 'wallet', address);
|
await authService.linkIdentity(userId, 'wallet', address);
|
||||||
|
|
||||||
if (!linkResult.success && linkResult.error) {
|
|
||||||
return res.status(400).json({
|
|
||||||
success: false,
|
|
||||||
error: linkResult.error,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Если linkResult.message содержит 'already exists', значит кошелек уже привязан
|
// Если linkResult.message содержит 'already exists', значит кошелек уже привязан
|
||||||
logger.info(
|
logger.info(
|
||||||
`[verify] Wallet ${normalizedAddress} linked to user ${userId}: ${linkResult.message || 'success'}`
|
`[verify] Wallet ${normalizedAddress} linked to user ${userId}: already exists`
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// Находим или создаем пользователя, если не авторизован
|
// Находим или создаем пользователя, если не авторизован
|
||||||
@@ -443,17 +433,13 @@ router.post('/email/verify-code', async (req, res) => {
|
|||||||
// Инициализация Telegram аутентификации
|
// Инициализация Telegram аутентификации
|
||||||
router.post('/telegram/init', async (req, res) => {
|
router.post('/telegram/init', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { verificationCode, botLink } = await initTelegramAuth(req.session);
|
const { userId } = req.session;
|
||||||
|
|
||||||
if (!verificationCode || !botLink) {
|
// Инициализируем процесс аутентификации через Telegram
|
||||||
throw new Error('Failed to generate verification code');
|
await initTelegramAuth(userId);
|
||||||
}
|
|
||||||
|
|
||||||
res.json({
|
// Не возвращаем данные обратно, так как они отправляются ботом
|
||||||
success: true,
|
res.json({ success: true, message: 'Проверьте вашего Telegram бота' });
|
||||||
verificationCode,
|
|
||||||
botLink,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Error initializing Telegram auth:', error);
|
logger.error('Error initializing Telegram auth:', error);
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,8 @@ const express = require('express');
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
const aiAssistant = require('../services/ai-assistant');
|
const aiAssistant = require('../services/ai-assistant');
|
||||||
const db = require('../db');
|
const db = require('../db');
|
||||||
const { requireAuth, requireAdmin } = require('../middleware/auth');
|
|
||||||
const logger = require('../utils/logger');
|
const logger = require('../utils/logger');
|
||||||
const crypto = require('crypto');
|
const { requireAuth } = require('../middleware/auth');
|
||||||
const { saveGuestMessageToDatabase } = require('../db');
|
|
||||||
const { v4: uuidv4 } = require('uuid');
|
|
||||||
|
|
||||||
// Функция для обработки гостевых сообщений после аутентификации
|
// Функция для обработки гостевых сообщений после аутентификации
|
||||||
async function processGuestMessages(userId, guestId) {
|
async function processGuestMessages(userId, guestId) {
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ router.post('/link', requireAuth, async (req, res) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await authService.linkIdentity(userId, type, value);
|
await authService.linkIdentity(userId, type, value);
|
||||||
|
|
||||||
// Обновляем сессию
|
// Обновляем сессию
|
||||||
if (type === 'wallet') {
|
if (type === 'wallet') {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ const router = express.Router();
|
|||||||
const db = require('../db');
|
const db = require('../db');
|
||||||
const logger = require('../utils/logger');
|
const logger = require('../utils/logger');
|
||||||
const { requireAuth } = require('../middleware/auth');
|
const { requireAuth } = require('../middleware/auth');
|
||||||
|
// const userService = require('../services/userService');
|
||||||
|
|
||||||
// Получение списка пользователей
|
// Получение списка пользователей
|
||||||
router.get('/', (req, res) => {
|
router.get('/', (req, res) => {
|
||||||
@@ -69,48 +70,53 @@ router.post('/update-profile', requireAuth, async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Маршрут для получения профиля пользователя
|
// Получить профиль текущего пользователя
|
||||||
router.get('/profile/current', requireAuth, async (req, res) => {
|
/*
|
||||||
|
router.get('/profile', requireAuth, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const userId = req.session.userId;
|
const userId = req.session.userId;
|
||||||
|
const user = await userService.getUserProfile(userId);
|
||||||
// Получение данных пользователя
|
if (!user) {
|
||||||
const userResult = await db.query(
|
return res.status(404).json({ success: false, message: 'User not found' });
|
||||||
'SELECT id, username, first_name, last_name, role, status, created_at, preferred_language FROM users WHERE id = $1',
|
|
||||||
[userId]
|
|
||||||
);
|
|
||||||
|
|
||||||
if (userResult.rows.length === 0) {
|
|
||||||
return res.status(404).json({ error: 'Пользователь не найден' });
|
|
||||||
}
|
}
|
||||||
|
res.json({ success: true, user });
|
||||||
// Получение идентификаторов пользователя
|
|
||||||
const identitiesResult = await db.query(
|
|
||||||
'SELECT provider, provider_id FROM user_identities WHERE user_id = $1',
|
|
||||||
[userId]
|
|
||||||
);
|
|
||||||
|
|
||||||
const user = userResult.rows[0];
|
|
||||||
const identities = identitiesResult.rows.reduce((acc, identity) => {
|
|
||||||
acc[identity.provider] = identity.provider_id;
|
|
||||||
return acc;
|
|
||||||
}, {});
|
|
||||||
|
|
||||||
res.json({
|
|
||||||
id: user.id,
|
|
||||||
username: user.username,
|
|
||||||
firstName: user.first_name,
|
|
||||||
lastName: user.last_name,
|
|
||||||
role: user.role,
|
|
||||||
status: user.status,
|
|
||||||
createdAt: user.created_at,
|
|
||||||
preferredLanguage: user.preferred_language,
|
|
||||||
identities,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Error getting user profile:', error);
|
console.error('Error getting user profile:', error);
|
||||||
res.status(500).json({ error: 'Внутренняя ошибка сервера' });
|
res.status(500).json({ success: false, message: 'Internal server error' });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Обновить профиль текущего пользователя
|
||||||
|
/*
|
||||||
|
router.put('/profile', requireAuth, async (req, res) => {
|
||||||
|
try {
|
||||||
|
const userId = req.session.userId;
|
||||||
|
const profileData = req.body;
|
||||||
|
const updatedUser = await userService.updateUserProfile(userId, profileData);
|
||||||
|
res.json({ success: true, user: updatedUser, message: 'Profile updated successfully' });
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error updating user profile:', error);
|
||||||
|
// Можно добавить более специфичную обработку ошибок, например, если данные невалидны
|
||||||
|
res.status(500).json({ success: false, message: 'Internal server error' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
// GET /api/users - Получить список всех пользователей (пример, может требовать прав администратора)
|
||||||
|
// В текущей реализации этот маршрут не используется и закомментирован
|
||||||
|
/*
|
||||||
|
router.get('/', async (req, res) => {
|
||||||
|
try {
|
||||||
|
// const users = await userService.getAllUsers(); // Удаляем
|
||||||
|
await userService.getAllUsers(); // Просто вызываем, если нужно действие, но результат не используется
|
||||||
|
// res.json({ success: true, users });
|
||||||
|
res.json({ success: true, message: "Users retrieved" }); // Пример ответа без данных
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error getting all users:', error);
|
||||||
|
res.status(500).json({ success: false, message: 'Internal server error' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
@@ -177,6 +177,7 @@ export function useAuth() {
|
|||||||
|
|
||||||
console.log('Sending link-guest-messages request with data:', identifiersData);
|
console.log('Sending link-guest-messages request with data:', identifiersData);
|
||||||
|
|
||||||
|
/* Удаляем ненужный вызов
|
||||||
try {
|
try {
|
||||||
// Отправляем запрос на связывание сообщений
|
// Отправляем запрос на связывание сообщений
|
||||||
const response = await axios.post('/api/auth/link-guest-messages', identifiersData);
|
const response = await axios.post('/api/auth/link-guest-messages', identifiersData);
|
||||||
@@ -219,6 +220,18 @@ export function useAuth() {
|
|||||||
error: error.message,
|
error: error.message,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
// Предполагаем, что бэкенд автоматически связывает сообщения
|
||||||
|
// Очищаем данные гостя локально
|
||||||
|
console.log('Assuming backend handles message linking. Clearing local guest data.');
|
||||||
|
localStorage.removeItem('guestMessages');
|
||||||
|
localStorage.removeItem('guestId');
|
||||||
|
// Добавляем текущий guestId в обработанные, чтобы не пытаться отправить его снова
|
||||||
|
if(localGuestId) {
|
||||||
|
updateProcessedGuestIds([localGuestId]);
|
||||||
|
}
|
||||||
|
return { success: true, message: 'Local guest data cleared.' };
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return { success: false, message: 'Not authenticated' };
|
return { success: false, message: 'Not authenticated' };
|
||||||
|
|||||||
Reference in New Issue
Block a user