alpha-test

This commit is contained in:
2025-09-18 13:46:35 +09:00
parent 85027a7747
commit 5ea3e8c1f3
27 changed files with 5887 additions and 174 deletions

View File

@@ -0,0 +1,170 @@
// Скрипт для исправления проблемы с ботом
require('dotenv').config();
const { Pool } = require('pg');
// Получаем данные подключения из .env
console.log('Параметры подключения к БД:');
console.log('DB_USERNAME:', process.env.DB_USERNAME);
console.log('DB_HOST:', process.env.DB_HOST);
console.log('DB_NAME:', process.env.DB_NAME);
console.log('DB_PASSWORD:', process.env.DB_PASSWORD ? '[указан]' : '[не указан]');
console.log('DB_PORT:', process.env.DB_PORT);
// Создаем пул соединений
const pool = new Pool({
user: process.env.DB_USERNAME,
host: process.env.DB_HOST,
database: process.env.DB_NAME,
password: process.env.DB_PASSWORD,
port: parseInt(process.env.DB_PORT || '5432')
});
async function fixDatabase() {
try {
console.log('Начинаем исправление базы данных...');
// Проверяем существование таблицы users
const tableResult = await pool.query(`
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'users'
);
`);
if (!tableResult.rows[0].exists) {
console.error('Таблица users не найдена!');
return;
}
console.log('✅ Таблица users существует');
// Проверяем и добавляем столбцы state и state_data, если они отсутствуют
console.log('Проверяем наличие столбцов state и state_data...');
const stateColumnResult = await pool.query(`
SELECT EXISTS (
SELECT FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'users'
AND column_name = 'state'
);
`);
const stateDataColumnResult = await pool.query(`
SELECT EXISTS (
SELECT FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'users'
AND column_name = 'state_data'
);
`);
if (!stateColumnResult.rows[0].exists) {
console.log('🔄 Добавляем столбец state...');
await pool.query(`ALTER TABLE users ADD COLUMN state VARCHAR(255) NULL;`);
console.log('✅ Столбец state успешно добавлен');
} else {
console.log('✅ Столбец state уже существует');
}
if (!stateDataColumnResult.rows[0].exists) {
console.log('🔄 Добавляем столбец state_data...');
await pool.query(`ALTER TABLE users ADD COLUMN state_data JSONB DEFAULT '{}'::jsonb;`);
console.log('✅ Столбец state_data успешно добавлен');
} else {
console.log('✅ Столбец state_data уже существует');
}
// Проверка наличия таблиц для уведомлений
console.log('Проверяем наличие таблиц для уведомлений...');
const tablesCheck = await Promise.all([
checkTableExists('notifications'),
checkTableExists('notification_settings'),
checkTableExists('scheduled_notifications')
]);
// Создаем отсутствующие таблицы
if (!tablesCheck[0]) {
console.log('🔄 Создаем таблицу notifications...');
await pool.query(`
CREATE TABLE notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
type VARCHAR(50) NOT NULL,
content JSONB NOT NULL DEFAULT '{}',
is_read BOOLEAN DEFAULT false,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_notifications_user_id ON notifications(user_id);
CREATE INDEX idx_notifications_type ON notifications(type);
CREATE INDEX idx_notifications_created_at ON notifications(created_at);
`);
console.log('✅ Таблица notifications успешно создана');
}
if (!tablesCheck[1]) {
console.log('🔄 Создаем таблицу notification_settings...');
await pool.query(`
CREATE TABLE notification_settings (
user_id UUID PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
new_matches BOOLEAN DEFAULT true,
new_messages BOOLEAN DEFAULT true,
new_likes BOOLEAN DEFAULT true,
reminders BOOLEAN DEFAULT true,
daily_summary BOOLEAN DEFAULT false,
time_preference VARCHAR(20) DEFAULT 'evening',
do_not_disturb BOOLEAN DEFAULT false,
do_not_disturb_start TIME,
do_not_disturb_end TIME,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
`);
console.log('✅ Таблица notification_settings успешно создана');
}
if (!tablesCheck[2]) {
console.log('🔄 Создаем таблицу scheduled_notifications...');
await pool.query(`
CREATE TABLE scheduled_notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
type VARCHAR(50) NOT NULL,
content JSONB NOT NULL DEFAULT '{}',
scheduled_at TIMESTAMP WITH TIME ZONE NOT NULL,
processed BOOLEAN DEFAULT false,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_scheduled_notifications_user_id ON scheduled_notifications(user_id);
CREATE INDEX idx_scheduled_notifications_scheduled_at ON scheduled_notifications(scheduled_at);
CREATE INDEX idx_scheduled_notifications_processed ON scheduled_notifications(processed);
`);
console.log('✅ Таблица scheduled_notifications успешно создана');
}
console.log('✅ Исправление базы данных завершено успешно');
} catch (error) {
console.error('Ошибка при исправлении базы данных:', error);
} finally {
await pool.end();
}
}
async function checkTableExists(tableName) {
const result = await pool.query(`
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = $1
);
`, [tableName]);
const exists = result.rows[0].exists;
console.log(`${exists ? '✅' : '❌'} Таблица ${tableName} ${exists ? 'существует' : 'отсутствует'}`);
return exists;
}
fixDatabase();