const { Client } = require('pg'); require('dotenv').config(); async function initializeDatabase() { console.log('🔄 Инициализация PostgreSQL...'); // Сначала подключаемся без конкретной БД const adminClient = new Client({ host: process.env.DB_HOST, port: process.env.DB_PORT || 5432, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: 'postgres' // Подключаемся к системной БД }); try { await adminClient.connect(); console.log('✅ Подключение к PostgreSQL установлено'); // Проверяем существование базы данных const dbCheck = await adminClient.query(` SELECT 1 FROM pg_database WHERE datname = '${process.env.DB_NAME}' `); if (dbCheck.rows.length === 0) { console.log(`📦 База данных ${process.env.DB_NAME} не существует, создаем...`); await adminClient.query(`CREATE DATABASE ${process.env.DB_NAME}`); console.log(`✅ База данных ${process.env.DB_NAME} создана`); } else { console.log(`✅ База данных ${process.env.DB_NAME} уже существует`); } await adminClient.end(); // Теперь подключаемся к созданной БД const dbClient = new Client({ host: process.env.DB_HOST, port: process.env.DB_PORT || 5432, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME }); await dbClient.connect(); // Создаем таблицы await dbClient.query(` CREATE TABLE IF NOT EXISTS sms_logs ( id SERIAL PRIMARY KEY, task_id INTEGER NOT NULL, task_title VARCHAR(500) NOT NULL, task_description TEXT, notification_type VARCHAR(50) NOT NULL, creator_id INTEGER, creator_name VARCHAR(255), creator_login VARCHAR(100), assignee_id INTEGER, assignee_name VARCHAR(255), assignee_login VARCHAR(100), message_content TEXT NOT NULL, message_subject VARCHAR(500), delivery_methods JSONB DEFAULT '[]', status VARCHAR(50) DEFAULT 'pending', error_message TEXT, retry_count INTEGER DEFAULT 0, sent_at TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, comments TEXT ) `); // Создаем индексы const indexes = [ 'CREATE INDEX IF NOT EXISTS idx_sms_logs_task_id ON sms_logs(task_id)', 'CREATE INDEX IF NOT EXISTS idx_sms_logs_creator_id ON sms_logs(creator_id)', 'CREATE INDEX IF NOT EXISTS idx_sms_logs_assignee_id ON sms_logs(assignee_id)', 'CREATE INDEX IF NOT EXISTS idx_sms_logs_status ON sms_logs(status)', 'CREATE INDEX IF NOT EXISTS idx_sms_logs_created_at ON sms_logs(created_at)' ]; for (const indexQuery of indexes) { try { await dbClient.query(indexQuery); } catch (err) { console.warn(`⚠️ Индекс не создан: ${err.message}`); } } await dbClient.end(); console.log('✅ PostgreSQL полностью инициализирован'); return true; } catch (error) { console.error('❌ Ошибка инициализации PostgreSQL:', error.message); return false; } } module.exports = { initializeDatabase };